Backup Portainer: Cứu Stack, Volume, Cấu Hình Trước Khi Mất

P P T P Chung

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_data

Khi 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:latest

Trong /data, Portainer lưu:

User, password hash, team, roleEndpoint/environmentStack metadataRegistry configSettingsTLS/cert liên quanMộ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_data

Nế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 portainer

2. 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.yml

Rồ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.yml

Khô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 ls

Bạ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:/uploads

Cá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 Portainer

Bạ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 portainer

Tạ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 portainer

Kết quả:

/backup/portainer/portainer_data_2026-06-02_10-30-00.tar.gz

Nê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).sql

MySQL/MariaDB:

docker exec mysql mysqldump -u root -p --all-databases > /backup/mysql_dump_$(date +%F).sql

Lý 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 -e

Thêm:

0 2   * /usr/local/bin/backup-docker.sh >> /var/log/backup-docker.log 2>&1

Script 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 -delete

Nguyê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_data

2. 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 -d

Hoặ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:latest

4. Kiểm tra

Mở:

https://SERVER_IP:9443

Kiể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 -d

Xem log:

docker logs -f postgres

Nế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 postgres

Lỗ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 ls

Map 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.5

Khô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ùng gpg, age, hoặc backup storage có encryption.

Ví dụ:

gpg -c portainer_data.tar.gz

Checklist backup Portainer/Docker

Portainer volume: portainer_dataPortainer compose fileStack compose files.env filesDocker named volumesBind mountsDatabase dumpsSecrets/API keysReverse proxy configSSL certificatesBackup offsiteRetention policyRestore 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”.

Tác giả

P T P

Chia sẻ

Bài viết liên quan

Bình luận (0)

Email của bạn sẽ không được hiển thị công khai.

Chưa có bình luận. Hãy là người đầu tiên!