Backup your database and files to Cloud Storage.
- Backup MySQL database (local and Docker)
- Backup PostgreSQL database (local and Docker)
- Support multiple database instances (for multiple Docker projects)
- Backup directory (multiple)
- Upload to Aliyun OSS / Tencent COS / Backblaze B2
sudo apt-get install zip -ysudo apt-get install python3 python3-pip -y
pip3 install pyyaml
pip3 install oss2 # aliyun oss (optional)
pip3 install cos-python-sdk-v5 # tencent cos (optional)
pip3 install b2sdk # backblaze b2 (optional)git clone https://github.com/forecho/backup-to-cloud-storage.gitcd backup-to-cloud-storage && cp config.yaml.example config.yamlEdit config.yaml:
backup:
driver: oss # oss, cos, or b2
name: myserver # backup file prefix
src: /var/www/html # directories to backup (space separated)
dir: /tmp/backup # temp directory
password: backup # zip password
# Database configuration (all optional, supports multiple instances)
databases:
mysql:
# Local MySQL
- name: local
host: localhost
user: root
password: root
databases: db1,db2
# Docker MySQL (project A)
- name: project_a
container: project_a_mysql # Docker container name
user: root
password: root
databases: app_db
postgres:
# Docker PostgreSQL (project B)
- name: project_b
container: project_b_postgres
user: postgres
password: secret
databases: app,analytics
# Cloud storage config (configure one)
oss:
access_key_id: xxx
access_key_secret: xxx
endpoint: https://oss-cn-shenzhen.aliyuncs.com
bucket: backup| Field | Required | Description |
|---|---|---|
name |
No | Identifier for backup filename (e.g., myserver-mysql-project_a-dbname.sql) |
container |
No | Docker container name. If set, uses docker exec to backup |
host |
No | Database host (default: localhost, ignored when using container) |
port |
No | Database port (PostgreSQL only, default: 5432) |
user |
Yes | Database username |
password |
No | Database password |
databases |
Yes | Comma-separated database names |
# List all running containers
docker ps
# Output example:
# CONTAINER ID IMAGE COMMAND NAMES
# a1b2c3d4e5f6 mysql:8.0 "docker-entrypoint.s…" project_a_mysql
# f6e5d4c3b2a1 postgres:15 "docker-entrypoint.s…" project_b_postgresThe NAMES column is the container name you need. If you use docker-compose, the container name is usually {project_directory}_{service_name}_1 or {project_name}-{service_name}-1.
You can also find it in your docker-compose.yml:
services:
db:
container_name: my_mysql # <-- This is the container name
image: mysql:8.0If container_name is not set, use docker ps to check the actual name.
python3 backup.pycrontab -eAdd this line to run backup at 2:00 AM daily:
0 2 * * * /usr/bin/python3 /root/backup-to-cloud-storage/backup.py