گٹ لیب کے ذریعے سی ڈی سیٹ کرنا

میں نے ایک بار اپنے پروجیکٹ کی تعیناتی کو خودکار کرنے کے بارے میں سوچا۔ gitlab.com برائے مہربانی اس کے لیے تمام ٹولز فراہم کرتا ہے، اور یقیناً میں نے اس سے فائدہ اٹھانے کا فیصلہ کیا، اس کا پتہ لگا کر اور ایک چھوٹی تعیناتی اسکرپٹ لکھی۔ اس مضمون میں میں کمیونٹی کے ساتھ اپنے تجربے کا اشتراک کرتا ہوں۔

TL؛ ڈاکٹر

  1. VPS سیٹ اپ کریں: روٹ کو غیر فعال کریں، پاس ورڈ کے ساتھ لاگ ان کریں، dockerd انسٹال کریں، ufw کنفیگر کریں
  2. سرور اور کلائنٹ کے لیے سرٹیفکیٹ تیار کریں۔ docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl tcp ساکٹ کے ذریعے dockerd کنٹرول کو فعال کریں: docker config سے -H fd:// آپشن کو ہٹا دیں۔
  3. docker.json میں سرٹیفکیٹس کے راستے رجسٹر کریں۔
  4. سرٹیفکیٹس کے مواد کے ساتھ CI/CD سیٹنگز میں gitlab متغیرات میں رجسٹر ہوں۔ تعیناتی کے لیے ایک اسکرپٹ .gitlab-ci.yml لکھیں۔

میں Debian کی تقسیم پر تمام مثالیں دکھاؤں گا۔

ابتدائی VPS سیٹ اپ

تو آپ نے مثال کے طور پر ایک مثال خریدی۔ DOسب سے پہلے آپ کو اپنے سرور کو جارحانہ بیرونی دنیا سے بچانا ہے۔ میں کچھ ثابت یا دعویٰ نہیں کروں گا، میں صرف اپنے ورچوئل سرور کے log/var/log/messages دکھاؤں گا۔

اسکرین شاٹگٹ لیب کے ذریعے سی ڈی سیٹ کرنا

سب سے پہلے، ufw فائر وال انسٹال کریں:

apt-get update && apt-get install ufw

آئیے پہلے سے طے شدہ پالیسی کو فعال کریں: تمام آنے والے کنکشن کو بلاک کریں، تمام باہر جانے والے کنکشن کی اجازت دیں:

ufw default deny incoming
ufw default allow outgoing

اہم: ssh کے ذریعے کنکشن کی اجازت دینا نہ بھولیں:

ufw allow OpenSSH

عمومی نحو مندرجہ ذیل ہے: پورٹ کے ذریعے کنکشن کی اجازت دیں: ufw 12345 اجازت دیں، جہاں 12345 پورٹ نمبر یا سروس کا نام ہے۔ انکار کریں: ufw انکار 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 انسٹال کریں، میں یہاں اس عمل کی وضاحت نہیں کروں گا، کیونکہ سب کچھ پہلے ہی تبدیل کیا جا سکتا ہے، سرکاری ویب سائٹ کے لنک پر عمل کریں اور اپنی ورچوئل مشین پر ڈوکر انسٹال کرنے کے مراحل سے گزریں: https://docs.docker.com/install/linux/docker-ce/debian/

سرٹیفکیٹ تیار کرنا

ڈوکر ڈیمون کو دور سے کنٹرول کرنے کے لیے، ایک خفیہ کردہ 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 ترتیب دینا

ڈوکر ڈیمون لانچ اسکرپٹ میں، ہم -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 پر مسلسل ڈیلیوری ترتیب دینا

گیٹلابا ورکر کے لیے ریموٹ ڈوکر ہوسٹ پر کمانڈز پر عمل درآمد کرنے کے قابل ہونے کے لیے، یہ فیصلہ کرنا ضروری ہے کہ سرٹیفکیٹس کو کیسے اور کہاں اسٹور کیا جائے اور Dockerd کے ساتھ انکرپٹڈ کنکشن کی کلید۔ میں نے gitlbab کی ترتیبات میں متغیرات میں درج ذیل کو شامل کرکے اس مسئلے کو حل کیا:

سپوئلر ٹائٹلگٹ لیب کے ذریعے سی ڈی سیٹ کرنا

صرف سرٹیفکیٹ کے مواد اور کلید کو بلی کے ذریعے آؤٹ پٹ کریں: 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

اصل مسئلہ سرٹیفکیٹس کے مواد کو گٹلیب CI/CD متغیرات سے عام شکل میں "کھینچنا" تھا۔ میں یہ نہیں سمجھ سکا کہ ریموٹ ہوسٹ سے کنکشن کیوں کام نہیں کر رہا ہے۔ میزبان پر میں نے log sudo journalctl -u docker کو دیکھا، مصافحہ کے دوران ایک خرابی تھی۔ میں نے یہ دیکھنے کا فیصلہ کیا کہ عام طور پر متغیرات میں کیا ذخیرہ کیا جاتا ہے؛ ایسا کرنے کے لیے، آپ اس طرح دیکھ سکتے ہیں: cat -A $DOCKER_CERT_PATH/key.pem۔ میں نے کیریج کریکٹر tr -d 'r' کو ہٹا کر غلطی پر قابو پا لیا۔

اس کے بعد، آپ اپنی صوابدید پر اسکرپٹ میں ریلیز کے بعد کے کام شامل کر سکتے ہیں۔ آپ میرے ذخیرے میں ورکنگ ورژن دیکھ سکتے ہیں۔ https://gitlab.com/isqad/gitlab-ci-cd

ماخذ: www.habr.com

نیا تبصرہ شامل کریں