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
- Configurer VPS : désactiver root, accès par mot de passe, installer dockerd, configurer ufw
- Générer des certificats pour le serveur et le client Activer la gestion de dockerd via un socket TCP : retirer l'option -H fd:// du fichier de configuration de Docker.
- Прописать пути до сертификатов в docker.json
- 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 , 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'écran
Tout d'abord, installons le pare-feu ufw :
apt-get update && apt-get install ufwNous allons activer la politique par défaut : bloquer toutes les connexions entrantes, autoriser toutes les connexions sortantes :
ufw default deny incoming
ufw default allow outgoingImportant : n'oubliez pas d'autoriser la connexion par ssh :
ufw allow OpenSSHLa 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 enableDé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 scotyEnsuite, 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.28l'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_configdésactiver l'accès par mot de passe :
PasswordAuthentication noRedémarrez le démon sshd :
sudo systemctl reload sshdDé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 :
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 : 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/dockerdEnsuite, 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 2376Redémarrons dockerd avec les nouvelles configurations :
sudo systemctl daemon-reload && sudo systemctl restart dockerVérifions :
sudo systemctl status dockerSi 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 spoiler
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.
Source : habr.com
