Featured image of post Docker compose Gitops مع Github Actions

Docker compose Gitops مع Github Actions

هذا المقال متوفر ايضا على مجتمع أسس هنا

السلام عليكم ورحمة الله وبركاته. اغلب المهتمين بالحوسبة السحابية قد سمعو سابقا بمصطلح Gitops, وكيف انه يعدّ نقله نوعية بإدارة الحاويات, بدلا من ادارتها يدويا. لكن عندما نبحث عن مصطلح Gitops نجد اغلب المصادر تستخدم عن Kubernetes. لكن ماذا عن Compose؟ الذي مازال ابسط بمراحل ويكفي في العديد من الاستخدامات؟

لذلك قمت بعمل مشروع docker-compose-gitops-action, وهو Github Action يقوم بتشغيل الحاويات على الخادم عن بعد, ويسمح لك بإدارتها من داخل مستودع Git على Github. وهو يدعم استخدامات متقدمه, مثل Swarm أو رفع ملفات مرافقه للحاويه. وحتى يمكن استخدامه على خادم منزلي دون فتح منافذ بواسطة Tailscale SSH.

هل Tailscale مفتوح المصدر؟ واجهه وخادم Tailscale الرسمي ليس مفتوح المصدر, لكن كل تطبيقاتهم مفتوحة, والآن اصبحُ يدعمون تطوير Headscale بشكل رسمي, وهو خادم مهندس بشكل عكسي ليقدم كامل خِدْمَات Tailscale لكنه مفتوح المصدر و يمكن استضافته محليا, و سيدعم Tailscale SSH قريبا

تجهيز الخادم

الaction يدعم وضعين للوصول, اما SSH عادي, او Tailscale SSH فائدة Tailscale SSH الأساسية هي عدم الحاجه لفتح منافذ للوصول للخادم, بالإضافة لعدم الحاجه لإدارة مفاتيح يدويا.

ستحتاج لمستخدم له وصول لDocker دون Sudo, قد يكون مستخدم غير المستخدم الأساسي على الخادم.

تجهيز المستودع

هناك طريقتين لاستخدام الAction

مجلد لكل مشروع

يعني سيكون هناك مجلد لكل مشروع/خدمة, داخله يكون Docker-compose.yml بالإضافة الى أي ملفات إضافية مثل ملفات للإعدادات, وسيتم تشغيل الAction في حاله حصول اي تعديل داخل هذا المجلد. ولن تحتاج لتحديث كل شيء اذا تعديل لمشروع محدد فقط.

مِلَفّ واحد لكل المستودع

هذا الخِيار يناسب الخوادم صغيره. مِلَفّ Compose واحد في نصف المستودع, يحتوي كل الحاويات والشبكات المستخدمة.

استخدام الAction

أولا يجب اضافه معلومات الوصول للخادم, سواءا مفتاح SSH بصيغة PEM أو مفتاح Tailscale لاستخدامات مؤقته “ephemeral”.

ماهو مفتاح لاستخدامات مؤقته “ephemeral key” في حاله actions, عندما يتم تشغيله كل مره, يعدّ جهاز جديد وفقط يعمل مره واحد ثم يحذف. لذلك يعتبر جهاز مؤقت “ephermal node” واستخدام مفتاح مؤقت, يجعل اي جهاز يستخدم مؤقت ويحذف بعد توقفه بفترة قصيرة.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
name: deploy-project

on:
  push:
    paths:
      - 'project/**'
      - '.github/**'
    branches: [main]
  workflow_dispatch:

jobs:
  deploy:
    runs-on: ubuntu-latest
    if: github.event_name != 'pull_request'
    steps:
      - name: checkout
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Tailscale
        uses: tailscale/github-action@ce41a99162202a647a4b24c30c558a567b926709
        with:
          authkey: ${{ secrets.TAILSCALE_AUTHKEY }}
          hostname: Github-actions

      - uses: aosus/docker-compose-gitops-action@v1
        name: Remote Deployment
        with:
          remote_docker_host: [email protected]
          args: -p project up -d
          tailscale_ssh: true
          compose_file_path: docker-compose.yml
          upload_directory: true
          #post_upload_command: touch "upload_command.txt"
          docker_compose_directory: project

عند تعديل ملف داخل .github او تعديل شيء داخل project سيتم تشغيل الaction. بما أنني فعلت upload_directory سيقوم برفع الملفات في project الى الخادم ثم تشغيل الحاويات من docker-compose.yml.

اذا تريد استخدام SSH العادي, فقط استبدل tailscale_ssh: true:

1
2
        ssh_public_key: ${{ secrets.SSH_KEY }}
        ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }}

وعين القيم في صفحه القيم السرية في Github. اذا تحتاج لإصلاح الصلاحيات الخاصة بالملفات قبل تشغيل الحاوية, بإمكانك استخدام post_upload_command, لكن تغيير صلاحيات الملفات معظم الوقت يحتاج لsudo.

أدارة كلمات المرور والقيم السرية في ملفات compose

عندما يحتوي مِلَفّ docker-compose.yml على قيم سرية مثل كلمة مرور قاعدة بيانات, يجب عدم رفعها لمستودع git لعدم كشفها. الحل بهذه الحالة استخدام متغيرات النظام, و اخذ قيمها من خزينه اسرار github.

لا تحدد قيمة للمتغير داخل مِلَفّ compose

1
2
3

environment:
- VAR

حدد القيمة في github actions

1
2
3
4
5
6
- name: Start Deployment
  uses: FarisZR/docker-compose-gitops-action@v1
  env:
    MARIADB_PASSWORD: ${{ secrets.gnulinuxsa_wordpress_mariadb_password }}
  with:
    remote_docker_host: ${{ secrets.server_address }}

والآن من المفترض ان يصبح كل شيء جاهز!, اصبح لديك Gitops مع Docker-compose!

FarisZR
مبني بستخدام Hugo
قالب Stack مصمم من Jimmy