Gitlab-ээр CD-г тохируулж байна

Би нэг удаа төслөө байршуулах ажлыг автоматжуулах талаар бодож байсан. gitlab.com нь үүнд зориулсан бүх хэрэгслээр хангадаг бөгөөд мэдээжийн хэрэг би үүнийг ашиглахаар шийдсэн бөгөөд үүнийг олж мэдээд жижиг байршуулах скрипт бичихээр шийдсэн. Энэ нийтлэлд би өөрийн туршлагаа олон нийтэд хуваалцаж байна.

TL, DR

  1. VPS тохируулах: root-г идэвхгүй болгох, нууц үгээр нэвтрэх, dockerd суулгах, ufw-г тохируулах
  2. Сервер болон үйлчлүүлэгчийн гэрчилгээ үүсгэх docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Tcp залгуураар докерын хяналтыг идэвхжүүлэх: docker тохиргооноос -H fd:// сонголтыг устгана уу.
  3. Docker.json-д гэрчилгээний замыг бүртгээрэй
  4. CI/CD тохиргоон дахь gitlab хувьсагчдад гэрчилгээний агуулгын хамт бүртгүүлнэ үү. Байршуулахын тулд .gitlab-ci.yml скрипт бичнэ үү.

Би Debian түгээлтийн бүх жишээг харуулах болно.

Анхны VPS тохиргоо

Тиймээс та жишээ худалдаж авсан DO, таны хийх ёстой хамгийн эхний зүйл бол серверээ гадны түрэмгий ертөнцөөс хамгаалах явдал юм. Би юу ч нотлохгүй, нотлохгүй, би зүгээр л виртуал серверийнхээ лог /var/log/ мессежийг харуулах болно:

Дэлгэцийн зурагGitlab-ээр CD-г тохируулж байна

Эхлээд ufw галт ханыг суулгана уу:

apt-get update && apt-get install ufw

Өгөгдмөл бодлогыг идэвхжүүлье: ирж буй бүх холболтыг блоклох, бүх гарах холболтыг зөвшөөрөх:

ufw default deny incoming
ufw default allow outgoing

Чухал: ssh-ээр холбогдохыг зөвшөөрөхөө бүү мартаарай:

ufw allow OpenSSH

Ерөнхий синтакс нь дараах байдалтай байна: Холболтыг портоор зөвшөөрөх: ufw зөвшөөрөх 12345, энд 12345 нь портын дугаар эсвэл үйлчилгээний нэр юм. Үгүйсгэх: ufw үгүйсгэх 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

Хэрэв та эсвэл өөр хэн нэгэн үндсэн хэрэглэгчээр нэвтрэхийг оролдвол энэ нь ажиллахгүй болно.

Дараа нь dockerd-г суулгана уу, би энд үйл явцыг тайлбарлахгүй, учир нь бүх зүйлийг аль хэдийн өөрчлөх боломжтой тул албан ёсны вэбсайт руу орж, виртуал машин дээрээ docker суулгах алхмуудыг дагана уу. https://docs.docker.com/install/linux/docker-ce/debian/

Сертификат үүсгэж байна

Докер демоныг алсаас удирдахын тулд шифрлэгдсэн TLS холболт шаардлагатай. Үүнийг хийхийн тулд та гэрчилгээ, түлхүүртэй байх шаардлагатай бөгөөд үүнийг үүсгэж, алсын машин руугаа шилжүүлэх ёстой. Албан ёсны docker вэбсайт дээрх зааврыг дагана уу. https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Ca.pem, server.pem, key.pem зэрэг серверт зориулсан бүх үүсгэсэн *.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-ээр CD-г тохируулж байна

Зөвхөн гэрчилгээний агуулгыг гаргаж, 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.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

Гол асуудал бол 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

сэтгэгдэл нэмэх