๐ 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 ่จญๅฎๆชๅๆด。 ๅฐไธญๅฐๅ้็ผๅ้่่จ,้ๆจฃ็ๅไปฝๆนๆก่ถณไปฅๆๅฐ็ฝ้ฃๅพฉๅ้ๆฑ。
๐ ๅปถไผธ้ฑ่ฎ
- ⚙️ Network ่ชๅๅๅไปฝ่็ๆฌๆงๅถ:Ansible + GitLab ๅฏฆไฝๆๅญธ
- ๐พ Linux rsync ๅไปฝๅๆญฅๅฏฆๆฐ
- ๐ก Linux ๅฎๅ จๅผทๅ่้ฒ่ญท็ญ็ฅ
— WWFandy・่ชๅๅ้็ผ็ญ่จ
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ