Nastavitev CD preko gitlab

Razmišljal sem o avtomatizaciji postavitve svojega projekta. gitlab.com prijazno ponuja vse potrebne instrumente, zato sem se odločil, da bom to izkoristil, se seznanil in napisal majhen skript za namestitev. V tem članku delim svoje izkušnje s skupnostjo.

TL;DR

  1. Nastavite VPS: onemogočite root, prijavo s geslom, namestite dockerd, nastavite ufw.
  2. Generirajte certifikate za strežnik in stranko. docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Omogočite upravljanje dockerd prek TCP soketa: odstranite možnost -H fd:// iz Dockerjeve konfiguracije.
  3. Прописать пути до сертификатов в docker.json
  4. V spremenljivkah gitlab v nastavitvah CI/CD vnesite vsebino certifikatov. Napišite skript .gitlab-ci.yml za namestitev.

Vse primere bom prikazal na distribuciji Debian.

Prvotna nastavitev VPS.

Torej, kupili ste primer na DO, prva stvar, ki jo morate storiti, je, da zaščitite svoj strežnik pred agresivnim zunanjim svetom. Ne bom nič dokazoval, samo pokazal bom dnevnik /var/log/messages svojega virtualnega strežnika:

ZaslonNastavitev CD preko gitlab

Najprej namestimo požarni zid ufw:

apt-get update && apt-get install ufw

Omogočili bomo privzeto politiko: blokiramo vse dohodne povezave, dovolimo vse odhodne povezave:

ufw default deny incoming
ufw default allow outgoing

Pomembno: ne pozabite omogočiti povezave prek ssh:

ufw allow OpenSSH

Splošna sintaksa je takšna: Dovolite povezavo na vratih: ufw allow 12345, kjer je 12345 številka vrat ali ime storitve. Prepovedati: ufw deny 12345.

Omogočamo požarni zid:

ufw enable

Izhod iz seje in ponovno se prijavite prek ssh.

Dodajte uporabnika, mu dodelite geslo in ga vključite v skupino sudo.

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

Nato je v načrtu onemogočitev prijave s geslom. Za to prek kopirajte svoj ssh ključ na strežnik:

ssh-copy-id root@10.101.10.28

ip strežnika mora biti vaš. Poskusite se zdaj prijaviti s prej ustvarjenim uporabnikom, gesla več ni treba vnašati. Nato v konfiguracijskih nastavitvah spremenite naslednje:

sudo nano /etc/ssh/sshd_config

onemogočite prijavo s geslom:

PasswordAuthentication no

Ponovno zaženite demon sshd:

sudo systemctl reload sshd

Zdaj, če se vi ali kdo drug poskusa prijaviti preko uporabnika root, mu ne bo uspelo.

Nato namestite dockerd, tu postopka ne bom opisoval, ker se lahko vse že spremeni, pojdite na uradno spletno stran in sledite korakom za namestitev dockerja na vaš virtualni strežnik: https://docs.docker.com/install/linux/docker-ce/debian/

Generiranje certifikatov

Za upravljanje Docker demonima na daljinu potrebno je šifrovano TLS povezivanje. Za to je potrebno imati sertifikat i ključ, koje treba generisati i preneti na vašu udaljenu mašinu. Pratite korake navedene u uputstvu na zvaničnom sajtu Docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Sve generisane *.pem datoteke za server, kao što su ca.pem, server.pem, key.pem, treba smestiti u direktorijum /etc/docker na serveru.

Konfiguracija dockerd

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

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

Nakon toga, treba da kreiramo datoteku sa podešavanjima, ako još ne postoji, i da unesemo 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
}

Omogući konekcije na portu 2376:

sudo ufw allow 2376

Ponovo pokrenimo dockerd sa novim podešavanjima:

sudo systemctl daemon-reload && sudo systemctl restart docker

Provjerimo:

sudo systemctl status docker

Ako je sve "zelena", smatramo da smo uspešno konfigurirali Docker na serveru.

Podešavanje kontinuirane isporuke na GitLabu

Da bi GitLab radnik mogao da izvršava komande na udaljenom Docker hostu, potrebno je odrediti kako i gde čuvati sertifikate i ključ za šifrovanu konekciju sa dockerd. Ovaj problem sam rešio jednostavno definisanjem u promenljivama u podešavanjima GitLaba:

Naslov sklopeNastavitev CD preko gitlab

Jednostavno prikazujte sadržaj sertifikata i ključa preko cat: cat ca.pem. Kopirate i nalepite u vrednost promenljivih.

Napišimo skriptu za implementaciju putem GitLaba. Koristiće se Docker-in-Docker (dind) slika.

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # ponovo ćemo napisati entrypoint da radi 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 ovde

Sadržaj skripte za implementaciju sa 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 je bio u tome da se "izvuku" iz GitLab CI/CD promenljivih sadržaji sertifikata u normalnom formatu. Nisam mogao da shvatim zašto veza sa udaljenim hostom nije radila. Na hostu sam pogledao log sudo journalctl -u docker, gde je bila greška pri rukovanju. Odlučio sam da pogledam šta se zapravo čuva u promenljivama, za to mogu da pogledam ovako cat -A $DOCKER_CERT_PATH/key.pem. Grešku sam prevazišao dodavanjem brisanja karakternog znaka tr -d 'r'.

Nato lahko v scenarij dodate post-release naloge po svoji izbiri. Delovno različico si lahko ogledate v moji zbirki. https://gitlab.com/isqad/gitlab-ci-cd

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster