Mõtlesin kord, kuidas automatiseerida oma projekti juurutamist. gitlab.com pakub selleks kõiki vajalikke tööriistu, ja ma otsustasin seda kasutada, õppides ja kirjutades väikese juurutusskeemi. Artiklis jagan oma kogemust kogukonnaga.
TL;DR
- Seadista VPS: lülita välja root, parooliga sisenemine, paigalda dockerd, seadista ufw.
- Generaatori sertifikaadid serveri ja kliendi jaoks. Luba dockerd haldus TCP soketi kaudu: eemalda -H fd:// valik dokseri konfigureerimisfailist.
- Прописать пути до сертификатов в docker.json
- Kirjuta gitlabi keskkonnas CI/CD muutujatesse sertifikaatide sisu. Kirjuta .gitlab-ci.yml juurutamiseks skript.
Katan kõik näited Debian'i distributsioonil.
Esialgne VPS seadistamine.
Oletame, et ostsite näiteks instantsi aadressilt , esmalt on vajalik kaitsta oma serverit agressiivse välismaailma eest. Ma ei hakka midagi tõestama ega väitma, vaid näitan lihtsalt logi /var/log/messages oma virtuaalsest serverist:
Kuvamine
Esiteks installime tulemüüre ufw:
apt-get update && apt-get install ufwLülitame sisse vaikimisi poliitika: blokeerime kõik sissetulevad ühendused, lubame kõik väljuvad ühendused:
ufw vaikimisi keelata sissetulevad
ufw vaikimisi lubada väljuvadOluline: ärge unustage lubada ssh-ühendust:
ufw luba OpenSSHÜldine süntaks on järgmine: Lubage ühendus pordil: ufw luba 12345, kus 12345 on sadama number või teenuse nimi. Keelake: ufw keelata 12345
Lülitame tulemüüri sisse:
ufw lubaVäljuge sessioonist ja logige uuesti ssh-i sisse.
Lisage kasutaja, määrake talle parool ja lisage ta sudo gruppi.
apt-get install sudo
adduser scoty
usermod -aG sudo scotyJärgmise sammuna tuleb keelata sisselogimine parooliga. Selleks kopeerige oma ssh-võti serverisse:
ssh-copy-id root@10.101.10.28serveri ip peab olema teie oma. Proovige nüüd logida loodud kasutaja alla, parooli ei pea enam sisestama. Seejärel muudame konfiguratsiooni seadetes järgmist:
sudo nano /etc/ssh/sshd_configkeela sisselogimine parooliga:
PasswordAuthentication noKäivitame sshd teenuse uuesti:
sudo systemctl reload sshdNüüd, kui proovite te või keegi teine root-kasutajana sisse logida, ei õnnestu see.
Seejärel installime dockerd, siinkohal ei hakka ma protsessi kirjeldama, kuna kõik võib juba muutuda, minge ametlikule veebisaidile ja järgige stepide korralikult docker'i installimist oma virtuaalmasinasse:
Sertifikaatide genereerimine
Kaugtöötluseks Docker daemoni juhtimiseks on vajalik krüptitud TLS-ühendus. Selleks on vaja sertifikaati ja võtit, mis tuleb genereerida ja kanda üle teie kaugmasinale. Järgige ametliku docker'i veebisaidi juhistes antud samme: Kõik genereeritud *.pem failid serveri jaoks, nimelt ca.pem, server.pem, key.pem, peavad olema paigutatud katalooge /etc/docker serveris.
Dockerd seadistamine
Docker daemoni käivitusskriptis eemaldame valiku -H df://, see valik määrab, millisel hostil saab docker daemoni juhtida.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerdSeejärel tuleb luua konfiguratsioonifail, kui see veel ei eksisteeri, 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 porti 2376 kaudu:
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 peame vajalikuks, et oleme serveris docker'i edukalt seadistanud.
Continuous delivery seadistamine GitLabis
Ettevalmistamisel, et GitLabi töötaja saaks täita käske kaugserveris, on vaja otsustada, kuidas ja kus hoida sertifikaate ja võtmeid krüpteeritud ühenduse jaoks dockerd-iga. Otsustasin selle probleemi lahendada, sisestades selle GitLabi seadetes muutujatesse:
Spoilertitle
Lihtsalt kuvage sertifikaatide ja võtme sisu cat käsuga: cat ca.pem. Kopeerige ja kleepige väärtustesse muutujaid.
Kirjutame skripti juurutamiseks läbi GitLabi. Kasutame docker-in-docker (dind) konteinerit.
.gitlab-ci.yml
image:
name: docker/compose:1.23.2
# kirjutame entrypoint'i ümber, et see töötaks dind'is
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 # juurutamise skript siin
Juurutamise skripti 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 selles, et «välja tõmmata» gitlab CI/CD muutujatest sertifikaatide sisu normaalses vormis. Ma ei saanud aru, miks kaugserveriga ühendus ei töötanud. Vaatasin serveris logi sudo journalctl -u docker, seal oli viga käepigistuses. Otsustasin uurida, mis üldse muutujatesse salvestatakse, selleks saab vaadata nii: cat -A $DOCKER_CERT_PATH/key.pem. Vea lahendasin, lisades karaktersümboli eemaldamise: tr -d 'r'.
Edasi võib skripti lisada post-release ülesandeid oma äranägemise järgi. Tööversiooniga saate tutvuda minu hoidlas.
Allikas: habr.com
