Поставување ЦД преку gitlab

Еднаш размислував да го автоматизирам распоредувањето на мојот проект. gitlab.com љубезно ги обезбедува сите алатки за ова, и се разбира, решив да ги искористам предностите на тоа, да го сфатам и да напишам мала скрипта за распоредување. Во оваа статија го споделувам моето искуство со заедницата.

TL; ДР

  1. Поставете VPS: оневозможете root, најавете се со лозинка, инсталирајте dockerd, конфигурирајте ufw
  2. Генерирајте сертификати за сервер и клиент docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Овозможете контрола на dockerd преку tcp сокет: отстранете ја опцијата -H fd:// од конфигурацијата на докер.
  3. Регистрирајте ги патеките до сертификатите во docker.json
  4. Регистрирајте се во променливите gitlab во поставките за CI/CD со содржината на сертификатите. Напишете скрипта .gitlab-ci.yml за распоредување.

Ќе ги покажам сите примери за распределбата на Debian.

Почетно поставување VPS

Така купивте пример на пример во DO, првото нешто што треба да направите е да го заштитите вашиот сервер од агресивниот надворешен свет. Нема да докажам или тврдам ништо, само ќе го покажам дневникот /var/log/пораки на мојот виртуелен сервер:

ЕкранотПоставување ЦД преку gitlab

Прво, инсталирајте го заштитниот ѕид на ufw:

apt-get update && apt-get install ufw

Ајде да ја овозможиме стандардната политика: блокирајте ги сите дојдовни врски, дозволете ги сите појдовни врски:

ufw default deny incoming
ufw default allow outgoing

Важно: не заборавајте да ја дозволите врската преку ssh:

ufw allow OpenSSH

Општата синтакса е следна: Дозволете поврзување по порта: ufw allow 12345, каде што 12345 е бројот на портата или името на услугата. Негирајте: ufw deny 12345

Вклучете го заштитниот ѕид:

ufw enable

Излегуваме од сесијата и повторно се најавуваме преку ssh.

Додадете корисник, доделете му лозинка и додајте го во групата sudo.

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

Следно, според планот, треба да го оневозможите најавувањето со лозинка. за да го направите ова, копирајте го вашиот ssh клуч на серверот:

ssh-copy-id [email protected]

IP-а на серверот мора да биде ваша. Сега обидете се да се најавите користејќи го корисникот што го создадовте претходно; повеќе не треба да внесувате лозинка. Следно, во поставките за конфигурација, променете го следново:

sudo nano /etc/ssh/sshd_config

оневозможи најавување со лозинка:

PasswordAuthentication no

Рестартирајте го sshd демонот:

sudo systemctl reload sshd

Сега, ако вие или некој друг се обиде да се најавите како root корисник, тоа нема да работи.

Следно, инсталирајте го dockerd, нема да го опишам процесот овде, бидејќи сè веќе може да се смени, следете ја врската до официјалната веб-страница и поминете низ чекорите за инсталирање на docker на вашата виртуелна машина: https://docs.docker.com/install/linux/docker-ce/debian/

Генерирање сертификати

За далечинско контролирање на докерскиот демон, потребна е шифрирана TLS врска. За да го направите ова, треба да имате сертификат и клуч, кои мора да бидат генерирани и префрлени на вашата далечинска машина. Следете ги чекорите дадени во упатствата на официјалната веб-страница на докер: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Сите генерирани *.pem датотеки за серверот, имено ca.pem, server.pem, key.pem, мора да се стават во директориумот /etc/docker на серверот.

Поставување dockerd

Во скриптата за лансирање на докерскиот демон, ја отстрануваме опцијата -H df://, оваа опција одредува на кој домаќин може да се контролира докерскиот демон.

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

Следно, треба да креирате датотека за поставки, ако веќе не постои, и да ги наведете опциите:

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

Ајде да дозволиме врски на портата 2376:

sudo ufw allow 2376

Ајде да го рестартираме dockerd со новите поставки:

sudo systemctl daemon-reload && sudo systemctl restart docker

Ајде да провериме:

sudo systemctl status docker

Ако сè е „зелено“, тогаш сметаме дека успешно го конфигуриравме докерот на серверот.

Поставување континуирана испорака на gitlab

За да може работникот на Гиталаба да извршува команди на далечински домаќин Docker, потребно е да одлучи како и каде да ги складира сертификатите и клучот за шифрирана врска со Dockerd. Го решив овој проблем со едноставно додавање на следново на променливите во поставките за gitlbab:

Наслов на спојлерПоставување ЦД преку gitlab

Само изнесете ја содржината на сертификатите и клучот преку cat: cat ca.pem. Копирајте и залепете во вредностите на променливите.

Ајде да напишеме скрипта за распоредување преку GitLab. Ќе се користи сликата docker-in-docker (dind).

.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 # скрипт деплоя тут

Содржина на скриптата за распоредување со коментари:

bin/deploy.ш

#!/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

Главниот проблем беше да се „извлече“ содржината на сертификатите во нормална форма од gitlab CI/CD променливите. Не можев да сфатам зошто врската со далечинскиот домаќин не работи. На домаќинот погледнав во log sudo journalctl -u docker, имаше грешка при ракувањето. Решив да погледнам што е генерално зачувано во променливи; за да го направите ова, можете да изгледате вака: cat -A $DOCKER_CERT_PATH/key.pem. Ја надминав грешката со додавање на отстранување на знакот за превоз tr -d 'r'.

Следно, можете да додадете задачи по објавувањето во сценариото по ваша дискреција. Работната верзија можете да ја видите во моето складиште https://gitlab.com/isqad/gitlab-ci-cd

Извор: www.habr.com

Додадете коментар