Një ditë, u mendova për automatizimin e shpërndarjes së projektit tim. gitlab.com ofron gjithë mjetet për këtë, prandaj vendosa ta shfrytëzoj atë, duke 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
- Konfiguroni VPS: çaktivizoni root, hyrjen me fjalëkalim, instaloni dockerd, konfiguroni ufw
- Gjeneroni certifikatat për serverin dhe klientin Aktivizoni menaxhimin e dockerd përmes tcp socket: hiqni opsionin -H fd:// nga konfigurimi i docker.
- Прописать пути до сертификатов в docker.json
- Shtoni 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 në 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 e jashtme e ashpër. Nuk do të argumentohem apo konfirmoj, thjesht do të tregoj logun /var/log/messages të serverit tim virtual:
Screenshot
Së pari, instaloni firewall-in ufw:
apt-get update && apt-get install ufwAktivizoni politikën e parazgjedhur: bllokoni të gjitha lidhjet hyrëse, lejoni të gjitha lidhjet dalje:
ufw default deny incoming
ufw default allow outgoingE rëndësishme: mos haroni të lejoni lidhjen për ssh:
ufw allow OpenSSHSintaksa e përgjithshme është kështu: Lejoni lidhjen për portin: ufw allow 12345, ku 12345 është numri i portit ose emri i shërbimit. Ndaloni: ufw deny 12345
Aktivizoni firewall-in:
ufw enableDalni 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ë planin ë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 i serverit duhet të jetë ai i juaji. Provoni tani të regjistroheni me përdoruesin e krijuar më parë, nuk keni nevojë të jepni më fjalëkalimin. Më pas, në cilësimet e konfigurimit, ndryshoni ndjekës:
sudo nano /etc/ssh/sshd_configçaktivizoni hyrjen me fjalëkalim:
PasswordAuthentication noRinisni demonin sshd:
sudo systemctl reload sshdTani, nëse ju ose ndonjë tjetër përpiqet të hyjë përmes përdoruesit root, nuk do të arrijë asgjë.
Më pas, instaloni dockerd, këtu procesi nuk do ta përshkruaj, pasi gjithçka mund të jetë ndryshuar tashmë, shkoni te lidhja në faqen zyrtare dhe përfundoni hapat për instalimin e docker në virtualin tuaj:
Generimi i certifikatave
Për të menaxhuar demonin e Dockerit në distancë, kërkohet një lidhje e enkriptuar TLS. Për këtë, është e nevojshme të keni një certifikat dhe një çelës, të cilat duhet të krijoni dhe transferoni në makinën tuaj të largët. Ndiqni hapat e caktuar në udhëzimet në faqen zyrtare të docker. Të gjitha skedaret *.pem të krijuara për serverin, përkatësisht ca.pem, server.pem, key.pem, duhet të vendosen në drejtorinë /etc/docker në server.
Konfigurimi i dockerd
Në skriptin e lançimit të demonit të Dockerit, hiqni opsionin -H df://, ky opsion përcakton se në cilin host mund të menaxhohet demoni i Dockerit.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerdMë pas, krijoni një skedar konfigurimi, nëse nuk ekziston, dhe 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
}Lejojmë lidhjet në portin 2376:
sudo ufw allow 2376Rinisim dockerd me cilësimet e reja:
sudo systemctl daemon-reload && sudo systemctl restart dockerTë kontrollojmë:
sudo systemctl status dockerNëse gjithçka është "e gjelbër", atëherë mendojmë se kemi konfiguruar me sukses docker në server.
Konfigurimi i dërgimit të vazhdueshëm në gitlab
Për të lejuar që punëtorët e GitLab të kryejnë komanda në hostin e largët të Dockerit, është e nevojshme të vendosim se si dhe ku do të ruhen certifikatat dhe çelësi për lidhjen e enkriptuar me dockerd. Enë e madhe e problemit e zgjodha duke e vendosur thjesht në variablat në konfigurimet e GitLab:
Titulli i spolerit
Thjesht printoni përmbajtjen e certifikatave dhe çelësit përmes cat: cat ca.pem. Kopjoni dhe ngjiteni në vlerën e variablave.
Do të shkruajmë një skript për shpërndarjen përmes GitLab. Do të përdorim imazhin docker-in-docker (dind).
.gitlab-ci.yml
image:
name: docker/compose:1.23.2
# do ta ripërdorim entrypoint, për ta bërë të punojë 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 # skripti i shpërndarjes këtu
Përmbajtja e skriptit të shpërndarjes 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 për të "nxjerrë" nga variablat gitlab CI/CD përmbajtjen e certifikatave në një format të pranuar. Nuk mund të kuptoja pse lidhja me hostin e largët nuk funksiononte. Në host shikoja regjistrin sudo journalctl -u docker, aty kishte një gabim gjatë dorëzimit. Vendosa të shikoja se çfarë ruhet në variabla, për këtë mund të shikoja kështu cat -A $DOCKER_CERT_PATH/key.pem. E zgjidhja gabimin duke shtuar heqjen e simbolit të karrocës tr -d ‘r’.
Më pas, mund të shtoni detyra post-release sipas dëshirës tuaj. Mund ta shihni versionin e punës në depozitën time.
Burimi: habr.com
