今天要來研究的是怎麼用 volumerize 來備份 docker 的 volume,首先釐清要達成的 scope,我用這個功能主要不是拿來確保資料不丟失的,因為我的整個 docker 是放在 vm 中的,而這個 vm 我本來就有做定期的備份,而是如果我有什麼操作失誤,或是要測試某個狀態下的行為,可以快速的回到相對精準的時間點,而不是只能回到一周為單位的備份。
而目前我們有儲存 odoo 資料的地方有兩個,一個是資料庫 bind db-dev-data:/var/lib/postgresql/data
用來儲存資料庫的內容,另一個是 odoo bind odoo-dev-data:/var/lib/odoo
,用來儲存一些檔案或是附件,
首先是新增的 docker-compose.yml,因為原作者的 https://hub.docker.com/r/blacklabelops/volumerize 蠻久沒更新,我是採用 https://github.com/pumbaasdad/volumerize 這邊的,但她 docker hub 沒有,所以是 submodule 的形式來裝
volumerize:
build: ./volumerize
restart: unless-stopped
volumes:
- odoo-dev-data:/source/odoo-dev-data:ro
- db-dev-data:/source/db-dev-data:ro
- odoo-prod-data:/source/odoo-prod-data:ro
- db-prod-data:/source/db-prod-data:ro
- ./backup:/backup # Use a folder for backups
- volumerize-cache:/volumerize-cache # Cache for Duplicity
environment:
- VOLUMERIZE_SOURCE=/source
- VOLUMERIZE_TARGET=file:///backup
- VOLUMERIZE_JOBBER_TIME=0 0 * * * * # Hourly incremental backups
- VOLUMERIZE_FULL_IF_OLDER_THAN=1D # Daily full backups
- REMOVE_OLDER_THAN=7D # Remove backups older than 7 days
- TZ=Asia/Taipei
volumerize-restore:
build: ./volumerize
restart: no # Don't restart this service by default
profiles:
- restore
network_mode: none
volumes:
- odoo-dev-data:/source/odoo-dev-data
- db-dev-data:/source/db-dev-data
- odoo-prod-data:/source/odoo-prod-data
- db-prod-data:/source/db-prod-data
- ./backup:/backup # Use a folder for backups
- volumerize-cache:/volumerize-cache # Cache for Duplicity
environment:
- VOLUMERIZE_SOURCE=/source
- VOLUMERIZE_TARGET=file:///backup
- VOLUMERIZE_JOBBER_TIME=0 0 * * * * # Hourly incremental backups
- VOLUMERIZE_FULL_IF_OLDER_THAN=1D # Daily full backups
- REMOVE_OLDER_THAN=7D # Remove backups older than 7 days
- TZ=Asia/Taipei
command: restore -t 2024-10-11T23:49:18+08:00
來測試吧
接下來備份
docker-compose exec volumerize backup
No valid action found. Will imply 'backup' because a path source was given and target is a url location.
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: Fri Oct 11 22:40:53 2024
--------------[ Backup Statistics ]--------------
StartTime 1728661758.92 (Fri Oct 11 23:49:18 2024)
EndTime 1728661759.48 (Fri Oct 11 23:49:19 2024)
ElapsedTime 0.56 (0.56 seconds)
SourceFiles 5898
SourceFileSize 248675285 (237 MB)
NewFiles 23
NewFileSize 657077 (642 KB)
DeletedFiles 1
ChangedFiles 26
ChangedFileSize 34341174 (32.8 MB)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 50
RawDeltaSize 1120943 (1.07 MB)
TotalDestinationSizeChange 120860 (118 KB)
Errors 0
-------------------------------------------------
running /postexecute/backup/0-removeoldbackup.sh
Checking if old backups should be removed
Removing all backups older than 7D if they are no more recent ones that depend on them
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: Fri Oct 11 22:40:53 2024
No old backup sets found, nothing deleted.
remove-older-than finished
running /postexecute/backup/1-replicate.sh
列出備份列表
docker-compose exec volumerize list
Last full backup date: Fri Oct 11 22:40:53 2024
Collection Status
-----------------
Connecting with backend: BackendWrapper
Archive dir: /volumerize-cache/3fe07cc0f71075f95f411fb55ec60120
Found 0 secondary backup chain(s).
Found primary backup chain with matching signature chain:
-------------------------
Chain start time: Fri Oct 11 22:40:53 2024
Chain end time: Fri Oct 11 23:49:18 2024
Number of contained backup sets: 38
Total number of contained volumes: 38
Type of backup set: Time: Num volumes:
Full Fri Oct 11 22:40:53 2024 1
Incremental Fri Oct 11 22:42:00 2024 1
Incremental Fri Oct 11 22:43:00 2024 1
...
Incremental Fri Oct 11 23:12:00 2024 1
Incremental Fri Oct 11 23:22:01 2024 1
Incremental Fri Oct 11 23:31:28 2024 1
Incremental Fri Oct 11 23:49:18 2024 1
-------------------------
No orphaned or incomplete backup sets found.
停掉容器們,這可能不需要拉 但我先這樣測試
docker-compose down
[+] Running 11/11
✔ Container webapp-deployment-postgresql-admin-1 Removed 3.5s
✔ Container webapp-deployment-static-brand-1 Removed 1.3s
✔ Container webapp-deployment-odoo-prod-1 Removed 2.1s
✔ Container webapp-deployment-reverse-proxy-1 Removed 2.8s
✔ Container webapp-deployment-odoo-dev-1 Removed 2.4s
✔ Container webapp-deployment-volumerize-1 Removed 1.0s
✔ Container webapp-deployment-postgresql-prod-1 Removed 1.0s
✔ Container webapp-deployment-postgresql-dev-1 Removed 1.0s
✔ Network webapp-deployment_prod-net Removed 0.2s
✔ Network webapp-deployment_default Removed 0.4s
✔ Network webapp-deployment_dev-net Removed 0.7s
restore -t 2024-10-11T23:49:18+08:00
我去把 restore 的改成我要回去的時間,也可以用相對時間 -t 3D 三天前
啟動 restore
docker-compose up volumerize-restore
[+] Running 1/1
✔ Container webapp-deployment-volumerize-restore-1 Recreated 0.1s
Attaching to volumerize-restore-1
volumerize-restore-1 | version: 1.4
volumerize-restore-1 |
volumerize-restore-1 | resultSinks:
volumerize-restore-1 | - &stdoutSink
volumerize-restore-1 | type: stdout
volumerize-restore-1 | data:
volumerize-restore-1 | - stdout
volumerize-restore-1 | - stderr
volumerize-restore-1 | - ¬ifyApprise
volumerize-restore-1 | type: program
volumerize-restore-1 | path: /opt/volumerize/notify_apprise.py
volumerize-restore-1 |
volumerize-restore-1 | prefs:
volumerize-restore-1 | runLog:
volumerize-restore-1 | type: file
volumerize-restore-1 | path: /var/log/jobber-runs
volumerize-restore-1 | maxFileLen: 100m
volumerize-restore-1 | maxHistories: 2
volumerize-restore-1 |
volumerize-restore-1 | jobs:
volumerize-restore-1 |
volumerize-restore-1 | VolumerizeBackupJob:
volumerize-restore-1 | cmd: /etc/volumerize/periodicBackup
volumerize-restore-1 | time: '0 0 * * * *'
volumerize-restore-1 | onError: Continue
volumerize-restore-1 | notifyOnError:
volumerize-restore-1 | - *stdoutSink
volumerize-restore-1 | - *notifyApprise
volumerize-restore-1 | notifyOnFailure:
volumerize-restore-1 | - *stdoutSink
volumerize-restore-1 | - *notifyApprise
volumerize-restore-1 |
volumerize-restore-1 | Local and Remote metadata are synchronized, no sync needed.
volumerize-restore-1 | Last full backup date: Fri Oct 11 22:40:53 2024
volumerize-restore-1 exited with code 0
重啟容器們
docker-compose up
[+] Running 11/11
✔ Network webapp-deployment_dev-net Created 0.0s
✔ Network webapp-deployment_default Created 0.0s
✔ Network webapp-deployment_prod-net Created 0.0s
✔ Container webapp-deployment-postgresql-admin-1 Created 0.1s
✔ Container webapp-deployment-postgresql-dev-1 Created 0.1s
✔ Container webapp-deployment-volumerize-1 Created 0.1s
✔ Container webapp-deployment-postgresql-prod-1 Created 0.1s
✔ Container webapp-deployment-static-brand-1 Created 0.1s
✔ Container webapp-deployment-reverse-proxy-1 Created 0.1s
✔ Container webapp-deployment-odoo-dev-1 Created 0.1s
✔ Container webapp-deployment-odoo-prod-1 Created 0.1s
成功