備份在Docker中的Gitlab資料 (Backup Gitlab in Docker)

備份在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/

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)

參考資料