إعداد القرص المضغوط عبر gitlab

فكرت ذات مرة في أتمتة نشر مشروعي. يقدم موقع gitlab.com جميع الأدوات اللازمة لذلك ، وبالطبع قررت استخدامه من خلال اكتشافه وكتابة نص نشر صغير. في هذه المقالة ، أشارك تجربتي مع المجتمع.

TL؛ DR

  1. قم بإعداد VPS: تعطيل الجذر ، تسجيل الدخول بكلمة المرور ، تثبيت dockerd ، تكوين ufw
  2. إنشاء شهادات للخادم والعميل docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl تمكين التحكم في dockerd عبر مقبس tcp: قم بإزالة الخيار -H fd: // من تكوين عامل الإرساء.
  3. قم بتعيين المسارات على الشهادات في docker.json
  4. سجل في متغيرات gitlab في إعدادات CI / CD مع محتويات الشهادات. اكتب برنامج نصي .gitlab-ci.yml للنشر.

سأعرض جميع الأمثلة على توزيعة دبيان.

الإعداد الأولي VPS

هنا اشتريت على سبيل المثال على سبيل المثال DO، أول شيء تفعله هو حماية خادمك من العالم الخارجي العدواني. لن أقوم بإثبات أو تأكيد أي شيء ، سأقوم فقط بعرض سجل / var / log / messages لخادمي الظاهري:

لقطةإعداد القرص المضغوط عبر gitlab

أولاً ، قم بتثبيت جدار الحماية 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 deny 12345

قم بتشغيل جدار الحماية:

ufw enable

نقوم بالخروج من الجلسة وتسجيل الدخول مرة أخرى عبر ssh.

أضف مستخدمًا ، وخصص له كلمة مرور ، وأضفه إلى مجموعة sudo.

apt-get install sudo
adduser scoty
usermod -aG sudo scoty

بعد ذلك ، وفقًا للخطة ، يجب عليك تعطيل تسجيل الدخول بكلمة المرور. للقيام بذلك ، انسخ مفتاح ssh الخاص بك إلى الخادم:

ssh-copy-id [email protected]

يجب أن يكون عنوان IP الخاص بالخادم ملكًا لك. حاول الآن تسجيل الدخول باسم المستخدم الذي تم إنشاؤه مسبقًا ، فلن تحتاج إلى إدخال كلمة مرور بعد الآن. بعد ذلك ، في إعدادات التكوين ، قم بتغيير ما يلي:

sudo nano /etc/ssh/sshd_config

تعطيل تسجيل الدخول بكلمة المرور:

PasswordAuthentication no

أعد تشغيل البرنامج الخفي لـ sshd:

sudo systemctl reload sshd

الآن إذا حاولت أنت أو أي شخص آخر تسجيل الدخول كجذر ، فسوف يفشل.

بعد ذلك ، نقوم بتثبيت dockerd ، ولن أصف العملية هنا ، حيث يمكن بالفعل تغيير كل شيء ، اتبع الرابط إلى الموقع الرسمي وتصفح خطوات تثبيت docker على جهازك الافتراضي: https://docs.docker.com/install/linux/docker-ce/debian/

توليد الشهادة

للتحكم في برنامج Docker daemon عن بُعد ، يلزم وجود اتصال TLS مشفر. للقيام بذلك ، يجب أن يكون لديك شهادة ومفتاح تحتاجهما لإنشاء ونقل إلى جهازك البعيد. اتبع الخطوات الواردة في التعليمات الموجودة على موقع Docker الرسمي: 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 على الخادم.

إعداد عامل ميناء

في البرنامج النصي لبدء تشغيل docker daemon ، قم بإزالة الخيار -H df: // ، حيث يخبر هذا الخيار المضيف الذي يمكن التحكم فيه في برنامج Docker daemon.

# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd

بعد ذلك ، قم بإنشاء ملف إعدادات إذا لم يكن موجودًا بالفعل وقم بتعيين الخيارات:

/etc/docker/docker.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

إذا كان كل شيء أخضر ، فإننا نعتبر أننا قد نجحنا في تكوين عامل الإرساء على الخادم.

إعداد التسليم المستمر على gitlab

لكي يتمكن عامل gitalab من تنفيذ الأوامر على مضيف عامل الإرساء البعيد ، عليك أن تقرر كيف وأين يتم تخزين الشهادات ومفتاح للاتصال المشفر بـ dockerd. لقد قمت بحل هذه المشكلة ببساطة عن طريق الكتابة إلى المتغيرات في إعدادات gitlbab:

عنوان المفسدإعداد القرص المضغوط عبر gitlab

ما عليك سوى إخراج محتويات الشهادات والمفتاح عبر cat: cat ca.pem. انسخ والصق في قيم متغيرة.

لنكتب نصًا للنشر من خلال gitlab. سيتم استخدام صورة docker-in-docker (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 # скрипт деплоя тут

محتويات البرنامج النصي للنشر مع التعليقات:

bin / publish.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. لم أتمكن من معرفة سبب عدم عمل الاتصال بالمضيف البعيد. نظرت إلى sudo journalctl -u docker log على المضيف ، هناك خطأ في المصافحة. قررت أن أنظر إلى ما يتم تخزينه بشكل عام في المتغيرات ، لذلك يمكنك رؤية cat -A $ DOCKER_CERT_PATH / key.pem. تغلب على الخطأ بإضافة حذف حرف الإقحام tr -d 'r'.

علاوة على ذلك ، يمكنك إضافة مهام ما بعد الإصدار إلى البرنامج النصي وفقًا لتقديرك. يمكنك التحقق من نسخة العمل في مستودعي https://gitlab.com/isqad/gitlab-ci-cd

المصدر: www.habr.com

إضافة تعليق