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
- Nastaviť VPS: zakázať root, prihlásenie heslom, nainštalovať dockerd, nastaviť ufw
- Vygenerovať certifikáty pre server a klienta Povoliť správu dockerd cez tcp socket: odstrániť možnosť -H fd:// z dockerskej konfigurácie.
- Прописать пути до сертификатов в docker.json
- 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 , 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:
Screenshot
Najprv nainštalujeme firewall ufw:
apt-get update && apt-get install ufwPovolí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 outgoingDôležité: nezabudneme povoliť pripojenie cez ssh:
ufw allow OpenSSHCelkovo 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 enableOdhlá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.28ip 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_configzakážeme prihlásenie heslom:
PasswordAuthentication noReštartujeme demon sshd:
sudo systemctl reload sshdAk 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:
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: 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/dockerdNá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 2376Reštartujeme dockerd s novými nastaveniami:
sudo systemctl daemon-reload && sudo systemctl restart dockerSkontrolujme:
sudo systemctl status dockerAk 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 spoileru
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.
Zdroj: habr.com
