Ik haw ienris tocht oer it automatisearjen fan de ynset fan myn projekt. gitlab.com jout freonlik alle ark foar dit, en fansels ik besletten om te profitearjen fan it, útfine en it skriuwen fan in lyts ynset skript. Yn dit artikel diel ik myn ûnderfining mei de mienskip.
Registrearje paden nei sertifikaten yn docker.json
Registrearje yn gitlab fariabelen yn de CI / CD ynstellings mei de ynhâld fan de sertifikaten. Skriuw in skript .gitlab-ci.yml foar ynset.
Ik sil alle foarbylden sjen litte oer de Debian-distribúsje.
Inisjele VPS opset
Sa kocht jo in eksimplaar bygelyks by DO, it earste ding dat jo moatte dwaan is jo tsjinner te beskermjen fan 'e agressive bûtenwrâld. Ik sil neat bewize of beweare, ik sil gewoan it log /var/log/berjochten fan myn firtuele server sjen litte:
Skermprint
Ynstallearje earst de ufw-firewall:
apt-get update && apt-get install ufw
Lit ús it standertbelied ynskeakelje: alle ynkommende ferbiningen blokkearje, alle útgeande ferbiningen tastean:
Wichtich: ferjit net de ferbining fia ssh ta te stean:
ufw allow OpenSSH
De algemiene syntaksis is as folget: Tastean in ferbining troch poarte: ufw tastean 12345, wêrby't 12345 is it poartenûmer of de namme fan 'e tsjinst. Deny: ufw deny 12345
De firewall oansette:
ufw enable
Wy ferlitte de sesje en logje opnij yn fia ssh.
Foegje in brûker ta, jou him in wachtwurd ta en foegje him ta oan de sudo-groep.
De server-ip moat fan jo wêze. Besykje no oan te melden mei de brûker dy't jo earder makke hawwe; jo hoege gjin wachtwurd mear yn te fieren. Folgjende, yn 'e konfiguraasje ynstellings, feroarje de folgjende:
sudo nano /etc/ssh/sshd_config
oanmelde wachtwurd útskeakelje:
PasswordAuthentication no
Start de sshd-daemon opnij:
sudo systemctl reload sshd
No as jo of immen oars besiket yn te loggen as de root-brûker, sil it net wurkje.
Ynstallearje dêrnei dockerd, ik sil it proses hjir net beskriuwe, om't alles al feroare kin, folgje de keppeling nei de offisjele webside en gean troch de stappen fan it ynstallearjen fan docker op jo firtuele masine: https://docs.docker.com/install/linux/docker-ce/debian/
It generearjen fan sertifikaten
Om de docker-daemon op ôfstân te kontrolearjen, is in fersifere TLS-ferbining nedich. Om dit te dwaan, moatte jo in sertifikaat en in kaai hawwe, dy't moatte wurde oanmakke en oerbrocht nei jo masine op ôfstân. Folgje de stappen jûn yn 'e ynstruksjes op' e offisjele docker-webside: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Alle oanmakke *.pem-bestannen foar de tsjinner, nammentlik ca.pem, server.pem, key.pem, moatte pleatst wurde yn de map /etc/docker op de tsjinner.
Dockerd ynstelle
Yn it startskript fan docker-daemon ferwiderje wy de -H df://-opsje, dizze opsje bepaalt op hokker host de docker-daemon kontrolearre wurde kin.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Dan moatte jo in ynstellingsbestân oanmeitsje, as it net al bestiet, en de opsjes spesifisearje:
As alles "grien" is, beskôgje wy dat wy docker mei súkses hawwe konfigureare op 'e tsjinner.
Trochrinnende levering ynstelle op gitlab
Om de Gitalaba-arbeider kommando's út te fieren op in Docker-host op ôfstân, is it nedich om te besluten hoe en wêr't sertifikaten en de kaai foar in fersifere ferbining mei Dockerd opslaan wurde. Ik haw dit probleem oplost troch gewoan it folgjende ta te foegjen oan 'e fariabelen yn' e gitlbab-ynstellingen:
spoiler titel
Utfiere gewoan de ynhâld fan 'e sertifikaten en kaai fia kat: cat ca.pem. Kopiearje en plakke yn 'e fariabele wearden.
Litte wy in skript skriuwe foar ynset fia GitLab. De docker-in-docker (dind) ôfbylding sil brûkt wurde.
#!/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
It wichtichste probleem wie om de ynhâld fan 'e sertifikaten yn in normale foarm te "lûken" fan 'e gitlab CI / CD fariabelen. Ik koe net útfine wêrom't de ferbining mei de host op ôfstân net wurke. Op de host seach ik nei it log sudo journalctl -u docker, d'r wie in flater by de handshake. Ik besleat om te sjen nei wat yn 't algemien yn fariabelen opslein is; om dit te dwaan kinne jo der sa útsjen: cat -A $DOCKER_CERT_PATH/key.pem. Ik oerwûn de flater troch it tafoegjen fan it fuortheljen fan de koets karakter tr -d 'r'.
Folgjende kinne jo nei jo goedtinken taheakje post-release taken oan it skript. Jo kinne de wurkferzje besjen yn myn repository https://gitlab.com/isqad/gitlab-ci-cd