Nastavenie CD cez gitlab

Razmýšľal som raz o automatizácii nasadzovania svojho projektu. gitlab.com láskavo poskytuje všetky nástroje, a tak som sa samozrejme rozhodol ich využiť, preštudoval som a napísal malý skript na nasadenie. V článku sa delím o svoju skúsenosť s komunitou.

TL;DR

  1. Nastaviť VPS: zakázať root, prihlásenie heslom, nainštalovať dockerd, nastaviť ufw
  2. Vygenerovať certifikáty pre server a klienta docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Povoliť správu dockerd cez tcp socket: odstrániť možnosť -H fd:// z dockerskej konfigurácie.
  3. Прописать пути до сертификатов в docker.json
  4. Zapísať do premenných gitlab v nastaveniach CI/CD obsah certifikátov. Napísať skript .gitlab-ci.yml pre nasadenie.

Všetky príklady budem ukazovať na distribúcii Debian.

Počiatočné nastavenie VPS

Kúpili ste inštanciu napríklad na DO, prvé, čo je potrebné urobiť, je zabezpečiť váš server pred agresívnym vonkajším svetom. Nechcem nič dokazovať ani tvrdiť, iba ukážem log /var/log/messages svojho virtuálneho servera:

ScreenshotNastavenie CD cez gitlab

Najprv nainštalujeme firewall ufw:

apt-get update && apt-get install ufw

Povolíme politiku predvolenú: blokujeme všetky prichádzajúce pripojenia, povoľujeme všetky odchádzajúce pripojenia:

ufw default deny incoming
ufw default allow outgoing

Dôležité: nezabudneme povoliť pripojenie cez ssh:

ufw allow OpenSSH

Celkovo je syntax takýto: Povoliť pripojenie na porte: ufw allow 12345, kde 12345 je číslo portu alebo názov služby. Zakázať: ufw deny 12345

Povolíme firewall:

ufw enable

Odhlásime sa zo session a znova sa prihlásime cez ssh.

Pridajte používateľa, priraďte mu heslo a pridajte ho do skupiny sudo.

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

Ďalej je plánom zakázať prihlásenie heslom. Na to skopírujte svoj ssh-kľúč na server:

ssh-copy-id root@10.101.10.28

ip servera by malo byť vaše. Teraz skúste prihlásiť pod predtým vytvoreným používateľom, heslo už zadávať netreba. Potom v konfiguračných nastaveniach zmeníme nasledujúce:

sudo nano /etc/ssh/sshd_config

zakážeme prihlásenie heslom:

PasswordAuthentication no

Reštartujeme demon sshd:

sudo systemctl reload sshd

Ak sa teraz pokúsite prihlásiť ako root, nič sa vám nepodarí.

Ďalej nainštalujeme dockerd, tu už nebudem popisovať proces, pretože sa môže všetko zmeniť, ísť na oficiálnu stránku a prejdite si kroky inštalácie docker na vašu virtuálku: https://docs.docker.com/install/linux/docker-ce/debian/

Generovanie certifikátov

Na vzdialené riadenie démona Docker je potrebné zabezpečené pripojenie TLS. Na to potrebujete certifikát a kľúč, ktoré musíte vygenerovať a preniesť na vašu vzdialenú mašinu. Postupujte podľa krokov v pokynoch na oficiálnej stránke Docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Všetky vygenerované súbory *.pem pre server, konkrétne ca.pem, server.pem, key.pem, je potrebné umiestniť do adresára /etc/docker na serveri.

Konfigurácia dockerd

V spúšťacom skripte démona Docker odstránime možnosť -H df://, táto možnosť určuje, na akom hostiteľovi možno spravovať démona Docker.

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

Následne je potrebné vytvoriť konfiguračný súbor, ak ešte neexistuje, a zadať možnosti:

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

Povolíme pripojenia na porte 2376:

sudo ufw allow 2376

Reštartujeme dockerd s novými nastaveniami:

sudo systemctl daemon-reload && sudo systemctl restart docker

Skontrolujme:

sudo systemctl status docker

Ak je všetko „zelené“, považujeme za úspešné nastavenie Docker na serveri.

Nastavenie continuous delivery na GitLab

Aby mohol worker GitLab vykonávať príkazy na vzdialenom hostiteľovi Docker, je potrebné rozhodnúť, ako a kde uchovávať certifikáty a kľúč na šifrované pripojenie k dockerd. Tento problém som vyriešil jednoducho tak, že som ich zapísal ako premenné v nastaveniach GitLab:

Názov spoileruNastavenie CD cez gitlab

Jednoducho zobrazte obsah certifikátov a kľúča cez cat: cat ca.pem. Skopírujte a vložte do hodnôt premenných.

Napíšeme skript na nasadenie cez GitLab. Používať sa bude obraz docker-in-docker (dind).

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # prepíšeme entrypoint, aby fungoval v 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 # skript nasadenia tu

Obsah skriptu nasadenia s komentármi:

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

Hlavný problém bol vyťažiť obsah certifikátov z premenných GitLab CI/CD vo správnej podobe. Nevedel som pochopiť, prečo nefungovalo pripojenie k vzdialenému hostiteľovi. Na hostiteľovi som si pozrel záznamy sudo journalctl -u docker, tam sa objavila chyba pri handshake. Rozhodol som sa skontrolovať, čo sa vlastne uchováva v premennej, na to je možné použiť cat -A $DOCKER_CERT_PATH/key.pem. Chybu som odstránil pridaním odstránenia znaku návratu tr -d ‘r’.

Nasledujúce úlohy po vydaní môžete pridať podľa svojho uváženia. Pracovnú verziu si môžete pozrieť v mojom repozitári. https://gitlab.com/isqad/gitlab-ci-cd

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster