بمجرد التفكير في أتمتة نشر مشروعي. يرجى gitlab.com توفير جميع الأدوات اللازمة لذلك ، وبالطبع قررت استخدامه من خلال فرز نصوص نشر صغيرة وكتابتها. في هذه المقالة ، أشارك تجربتي مع المجتمع.
TL ؛ د
- تكوين VPS: تعطيل الجذر ، تسجيل الدخول إلى كلمة المرور ، تثبيت dockerd ، تكوين ufw
- إنشاء شهادات للخادم والعميل docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl تمكين التحكم في إرساء الجهاز عبر مأخذ tcp: قم بإزالة الخيار -H fd: / / من التكوين عامل ميناء.
- تسجيل مسارات الشهادة في docker.json
- التسجيل في متغيرات gitlab في إعدادات CI / CD مع محتويات الشهادة. اكتب نصي .gitlab-ci.yml للنشر.
سأعرض كل الأمثلة على مجموعة توزيع دبيان.
إعداد VPS الأولي
لذا فقد اشتريت مثيلًا على سبيل المثال في
DO ، فإن أول ما عليك فعله هو حماية الخادم الخاص بك من العالم الخارجي العدواني. لن أقوم بإثبات أي شيء أو المطالبة به ، فما عليك سوى عرض السجل / var / log / رسائل الخادم الظاهري:
أولاً ، قم بتثبيت جدار الحماية ufw:
apt-get update && apt-get install ufw
تشغيل السياسة الافتراضية: حظر جميع الاتصالات الواردة ، والسماح لجميع الاتصالات الصادرة:
ufw default deny incoming ufw default allow outgoing
هام: لا تنسى السماح بالاتصال ssh:
ufw allow OpenSSH
بناء الجملة العام هو: السماح باتصال منفذ: ufw allow 12345 ، حيث 12345 هو رقم المنفذ أو اسم الخدمة. الرفض: ufw الرفض 12345
قم بتشغيل جدار الحماية:
ufw enable
نترك الجلسة وتسجيل الدخول مرة أخرى عبر سه.
أضف المستخدم ، عيّنه كلمة مرور وأضفه إلى مجموعة sudo.
apt-get install sudo adduser scoty usermod -aG sudo scoty
بعد ذلك ، وفقًا للخطة ، يجب عليك تعطيل إدخال كلمة المرور. للقيام بذلك ، انسخ مفتاح ssh الخاص بك إلى الخادم:
ssh-copy-id root@10.101.10.28
يجب تحديد عنوان IP الخاص بالخادم. جرب الآن لتسجيل الدخول تحت المستخدم الذي تم إنشاؤه مسبقًا ، لم تعد بحاجة إلى إدخال كلمة مرور. بعد ذلك ، في إعدادات التكوين ، قم بتغيير التالي:
sudo nano /etc/ssh/sshd_config
تعطيل إدخال كلمة المرور:
PasswordAuthentication no
أعد تشغيل البرنامج الخفي sshd:
sudo systemctl reload sshd
الآن ، إذا حاولت أنت أو أي شخص آخر تسجيل الدخول كجذر ، فهذا لن ينجح.
بعد ذلك ، قم بتعيين dockerd ، لن أصف العملية هنا ، حيث يمكن تغيير كل شيء بالفعل ، اتبع الرابط إلى الموقع الرسمي وتصفح خطوات تثبيت docker على جهازك الظاهري:
https://docs.docker.com/install/linux/docker- م / ديبيان /شهادة الجيل
لإدارة البرنامج الخفي لرسو السفن عن بُعد ، يلزم وجود اتصال TLS مشفر. للقيام بذلك ، يجب أن يكون لديك شهادة ومفتاح ، والتي يجب إنشاؤها ونقلها إلى جهازك البعيد. اتبع الخطوات الموضحة في الإرشادات الموجودة على موقع عامل الإرساء الرسمي على الويب:
https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl كل ما تم إنشاؤه * .pem يجب وضع ملفات الخادم ، وهي ca.pem ، server.pem ، key.pem في دليل / etc / docker على الخادم.
Dockerd الإعداد
في البرنامج النصي لتشغيل البرنامج الخفي docker ، أزل الخيار -H df: // ، هذا الخيار يجيب على المضيف الذي يمكنه التحكم في البرنامج الخفي.
# At /lib/systemd/system/docker.service [Service] Type=notify ExecStart=/usr/bin/dockerd
بعد ذلك ، قم بإنشاء ملف إعدادات ، إذا لم يكن موجودًا بالفعل ووصف الخيارات:
/etc/docker/daemon.json { "hosts": [ "unix:///var/run/docker.sock", "tcp://0.0.0.0:2376" ], "labels": [ "is-our-remote-engine=true" ], "tls": true, "tlscacert": "/etc/docker/ca.pem", "tlscert": "/etc/docker/server.pem", "tlskey": "/etc/docker/key.pem", "tlsverify": true }
لنقم بتمكين الاتصالات على المنفذ 2376:
sudo ufw allow 2376
أعد تشغيل dockerd بالإعدادات الجديدة:
sudo systemctl daemon-reload && sudo systemctl restart docker
تحقق:
sudo systemctl status docker
إذا كان كل شيء أخضر ، فإننا نعتقد أننا نجحنا في تهيئة عامل ميناء على الخادم.
تكوين deleivery مستمر على gitlab
لكي يتمكن عامل gitalab من تنفيذ الأوامر على مضيف جهاز التحكم عن بعد ، من الضروري تحديد كيفية ومكان تخزين الشهادات والمفتاح الخاص بالاتصال المشفر مع dockerd. لقد قمت بحل هذه المشكلة بمجرد كتابتها في متغيرات في إعدادات gitlbab:
ما عليك سوى عرض محتويات الشهادات والمفتاح عبر cat:
cat ca.pem
. انسخ والصق في قيمة المتغيرات.
دعنا نكتب البرنامج النصي للنشر من خلال gitlab. سيتم استخدام صورة عامل الإرساء (dind).
.gitlab-ci.yml image: name: docker/compose:1.23.2 # entrypoint , dind entrypoint: ["/bin/sh", "-c"] variables: DOCKER_HOST: tcp://docker:2375/ DOCKER_DRIVER: overlay2 services: - docker:dind stages: - deploy deploy: stage: deploy script: - bin/deploy.sh #
محتوى البرنامج النصي للنشر مع التعليقات:
بن / نشر #!/usr/bin/env sh # , - set -e # , , set -v # DOCKER_COMPOSE_FILE=docker-compose.yml # DEPLOY_HOST=185.241.52.28 # , - gitlab- DOCKER_CERT_PATH=/root/.docker # , docker info docker-compose version # ( - gitlab') mkdir $DOCKER_CERT_PATH # , . echo "$CA_PEM" | tr -d '\r' > $DOCKER_CERT_PATH/ca.pem echo "$CERT_PEM" | tr -d '\r' > $DOCKER_CERT_PATH/cert.pem echo "$KEY_PEM" | tr -d '\r' > $DOCKER_CERT_PATH/key.pem # chmod 400 $DOCKER_CERT_PATH/ca.pem chmod 400 $DOCKER_CERT_PATH/cert.pem chmod 400 $DOCKER_CERT_PATH/key.pem # docker-. , export DOCKER_TLS_VERIFY=1 export DOCKER_HOST=tcp://$DEPLOY_HOST:2376 # , docker-compose \ -f $DOCKER_COMPOSE_FILE \ ps # docker-, "" docker login -u $DOCKER_USER -p $DOCKER_PASSWORD docker-compose \ -f $DOCKER_COMPOSE_FILE \ pull app # docker-compose \ -f $DOCKER_COMPOSE_FILE \ up -d app
كانت المشكلة الرئيسية هي "استخراج" محتويات الشهادات في شكلها الطبيعي من متغيرات gitlab CI / CD. لم أستطع فهم سبب عدم عمل الاتصال بالمضيف البعيد. على المضيف ، نظرت إلى سجل عامل الإيقاف sudu journalctl -u ، هناك خطأ في المصافحة. قررت إلقاء نظرة على ما يتم تخزينه بشكل عام في المتغيرات ، لذلك يمكنك رؤية cat -A $ DOCKER_CERT_PATH / key.pem. تم التغلب على الخطأ عن طريق إضافة إزالة رمز النقل tr -d '\ r'.
علاوة على ذلك في البرنامج النصي ، يمكنك إضافة مهام ما بعد النشر وفقًا لتقديرك. تستطيع أن ترى نسخة العمل في مستودع بلدي
https://gitlab.com/isqad/gitlab-ci-cd