Jednom sam razmišljao o automatizaciji raspoređivanja svog projekta. gitlab.com ljubazno pruža sve alate za to, pa sam odlučio iskoristiti to, razumjeti i napisati mali raspoređivački skript. U članku dijelim svoje iskustvo s zajednicom.
TL;DR
- Postavi VPS: onemogući root, prijavu putem lozinke, instaliraj dockerd, postavi ufw
- Generiraj certifikate za server i klijenta Omogući upravljanje dockerd-om putem tcp soketa: ukloni opciju -H fd:// iz docker konfiguracije.
- Прописать пути до сертификатов в docker.json
- Unesi u varijable gitlaba u CI/CD postavkama sadržaj certifikata. Napiši skript .gitlab-ci.yml za raspoređivanje.
Sve primjere ću prikazati na distribuciji Debian.
Prvotna konfiguracija VPS-a
Dakle, kupili ste instancu na primjer na , prvo što treba učiniti je zaštititi svoj server od agresivnog vanjskog svijeta. Neću ništa dokazivati i tvrditi, samo ću pokazati log /var/log/messages svog virtualnog servera:
Snimka ekrana
Prvo ćemo instalirati vatrozid ufw:
apt-get update && apt-get install ufwUključujemo politiku prema zadanim postavkama: blokiramo sve dolazne veze, dopuštamo sve odlazne veze:
ufw default deny incoming
ufw default allow outgoingVažno: ne zaboravite omogućiti vezu putem ssh:
ufw allow OpenSSHOpći sintaksis je ovakav: Omogućiti vezu putem porta: ufw allow 12345, gdje je 12345 broj porta ili naziv servisa. Zabraniti: ufw deny 12345
Aktiviraj vatrozid:
ufw enableIzađite iz sesije i ponovo se prijavite putem ssh.
Dodajte korisnika, dodijelite mu lozinku i dodajte ga u grupu sudo.
apt-get install sudo
adduser scoty
usermod -aG sudo scotySljedeći korak je onemogućiti prijavu putem lozinke. Za to kopirajte svoj ssh ključ na server:
ssh-copy-id root@10.101.10.28ip servera treba biti vaš. Pokušajte se sada prijaviti kao ranije stvoreni korisnik, lozinku više ne trebate unositi. Zatim u konfiguracijskim postavkama mijenjamo sljedeće:
sudo nano /etc/ssh/sshd_configonemogućite prijavu putem lozinke:
PasswordAuthentication noPonovno pokrenite sshd demon:
sudo systemctl reload sshdSada, ako vi ili netko drugi pokuša ući kao korisnik root, neće uspjeti.
Zatim instaliramo dockerd, ovdje neću opisivati proces jer se može puno toga promijeniti, idite na službenu stranicu i prođite kroz korake instalacije dockera na svom virtualnom serveru:
Generiranje certifikata
Za upravljanje Docker demonima na daljinu potrebno je šifrirano TLS povezivanje. Da biste to postigli, potrebno je generirati certifikat i ključ te ih prenijeti na vaše udaljeno računalo. Slijedite korake navedene u uputama na službenoj Docker web stranici: Sve generirane *.pem datoteke za server, odnosno ca.pem, server.pem, key.pem trebate staviti u direktorij /etc/docker na serveru.
Postavljanje dockerd-a
U skripti za pokretanje Docker demona uklanjamo opciju -H df://, ova opcija određuje na kojem hostu se može upravljati Docker demonima.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerdZatim je potrebno stvoriti datoteku s postavkama, ako već ne postoji, i upisati 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
}Dozvolimo veze putem porta 2376:
sudo ufw allow 2376Ponovo pokrećemo dockerd s novim postavkama:
sudo systemctl daemon-reload && sudo systemctl restart dockerProvjerimo:
sudo systemctl status dockerAko je sve "zeleno", smatramo da smo uspješno postavili Docker na serveru.
Postavke kontinuirane isporuke na GitLab-u
Da bi GitLab radnik mogao izvršavati naredbe na udaljenom Docker hostu, potrebno je odlučiti kako i gdje pohraniti certifikate i ključ za šifrirano povezivanje s dockerd-om. Ovaj problem sam riješio jednostavno definiranjem varijabli u postavkama GitLab-a:
Naslov proširivanja
Jednostavno prikažite sadržaj certifikata i ključa putem cat: cat ca.pem. Kopirajte i zalijepite u vrijednosti varijabli.
Definirajmo skriptu za implementaciju putem GitLab-a. Koristit će se Docker-in-Docker (dind) slika.
.gitlab-ci.yml
image:
name: docker/compose:1.23.2
# prepisujemo entrypoint kako bi radio 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 ovdje
Sadržaj skripte za implementaciju s 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 bio je "izvlačenje" iz GitLab CI/CD varijabli sadržaja certifikata u ispravnom obliku. Nisam mogao razumjeti zašto povezivanje s udaljenim hostom nije radilo. Pogledao sam zapis na hostu sudo journalctl -u docker, tamo je bila greška pri rukovanju. Odlučio sam provjeriti što se uopće čuva u varijablama, za to se može pogledati na sljedeći način cat -A $DOCKER_CERT_PATH/key.pem. Grešku sam riješio uklanjanjem karaktera povratne oznake tr -d 'r'.
Dalje u scenarij možete dodati post-release zadatke prema vlastitom nahođenju. Radnu verziju možete pogledati u mom repozitoriju
Izvor: habr.com
