من یک بار در مورد خودکار کردن استقرار پروژه خود فکر کردم. gitlab.com با مهربانی همه ابزارها را برای این کار فراهم می کند، و البته من تصمیم گرفتم با کشف آن و نوشتن یک اسکریپت توسعه کوچک از آن استفاده کنم. در این مقاله تجربه خود را با جامعه به اشتراک می گذارم.
TL؛ DR
راه اندازی VPS: غیرفعال کردن root، ورود رمز عبور، نصب dockerd، پیکربندی ufw
مسیرهایی را برای گواهی ها در docker.json تنظیم کنید
در متغیرهای gitlab در تنظیمات CI / CD با محتویات گواهی ها ثبت نام کنید. یک اسکریپت gitlab-ci.yml. برای استقرار بنویسید.
من تمام نمونه های توزیع دبیان را نشان خواهم داد.
راه اندازی اولیه VPS
در اینجا شما یک نمونه را برای مثال خریدید DO، اولین کاری که باید انجام دهید این است که از سرور خود در برابر دنیای تهاجمی خارج محافظت کنید. من چیزی را اثبات یا ادعا نمی کنم، فقط گزارش /var/log/messages سرور مجازی خود را نشان می دهم:
عکس صفحه
ابتدا فایروال ufw را نصب کنید:
apt-get update && apt-get install ufw
سیاست پیشفرض را فعال کنید: همه اتصالات ورودی را مسدود کنید، همه اتصالات خروجی را مجاز کنید:
آی پی سرور باید مال شما باشد. اکنون سعی کنید در زیر کاربری ایجاد شده قبلی وارد شوید، دیگر نیازی به وارد کردن رمز عبور ندارید. بعد، در تنظیمات پیکربندی، موارد زیر را تغییر دهید:
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
در مرحله بعد، اگر فایل تنظیمات موجود نیست، ایجاد کنید و گزینه های زیر را تنظیم کنید:
اگر همه چیز سبز است، در نظر می گیریم که داکر را با موفقیت در سرور پیکربندی کرده ایم.
راه اندازی تحویل مداوم در gitlab
برای اینکه کارگر gitalab بتواند دستورات را بر روی یک میزبان داکر راه دور اجرا کند، باید تصمیم بگیرید که چگونه و کجا گواهینامه ها و یک کلید برای اتصال رمزگذاری شده به dockerd ذخیره شود. من این مشکل را با نوشتن روی متغیرهای موجود در تنظیمات gitlbab حل کردم:
عنوان اسپویلر
فقط محتویات گواهی ها و کلید را از طریق cat خروجی بگیرید: cat ca.pem. کپی و در مقادیر متغیر پیست کنید.
بیایید یک اسکریپت برای استقرار از طریق gitlab بنویسیم. تصویر docker-in-docker (dind) استفاده خواهد شد.
#!/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