Postavljanje CD-a putem gitlaba

Jednom sam razmišljao o automatizaciji raspoređivanja svog projekta. gitlab.com ljubazno pruža sve alate za to, pa sam odlučio iskoristiti to, razumjeti i napisati mali raspoređivački skript. U članku dijelim svoje iskustvo s zajednicom.

TL;DR

  1. Postavi VPS: onemogući root, prijavu putem lozinke, instaliraj dockerd, postavi ufw
  2. Generiraj certifikate za server i klijenta docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Omogući upravljanje dockerd-om putem tcp soketa: ukloni opciju -H fd:// iz docker konfiguracije.
  3. Прописать пути до сертификатов в docker.json
  4. Unesi u varijable gitlaba u CI/CD postavkama sadržaj certifikata. Napiši skript .gitlab-ci.yml za raspoređivanje.

Sve primjere ću prikazati na distribuciji Debian.

Prvotna konfiguracija VPS-a

Dakle, kupili ste instancu na primjer na IZVRŠI, prvo što treba učiniti je zaštititi svoj server od agresivnog vanjskog svijeta. Neću ništa dokazivati i tvrditi, samo ću pokazati log /var/log/messages svog virtualnog servera:

Snimka ekranaPostavljanje CD-a putem gitlaba

Prvo ćemo instalirati vatrozid ufw:

apt-get update && apt-get install ufw

Uključujemo politiku prema zadanim postavkama: blokiramo sve dolazne veze, dopuštamo sve odlazne veze:

ufw default deny incoming
ufw default allow outgoing

Važno: ne zaboravite omogućiti vezu putem ssh:

ufw allow OpenSSH

Opći sintaksis je ovakav: Omogućiti vezu putem porta: ufw allow 12345, gdje je 12345 broj porta ili naziv servisa. Zabraniti: ufw deny 12345

Aktiviraj vatrozid:

ufw enable

Izađite iz sesije i ponovo se prijavite putem ssh.

Dodajte korisnika, dodijelite mu lozinku i dodajte ga u grupu sudo.

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

Sljedeći korak je onemogućiti prijavu putem lozinke. Za to kopirajte svoj ssh ključ na server:

ssh-copy-id root@10.101.10.28

ip servera treba biti vaš. Pokušajte se sada prijaviti kao ranije stvoreni korisnik, lozinku više ne trebate unositi. Zatim u konfiguracijskim postavkama mijenjamo sljedeće:

sudo nano /etc/ssh/sshd_config

onemogućite prijavu putem lozinke:

PasswordAuthentication no

Ponovno pokrenite sshd demon:

sudo systemctl reload sshd

Sada, ako vi ili netko drugi pokuša ući kao korisnik root, neće uspjeti.

Zatim instaliramo dockerd, ovdje neću opisivati proces jer se može puno toga promijeniti, idite na službenu stranicu i prođite kroz korake instalacije dockera na svom virtualnom serveru: https://docs.docker.com/install/linux/docker-ce/debian/

Generiranje certifikata

Za upravljanje Docker demonima na daljinu potrebno je šifrirano TLS povezivanje. Da biste to postigli, potrebno je generirati certifikat i ključ te ih prenijeti na vaše udaljeno računalo. Slijedite korake navedene u uputama na službenoj Docker web stranici: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Sve generirane *.pem datoteke za server, odnosno ca.pem, server.pem, key.pem trebate staviti u direktorij /etc/docker na serveru.

Postavljanje dockerd-a

U skripti za pokretanje Docker demona uklanjamo opciju -H df://, ova opcija određuje na kojem hostu se može upravljati Docker demonima.

# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd

Zatim je potrebno stvoriti datoteku s postavkama, ako već ne postoji, i upisati opcije:

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

Dozvolimo veze putem porta 2376:

sudo ufw allow 2376

Ponovo pokrećemo dockerd s novim postavkama:

sudo systemctl daemon-reload && sudo systemctl restart docker

Provjerimo:

sudo systemctl status docker

Ako je sve "zeleno", smatramo da smo uspješno postavili Docker na serveru.

Postavke kontinuirane isporuke na GitLab-u

Da bi GitLab radnik mogao izvršavati naredbe na udaljenom Docker hostu, potrebno je odlučiti kako i gdje pohraniti certifikate i ključ za šifrirano povezivanje s dockerd-om. Ovaj problem sam riješio jednostavno definiranjem varijabli u postavkama GitLab-a:

Naslov proširivanjaPostavljanje CD-a putem gitlaba

Jednostavno prikažite sadržaj certifikata i ključa putem cat: cat ca.pem. Kopirajte i zalijepite u vrijednosti varijabli.

Definirajmo skriptu za implementaciju putem GitLab-a. Koristit će se Docker-in-Docker (dind) slika.

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # prepisujemo entrypoint kako bi radio u 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 # skripta za implementaciju ovdje

Sadržaj skripte za implementaciju s komentarima:

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

Glavni problem bio je "izvlačenje" iz GitLab CI/CD varijabli sadržaja certifikata u ispravnom obliku. Nisam mogao razumjeti zašto povezivanje s udaljenim hostom nije radilo. Pogledao sam zapis na hostu sudo journalctl -u docker, tamo je bila greška pri rukovanju. Odlučio sam provjeriti što se uopće čuva u varijablama, za to se može pogledati na sljedeći način cat -A $DOCKER_CERT_PATH/key.pem. Grešku sam riješio uklanjanjem karaktera povratne oznake tr -d 'r'.

Dalje u scenarij možete dodati post-release zadatke prema vlastitom nahođenju. Radnu verziju možete pogledati u mom repozitoriju https://gitlab.com/isqad/gitlab-ci-cd

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster