็†ฑ้–€ๅˆ†้กž
 ่ผ‰ๅ…ฅไธญ…
็›ฎ้Œ„

๐Ÿ Python ่‡ชๅ‹•ๅŒ–ๅ‚™ไปฝ่…ณๆœฌๆ•™ๅญธ:GitLab API + ๅฎšๆ™‚ไปปๅ‹™

    ๐Ÿ 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:

    1. ็™ปๅ…ฅ GitLab → ้ปž้ธๅ€‹ไบบ้ ญๅƒ → Access Tokens
    2. Scopes ้ธๆ“‡ apiread_repository
    3. ่ค‡่ฃฝ 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・่‡ชๅ‹•ๅŒ–้–‹็™ผ็ญ†่จ˜

    ๐Ÿ”— ๅˆ†ไบซ้€™็ฏ‡ LINE Facebook X

    ๆฒ’ๆœ‰็•™่จ€:

    ๅผต่ฒผ็•™่จ€

    ๅญ—็ดš