ಗಿಟ್ಲ್ಯಾಬ್ ಮೂಲಕ ಸಿಡಿ ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ

ನನ್ನ ಯೋಜನೆಯ ನಿಯೋಜನೆಯನ್ನು ಸ್ವಯಂಚಾಲಿತಗೊಳಿಸುವ ಬಗ್ಗೆ ನಾನು ಒಮ್ಮೆ ಯೋಚಿಸಿದೆ. gitlab.com ಇದಕ್ಕಾಗಿ ಎಲ್ಲಾ ಸಾಧನಗಳನ್ನು ದಯೆಯಿಂದ ಒದಗಿಸುತ್ತದೆ, ಮತ್ತು ಸಹಜವಾಗಿ ನಾನು ಅದರ ಲಾಭವನ್ನು ಪಡೆಯಲು ನಿರ್ಧರಿಸಿದೆ, ಅದನ್ನು ಲೆಕ್ಕಾಚಾರ ಮಾಡಿ ಮತ್ತು ಸಣ್ಣ ನಿಯೋಜನೆ ಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ಬರೆಯುತ್ತೇನೆ. ಈ ಲೇಖನದಲ್ಲಿ ನಾನು ನನ್ನ ಅನುಭವವನ್ನು ಸಮುದಾಯದೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳುತ್ತೇನೆ.

ಟಿಎಲ್; ಡಿಆರ್

  1. VPS ಅನ್ನು ಹೊಂದಿಸಿ: ರೂಟ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ, ಪಾಸ್‌ವರ್ಡ್‌ನೊಂದಿಗೆ ಲಾಗ್ ಇನ್ ಮಾಡಿ, ಡಾಕರ್ಡ್ ಅನ್ನು ಸ್ಥಾಪಿಸಿ, ufw ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ
  2. ಸರ್ವರ್ ಮತ್ತು ಕ್ಲೈಂಟ್‌ಗಾಗಿ ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ರಚಿಸಿ docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl tcp ಸಾಕೆಟ್ ಮೂಲಕ ಡಾಕರ್ಡ್ ನಿಯಂತ್ರಣವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ: ಡಾಕರ್ ಸಂರಚನೆಯಿಂದ -H fd:// ಆಯ್ಕೆಯನ್ನು ತೆಗೆದುಹಾಕಿ.
  3. docker.json ನಲ್ಲಿ ಪ್ರಮಾಣಪತ್ರಗಳಿಗೆ ಮಾರ್ಗಗಳನ್ನು ನೋಂದಾಯಿಸಿ
  4. ಪ್ರಮಾಣಪತ್ರಗಳ ವಿಷಯಗಳೊಂದಿಗೆ CI/CD ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ gitlab ವೇರಿಯೇಬಲ್‌ಗಳಲ್ಲಿ ನೋಂದಾಯಿಸಿ. ನಿಯೋಜನೆಗಾಗಿ .gitlab-ci.yml ಸ್ಕ್ರಿಪ್ಟ್ ಬರೆಯಿರಿ.

ನಾನು ಡೆಬಿಯನ್ ವಿತರಣೆಯಲ್ಲಿ ಎಲ್ಲಾ ಉದಾಹರಣೆಗಳನ್ನು ತೋರಿಸುತ್ತೇನೆ.

ಆರಂಭಿಕ VPS ಸೆಟಪ್

ಆದ್ದರಿಂದ ನೀವು ಉದಾಹರಣೆಯನ್ನು ಖರೀದಿಸಿದ್ದೀರಿ DO, ನೀವು ಮಾಡಬೇಕಾದ ಮೊದಲ ವಿಷಯವೆಂದರೆ ಆಕ್ರಮಣಕಾರಿ ಹೊರಗಿನ ಪ್ರಪಂಚದಿಂದ ನಿಮ್ಮ ಸರ್ವರ್ ಅನ್ನು ರಕ್ಷಿಸುವುದು. ನಾನು ಏನನ್ನೂ ಸಾಬೀತುಪಡಿಸುವುದಿಲ್ಲ ಅಥವಾ ಪ್ರತಿಪಾದಿಸುವುದಿಲ್ಲ, ನನ್ನ ವರ್ಚುವಲ್ ಸರ್ವರ್‌ನ ಲಾಗ್ /var/log/messages ಅನ್ನು ನಾನು ತೋರಿಸುತ್ತೇನೆ:

ಸ್ಕ್ರೀನ್‌ಶಾಟ್ಗಿಟ್ಲ್ಯಾಬ್ ಮೂಲಕ ಸಿಡಿ ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ

ಮೊದಲು, 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 ಮೂಲಕ ಮತ್ತೆ ಲಾಗ್ ಇನ್ ಮಾಡುತ್ತೇವೆ.

ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ, ಅವರಿಗೆ ಪಾಸ್‌ವರ್ಡ್ ನಿಯೋಜಿಸಿ ಮತ್ತು ಅವರನ್ನು ಸುಡೋ ಗುಂಪಿಗೆ ಸೇರಿಸಿ.

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

ಮುಂದೆ, ಯೋಜನೆಯ ಪ್ರಕಾರ, ನೀವು ಪಾಸ್ವರ್ಡ್ ಲಾಗಿನ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬೇಕು. ಇದನ್ನು ಮಾಡಲು, ನಿಮ್ಮ ssh ಕೀಯನ್ನು ಸರ್ವರ್‌ಗೆ ನಕಲಿಸಿ:

ssh-copy-id [email protected]

ಸರ್ವರ್ ಐಪಿ ನಿಮ್ಮದೇ ಆಗಿರಬೇಕು. ಈಗ ನೀವು ಮೊದಲು ರಚಿಸಿದ ಬಳಕೆದಾರರನ್ನು ಬಳಸಿಕೊಂಡು ಲಾಗ್ ಇನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ; ನೀವು ಇನ್ನು ಮುಂದೆ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸುವ ಅಗತ್ಯವಿಲ್ಲ. ಮುಂದೆ, ಕಾನ್ಫಿಗರೇಶನ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ, ಈ ಕೆಳಗಿನವುಗಳನ್ನು ಬದಲಾಯಿಸಿ:

sudo nano /etc/ssh/sshd_config

ಪಾಸ್ವರ್ಡ್ ಲಾಗಿನ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ:

PasswordAuthentication no

sshd ಡೀಮನ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ:

sudo systemctl reload sshd

ಈಗ ನೀವು ಅಥವಾ ಬೇರೊಬ್ಬರು ರೂಟ್ ಬಳಕೆದಾರರಾಗಿ ಲಾಗ್ ಇನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿದರೆ, ಅದು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ.

ಮುಂದೆ, ಡಾಕರ್ಡ್ ಅನ್ನು ಸ್ಥಾಪಿಸಿ, ನಾನು ಪ್ರಕ್ರಿಯೆಯನ್ನು ಇಲ್ಲಿ ವಿವರಿಸುವುದಿಲ್ಲ, ಏಕೆಂದರೆ ಎಲ್ಲವನ್ನೂ ಈಗಾಗಲೇ ಬದಲಾಯಿಸಬಹುದು, ಅಧಿಕೃತ ವೆಬ್‌ಸೈಟ್‌ಗೆ ಲಿಂಕ್ ಅನ್ನು ಅನುಸರಿಸಿ ಮತ್ತು ನಿಮ್ಮ ವರ್ಚುವಲ್ ಗಣಕದಲ್ಲಿ ಡಾಕರ್ ಅನ್ನು ಸ್ಥಾಪಿಸುವ ಹಂತಗಳ ಮೂಲಕ ಹೋಗಿ: 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 ಡೈರೆಕ್ಟರಿಯಲ್ಲಿ ಇರಿಸಬೇಕು.

ಡಾಕರ್ಡ್ ಅನ್ನು ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ

ಡಾಕರ್ ಡೀಮನ್ ಲಾಂಚ್ ಸ್ಕ್ರಿಪ್ಟ್‌ನಲ್ಲಿ, ನಾವು -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

ಹೊಸ ಸೆಟ್ಟಿಂಗ್‌ಗಳೊಂದಿಗೆ ಡಾಕರ್ಡ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸೋಣ:

sudo systemctl daemon-reload && sudo systemctl restart docker

ಪರಿಶೀಲಿಸೋಣ:

sudo systemctl status docker

ಎಲ್ಲವೂ "ಹಸಿರು" ಆಗಿದ್ದರೆ, ನಾವು ಸರ್ವರ್‌ನಲ್ಲಿ ಡಾಕರ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ್ದೇವೆ ಎಂದು ನಾವು ಪರಿಗಣಿಸುತ್ತೇವೆ.

ಗಿಟ್‌ಲ್ಯಾಬ್‌ನಲ್ಲಿ ನಿರಂತರ ವಿತರಣೆಯನ್ನು ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ

ರಿಮೋಟ್ ಡಾಕರ್ ಹೋಸ್ಟ್‌ನಲ್ಲಿ ಕಮಾಂಡ್‌ಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲು ಗಿಟಾಲಾಬಾ ಕೆಲಸಗಾರನಿಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ, ಡಾಕರ್ಡ್‌ನೊಂದಿಗೆ ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಿದ ಸಂಪರ್ಕಕ್ಕಾಗಿ ಪ್ರಮಾಣಪತ್ರಗಳು ಮತ್ತು ಕೀಲಿಯನ್ನು ಹೇಗೆ ಮತ್ತು ಎಲ್ಲಿ ಸಂಗ್ರಹಿಸಬೇಕು ಎಂಬುದನ್ನು ನಿರ್ಧರಿಸುವುದು ಅವಶ್ಯಕ. gitlbab ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿನ ವೇರಿಯೇಬಲ್‌ಗಳಿಗೆ ಈ ಕೆಳಗಿನವುಗಳನ್ನು ಸೇರಿಸುವ ಮೂಲಕ ನಾನು ಈ ಸಮಸ್ಯೆಯನ್ನು ಪರಿಹರಿಸಿದೆ:

ಸ್ಪಾಯ್ಲರ್ ಶೀರ್ಷಿಕೆಗಿಟ್ಲ್ಯಾಬ್ ಮೂಲಕ ಸಿಡಿ ಹೊಂದಿಸಲಾಗುತ್ತಿದೆ

ಕ್ಯಾಟ್ ಮೂಲಕ ಪ್ರಮಾಣಪತ್ರಗಳು ಮತ್ತು ಕೀಗಳ ವಿಷಯಗಳನ್ನು ಔಟ್ಪುಟ್ ಮಾಡಿ: cat ca.pem. ವೇರಿಯಬಲ್ ಮೌಲ್ಯಗಳಿಗೆ ನಕಲಿಸಿ ಮತ್ತು ಅಂಟಿಸಿ.

GitLab ಮೂಲಕ ನಿಯೋಜನೆಗಾಗಿ ಸ್ಕ್ರಿಪ್ಟ್ ಬರೆಯೋಣ. ಡಾಕರ್-ಇನ್-ಡಾಕರ್ (ಡಿಂಡ್) ಚಿತ್ರವನ್ನು ಬಳಸಲಾಗುತ್ತದೆ.

.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

ಗಿಟ್ಲ್ಯಾಬ್ CI/CD ವೇರಿಯೇಬಲ್‌ಗಳಿಂದ ಸಾಮಾನ್ಯ ರೂಪದಲ್ಲಿ ಪ್ರಮಾಣಪತ್ರಗಳ ವಿಷಯಗಳನ್ನು "ಪುಲ್" ಮಾಡುವುದು ಮುಖ್ಯ ಸಮಸ್ಯೆಯಾಗಿದೆ. ರಿಮೋಟ್ ಹೋಸ್ಟ್‌ಗೆ ಸಂಪರ್ಕವು ಏಕೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿಲ್ಲ ಎಂದು ನನಗೆ ಕಂಡುಹಿಡಿಯಲಾಗಲಿಲ್ಲ. ಹೋಸ್ಟ್‌ನಲ್ಲಿ ನಾನು ಲಾಗ್ sudo journalctl -u ಡಾಕರ್ ಅನ್ನು ನೋಡಿದೆ, ಹ್ಯಾಂಡ್‌ಶೇಕ್ ಸಮಯದಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ. ವೇರಿಯೇಬಲ್‌ಗಳಲ್ಲಿ ಸಾಮಾನ್ಯವಾಗಿ ಏನನ್ನು ಸಂಗ್ರಹಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ನೋಡಲು ನಾನು ನಿರ್ಧರಿಸಿದೆ; ಇದನ್ನು ಮಾಡಲು, ನೀವು ಈ ರೀತಿ ಕಾಣಿಸಬಹುದು: cat -A $DOCKER_CERT_PATH/key.pem. ನಾನು ಕ್ಯಾರೇಜ್ ಅಕ್ಷರದ ತೆಗೆದುಹಾಕುವಿಕೆಯನ್ನು ಸೇರಿಸುವ ಮೂಲಕ ದೋಷವನ್ನು ನಿವಾರಿಸಿದೆ tr -d 'r'.

ಮುಂದೆ, ನಿಮ್ಮ ವಿವೇಚನೆಯಿಂದ ಸ್ಕ್ರಿಪ್ಟ್‌ಗೆ ಬಿಡುಗಡೆಯ ನಂತರದ ಕಾರ್ಯಗಳನ್ನು ನೀವು ಸೇರಿಸಬಹುದು. ನನ್ನ ರೆಪೊಸಿಟರಿಯಲ್ಲಿ ನೀವು ಕೆಲಸ ಮಾಡುವ ಆವೃತ್ತಿಯನ್ನು ವೀಕ್ಷಿಸಬಹುದು https://gitlab.com/isqad/gitlab-ci-cd

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ