Razmýšľal som raz o automatizácii nasadenia svojho projektu. gitlab.com poskytuje všetky nástroje na to, a samozrejme som sa rozhodol využiť to, podrobne som si to pozrel a napísal malý skript na nasadenie. V článku zdieľam svoje skúsenosti s komunitou.
TL;DR
- Nastaviť VPS: vypnúť root, prihlásenie cez heslo, nainštalovať dockerd, nastaviť ufw
- Vygenerovať certifikáty pre server a klienta Povoliť správu dockerd cez tcp socket: odstrániť voľbu -H fd:// z konfigurácie dockera.
- Прописать пути до сертификатов в docker.json
- Zaznamenať 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
Takže ste si kúpili inštanciu napríklad na , prvé, čo musíte urobiť, je chrániť svoj server pred agresívnym vonkajším svetom. Nebudem nič dokazovať ani tvrdiť, len ukážem log /var/log/messages svojho virtuálneho servera:
Screenshot
Po prvé, nainštalujme firewall ufw:
apt-get update && apt-get install ufwPovolíme predvolenú politiku: blokujeme všetky prichádzajúce spojenia, povoľujeme všetky odchádzajúce spojenia:
ufw default deny incoming
ufw default allow outgoingDôležité: nezabudneme povoliť spojenie cez ssh:
ufw allow OpenSSHVšeobecná syntax je takáto: Povoľte spojenie cez port: ufw allow 12345, kde 12345 je číslo portu alebo názov služby. Zakázať: ufw deny 12345
Povoľujeme firewall:
ufw enableOdhlásime sa zo session a znovu sa prihlásime cez ssh.
Pridajte používateľa, priradte mu heslo a pridajte ho do skupiny sudo.
apt-get install sudo
adduser scoty
usermod -aG sudo scotyĎalej v pláne nasleduje vypnúť prihlásenie cez heslo. Na to skopírujte svoj ssh-kľúč na server:
ssh-copy-id root@10.101.10.28ip servera by mal byť váš. Teraz skúste prihlásiť pod práve vytvoreným používateľom, heslo už nie je potrebné. Potom v nastaveniach konfigurácie zmeňte nasledovné:
sudo nano /etc/ssh/sshd_configvypneme prihlásenie cez heslo:
PasswordAuthentication noReštartujeme daemon sshd:
sudo systemctl reload sshdTeraz, ak sa pokúsite vy alebo niekto iný prihlásiť cez používateľa root, nič mu nevyjde.
Ďalej nainštalujeme dockerd, tu už nebudem opisovať proces, pretože sa mohol už zmeniť, choďte na oficiálnu stránku a prejdite krokmi inštalácie docker na vašej virtuálke:
Generovanie certifikátov
Na to, aby ste mohli na diaľku spravovať démon dockera, potrebujete šifrované TLS spojenie. K tomu je potrebné mať certifikát a kľúč, ktoré je potrebné vygenerovať a preniesť na váš vzdialený stroj. Postupujte podľa krokov uvedených v dokumentácii na oficiálnej stránke dockera: 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.
Nastavenie dockerd
V spúšťacom skripte démona dockera odstráňte možnosť -H df://, táto možnosť určuje, na ktorom hostiteľovi je možné spravovať démona dockera.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerdNásledne je potrebné vytvoriť konfiguračný súbor, ak ešte neexistuje, a zapísať 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 2376Reštartujeme dockerd s novými nastaveniami:
sudo systemctl daemon-reload && sudo systemctl restart dockerSkontrolujeme:
sudo systemctl status dockerAk je všetko „zelené“, považujeme to za úspešné nastavenie dockera na serveri.
Nastavenie kontinuálneho dodávania na gitlabe
Aby mohol pracovník gitlabu vykonávať príkazy na vzdialenom hoste dockera, je potrebné určiť, ako a kde uchovávať certifikáty a kľúč pre šifrované spojenie s dockerd. Problém som vyriešil jednoducho tak, že som ich zapísal do premenných v nastaveniach gitlabu:
Názov spoileru
Jednoducho výstupujte 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žívaný 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 v tom, aby som „vytiahol“ z premenných gitlab CI/CD obsah certifikátov v normálnej forme. Nevedel som pochopiť, prečo nefungovalo spojenie s vzdialeným hostiteľom. Na hostiteľovi som skontroloval denník sudo journalctl -u docker, tam bola chyba pri handshake. Rozhodol som sa pozrieť, čo sa vlastne nachádza v premenných, na to sa dá pozrieť takto cat -A $DOCKER_CERT_PATH/key.pem. Chybu som odstránil pridaním odstránenia znaku návratu tr -d ‘r’.
Ďalej do skriptu môžete pridať post-release úlohy podľa vlastného uváženia. Aktuálnu verziu si môžete pozrieť v mojom repozitári
Zdroj: habr.com
