Konfigurimi i CD përmes gitlab

Mendoj një herë se si të automatizoj shpërndarjen e projektit tim. gitlab.com ofron të gjitha mjetet për këtë, dhe unë vendosa t'i përdor, duke e kuptuar dhe shkruar një skenar të vogël për shpërndarjen. Në këtë artikull ndaja përvojën time me komunitetin.

TL;DR

  1. Konfiguro VPS: çaktivizo root, hyrja me fjalëkalim, instaloni dockerd, konfiguro ufw
  2. Gjeneroni certifikatat për serverin dhe klientin docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Aktivizo menaxhimin e dockerd përmes soketëve tcp: hiq opsionin -H fd:// nga konfigurimi i Dockerit.
  3. Прописать пути до сертификатов в docker.json
  4. Shkruani në variablat gitlab në cilësimet CI/CD përmbajtjen e certifikatave. Shkruani skenarin .gitlab-ci.yml për shpërndarjen.

Të gjitha shembujt do t'i tregoj mbi distribucionin Debian.

Konfigurimi fillestar i VPS

Keni blerë një instancë për shembull në DO, e para gjë që duhet të bëni është të mbroni serverin tuaj nga bota agresive e jashtme. Nuk do të provoj asgjë dhe nuk do të them asgjë, thjesht do të tregoj logun /var/log/messages të serverit tim virtual:

ShkrepKonfigurimi i CD përmes gitlab

Së pari, do të instalojmë firewal-in ufw:

apt-get update && apt-get install ufw

Do të aktivizojmë politikën e parazgjedhur: bllokoni të gjitha lidhjet e ardhshme, lejoni të gjitha lidhjet e daljes:

ufw default deny incoming
ufw default allow outgoing

Është e rëndësishme: mos harroni të lejoni lidhjen për ssh:

ufw allow OpenSSH

Sintaksa e përgjithshme është kështu: Lejoni lidhjen në port: ufw allow 12345, ku 12345 është numri i portit ose emri i shërbimit. Ndalo: ufw deny 12345

Aktivizoni firewall-in:

ufw enable

Dilni nga sesioni dhe regjistrohuni përsëri me ssh.

Shtoni përdoruesin, caktoni një fjalëkalim dhe shtojeni atë në grupin sudo.

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

Më pas në plan është të çaktivizoni hyrjen me fjalëkalim. Për këtë kopjoni çelësin tuaj ssh në server:

ssh-copy-id root@10.101.10.28

IP e serverit duhet të jetë e juaja. Tani provoni të regjistroheni me përdoruesin e krijuar më parë, nuk është e nevojshme të vendosni më fjalëkalimin. Më pas në cilësimet e konfigurimit ndryshoni si më poshtë:

sudo nano /etc/ssh/sshd_config

çaktivizoni hyrjen me fjalëkalim:

PasswordAuthentication no

Rinisni demonin sshd:

sudo systemctl reload sshd

Tani nëse ju ose dikush tjetër përpiqet të hyjë si përdorues root, nuk do të ketë sukses.

Më pas instaloni dockerd, këtu procesi nuk do ta përshkruaj më, pasi gjithçka mund të jetë ndryshuar, shikoni në faqen zyrtare dhe ndiqni hapat për instalimin e docker në virtualen tuaj: https://docs.docker.com/install/linux/docker-ce/debian/

Generimi i certifikatave

Për të menaxhuar demonin e Docker-it nga distanca, kërkohet një lidhje e sigurt TLS. Për këtë, nevojitet një certifikatë dhe çelës, të cilat duhet të gjenerohen dhe të transferohen në makinën tuaj të largët. Ndiqni hapat e përcaktuar në udhëzimin në faqen zyrtare të Docker-it: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Të gjitha skedarët e gjeneruar *.pem për serverin, përkatësisht ca.pem, server.pem, key.pem, duhet të vendosen në direktoriumin /etc/docker në server.

Konfigurimi i dockerd

Në skriptin e nisjes së demonit Docker, hiqni opsionin -H df://; ky opsion përcakton se në cilin host mund të menaxhohet demoni i Docker-it.

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

Më pas, duhet të krijoni një skedar konfigurimi, nëse nuk ekziston, dhe të shkruani opsionet:

/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
}

Lejojini lidhjet në portin 2376:

sudo ufw allow 2376

Rinisni dockerd me konfigurimet e reja:

sudo systemctl daemon-reload && sudo systemctl restart docker

Kontrolloni:

sudo systemctl status docker

Nëse gjithçka është "e gjelbërt", atëherë e konsiderojmë se kemi konfiguruar me sukses Docker-in në server.

Konfigurimi i dërgimit të vazhdueshëm në gitlab

Për që punëtori i GitLab të mund të ekzekutojë komandat në hostin e largët Docker, është e nevojshme të përcaktojmë se si dhe ku të ruajmë certifikatat dhe çelësin për lidhjen e kriptuar me dockerd. Unë e zgjidhja këtë problem thjesht duke i shkruar në variablat në cilësimet e GitLab:

Kreu i spojleritKonfigurimi i CD përmes gitlab

Thjesht shfaqni përmbajtjen e certifikatave dhe çelësit përmes cat: cat ca.pem. Kopjoni dhe ngjisni në vlerën e variablave.

Do të shkruajmë një skenar për desplejimin përmes GitLab. Do të përdorim imazhin docker-in-docker (dind).

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # do të rikthejmë entrypoint, që të funksionojë në 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 # skenari i desplejimit këtu

Përmbajtja e skenarit të desplejimit me komente:

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

Problemi kryesor ishte të "nxirrja" nga variablat gitlab CI/CD përmbajtja e certifikatave në një formë normale. Nuk e kuptoja pse lidhja me hostin e largët nuk punonte. Në host shikova logun sudo journalctl -u docker, aty kishte një gabim gjatë dorështrëngimit. Vendosa të shikoj se çfarë është ruajtur në variablat, për këtë mund të shoh kështu cat -A $DOCKER_CERT_PATH/key.pem. E zgjidhja gabimin duke shtuar fshirjen e karakterit të kthimit tr -d 'r'.

Për më tepër, në skenar mund të shtoni detyra post-lëshimi sipas dëshirës tuaj. Mund ta shqyrtoni versionin punues në depozitat e mia. https://gitlab.com/isqad/gitlab-ci-cd

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster