Gitlab orqali kompakt diskni sozlash

Men bir marta loyihamni joylashtirishni avtomatlashtirish haqida o'yladim. gitlab.com mehribonlik bilan buning uchun barcha vositalarni taqdim etadi va, albatta, men undan foydalanishga qaror qildim, buni bilib oldim va kichik joylashtirish skriptini yozdim. Ushbu maqolada men o'z tajribamni jamiyat bilan baham ko'raman.

TP; DR

  1. VPS-ni o'rnating: root-ni o'chiring, parol bilan tizimga kiring, dockerd-ni o'rnating, ufw-ni sozlang
  2. Server va mijoz uchun sertifikatlar yarating docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl tcp soketi orqali dockerd boshqaruvini yoqing: docker konfiguratsiyasidan -H fd:// opsiyasini olib tashlang.
  3. Sertifikatlarga yo'llarni docker.json da ro'yxatdan o'tkazing
  4. CI/CD sozlamalarida sertifikatlar mazmuni bilan gitlab o'zgaruvchilarida ro'yxatdan o'ting. Joylashtirish uchun .gitlab-ci.yml skriptini yozing.

Men Debian taqsimotidagi barcha misollarni ko'rsataman.

Dastlabki VPS sozlamalari

Shunday qilib, siz misol sotib oldingiz DO, qilishingiz kerak bo'lgan birinchi narsa - serveringizni tajovuzkor tashqi dunyodan himoya qilishdir. Men hech narsani isbotlamayman yoki tasdiqlamayman, shunchaki virtual serverimning /var/log/messages jurnalini ko'rsataman:

Ekran rasmlariGitlab orqali kompakt diskni sozlash

Birinchidan, ufw xavfsizlik devorini o'rnating:

apt-get update && apt-get install ufw

Standart siyosatni yoqaylik: barcha kiruvchi ulanishlarni bloklang, barcha chiquvchi ulanishlarga ruxsat bering:

ufw default deny incoming
ufw default allow outgoing

Muhim: ssh orqali ulanishga ruxsat berishni unutmang:

ufw allow OpenSSH

Umumiy sintaksis quyidagicha: Port orqali ulanishga ruxsat berish: ufw ruxsat 12345, bu erda 12345 port raqami yoki xizmat nomi. Rad etish: ufw rad etish 12345

Xavfsizlik devorini yoqing:

ufw enable

Biz sessiyadan chiqamiz va ssh orqali yana tizimga kiramiz.

Foydalanuvchi qo'shing, unga parol tayinlang va uni sudo guruhiga qo'shing.

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

Keyinchalik, rejaga ko'ra, parol bilan kirishni o'chirib qo'yishingiz kerak. Buning uchun ssh kalitingizni serverga nusxalang:

ssh-copy-id [email protected]

Serverning IP manzili sizniki bo'lishi kerak. Endi avval yaratgan foydalanuvchi orqali tizimga kirishga harakat qiling; endi parol kiritishingiz shart emas. Keyin, konfiguratsiya sozlamalarida quyidagilarni o'zgartiring:

sudo nano /etc/ssh/sshd_config

parolga kirishni o'chirib qo'ying:

PasswordAuthentication no

Sshd demonini qayta ishga tushiring:

sudo systemctl reload sshd

Endi siz yoki boshqa birov root foydalanuvchi sifatida tizimga kirishga harakat qilsangiz, u ishlamaydi.

Keyin, dockerd-ni o'rnating, men bu erda jarayonni tasvirlamayman, chunki hamma narsani allaqachon o'zgartirish mumkin, rasmiy veb-saytga havolaga o'ting va virtual mashinangizga dockerni o'rnatish bosqichlarini bajaring: https://docs.docker.com/install/linux/docker-ce/debian/

Sertifikatlarni yaratish

Docker demonini masofadan boshqarish uchun shifrlangan TLS ulanishi talab qilinadi. Buni amalga oshirish uchun sizda sertifikat va kalit bo'lishi kerak, ular yaratilishi va masofaviy kompyuteringizga o'tkazilishi kerak. Rasmiy docker veb-saytidagi ko'rsatmalarda keltirilgan amallarni bajaring: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Server uchun yaratilgan barcha *.pem fayllari, ya'ni ca.pem, server.pem, key.pem serverdagi /etc/docker katalogiga joylashtirilishi kerak.

Dockerd o'rnatilmoqda

Docker demonini ishga tushirish skriptida biz -H df:// variantini olib tashlaymiz, bu parametr qaysi xostda docker demonini boshqarish mumkinligini aniqlaydi.

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

Keyinchalik, sozlamalar faylini yaratishingiz kerak, agar u allaqachon mavjud bo'lmasa va variantlarni belgilang:

/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 portda ulanishga ruxsat beraylik:

sudo ufw allow 2376

Keling, dockerd-ni yangi sozlamalar bilan qayta ishga tushiramiz:

sudo systemctl daemon-reload && sudo systemctl restart docker

Keling, tekshiramiz:

sudo systemctl status docker

Agar hamma narsa "yashil" bo'lsa, biz serverda dockerni muvaffaqiyatli sozladik deb hisoblaymiz.

Gitlabda uzluksiz yetkazib berishni sozlash

Gitalaba ishchisi masofaviy Docker xostida buyruqlarni bajara olishi uchun sertifikatlar va Dockerd bilan shifrlangan ulanish kalitini qanday va qayerda saqlash kerakligini hal qilish kerak. Men bu muammoni gitlbab sozlamalaridagi o'zgaruvchilarga oddiygina qo'shish orqali hal qildim:

Spoiler sarlavhasiGitlab orqali kompakt diskni sozlash

Faqat sertifikatlar mazmunini va kalitni mushuk orqali chiqaring: cat ca.pem. O'zgaruvchi qiymatlariga nusxa ko'chiring va joylashtiring.

Keling, GitLab orqali joylashtirish uchun skript yozaylik. Docker-in-docker (dind) tasviridan foydalaniladi.

.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 # скрипт дСплоя Ρ‚ΡƒΡ‚

Izohlar bilan tarqatish skriptining mazmuni:

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

Asosiy muammo sertifikatlar mazmunini gitlab CI/CD o'zgaruvchilaridan oddiy shaklda "tortib olish" edi. Masofaviy hostga ulanish nima uchun ishlamayotganini tushunolmadim. Xostda men sudo journalctl -u docker jurnaliga qaradim, qo'l siqish paytida xatolik yuz berdi. Men odatda o'zgaruvchilarda saqlanadigan narsalarni ko'rib chiqishga qaror qildim; Buning uchun siz shunday ko'rinishga ega bo'lishingiz mumkin: cat -A $DOCKER_CERT_PATH/key.pem. Men tr -d 'r' vagon belgisini olib tashlashni qo'shish orqali xatoni bartaraf etdim.

Keyinchalik, siz o'zingizning xohishingiz bilan skriptga nashrdan keyingi vazifalarni qo'shishingiz mumkin. Ishchi versiyani mening omborimda ko'rishingiz mumkin https://gitlab.com/isqad/gitlab-ci-cd

Manba: www.habr.com

a Izoh qo'shish