backup-recovery
Production backup strategy and disaster recovery planning for Linux servers, covering database backups, file backups, encryption, cloud storage, retention policies, and restore runbooks. USE WHEN: - Designing or implementing a backup strategy for a production server - Writing pg_dump / mongodump / mysqldump backup scripts - Configuring rclone to sync backups to S3, Backblaze B2, or SFTP - Encrypting backup archives with GPG before uploading offsite - Setting up retention schedules (daily/weekly/monthly rotation) - Writing or testing a disaster recovery runbook - Monitoring backup success/failure with healthchecks.io DO NOT USE FOR: - Kubernetes PersistentVolume snapshots (use cloud-provider CSI snapshot tools) - Application-level data export (e.g., Stripe data export, SaaS data portability) - Code repository backups (use git push to multiple remotes) - Windows Server backup (this skill covers Linux only)
What this skill does
# Backup & Recovery — Production Strategy ## The 3-2-1 Rule Every production backup strategy must satisfy: - **3** copies of data (1 primary + 2 backups) - **2** different storage media or locations (e.g., local disk + cloud) - **1** offsite copy (different geographic region from primary) | Backup Type | Description | Use Case | |------------|-------------|----------| | Full | Complete snapshot of all data | Weekly baseline, before major upgrades | | Incremental | Changes since last backup (any type) | Daily; fast but requires chain for restore | | Differential | Changes since last full backup | Balances restore speed vs. storage cost | Recommended schedule: **Full weekly + Incremental daily** with 30-day retention. --- ## Database Backups ### PostgreSQL ```bash # Plain SQL dump (human-readable, compatible with any Postgres version) pg_dump -U postgres -d mydb > mydb_$(date +%Y%m%d_%H%M%S).sql # Custom format (-Fc) — compressed, supports parallel restore, preferred for large DBs pg_dump -U postgres -Fc -d mydb -f mydb_$(date +%Y%m%d_%H%M%S).dump # Directory format (-Fd) — parallel dump, one file per table pg_dump -U postgres -Fd -j 4 -d mydb -f mydb_$(date +%Y%m%d_%H%M%S).dir/ # Dump globals (roles, tablespaces) — run separately pg_dumpall -U postgres --globals-only > globals_$(date +%Y%m%d).sql # Dump all databases pg_dumpall -U postgres > all_databases_$(date +%Y%m%d).sql ``` **PostgreSQL restore:** ```bash # From plain SQL psql -U postgres -d mydb < mydb_20241201_030000.sql # From custom format (parallel restore with -j) pg_restore -U postgres -d mydb -j 4 --clean --if-exists mydb_20241201_030000.dump # Create DB first if it doesn't exist createdb -U postgres mydb pg_restore -U postgres -d mydb mydb_20241201_030000.dump # Restore globals first psql -U postgres < globals_20241201.sql ``` ### MongoDB ```bash # Full dump (BSON format) mongodump --uri="mongodb://user:pass@localhost:27017/mydb" \ --out=/var/backups/mongo/$(date +%Y%m%d_%H%M%S)/ # Compressed archive mongodump --uri="mongodb://user:pass@localhost:27017/mydb" \ --archive=/var/backups/mongo/mydb_$(date +%Y%m%d).gz \ --gzip # Restore mongorestore --uri="mongodb://user:pass@localhost:27017/mydb" \ --drop \ --archive=/var/backups/mongo/mydb_20241201.gz \ --gzip ``` ### MySQL / MariaDB ```bash # Single database mysqldump -u root -p mydb \ --single-transaction \ --routines \ --triggers \ --events \ > mydb_$(date +%Y%m%d_%H%M%S).sql # All databases mysqldump -u root -p \ --all-databases \ --single-transaction \ > all_databases_$(date +%Y%m%d).sql # Restore mysql -u root -p mydb < mydb_20241201_030000.sql ``` `--single-transaction` acquires a consistent snapshot for InnoDB without locking tables. --- ## File Backups with rsync ```bash # Basic archive sync (preserves permissions, timestamps, symlinks) rsync -av /var/www/html/ /mnt/backup/html/ # With deletion (mirror: remove files deleted from source) rsync -av --delete /var/www/html/ /mnt/backup/html/ # Exclude paths rsync -av --delete \ --exclude='*.log' \ --exclude='node_modules/' \ --exclude='.cache/' \ /var/www/ /mnt/backup/www/ # Incremental backup using --link-dest (hardlinks unchanged files — space efficient) BACKUP_DATE=$(date +%Y%m%d_%H%M%S) LATEST=/mnt/backup/latest rsync -av --delete \ --link-dest="$LATEST" \ /var/www/html/ \ /mnt/backup/snapshots/$BACKUP_DATE/ # Update the "latest" symlink ln -sfn /mnt/backup/snapshots/$BACKUP_DATE /mnt/backup/latest # Remote sync over SSH (bandwidth-limited to 10 MB/s) rsync -av --delete \ --bwlimit=10000 \ --partial \ -e "ssh -i /root/.ssh/backup_key -p 22" \ /var/www/html/ \ [email protected]:/backups/html/ ``` --- ## rclone for Cloud Storage ### Installation and Configuration ```bash curl https://rclone.org/install.sh | sudo bash # Interactive config rclone config # Creates ~/.config/rclone/rclone.conf ``` `~/.config/rclone/rclone.conf`: ```ini [b2] type = b2 account = your-b2-account-id key = your-b2-application-key [s3] type = s3 provider = AWS access_key_id = AKIAIOSFODNN7EXAMPLE secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY region = us-east-1 [sftp-backup] type = sftp host = backup-server.example.com user = backup key_file = /root/.ssh/backup_key port = 22 ``` ### rclone Commands ```bash # Copy (source → dest, skip existing identical files) rclone copy /var/backups/ b2:my-bucket/server-backups/ --progress # Sync (make destination identical to source — DELETES files not in source) rclone sync /var/backups/ b2:my-bucket/server-backups/ \ --progress \ --bwlimit 50M # Copy with bandwidth limit and filtering rclone copy /var/backups/ s3:my-bucket/backups/ \ --bwlimit 20M \ --include "*.gpg" \ --progress # List remote contents rclone ls b2:my-bucket/server-backups/ # Check (verify checksums between source and destination) rclone check /var/backups/ b2:my-bucket/server-backups/ ``` --- ## Encryption with GPG Never upload unencrypted backups containing sensitive data to cloud storage. ```bash # Symmetric encryption (single passphrase) — simpler, good for personal use gpg --symmetric \ --cipher-algo AES256 \ --compress-algo none \ mydb_backup.dump # Produces: mydb_backup.dump.gpg # Asymmetric encryption (public key) — better for automation (no passphrase at encrypt time) # Generate key pair once: gpg --full-gen-key gpg --encrypt \ --recipient [email protected] \ mydb_backup.dump # Decrypt symmetric gpg --decrypt mydb_backup.dump.gpg > mydb_backup.dump # Decrypt asymmetric (requires private key) gpg --decrypt mydb_backup.dump.gpg > mydb_backup.dump # Pipe backup directly through encryption (no plaintext file on disk) pg_dump -U postgres -Fc mydb | \ gpg --symmetric --cipher-algo AES256 --compress-algo none \ > /var/backups/mydb_$(date +%Y%m%d).dump.gpg ``` --- ## Complete Production Backup Script `/opt/scripts/backup-postgres.sh`: ```bash #!/bin/bash # Production PostgreSQL backup: dump → encrypt → upload to S3 → cleanup → ping set -euo pipefail # ── Configuration ──────────────────────────────────────────────────────────── DB_NAME="mydb" DB_USER="postgres" BACKUP_DIR="/var/backups/postgres" RCLONE_DEST="s3:my-backup-bucket/postgres" GPG_PASSPHRASE_FILE="/etc/backup/gpg-passphrase" # chmod 600, owned by backup user HEALTHCHECK_URL="https://hc-ping.com/YOUR-CHECK-UUID" RETAIN_LOCAL_DAYS=7 RETAIN_REMOTE_DAYS=30 LOG_FILE="/var/log/backup-postgres.log" # ── Helpers ─────────────────────────────────────────────────────────────────── log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"; } cleanup() { local exit_code=$? if [[ $exit_code -ne 0 ]]; then log "BACKUP FAILED (exit $exit_code) — sending failure ping" curl -fsS --retry 3 "${HEALTHCHECK_URL}/fail" > /dev/null || true fi } trap cleanup EXIT # ── Ping start ──────────────────────────────────────────────────────────────── curl -fsS --retry 3 "${HEALTHCHECK_URL}/start" > /dev/null || true # ── Backup ─────────────────────────────────────────────────────────────────── TIMESTAMP=$(date +%Y%m%d_%H%M%S) FILENAME="${DB_NAME}_${TIMESTAMP}.dump.gpg" BACKUP_PATH="${BACKUP_DIR}/${FILENAME}" mkdir -p "$BACKUP_DIR" log "Starting backup of database: $DB_NAME" pg_dump -U "$DB_USER" -Fc "$DB_NAME" | \ gpg --batch --yes \ --passphrase-file "$GPG_PASSPHRASE_FILE" \ --symmetric \ --cipher-algo AES256 \ --compress-algo none \ > "$BACKUP_PATH" BACKUP_SIZE=$(du -sh "$BACKUP_PATH" | cut -f1) log "Backup complete: $FILENAME ($BACKUP_SIZE)" # ── Upload to S3 ───────────────────────────────────────────────────────────── log "Uploading to $RCLONE_DEST" rclone copy "$BACKUP_PATH" "$RCLONE_DEST/" \ --progress \ --log-file="$LOG_FILE" \ --log-level INFO log "Upload complete" # ── Local retention cleanup ─────────────────────────────────────────────────── log "Removing local backups older than ${RETAIN_LOCAL_DAYS} days" fin
Related in Cloud & DevOps
appbuilder-action-scaffolder
IncludedCreate, implement, deploy, and debug Adobe Runtime actions with consistent layout, validation, and error handling. Use this skill whenever the user needs to add actions to an App Builder project, understand action structure (params, response format, web/raw actions), configure actions in the manifest, use App Builder SDKs (State, Files, Events, database), deploy and invoke actions via CLI, debug action issues, or implement patterns such as webhook receivers, custom event providers, journaling consumers, large payload redirects, action sequence pipelines, and Asset Compute workers. Also trigger when users mention serverless functions in Adobe context, action logging, IMS authentication for actions, or cron-style scheduled actions.
orchestrating-datacloud
IncludedSalesforce Data Cloud product orchestrator for connect→prepare→harmonize→segment→act workflows. Use this skill when the user needs a multi-step Data Cloud pipeline, cross-phase troubleshooting, or data space and data kit management. TRIGGER when: user needs a multi-step Data Cloud pipeline, asks to set up or troubleshoot Data Cloud across phases, manages data spaces or data kits, or wants a cross-phase sf data360 workflow. DO NOT TRIGGER when: work is isolated to a single phase (use the matching phase-specific skill), the task is STDM/session tracing/parquet telemetry (use observing-agentforce), standard CRM SOQL (use querying-soql), or Apex implementation (use generating-apex).
github-project-automation
IncludedAutomate GitHub repository setup with CI/CD workflows, issue templates, Dependabot, and CodeQL security scanning. Includes 12 production-tested workflows and prevents 18 errors: YAML syntax, action pinning, and configuration. Use when: setting up GitHub Actions CI/CD, creating issue/PR templates, enabling Dependabot or CodeQL scanning, deploying to Cloudflare Workers, implementing matrix testing, or troubleshooting YAML indentation, action version pinning, secrets syntax, runner versions, or CodeQL configuration. Keywords: github actions, github workflow, ci/cd, issue templates, pull request templates, dependabot, codeql, security scanning, yaml syntax, github automation, repository setup, workflow templates, github actions matrix, secrets management, branch protection, codeowners, github projects, continuous integration, continuous deployment, workflow syntax error, action version pinning, runner version, github context, yaml indentation error
sf-datacloud
IncludedSalesforce Data Cloud product orchestrator for connect→prepare→harmonize→segment→act workflows. TRIGGER when: user needs a multi-step Data Cloud pipeline, asks to set up or troubleshoot Data Cloud across phases, manages data spaces or data kits, or wants a cross-phase `sf data360` workflow. DO NOT TRIGGER when: work is isolated to a single phase (use the matching sf-datacloud-* skill), the task is STDM/session tracing/parquet telemetry (use sf-ai-agentforce-observability), standard CRM SOQL (use sf-soql), or Apex implementation (use sf-apex).
fabric-cli
IncludedUse this skill for Fabric.so CLI workflows with the `fabric` terminal command: diagnose/install/login, search or browse a Fabric library, save notes/links/files, create folders, ask the Fabric AI assistant, manage tasks/workspaces, generate shell completion, check subscription usage, produce JSON output, and use Fabric as persistent agent memory. Do not use for Microsoft Fabric/Azure/Power BI `fab`, Daniel Miessler's Fabric framework, Python Fabric SSH, Fabric.js, or textile/fashion fabric.
lark
IncludedLark/Feishu CLI skills: lark-cli operations for docs, markdown, sheets, base, calendar, im, mail, task, okr, drive, wiki, slides, whiteboard, apps, approval, attendance, contact, vc, minutes, event. Use when the user needs to operate Lark/Feishu resources via lark-cli, send messages, manage documents, spreadsheets, calendars, tasks, OKRs, deploy web pages, or any Feishu/Lark workspace operations.