iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0
Odoo

Odoo 部署策略系列 第 27

docker volume 備份方案:volumerize 讓 odoo 備份更簡單

  • 分享至 

  • xImage
  •  

今天要來研究的是怎麼用 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

來測試吧
https://ithelp.ithome.com.tw/upload/images/20241012/20168935RhjJTt4PDQ.png

接下來備份

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  |   - &notifyApprise
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

https://ithelp.ithome.com.tw/upload/images/20241012/20168935vCxixfkcfI.png

成功


上一篇
又又又是 odoo 安全與效能:X-Sendfile、X-Accel、HSTS、Cookie 安全標記、Gzip 壓縮
下一篇
docker compose 和 certbot:(半)自動化 Let's Encrypt 憑證申請
系列文
Odoo 部署策略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言