Mi iam pensis pri aŭtomatigo de la deplojo de mia projekto. gitlab.com afable provizas ĉiujn ilojn por ĉi tio, kaj kompreneble mi decidis uzi ĝin eltrovante ĝin kaj skribante malgrandan deplojan skripton. En ĉi tiu artikolo, mi dividas mian sperton kun la komunumo.
Registru en la gitlab-variabloj en la CI / KD-agordoj kun la enhavo de la atestiloj. Skribu .gitlab-ci.yml skripton por deplojo.
Mi montros ĉiujn ekzemplojn pri la Debiana distribuo.
Komenca VPS-agordo
Ĉi tie vi aĉetis ekzemplon ekzemple sur DO, La unua afero por fari estas protekti vian servilon de la agresema ekstera mondo. Mi nenion pruvos aŭ asertos, mi nur montros la /var/log/messages protokolon de mia virtuala servilo:
Ekrankopio
Unue, instalu la ufw-fajrumuron:
apt-get update && apt-get install ufw
Ebligu la defaŭltan politikon: bloku ĉiujn envenantajn konektojn, permesu ĉiujn elirantajn ligojn:
La ip de la servilo devas esti via. Nun provu ensaluti sub la uzanto kreita pli frue, vi ne plu bezonas enigi pasvorton. Poste, en la agordaj agordoj, ŝanĝu la jenajn:
sudo nano /etc/ssh/sshd_config
malŝalti pasvortan ensaluton:
PasswordAuthentication no
Rekomencu la sshd-demonon:
sudo systemctl reload sshd
Nun se vi aŭ iu alia provas ensaluti kiel radiko, ĝi malsukcesos.
Poste, ni instalas dockerd, mi ne priskribos la procezon ĉi tie, ĉar ĉio jam povas esti ŝanĝita, sekvu la ligon al la oficiala retejo kaj trairu la paŝojn por instali docker sur via virtuala maŝino: https://docs.docker.com/install/linux/docker-ce/debian/
Atestila generacio
Por kontroli la docker-demonon malproksime, ĉifrita TLS-konekto estas postulata. Por fari tion, vi devas havi atestilon kaj ŝlosilon, kiujn vi bezonas por generi kaj transdoni al via fora maŝino. Sekvu la paŝojn donitajn en la instrukcioj en la oficiala retejo de docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Ĉiuj generitaj *.pem dosieroj por la servilo, nome ca.pem, server.pem, key.pem, devus esti metitaj en la dosierujon /etc/docker sur la servilo.
docker agordo
En la starta skripto de docker-demono, forigu la opcion -H df://, ĉi tiu opcio diras, sur kiu gastiganto la docker-demono povas esti kontrolita.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Poste, kreu agordan dosieron se ĝi ne jam ekzistas kaj agordu la opciojn:
Se ĉio estas verda, tiam ni konsideras, ke ni sukcese agordis docker sur la servilo.
Agordi kontinuan liveron sur gitlab
Por ke la gitalab-laboristo povu efektivigi komandojn sur fora docker-gastiganto, vi devas decidi kiel kaj kie stoki atestilojn kaj ŝlosilon por ĉifrita konekto al dockerd. Mi solvis ĉi tiun problemon simple skribante al la variabloj en la gitlbab-agordoj:
spoiler titolo
Nur eligu la enhavon de la atestiloj kaj ŝlosilon per kato: cat ca.pem. Kopiu kaj algluu en variajn valorojn.
Ni skribu skripton por deplojo per gitlab. La bildo docker-in-docker (dind) estos uzata.
#!/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
La ĉefa problemo estis "eltiri" la enhavon de la atestiloj en la normala formo el la gitlab CI / KD-variabloj. Mi ne povis eltrovi kial la konekto al la fora gastiganto ne funkciis. Mi rigardis la sudo journalctl -u docker log sur la gastiganto, estas eraro kun la manpremo. Mi decidis rigardi kio estas ĝenerale stokita en variabloj, por tio vi povas vidi cat -A $DOCKER_CERT_PATH/key.pem. Venkis la eraron aldonante la forigon de la signo tr -d 'r'.
Plue, vi povas aldoni post-eldonajn taskojn al la skripto laŭ via bontrovo. Vi povas kontroli la funkciantan version en mia deponejo https://gitlab.com/isqad/gitlab-ci-cd