Automated database backup (PostgreSQL, MySQL, MongoDB) to S3/R2/B2 with encryption
3.9K
Universal database backup container — PostgreSQL, MySQL, MongoDB, SQLite → S3, R2, B2, MinIO.
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
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:
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}
| Variable | Default | Description |
|---|---|---|
POSTGRES_HOST | PostgreSQL hostname | |
POSTGRES_PORT | 5432 | PostgreSQL port |
POSTGRES_DB | all | Database name (or all) |
MYSQL_HOST | MySQL/MariaDB hostname | |
MONGO_URI | MongoDB connection URI | |
SQLITE_PATH | Path to SQLite file | |
BACKUP_DIR | /backups | Local backup directory |
RETENTION_DAYS | 30 | Days to keep old backups |
COMPRESSION | gzip | Compression method |
ENCRYPTION_KEY | AES-256 encryption password | |
CRON_SCHEDULE | Cron expression (empty = run once) | |
UPLOAD_TARGET | Remote storage URI | |
HEALTHCHECK_URL | URL to ping on success |
# 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
MIT
Content type
Image
Digest
sha256:86dbe12f3…
Size
112.3 MB
Last updated
6 months ago
docker pull zachbg/docker-backup