Sign inSign up

zachbg/docker-backup

By zachbg

•Updated 6 months ago

Automated database backup (PostgreSQL, MySQL, MongoDB) to S3/R2/B2 with encryption

Image
1

3.9K

zachbg/docker-backup repository overview

⁠docker-backup

Universal database backup container — PostgreSQL, MySQL, MongoDB, SQLite → S3, R2, B2, MinIO.

Docker Image Docker Pulls

⁠Features

  • Multi-database: PostgreSQL, MySQL/MariaDB, MongoDB, SQLite
  • Multi-cloud upload: AWS S3, Cloudflare R2, Backblaze B2, MinIO
  • Encryption: AES-256-CBC at rest
  • Retention policy: Auto-delete old backups
  • Cron scheduling: Built-in recurring backups
  • Health monitoring: Uptime Kuma / Healthchecks.io ping
  • Tiny footprint: Alpine-based, ~50MB

⁠Quick Start

⁠PostgreSQL Backup (one-time)
docker run --rm \
  -e POSTGRES_HOST=your-db-host \
  -e POSTGRES_DB=myapp \
  -e POSTGRES_USER=postgres \
  -e POSTGRES_PASSWORD=secret \
  -v ./backups:/backups \
  zachbg/docker-backup
⁠Scheduled Backup with S3 Upload
services:
  backup:
    image: zachbg/docker-backup
    environment:
      - POSTGRES_HOST=postgres
      - POSTGRES_DB=myapp
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - CRON_SCHEDULE=0 3 * * *        # Daily at 3 AM
      - RETENTION_DAYS=30
      - UPLOAD_TARGET=s3://my-backups/db
      - AWS_ACCESS_KEY_ID=${AWS_KEY}
      - AWS_SECRET_ACCESS_KEY=${AWS_SECRET}
      - HEALTHCHECK_URL=https://hc.example.com/ping/xxx
    volumes:
      - backup-data:/backups

  postgres:
    image: postgres:17
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes:
      - pg-data:/var/lib/postgresql/data

volumes:
  backup-data:
  pg-data:
⁠MySQL + Cloudflare R2
services:
  backup:
    image: zachbg/docker-backup
    environment:
      - MYSQL_HOST=mariadb
      - MYSQL_DB=wordpress
      - MYSQL_USER=root
      - MYSQL_PASSWORD=${DB_PASSWORD}
      - CRON_SCHEDULE=0 */6 * * *      # Every 6 hours
      - UPLOAD_TARGET=r2://backups/mysql
      - R2_ACCOUNT_ID=${R2_ACCOUNT}
      - R2_ACCESS_KEY=${R2_KEY}
      - R2_SECRET_KEY=${R2_SECRET}

⁠Environment Variables

VariableDefaultDescription
POSTGRES_HOSTPostgreSQL hostname
POSTGRES_PORT5432PostgreSQL port
POSTGRES_DBallDatabase name (or all)
MYSQL_HOSTMySQL/MariaDB hostname
MONGO_URIMongoDB connection URI
SQLITE_PATHPath to SQLite file
BACKUP_DIR/backupsLocal backup directory
RETENTION_DAYS30Days to keep old backups
COMPRESSIONgzipCompression method
ENCRYPTION_KEYAES-256 encryption password
CRON_SCHEDULECron expression (empty = run once)
UPLOAD_TARGETRemote storage URI
HEALTHCHECK_URLURL to ping on success

⁠Restoring

# Decompress
gunzip backup.sql.gz

# Decrypt (if encrypted)
openssl enc -aes-256-cbc -d -pbkdf2 -in backup.sql.gz.enc -out backup.sql.gz

# Restore PostgreSQL
psql -h localhost -U postgres -d mydb < backup.sql

# Restore MySQL
mysql -h localhost -u root -p mydb < backup.sql

⁠License

MIT

Tag summary

Content type

Image

Digest

sha256:86dbe12f3…

Size

112.3 MB

Last updated

6 months ago

docker pull zachbg/docker-backup