KD-aranĝo per gitlab

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.

TL; DR

  1. Agordu VPS: malŝalti radikon, pasvortan ensaluti, instali dockerd, agordi ufw
  2. Generu atestilojn por servilo kaj kliento docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Ebligu dockerd-kontrolon per tcp-ingo: forigu la opcion -H fd:// el la docker-agordo.
  3. Agordu vojojn al atestiloj en docker.json
  4. 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:

EkrankopioKD-aranĝo per gitlab

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:

ufw default deny incoming
ufw default allow outgoing

Grava: ne forgesu permesi konekton per ssh:

ufw allow OpenSSH

La ĝenerala sintakso estas: Permesi konekton sur haveno: ufw allow 12345, kie 12345 estas la havenonumero aŭ servonomo. Nei: ufw nei 12345

Ŝaltu fajroŝirmilon:

ufw enable

Ni eliras la seancon kaj ensalutas denove per ssh.

Aldonu uzanton, asignu al li pasvorton kaj aldonu lin al la sudo-grupo.

apt-get install sudo
adduser scoty
usermod -aG sudo scoty

Poste, laŭ la plano, vi devus malŝalti pasvortan ensaluton. por fari tion, kopiu vian ssh-ŝlosilon al la servilo:

ssh-copy-id [email protected]

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:

/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
}

Permesu konektojn sur haveno 2376:

sudo ufw allow 2376

Rekomencu dockerd kun novaj agordoj:

sudo systemctl daemon-reload && sudo systemctl restart docker

Ni kontrolu:

sudo systemctl status docker

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 titoloKD-aranĝo per gitlab

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.

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # перепишем entrypoint , чтобы работало в 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 # скрипт деплоя тут

La enhavo de la deploja skripto kun komentoj:

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

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

fonto: www.habr.com

Aldoni komenton