Mendoj një herë se si të automatizoj shpërndarjen e projektit tim. gitlab.com ofron të gjitha mjetet për këtë, dhe unë vendosa t'i përdor, duke e kuptuar dhe shkruar një skenar të vogël për shpërndarjen. Në këtë artikull ndaja përvojën time me komunitetin.
TL;DR
- Konfiguro VPS: çaktivizo root, hyrja me fjalëkalim, instaloni dockerd, konfiguro ufw
- Gjeneroni certifikatat për serverin dhe klientin Aktivizo menaxhimin e dockerd përmes soketëve tcp: hiq opsionin -H fd:// nga konfigurimi i Dockerit.
- Прописать пути до сертификатов в docker.json
- Shkruani në variablat gitlab në cilësimet CI/CD përmbajtjen e certifikatave. Shkruani skenarin .gitlab-ci.yml për shpërndarjen.
Të gjitha shembujt do t'i tregoj mbi distribucionin Debian.
Konfigurimi fillestar i VPS
Keni blerë një instancë për shembull në , e para gjë që duhet të bëni është të mbroni serverin tuaj nga bota agresive e jashtme. Nuk do të provoj asgjë dhe nuk do të them asgjë, thjesht do të tregoj logun /var/log/messages të serverit tim virtual:
Shkrep
Së pari, do të instalojmë firewal-in ufw:
apt-get update && apt-get install ufwDo të aktivizojmë politikën e parazgjedhur: bllokoni të gjitha lidhjet e ardhshme, lejoni të gjitha lidhjet e daljes:
ufw default deny incoming
ufw default allow outgoingËshtë e rëndësishme: mos harroni të lejoni lidhjen për ssh:
ufw allow OpenSSHSintaksa e përgjithshme është kështu: Lejoni lidhjen në port: ufw allow 12345, ku 12345 është numri i portit ose emri i shërbimit. Ndalo: ufw deny 12345
Aktivizoni firewall-in:
ufw enableDilni nga sesioni dhe regjistrohuni përsëri me ssh.
Shtoni përdoruesin, caktoni një fjalëkalim dhe shtojeni atë në grupin sudo.
apt-get install sudo
adduser scoty
usermod -aG sudo scotyMë pas në plan është të çaktivizoni hyrjen me fjalëkalim. Për këtë kopjoni çelësin tuaj ssh në server:
ssh-copy-id root@10.101.10.28IP e serverit duhet të jetë e juaja. Tani provoni të regjistroheni me përdoruesin e krijuar më parë, nuk është e nevojshme të vendosni më fjalëkalimin. Më pas në cilësimet e konfigurimit ndryshoni si më poshtë:
sudo nano /etc/ssh/sshd_configçaktivizoni hyrjen me fjalëkalim:
PasswordAuthentication noRinisni demonin sshd:
sudo systemctl reload sshdTani nëse ju ose dikush tjetër përpiqet të hyjë si përdorues root, nuk do të ketë sukses.
Më pas instaloni dockerd, këtu procesi nuk do ta përshkruaj më, pasi gjithçka mund të jetë ndryshuar, shikoni në faqen zyrtare dhe ndiqni hapat për instalimin e docker në virtualen tuaj:
Generimi i certifikatave
Për të menaxhuar demonin e Docker-it nga distanca, kërkohet një lidhje e sigurt TLS. Për këtë, nevojitet një certifikatë dhe çelës, të cilat duhet të gjenerohen dhe të transferohen në makinën tuaj të largët. Ndiqni hapat e përcaktuar në udhëzimin në faqen zyrtare të Docker-it: Të gjitha skedarët e gjeneruar *.pem për serverin, përkatësisht ca.pem, server.pem, key.pem, duhet të vendosen në direktoriumin /etc/docker në server.
Konfigurimi i dockerd
Në skriptin e nisjes së demonit Docker, hiqni opsionin -H df://; ky opsion përcakton se në cilin host mund të menaxhohet demoni i Docker-it.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerdMë pas, duhet të krijoni një skedar konfigurimi, nëse nuk ekziston, dhe të shkruani opsionet:
/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
}Lejojini lidhjet në portin 2376:
sudo ufw allow 2376Rinisni dockerd me konfigurimet e reja:
sudo systemctl daemon-reload && sudo systemctl restart dockerKontrolloni:
sudo systemctl status dockerNëse gjithçka është "e gjelbërt", atëherë e konsiderojmë se kemi konfiguruar me sukses Docker-in në server.
Konfigurimi i dërgimit të vazhdueshëm në gitlab
Për që punëtori i GitLab të mund të ekzekutojë komandat në hostin e largët Docker, është e nevojshme të përcaktojmë se si dhe ku të ruajmë certifikatat dhe çelësin për lidhjen e kriptuar me dockerd. Unë e zgjidhja këtë problem thjesht duke i shkruar në variablat në cilësimet e GitLab:
Kreu i spojlerit
Thjesht shfaqni përmbajtjen e certifikatave dhe çelësit përmes cat: cat ca.pem. Kopjoni dhe ngjisni në vlerën e variablave.
Do të shkruajmë një skenar për desplejimin përmes GitLab. Do të përdorim imazhin docker-in-docker (dind).
.gitlab-ci.yml
image:
name: docker/compose:1.23.2
# do të rikthejmë entrypoint, që të funksionojë në 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 # skenari i desplejimit këtu
Përmbajtja e skenarit të desplejimit me komente:
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
Problemi kryesor ishte të "nxirrja" nga variablat gitlab CI/CD përmbajtja e certifikatave në një formë normale. Nuk e kuptoja pse lidhja me hostin e largët nuk punonte. Në host shikova logun sudo journalctl -u docker, aty kishte një gabim gjatë dorështrëngimit. Vendosa të shikoj se çfarë është ruajtur në variablat, për këtë mund të shoh kështu cat -A $DOCKER_CERT_PATH/key.pem. E zgjidhja gabimin duke shtuar fshirjen e karakterit të kthimit tr -d 'r'.
Për më tepër, në skenar mund të shtoni detyra post-lëshimi sipas dëshirës tuaj. Mund ta shqyrtoni versionin punues në depozitat e mia.
Burimi: habr.com
