Ech hunn emol geduecht fir den Ofbau vu mengem Projet ze automatiséieren. gitlab.com bitt frëndlech all Tools fir dëst, an natierlech hunn ech decidéiert dovunner ze profitéieren, erauszefannen an e klengen Deployment Skript ze schreiwen. An dësem Artikel deelen ech meng Erfahrung mat der Gemeinschaft.
Registréiert Weeër fir Certificaten an docker.json
Registréiert Iech a gitlab Variablen an den CI / CD Astellunge mam Inhalt vun den Certificaten. Schreift e Skript .gitlab-ci.yml fir den Asaz.
Ech weisen all Beispiller op der Debian Verdeelung.
Éischt VPS Setup
Also hutt Dir eng Instanz zum Beispill bei DO, dat éischt wat Dir maache musst ass Äre Server virun der aggressiver Äussewelt ze schützen. Ech wäert näischt beweisen oder behaapten, ech weisen just de Log /var/log/Message vu mengem virtuelle Server:
Screenshot
Als éischt, installéiert d'ufw Firewall:
apt-get update && apt-get install ufw
Loosst eis d'Standardpolitik aktivéieren: blockéiert all erakommen Verbindungen, erlaabt all erausginn Verbindungen:
Wichteg: Vergiesst net d'Verbindung iwwer ssh z'erméiglechen:
ufw allow OpenSSH
Déi allgemeng Syntax ass wéi follegt: Erlaabt eng Verbindung duerch Port: ufw erlaben 12345, wou 12345 d'Portnummer oder den Numm vum Service ass. Deny: ufw deny 12345
Maacht d'Firewall un:
ufw enable
Mir verloossen d'Sessioun an aloggen erëm iwwer ssh.
Füügt e Benotzer un, gitt him e Passwuert a füügt hien an d'Sudo-Grupp.
De Server IP muss ären sinn. Probéiert elo aloggen mat dem Benotzer deen Dir virdru erstallt hutt; Dir musst net méi e Passwuert aginn. Als nächst, an de Konfiguratiounsastellungen, ännert déi folgend:
sudo nano /etc/ssh/sshd_config
Passwuert Login auszeschalten:
PasswordAuthentication no
Restart den sshd Daemon:
sudo systemctl reload sshd
Elo wann Dir oder een aneren probéiert Iech als Root Benotzer unzemellen, funktionnéiert et net.
Als nächst, installéiert Dockerd, ech wäert de Prozess net hei beschreiwen, well alles ka scho geännert ginn, befollegt de Link op déi offiziell Websäit a gitt duerch d'Schrëtt fir Docker op Ärer virtueller Maschinn z'installéieren: https://docs.docker.com/install/linux/docker-ce/debian/
Generéiere Certificaten
Fir den Docker Daemon op afstand ze kontrolléieren, ass eng verschlësselte TLS Verbindung erfuerderlech. Fir dëst ze maachen, musst Dir e Certificat an e Schlëssel hunn, dee muss generéiert an op Är Fernmaschinn transferéiert ginn. Follegt d'Schrëtt an den Instruktiounen op der offizieller Docker Websäit: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl All generéiert *.pem Dateie fir de Server, nämlech ca.pem, server.pem, key.pem, mussen am /etc/docker Verzeichnis um Server gesat ginn.
Ariichten dockerd
Am Docker Daemon Start Skript, hu mir d'Optioun -H df:// ewechgeholl, dës Optioun bestëmmt op wéi engem Host den Docker Daemon kontrolléiert ka ginn.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Als nächst sollt Dir eng Astellungsdatei erstellen, wann et net scho gëtt, an d'Optiounen spezifizéieren:
Wann alles "gréng" ass, betruechte mir datt mir den Docker op de Server erfollegräich konfiguréiert hunn.
Kontinuéierlech Liwwerung op gitlab opsetzen
Fir datt de Gitalaba Aarbechter fäeg ass Kommandoen op engem Remote Docker Host auszeféieren, ass et néideg ze entscheeden wéi a wou d'Zertifikater an de Schlëssel fir eng verschlësselte Verbindung mat Dockerd späicheren. Ech hunn dëse Problem geléist andeems Dir einfach déi folgend Variabelen an de gitlbab Astellunge bäigefüügt:
Spoiler Titel
Gitt just den Inhalt vun den Certificaten a Schlëssel iwwer Kaz eraus: cat ca.pem. Kopéiert a paste an d'Variabel Wäerter.
Loosst eis e Skript schreiwen fir z'installéieren iwwer GitLab. D'Docker-in-Docker (dind) Bild gëtt benotzt.
#!/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
Den Haaptproblem war den Inhalt vun den Certificaten an enger normaler Form vun de gitlab CI / CD Variablen ze "zéien". Ech konnt net erausfannen firwat d'Verbindung mam Fernhost net funktionnéiert. Am Host hunn ech de Log sudo journalctl -u docker gekuckt, et gouf e Feeler beim Handshake. Ech hu beschloss ze kucken wat allgemeng a Variablen gespäichert ass; Fir dëst ze maachen, kënnt Dir esou ausgesinn: cat -A $DOCKER_CERT_PATH/key.pem. Ech hunn de Feeler iwwerwonne andeems ech d'Entfernung vum Kutsche Charakter tr -d 'r' derbäigesat hunn.
Als nächst kënnt Dir Post-Release Aufgaben un de Skript no Ärem Diskretioun addéieren. Dir kënnt d'Aarbechtsversioun a mengem Repository kucken https://gitlab.com/isqad/gitlab-ci-cd