Razmišljal sem o avtomatizaciji postavitve svojega projekta. gitlab.com prijazno ponuja vse potrebne instrumente, zato sem se odločil, da bom to izkoristil, se seznanil in napisal majhen skript za namestitev. V tem članku delim svoje izkušnje s skupnostjo.
TL;DR
- Nastavite VPS: onemogočite root, prijavo s geslom, namestite dockerd, nastavite ufw.
- Generirajte certifikate za strežnik in stranko. Omogočite upravljanje dockerd prek TCP soketa: odstranite možnost -H fd:// iz Dockerjeve konfiguracije.
- Прописать пути до сертификатов в docker.json
- V spremenljivkah gitlab v nastavitvah CI/CD vnesite vsebino certifikatov. Napišite skript .gitlab-ci.yml za namestitev.
Vse primere bom prikazal na distribuciji Debian.
Prvotna nastavitev VPS.
Torej, kupili ste primer na , prva stvar, ki jo morate storiti, je, da zaščitite svoj strežnik pred agresivnim zunanjim svetom. Ne bom nič dokazoval, samo pokazal bom dnevnik /var/log/messages svojega virtualnega strežnika:
Zaslon
Najprej namestimo požarni zid ufw:
apt-get update && apt-get install ufwOmogočili bomo privzeto politiko: blokiramo vse dohodne povezave, dovolimo vse odhodne povezave:
ufw default deny incoming
ufw default allow outgoingPomembno: ne pozabite omogočiti povezave prek ssh:
ufw allow OpenSSHSplošna sintaksa je takšna: Dovolite povezavo na vratih: ufw allow 12345, kjer je 12345 številka vrat ali ime storitve. Prepovedati: ufw deny 12345.
Omogočamo požarni zid:
ufw enableIzhod iz seje in ponovno se prijavite prek ssh.
Dodajte uporabnika, mu dodelite geslo in ga vključite v skupino sudo.
apt-get install sudo
adduser scoty
usermod -aG sudo scotyNato je v načrtu onemogočitev prijave s geslom. Za to prek kopirajte svoj ssh ključ na strežnik:
ssh-copy-id root@10.101.10.28ip strežnika mora biti vaš. Poskusite se zdaj prijaviti s prej ustvarjenim uporabnikom, gesla več ni treba vnašati. Nato v konfiguracijskih nastavitvah spremenite naslednje:
sudo nano /etc/ssh/sshd_configonemogočite prijavo s geslom:
PasswordAuthentication noPonovno zaženite demon sshd:
sudo systemctl reload sshdZdaj, če se vi ali kdo drug poskusa prijaviti preko uporabnika root, mu ne bo uspelo.
Nato namestite dockerd, tu postopka ne bom opisoval, ker se lahko vse že spremeni, pojdite na uradno spletno stran in sledite korakom za namestitev dockerja na vaš virtualni strežnik:
Generiranje certifikatov
Za upravljanje Docker demonima na daljinu potrebno je šifrovano TLS povezivanje. Za to je potrebno imati sertifikat i ključ, koje treba generisati i preneti na vašu udaljenu mašinu. Pratite korake navedene u uputstvu na zvaničnom sajtu Docker: Sve generisane *.pem datoteke za server, kao što su ca.pem, server.pem, key.pem, treba smestiti u direktorijum /etc/docker na serveru.
Konfiguracija dockerd
U skripti za pokretanje Docker demona uklanjamo opciju -H df://, koja određuje na kom hostu se može upravljati Docker demonima.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerdNakon toga, treba da kreiramo datoteku sa podešavanjima, ako još ne postoji, i da unesemo opcije:
/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
}Omogući konekcije na portu 2376:
sudo ufw allow 2376Ponovo pokrenimo dockerd sa novim podešavanjima:
sudo systemctl daemon-reload && sudo systemctl restart dockerProvjerimo:
sudo systemctl status dockerAko je sve "zelena", smatramo da smo uspešno konfigurirali Docker na serveru.
Podešavanje kontinuirane isporuke na GitLabu
Da bi GitLab radnik mogao da izvršava komande na udaljenom Docker hostu, potrebno je odrediti kako i gde čuvati sertifikate i ključ za šifrovanu konekciju sa dockerd. Ovaj problem sam rešio jednostavno definisanjem u promenljivama u podešavanjima GitLaba:
Naslov sklope
Jednostavno prikazujte sadržaj sertifikata i ključa preko cat: cat ca.pem. Kopirate i nalepite u vrednost promenljivih.
Napišimo skriptu za implementaciju putem GitLaba. Koristiće se Docker-in-Docker (dind) slika.
.gitlab-ci.yml
image:
name: docker/compose:1.23.2
# ponovo ćemo napisati entrypoint da radi u 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 # skripta za implementaciju ovde
Sadržaj skripte za implementaciju sa komentarima:
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
Glavni problem je bio u tome da se "izvuku" iz GitLab CI/CD promenljivih sadržaji sertifikata u normalnom formatu. Nisam mogao da shvatim zašto veza sa udaljenim hostom nije radila. Na hostu sam pogledao log sudo journalctl -u docker, gde je bila greška pri rukovanju. Odlučio sam da pogledam šta se zapravo čuva u promenljivama, za to mogu da pogledam ovako cat -A $DOCKER_CERT_PATH/key.pem. Grešku sam prevazišao dodavanjem brisanja karakternog znaka tr -d 'r'.
Nato lahko v scenarij dodate post-release naloge po svoji izbiri. Delovno različico si lahko ogledate v moji zbirki.
Izvor: habr.com
