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
- VPS-i seadistamine: rooti keelamine, parooliga sisenemise keelamine, dockerdi installimine, ufw seadistamine
- Sertifikaatide genereerimine serverile ja kliendile Lülitage dockerdi haldamine sisse tcp soketi kaudu: eemaldage dokkeri konfiguratsioonist -H fd:// valik.
- Прописать пути до сертификатов в docker.json
- 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 , 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:
Screenshoot
Esiteks paigaldame tulemüüri ufw:
apt-get update && apt-get install ufwLülitame sisse vaikimisi poliitika: blokeerime kõik sissetulevad ühendused, lubame kõik väljaminevad ühendused:
ufw default deny incoming
ufw default allow outgoingOluline: ä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 enableLogige 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 scotySeejärel järgneb plaanis parooliga sisenemise keelamine. Selle jaoks kopeerige oma ssh-võti serverisse:
ssh-copy-id root@10.101.10.28serveri 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_configkeelame parooliga sisenemise:
tuleb seada väärtuseleTaaskäivitage sshd deemon:
sudo systemctl reload sshdNüü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:
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. 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/dockerdSeejä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 2376Taaskäivitame dockerd uute seadistustega:
sudo systemctl daemon-reload && sudo systemctl restart dockerKontrollime:
sudo systemctl status dockerKui 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 pealkiri
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.
Allikas: habr.com
