備份在Docker中的Gitlab資料 (Backup Gitlab in Docker)
查看Gitlab的設定值
Gitlab 的設定值由gitlab.rb
這個檔案控管
先找到這個檔案的路徑,確認看看是否有要修改的地方
由於是服務是運行在 Docker 的 Container 裡面
根據執行時是否加入 Volume 參數
- 如果有設定 Docker 的 Volume
- 可以直接去當初 volume 設定的本地路徑
- 如果沒有,就得進到 Container 裡面去找
- 進到 Container
docker attach gitlab
- 查看與修改設定
sudo nano /etc/gitlab/
- 進到 Container
Volume 可以使 Container 裡面的檔案路徑
對應到實體主機的檔案路徑
例如: –volume /gitlab/config:/etc/gitlab
會使本地的 /gitlab/config 對應到 Container 裡的 /etc/gitlab
修改、確認設定值
gitlab.rb
裡面的備份設定區塊
可以設定
- 是否要啟用備份
- 備份到哪個路徑
- 備份出來的檔案權限
- 備份哪個schema
- 備份出來的檔案,多久後過期 (預設為7天)
### Backup Settings
###! Docs: https://docs.gitlab.com/omnibus/settings/backups.html
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
###! Docs: https://docs.gitlab.com/ce/raketasks/backup_restore.html#backup- archive-permissions
gitlab_rails['backup_archive_permissions'] = 0644
gitlab_rails['backup_pg_schema'] = 'public'
###! The duration in seconds to keep backups before they are allowed to be deleted
gitlab_rails['backup_keep_time'] = 604800
如果這些預設值都已經符合需求
就可以直接前往下一步
如果有修改
就需要在儲存後,執行刷新設定的指令
## In Container
gitlab-ctl reconfigure
## 在本機執行,前面要加上 docker exec -it gitlab
docker exec -it gitlab gitlab-ctl reconfigure
執行備份
執行指令
## In Container
gitlab-rake gitlab:backup:create
## 在本機執行,前面要加上 docker exec -it gitlab
docker exec -it gitlab-rake gitlab:backup:create
跑出一大堆東西後就可以去看
備份路徑內是否出現了 gitlab_backup.tar 的備份檔案
Creating backup archive: 1609235127_2020_12_29_12.9.2_gitlab_backup.tar ... done
Uploading backup archive to remote storage ... skipped
Deleting tmp directories ... done
done
done
...
利用 Crontab 來自動執行備份
測試完可以手動備份後
來建立要執行的腳本
以及設定 Crontab 的排程計畫
創建要執行的 shell script
#!/bin/bash
docker exec -i gitlab gitlab-rake gitlab:backup:create
這邊值得注意的是
前面的指令docker exec -it
這裡要改成docker exec -i
在 Crontab 執行時加入 -t 參數會有錯誤
Docker 的 exec 指令參數為:
docker exec [OPTIONS] CONTAINER COMMAND [ARG…]
(-d:背景進行;-i:保持STDIN打開,看到印出結果;-t:分配一個虛擬終端)
https://docs.docker.com/engine/reference/commandline/exec/
創建 Crontab 的排程計畫
下面的例子是 每天 22:30 的時候執行備份的 shell script
並且將印出的 log 重導放置於 cronlog.txt
以供出錯時查看
# backup gitlab
30 22 * * * /bin/sh /gitlab/data/backups/auto_backup.sh > /gitlab/data/backups/cronlog.txt 2>&1
刪除多餘的備份檔?
在其他文章有看到
他另外建立了刪除備份檔的 shell script 與 排程
不過經測試後發現
由於前面已經設置了備份過期的時間
gitlab.rb 的 gitlab_rails['backup_keep_time']
所以在每次執行備份指令時
會檢查哪些備份檔已經過期
並且自動刪除
如下面範例的最後一行
Creating backup archive: 1609235127_2020_12_29_12.9.2_gitlab_backup.tar ... done
Uploading backup archive to remote storage ... skipped
Deleting tmp directories ... done
done
done
done
done
done
done
done
Deleting old backups ... done. (2 removed)