CD seadistamine gitlabis

Mõtlesin ühel korral, kuidas automatiseerida oma projekti juurutamist. gitlab.com pakub selleks kõiki vajalikke tööriistu, ja loomulikult otsustasin neid kasutada, uurides ja kirjutades väikese juurutusskripti. Artiklis jagan oma kogemust kogukonnaga.

TL;DR

  1. VPS-i seadistamine: rooti keelamine, parooliga sisenemise keelamine, dockerdi installimine, ufw seadistamine
  2. Sertifikaatide genereerimine serverile ja kliendile docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Lülitage dockerdi haldamine sisse tcp soketi kaudu: eemaldage dokkeri konfiguratsioonist -H fd:// valik.
  3. Прописать пути до сертификатов в docker.json
  4. Kandke CI/CD seadetes gitlabi keskkonnamuutujatesse sertifikaatide sisu. Kirjutage .gitlab-ci.yml skript juurutamiseks.

Kõiki näiteid näitan Debian'i jaotusel.

VPS-i algseadistus

Nüüd, kui olete näiteks instantsi ostnud DO, esimene asi, mida peate tegema, on kaitsta oma serverit agressiivse välimise maailma eest. Ma ei hakka midagi tõestama ega kinnitama, näitan lihtsalt oma virtuaalse serveri logi /var/log/messages:

ScreenshootCD seadistamine gitlabis

Esiteks paigaldame tulemüüri ufw:

apt-get update && apt-get install ufw

Lülitame sisse vaikimisi poliitika: blokeerime kõik sissetulevad ühendused, lubame kõik väljaminevad ühendused:

ufw default deny incoming
ufw default allow outgoing

Oluline: ärge unustage lubada ssh-ühendust:

ufw allow OpenSSH

Üldine süntaks on järgmine: lubada ühendus sadamas: ufw allow 12345, kus 12345 on sadama number või teenuse nimi. Keelata: ufw deny 12345

Lülitage tulemüür sisse:

ufw enable

Logige sessioonist välja ja logige uuesti ssh kaudu sisse.

Lisage kasutaja, määrake talle parool ja lisage ta sudo gruppi.

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

Seejärel järgneb plaanis parooliga sisenemise keelamine. Selle jaoks kopeerige oma ssh-võti serverisse:

ssh-copy-id root@10.101.10.28

serveri IP peaks olema teie oma. Proovige nüüd logida sisse varem loodud kasutajana, parooli sisestama ei pea. Järgmisena muudame konfiguratsiooni seetiks:

sudo nano /etc/ssh/sshd_config

keelame parooliga sisenemise:

tuleb seada väärtusele

Taaskäivitage sshd deemon:

sudo systemctl reload sshd

Nüüd, kui keegi proovib root kasutajana sisse logida, ei õnnestu see tal.

Järgmiseks paigaldame dockerd, siin ma protsessi ei kirjelda, kuna see võib olla juba muutunud, minge ametlikule veebilehele ja järgige dokkeri installimise samme oma virtuaalmasinale: https://docs.docker.com/install/linux/docker-ce/debian/

Sertifikaatide genereerimine

Kaugel asuva Docker-deemoni haldamiseks on vajalik krüpteeritud TLS-ühendus. Selle saavutamiseks on vaja sertifikaati ja võtmet, mille peate genereerima ja kaugseadmest üle kandma. Järgige ametlikul Docker veebisaidil antud juhiseid. https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Kõik genereeritud *.pem failid serveris, sealhulgas ca.pem, server.pem ja key.pem, tuleb paigutada kausta /etc/docker serveris.

Dockerd'i seadistamine

Docker-deemoni käivitusskriptis eemaldame valiku -H df://, mis näitab, millisel hostil saab Docker-deemoni juhtida.

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

Seejärel tuleb luua seadistfail, kui seda veel ei ole, ja määrata valikud:

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

Lubame ühendusi pordil 2376:

sudo ufw allow 2376

Taaskäivitame dockerd uute seadistustega:

sudo systemctl daemon-reload && sudo systemctl restart docker

Kontrollime:

sudo systemctl status docker

Kui kõik on "roheline", siis on serveris Docker edukalt seadistatud.

Continuous delivery seadistamine GitLabis

Käitleja GitLabis peab suutma käivitada käske kaugseadmest Dockeris, seetõttu tuleb otsustada, kuidas ja kus sertifikaate ja võtit salvestada krüpteeritud ühenduse jaoks dockerd-iga. Lahendasin selle probleemi lihtsalt, määrates väärtused GitLabi seadistustes muutuja sisse:

Spoileri pealkiriCD seadistamine gitlabis

Lihtsalt väljastage sertifikaatide ja võtme sisu cat käsuga: cat ca.pem. Kopeerige ja kleepige väärtuste muutujate sisse.

Kirjutame skripti GitLabis juurutamiseks. Kasutame docker-in-docker (dind) pilti.

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # muutke entrypoint, et töötaks dind-iga
  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 # juurutusskript siin

Juurutusskripti sisu koos kommentaaridega:

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

Peamine probleem oli "väljatõmbamine" GitLabi CI/CD muutujatest sertifikaatide sisu normaalses vormis. Ma ei saanud aru, miks kaugseadmest ühendamine ei töötanud. Vaatasin hostist ajalugu sudo journalctl -u docker, seal oli viga käepigistuses. Otsustasin vaadata, mida muutujates üldse hoitakse, selleks võite vaadata niinimetatud cat -A $DOCKER_CERT_PATH/key.pem. Vea lahendasin, lisades karbikandja eemaldamise tr -d 'r' käsu.

Edasi saab stsenaariumi lisada post-releaset ülesandeid oma äranägemise järgi. Tööversiooniga saate tutvuda minu hoidlas. https://gitlab.com/isqad/gitlab-ci-cd

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster