🐍 Python 自動化備份腳本教學:GitLab API + 定時任務
維運環境中,專案版本庫或設定檔的每日備份是不可或缺的安全機制。 本文示範如何使用 Python 搭配 GitLab API, 以程式自動化方式備份專案、下載檔案,並透過 cron 定時任務自動執行, 讓你在不開 CI/CD 的情況下也能安全保存所有專案版本。
📦 一、環境準備
# 安裝所需套件
sudo apt update
sudo apt install -y python3 python3-pip
pip install python-gitlab requests
設定 GitLab Personal Access Token:
- 登入 GitLab → 點選個人頭像 →
Access Tokens - Scopes 選擇
api、read_repository - 複製 Token(後續腳本中會用到)
🧠 二、基本備份腳本
#!/usr/bin/env python3
import gitlab
import os
import datetime
# GitLab 連線設定
GITLAB_URL = "https://gitlab.com"
PRIVATE_TOKEN = "YOUR_TOKEN_HERE"
BACKUP_DIR = "/home/admin/gitlab_backup"
# 初始化 GitLab API
gl = gitlab.Gitlab(GITLAB_URL, private_token=PRIVATE_TOKEN)
gl.auth()
# 確保備份資料夾存在
os.makedirs(BACKUP_DIR, exist_ok=True)
today = datetime.date.today().strftime("%Y-%m-%d")
for project in gl.projects.list(owned=True, all=True):
name = project.path_with_namespace.replace("/", "_")
file_path = f"{BACKUP_DIR}/{name}_{today}.tar.gz"
print(f"⬇️ 下載 {project.name} 中 ...")
try:
export = project.exports.create()
export.refresh()
export.download(streamed=True, action="download", filepath=file_path)
print(f"✅ 完成備份:{file_path}")
except Exception as e:
print(f"❌ 錯誤:{e}")
執行備份:
python3 gitlab_backup.py
執行後會自動將所有專案匯出為 .tar.gz 並保存在指定目錄。
🔧 三、加入自動刪除舊備份功能
import time
RETENTION_DAYS = 7
for file in os.listdir(BACKUP_DIR):
fpath = os.path.join(BACKUP_DIR, file)
if os.path.isfile(fpath):
mtime = os.path.getmtime(fpath)
if (time.time() - mtime) > RETENTION_DAYS * 86400:
os.remove(fpath)
print(f"🧹 刪除舊檔案:{file}")
🕒 四、設定定時任務(cron job)
crontab -e
# 每天凌晨 3 點執行
0 3 * * * /usr/bin/python3 /home/admin/gitlab_backup.py >> /var/log/gitlab_backup.log 2>&1
建議將 log 輸出到 /var/log,方便日後檢查執行狀況。
🚀 五、延伸應用
- 將
BACKUP_DIR改為掛載的 NAS 或遠端目錄。 - 搭配
rclone上傳至 Google Drive / Dropbox。 - 與前一篇 Ansible + GitLab 備份整合 串聯使用。
🧭 行動清單(Checklist)
✅ 建立 GitLab Token 並設定權限
✅ 撰寫 Python 備份腳本(含錯誤處理)
✅ 實作自動清除過期檔案
✅ 新增 cron job 每日自動執行
✅ 檢查 log 確保執行成功
📘 結語
使用 Python 操控 GitLab API 是輕量又靈活的自動化方式, 不僅能每日備份專案,也能擴充為版本同步、Issue 匯出或 CI 設定檔備援。 對中小型開發團隊而言,這樣的備份方案足以應對災難復原需求。
🔗 延伸閱讀
— WWFandy・自動化開發筆記
沒有留言: