Backup và khôi phục Portainer: tránh mất stack, volume và cấu hình quan trọng
Một ngày bình thường: server vẫn chạy, container vẫn xanh, stack vẫn ổn. Rồi sau một lần update Docker, lỗi disk, thao tác nhầm docker volume rm, hoặc migrate VPS gấp, bạn mở Portainer lên và thấy: stack biến mất, cấu hình endpoint mất, user không còn, volume chứa dữ liệu app không mount được.
Portainer rất tiện để quản lý Docker, Docker Compose, Swarm, Kubernetes ở mức trực quan. Nhưng chính vì tiện, nhiều người quên rằng Portainer cũng có dữ liệu riêng cần backup. Ngoài ra, Portainer không tự backup toàn bộ volume của container khác. Nếu chỉ backup Portainer mà bỏ qua database, file upload, config app trong volume → vẫn mất dữ liệu.
Bài này đi thẳng vào thực tế: cần backup gì, backup thế nào, khôi phục ra sao, tránh mất stack/volume/config quan trọng.
Hiểu đúng: Portainer lưu gì?
Portainer có volume dữ liệu riêng, thường là:
portainer_dataKhi chạy bằng Docker, lệnh phổ biến:
docker run -d
-p 9443:9443
--name portainer
--restart=always
-v /var/run/docker.sock:/var/run/docker.sock
-v portainer_data:/data
portainer/portainer-ce:latestTrong /data, Portainer lưu:
– User, password hash, team, role – Endpoint/environment – Stack metadata – Registry config – Settings – TLS/cert liên quan – Một số thông tin UI/config nội bộ
Nhưng cần phân biệt:
Portainer stack ≠ toàn bộ dữ liệu app
Nếu bạn deploy stack qua Portainer, Portainer lưu thông tin stack. Tuy nhiên dữ liệu app thường nằm ở:
– Docker named volume: mysql_data, postgres_data, wp_data
– Bind mount: /opt/app/data, /srv/docker/app/config
– External DB/server khác
– Object storage/S3/minio
– Secrets/configs ngoài Portainer
Vì vậy backup Portainer chỉ giúp khôi phục bộ điều khiển. Muốn app sống lại đầy đủ, cần backup cả volume + file config + compose file + secrets.
Những thứ bắt buộc phải backup
1. Volume Portainer
Quan trọng nhất:
portainer_dataNếu mất volume này → mất cấu hình Portainer, stack metadata, users, endpoints.
Kiểm tra:
docker volume ls | grep portainer
docker inspect portainer2. File Compose của Portainer
Nếu bạn chạy Portainer bằng Compose, lưu file này:
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: always
ports:
- "9443:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
volumes:
portainer_data:
Nên lưu ở:
/opt/portainer/docker-compose.ymlRồi đưa vào Git private hoặc backup định kỳ.
3. Stack Compose files
Với mỗi app, nên có repo hoặc thư mục riêng:
/opt/stacks/
├── wordpress/docker-compose.yml
├── postgres/docker-compose.yml
├── nginx-proxy/docker-compose.yml
└── monitoring/docker-compose.ymlKhông nên chỉ sửa stack trong UI Portainer mà không có bản sao ngoài. UI tiện, nhưng Git/backup file mới là nguồn khôi phục chắc chắn.
4. Volumes của app
Ví dụ:
docker volume lsBạn có thể thấy:
wordpress_db_data
wordpress_html
n8n_data
postgres_data
grafana_dataĐây mới là nơi chứa dữ liệu thực sự. Mất chúng → app có thể start lại nhưng dữ liệu rỗng.
5. Bind mounts
Nhiều stack dùng mount kiểu:
volumes:
- /opt/app/config:/config
- /srv/uploads:/uploadsCác thư mục này không nằm trong Docker volume. Cần backup bằng rsync, tar, snapshot, hoặc tool backup hệ thống.
6. Secrets, env, registry credentials
Backup:
– .env
– Docker secrets
– API key
– DB password
– SMTP password
– Registry token
– Cloud credential
Lưu ý: không commit plaintext secret lên public Git. Dùng Git private + encryption, SOPS, age, Vault, Bitwarden, hoặc backup mã hóa.
Backup Portainer bằng tính năng built-in
Portainer có chức năng backup trong UI.
Đường dẫn thường là:
Settings → Backup PortainerBạn có thể tạo file backup chứa dữ liệu Portainer. Nên đặt mật khẩu mã hóa nếu Portainer hỗ trợ ở phiên bản bạn dùng.
Ưu điểm:
– Dễ dùng – Phù hợp backup nhanh trước khi upgrade – Khôi phục UI/config tốt
Nhược điểm:
– Không backup volume app – Không thay thế backup Docker host – Cần kiểm tra tương thích version
Khuyến nghị:
– Backup thủ công trước mỗi lần upgrade Portainer – Tải file backup về máy khác – Lưu thêm bản ở cloud/object storage – Không để duy nhất trên cùng server
Backup Portainer bằng Docker volume
Cách phổ biến: dùng container tạm để nén volume portainer_data.
Dừng Portainer trước khi backup
Để tránh dữ liệu đang ghi dở:
docker stop portainerTạo backup
mkdir -p /backup/portainer
docker run --rm
-v portainer_data:/data
-v /backup/portainer:/backup
alpine
tar czf /backup/portainer_data_$(date +%F_%H-%M-%S).tar.gz -C /data .
Start lại Portainer
docker start portainerKết quả:
/backup/portainer/portainer_data_2026-06-02_10-30-00.tar.gzNên copy ra ngoài:
rsync -av /backup/portainer/ user@backup-server:/backups/docker-host-01/portainer/Hoặc đẩy lên S3 bằng rclone.
Backup volume app đúng cách
Cách tar Docker named volume
Ví dụ backup postgres_data:
docker run --rm
-v postgres_data:/data:ro
-v /backup/volumes:/backup
alpine
tar czf /backup/postgres_data_$(date +%F).tar.gz -C /data .Với nhiều volume, có thể script:
#!/bin/sh
set -e
BACKUP_DIR="/backup/volumes"
mkdir -p "$BACKUP_DIR"
for volume in portainer_data postgres_data grafana_data n8n_data; do
docker run --rm
-v "$volume":/data:ro
-v "$BACKUP_DIR":/backup
alpine
tar czf "/backup/${volume}_$(date +%F_%H-%M-%S).tar.gz" -C /data .
done
Với database: ưu tiên dump logic
Database nên backup bằng công cụ native:
PostgreSQL:
docker exec postgres pg_dumpall -U postgres > /backup/postgres_dump_$(date +%F).sqlMySQL/MariaDB:
docker exec mysql mysqldump -u root -p --all-databases > /backup/mysql_dump_$(date +%F).sqlLý do: tar volume DB đang chạy có thể không nhất quán nếu không snapshot/freeze đúng. Dump logic dễ restore, dễ kiểm tra, ít lỗi hơn.
Backup bind mount và cấu hình host
Nếu stack dùng /opt, /srv, /etc/nginx, /etc/letsencrypt, cần backup trực tiếp:
rsync -aH --delete /opt/stacks/ /backup/files/opt-stacks/
rsync -aH --delete /srv/ /backup/files/srv/
rsync -aH --delete /etc/letsencrypt/ /backup/files/letsencrypt/Cần đặc biệt chú ý:
– Reverse proxy config
– SSL cert
– Upload directory
– App config
– .env
– Custom scripts
– Cron jobs
– Firewall rules/documentation
Tự động hóa backup
Backup thủ công dễ quên. Nên dùng cron/systemd timer.
Ví dụ cron chạy 2h sáng mỗi ngày:
crontab -eThêm:
0 2 * /usr/local/bin/backup-docker.sh >> /var/log/backup-docker.log 2>&1Script nên có:
– Timestamp – Log rõ – Kiểm tra lỗi – Retention, ví dụ giữ 7 ngày local – Upload offsite – Mã hóa nếu chứa secret – Thông báo lỗi qua email/Telegram/Slack
Xóa backup cũ:
find /backup -type f -name "*.tar.gz" -mtime +14 -deleteNguyên tắc thực tế: 3-2-1 backup:
– 3 bản dữ liệu – 2 loại lưu trữ khác nhau – 1 bản offsite
Ví dụ: server chính + NAS + S3.
Quy trình khôi phục Portainer
Giả sử server mới đã cài Docker.
1. Tạo volume mới
docker volume create portainer_data2. Giải nén backup vào volume
docker run --rm
-v portainer_data:/data
-v /backup/portainer:/backup
alpine
sh -c "cd /data && tar xzf /backup/portainer_data_2026-06-02_10-30-00.tar.gz"3. Chạy lại Portainer
docker compose up -dHoặc:
docker run -d
-p 9443:9443
--name portainer
--restart=always
-v /var/run/docker.sock:/var/run/docker.sock
-v portainer_data:/data
portainer/portainer-ce:latest4. Kiểm tra
Mở:
https://SERVER_IP:9443Kiểm tra:
– User đăng nhập được – Endpoint còn – Stack hiển thị đúng – Registry còn – Settings không lỗi – Version Portainer tương thích
Khôi phục stack và volume app
Quy trình khuyến nghị:
1. Restore Docker volumes/app data.
2. Restore bind mounts.
3. Restore .env, secrets.
4. Deploy stack từ Compose.
5. Kiểm tra log.
6. Kiểm tra app/data.
7. Kiểm tra backup mới sau khi ổn định.
Restore volume ví dụ:
docker volume create postgres_data
docker run --rm
-v postgres_data:/data
-v /backup/volumes:/backup
alpine
sh -c "cd /data && tar xzf /backup/postgres_data_2026-06-02.tar.gz"
Deploy stack:
cd /opt/stacks/postgres
docker compose up -dXem log:
docker logs -f postgresNếu DB restore từ dump, tạo container trước rồi import:
cat /backup/postgres_dump_2026-06-02.sql | docker exec -i postgres psql -U postgresLỗi thường gặp cần tránh
Chỉ backup Portainer, quên volume app
Kết quả: Portainer khôi phục đẹp, stack thấy đủ, nhưng app mất dữ liệu.
Fix: liệt kê tất cả volume:docker volume lsMap volume ↔ app. Backup từng volume quan trọng.
Dùng latest khi restore
latest có thể kéo version mới hơn → lỗi tương thích.
Fix: pin version:
image: portainer/portainer-ce:2.21.5Không test restore
Backup chưa test = giả định.
Fix: định kỳ restore thử trên VM/lab.Lưu backup trên cùng disk
Disk chết → backup chết theo.
Fix: offsite backup.Không mã hóa backup
Backup có secret, token, DB data.
Fix: dùnggpg, age, hoặc backup storage có encryption.
Ví dụ:
gpg -c portainer_data.tar.gzChecklist backup Portainer/Docker
– Portainer volume: portainer_data
– Portainer compose file
– Stack compose files
– .env files
– Docker named volumes
– Bind mounts
– Database dumps
– Secrets/API keys
– Reverse proxy config
– SSL certificates
– Backup offsite
– Retention policy
– Restore test định kỳ
Kết luận thực tế
Portainer giúp quản lý Docker dễ hơn, nhưng không phải phép màu backup. Muốn tránh mất stack, volume, cấu hình quan trọng, cần nhìn hệ thống theo 3 lớp:
– Portainer data → giữ UI, user, endpoint, stack metadata. – Stack/config files → tái dựng dịch vụ. – App data/volumes/database → giữ dữ liệu sống còn.
Chiến lược tốt nhất: backup Portainer trước mỗi upgrade, backup volume/database hằng ngày, lưu Compose trong Git private, đẩy backup ra nơi khác, mã hóa dữ liệu nhạy cảm, và quan trọng nhất: test restore. Khi sự cố xảy ra, thứ cứu bạn không phải niềm tin rằng “backup có chạy”, mà là bằng chứng rằng “restore đã từng thành công”.
Bình luận (0)
Chưa có bình luận. Hãy là người đầu tiên!