راه اندازی سی دی از طریق gitlab

من یک بار در مورد خودکار کردن استقرار پروژه خود فکر کردم. gitlab.com با مهربانی همه ابزارها را برای این کار فراهم می کند، و البته من تصمیم گرفتم با کشف آن و نوشتن یک اسکریپت توسعه کوچک از آن استفاده کنم. در این مقاله تجربه خود را با جامعه به اشتراک می گذارم.

TL؛ DR

  1. راه اندازی VPS: غیرفعال کردن root، ورود رمز عبور، نصب dockerd، پیکربندی ufw
  2. تولید گواهی برای سرور و مشتری docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl کنترل dockerd را از طریق سوکت tcp فعال کنید: گزینه -H fd:// را از پیکربندی docker حذف کنید.
  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]

آی پی سرور باید مال شما باشد. اکنون سعی کنید در زیر کاربری ایجاد شده قبلی وارد شوید، دیگر نیازی به وارد کردن رمز عبور ندارید. بعد، در تنظیمات پیکربندی، موارد زیر را تغییر دهید:

sudo nano /etc/ssh/sshd_config

غیرفعال کردن ورود رمز عبور:

PasswordAuthentication no

دیمون sshd را مجددا راه اندازی کنید:

sudo systemctl reload sshd

حال اگر شما یا شخص دیگری بخواهید به عنوان روت وارد شوید، با شکست مواجه می شود.

بعد، ما dockerd را نصب می کنیم، من روند را در اینجا شرح نمی دهم، زیرا همه چیز را می توان تغییر داد، پیوند به وب سایت رسمی را دنبال کنید و مراحل نصب docker را در ماشین مجازی خود طی کنید: https://docs.docker.com/install/linux/docker-ce/debian/

تولید گواهینامه

برای کنترل داکر دیمون از راه دور، یک اتصال 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:// را حذف کنید، این گزینه می گوید که داکر دیمون روی کدام میزبان قابل کنترل است.

# 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/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 بود. من نتوانستم بفهمم چرا اتصال به میزبان راه دور کار نمی کند. من به گزارش sudo journalctl -u docker در هاست نگاه کردم، خطا در دست دادن وجود دارد. من تصمیم گرفتم به آنچه که به طور کلی در متغیرها ذخیره می شود نگاه کنم، برای این شما می توانید cat -A $DOCKER_CERT_PATH/key.pem را ببینید. با اضافه کردن حذف کاراکتر caret tr -d 'r' بر خطا غلبه کرد.

علاوه بر این، می توانید کارهای پس از انتشار را به صلاحدید خود به اسکریپت اضافه کنید. می توانید نسخه کار را در مخزن من بررسی کنید https://gitlab.com/isqad/gitlab-ci-cd

منبع: www.habr.com

اضافه کردن نظر