CD beállítása gitlab-ön

Egyszer csak elgondolkodtam a projektem telepítésének automatizálásán. A gitlab.com kedvesen minden eszközt biztosít ehhez, így természetesen döntöttem úgy, hogy élek a lehetőséggel, megértettem, és írtam egy kis telepítési forgatókönyvet. A cikkben megosztom tapasztalataimat a közösséggel.

Röviden összefoglalva

  1. VPS beállítása: root kikapcsolása, jelszavas bejelentkezés letiltása, dockerd telepítése, ufw beállítása
  2. Tanúsítványok generálása a szerver és az ügyfél számára docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Engedélyezd a dockerd kezelést tcp socketen keresztül: vedd ki a -H fd:// opciót a docker konfigurációból.
  3. Прописать пути до сертификатов в docker.json
  4. A gitlab CI/CD beállításainál a változókba írd be a tanúsítványok tartalmát. Írj .gitlab-ci.yml scriptet a telepítéshez.

Minden példát Debian disztribúción fogok bemutatni.

Első beállítás VPS-hez

Tegyük fel, hogy vásároltál egy példányt például itt: DO, az első dolog, amit meg kell tenned, hogy megvédd a szerveredet a külső agresszortól. Nem fogom ezt bizonyítani és állítani, csak megmutatom a logot /var/log/messages a virtuális szerveremen:

KépernyőképCD beállítása gitlab-ön

Először telepítjük a tűzfalat, az ufw-t:

apt-get update && apt-get install ufw

Beállítjuk az alapértelmezett politikát: blokkoljuk az összes bejövő kapcsolatot, engedélyezzük az összes kimenő kapcsolatot:

ufw default deny incoming
ufw default allow outgoing

Fontos: ne felejtsd el engedélyezni a ssh kapcsolatot:

ufw allow OpenSSH

A szintaxis a következő: Engedélyezni egy portot: ufw allow 12345, ahol 12345 a port száma vagy a szolgáltatás neve. Megtagadni: ufw deny 12345

Engedélyezd a tűzfalat:

ufw enable

Lépj ki a munkamenetből, és ismét jelentkezz be ssh-n keresztül.

Adj hozzá egy felhasználót, állíts be neki jelszót, és add hozzá a sudo csoporthoz.

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

A következő lépésben le kell tiltanunk a jelszavas bejelentkezést. Ehhez másold a ssh kulcsodat a szerverre:

ssh-copy-id root@10.101.10.28

A szerver IP-jének a tiédnek kell lennie. Próbálkozz most a korábban létrehozott felhasználó alatti bejelentkezéssel, jelszót nem szükséges beírni. A konfigurációs beállításokban a következőket kell módosítani:

sudo nano /etc/ssh/sshd_config

tiltani a jelszavas bejelentkezést:

PasswordAuthentication no

Indítsd újra az sshd démon-t:

sudo systemctl reload sshd

Most, ha te vagy valaki más megpróbál belépni root felhasználóként, nem fog sikerülni.

Következő lépésben telepítjük a dockerd-t, ezt a folyamatot nem részletezem, mert valószínűleg minden megváltozott, látogass el az hivatalos weboldalra, és kövesd a docker telepítésének lépéseit a virtuális gépedre: https://docs.docker.com/install/linux/docker-ce/debian/

Tanúsítványok generálása

A Docker démon távoli vezérléséhez titkosított TLS kapcsolatra van szükség. Ehhez tanúsítványra és kulcsra van szükség, amelyeket generálnunk és át kell helyeznünk a távoli gépre. Kövesse a hivatalos Docker webhelyén található útmutató lépéseit: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Minden generált *.pem fájlt, mint például ca.pem, server.pem, key.pem, a /etc/docker mappába kell helyezni a szerveren.

dockerd beállítása

A Docker démon indítóparancsában távolítsuk el a -H df:// opciót, amely meghatározza, hogy melyik hoszton lehet a Docker démonját vezérelni.

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

Ezután létre kell hozni egy beállítási fájlt, ha még nem létezik, és bele kell írni az opciókat:

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

Engedélyezzük a 2376-os porton való csatlakozást:

sudo ufw allow 2376

Indítsuk újra a dockerd-t az új beállításokkal:

sudo systemctl daemon-reload && sudo systemctl restart docker

Ellenőrizzük:

sudo systemctl status docker

Ha minden "zöld", akkor azt mondhatjuk, hogy sikeresen beállítottuk a dockert a szerveren.

Folyamatos szállítás beállítása GitLab-on

Ahhoz, hogy a GitLab munkásának parancsokat tudjon futtatni a Docker távoli hoszton, meg kell határoznunk, hogyan és hol tároljuk a tanúsítványokat és a kulcsot a Dockerd titkosított kapcsolatához. Én ezt a problémát egyszerűen megoldottam azáltal, hogy a GitLab beállításaiban változókba írtam:

Spoiler címCD beállítása gitlab-ön

Egyszerűen jelenítse meg a tanúsítványok és kulcs tartalmát a cat parancs segítségével: cat ca.pem. Másolja és illessze be a változó értékeiként.

Írjunk egy forgatókönyvet a GitLab-os telepítéshez. A Docker-in-Docker (dind) képet fogjuk használni.

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # átírjuk az entrypoint-ot, hogy működjön a dind-ben
  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 # telepítési forgatókönyv itt

A telepítési forgatókönyv tartalma megjegyzésekkel:

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

A fő probléma az volt, hogy „ki kellene húzni” a GitLab CI/CD változóiból a tanúsítványokat normál formában. Nem értettem, miért nem működött a kapcsolat a távoli hoszttal. A gazdagépen megnéztem a naplót: sudo journalctl -u docker, ott hiba történt a kézfogás során. Meg akartam nézni, hogy mit tárolnak a változókban, ezért így néztem: cat -A $DOCKER_CERT_PATH/key.pem. A hibát úgy küzdöttem le, hogy eltávolítottam a kocsivégjelet: tr -d 'r'.

A forgatókönyvhez utólagos feladatokat is hozzátehetünk tetszés szerint. A működő verzióval a tárolómban ismerkedhet meg. https://gitlab.com/isqad/gitlab-ci-cd

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster