Configuration CD via gitlab

Un jour, je me suis interrogé sur l'automatisation du déploiement de mon projet. gitlab.com propose toutes les outils nécessaires, et j'ai bien sûr décidé d'en profiter, en m'instruisant et en écrivant un petit script de déploiement. Dans cet article, je partage mon expérience avec la communauté.

TL;DR

  1. Configurer VPS : désactiver root, accès par mot de passe, installer dockerd, configurer ufw
  2. Générer des certificats pour le serveur et le client docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Activer la gestion de dockerd via un socket TCP : retirer l'option -H fd:// du fichier de configuration de Docker.
  3. Прописать пути до сертификатов в docker.json
  4. Définir les variables dans GitLab dans les paramètres CI/CD avec le contenu des certificats. Écrire un script .gitlab-ci.yml pour le déploiement.

Tous les exemples que je vais montrer seront basés sur la distribution Debian.

Configuration initiale du VPS

Vous avez acheté un instance par exemple sur DO, la première chose à faire est de protéger votre serveur contre le monde extérieur agressif. Je ne vais rien prouver ni affirmer, je vais juste montrer les logs /var/log/messages de mon serveur virtuel :

Capture d'écranConfiguration CD via gitlab

Tout d'abord, installons le pare-feu ufw :

apt-get update && apt-get install ufw

Nous allons activer la politique par défaut : bloquer toutes les connexions entrantes, autoriser toutes les connexions sortantes :

ufw default deny incoming
ufw default allow outgoing

Important : n'oubliez pas d'autoriser la connexion par ssh :

ufw allow OpenSSH

La syntaxe générale est la suivante : Autoriser une connexion sur un port : ufw allow 12345, où 12345 est le numéro de port ou le nom du service. Interdire : ufw deny 12345

Activer le pare-feu :

ufw enable

Déconnectez-vous de la session et reconnectez-vous par ssh.

Ajoutez un utilisateur, définissez un mot de passe et ajoutez-le au groupe sudo.

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

Ensuite, le plan prévoit de désactiver l'accès par mot de passe. Pour cela, copiez votre clé ssh sur le serveur :

ssh-copy-id root@10.101.10.28

l'IP du serveur doit être la vôtre. Essayez maintenant de vous connecter avec l'utilisateur que vous avez créé précédemment, vous n'aurez plus besoin de saisir un mot de passe. Ensuite, changez ce qui suit dans la configuration :

sudo nano /etc/ssh/sshd_config

désactiver l'accès par mot de passe :

PasswordAuthentication no

Redémarrez le démon sshd :

sudo systemctl reload sshd

Désormais, si vous ou quelqu'un d'autre essayez de vous connecter avec l'utilisateur root, cela ne fonctionnera pas.

Ensuite, installons dockerd, ici je ne vais pas décrire le processus car tout peut avoir changé, allez sur le site officiel et suivez les étapes pour installer docker sur votre machine virtuelle : https://docs.docker.com/install/linux/docker-ce/debian/

Génération de certificats

Pour gérer le démon Docker à distance, une connexion TLS chiffrée est requise. Pour cela, vous devez avoir un certificat et une clé, que vous devez générer et transférer sur votre machine distante. Suivez les étapes indiquées dans le guide sur le site officiel de Docker : https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Tous les fichiers *.pem générés pour le serveur, à savoir ca.pem, server.pem, key.pem, doivent être placés dans le répertoire /etc/docker sur le serveur.

Configuration de dockerd

Dans le script de démarrage du démon Docker, retirez l'option -H df://, cette option détermine depuis quel hôte vous pouvez gérer le démon Docker.

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

Ensuite, créez un fichier de configuration, s'il n'existe pas encore, et précisez les options :

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

Autorisons les connexions sur le port 2376 :

sudo ufw allow 2376

Redémarrons dockerd avec les nouvelles configurations :

sudo systemctl daemon-reload && sudo systemctl restart docker

Vérifions :

sudo systemctl status docker

Si tout est «vert», nous considérons que Docker a été configuré avec succès sur le serveur.

Configuration de la livraison continue sur GitLab

Pour permettre au worker de GitLab d'exécuter des commandes sur l'hôte distant Docker, il est nécessaire de définir comment et où stocker les certificats et la clé pour la connexion chiffrée avec dockerd. J'ai résolu ce problème simplement en définissant des variables dans les paramètres de GitLab :

Titre du spoilerConfiguration CD via gitlab

Il suffit d'afficher le contenu des certificats et de la clé avec cat : cat ca.pem. Copiez et collez dans les valeurs des variables.

Écrivons un script de déploiement via GitLab. Nous utiliserons l'image docker-in-docker (dind).

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # réécrivons l'entrypoint pour que cela fonctionne dans 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 # script de déploiement ici

Contenu du script de déploiement avec commentaires :

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

Le principal problème était de « sortir » des variables GitLab CI/CD le contenu des certificats dans un format normal. Je ne comprenais pas pourquoi la connexion à l'hôte distant ne fonctionnait pas. Sur l'hôte, j'ai vérifié le journal avec sudo journalctl -u docker, et j'y ai trouvé une erreur lors de l'authentification. J'ai décidé de voir ce qui était enregistré dans les variables, pour cela, on peut utiliser cat -A $DOCKER_CERT_PATH/key.pem. J'ai résolu l'erreur en ajoutant la suppression du caractère de retour à la ligne avec tr -d ‘r’.

Ensuite, vous pouvez ajouter des tâches post-release dans le scénario à votre convenance. Vous pouvez consulter la version de travail dans mon référentiel. https://gitlab.com/isqad/gitlab-ci-cd

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster