Une fois, j'ai pensé à automatiser le déploiement de mon projet. gitlab.com fournit gentiment tous les outils pour cela, et bien sûr j'ai décidé de l'utiliser en le découvrant 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 la racine, la connexion par mot de passe, installer dockerd, configurer ufw
Définir les chemins d'accès aux certificats dans docker.json
Enregistrez-vous dans les variables gitlab dans les paramètres CI / CD avec le contenu des certificats. Écrivez un script .gitlab-ci.yml pour le déploiement.
Je vais montrer tous les exemples sur la distribution Debian.
Configuration initiale du VPS
Ici vous avez acheté une instance par exemple sur DO, la première chose à faire est de protéger votre serveur du monde extérieur agressif. Je ne prouverai ni n'affirmerai rien, je montrerai juste le log /var/log/messages de mon serveur virtuel :
Capture d'écran
Tout d'abord, installez le pare-feu ufw :
apt-get update && apt-get install ufw
Activez la politique par défaut : bloquer toutes les connexions entrantes, autoriser toutes les connexions sortantes :
Important : n'oubliez pas d'autoriser la connexion via ssh :
ufw allow OpenSSH
La syntaxe générale est la suivante : Autoriser la connexion sur le port : ufw allow 12345, où 12345 est le numéro de port ou le nom du service. Refuser: ufw refuser 12345
Activez le pare-feu :
ufw enable
Nous quittons la session et nous reconnectons via ssh.
Ajoutez un utilisateur, attribuez-lui un mot de passe et ajoutez-le au groupe sudo.
L'IP du serveur doit être la vôtre. Essayez maintenant de vous connecter sous l'utilisateur créé précédemment, vous n'avez plus besoin de saisir de mot de passe. Ensuite, dans les paramètres de configuration, modifiez les éléments suivants :
sudo nano /etc/ssh/sshd_config
désactiver la connexion par mot de passe :
PasswordAuthentication no
Redémarrez le démon sshd :
sudo systemctl reload sshd
Maintenant, si vous ou quelqu'un d'autre essayez de vous connecter en tant que root, cela échouera.
Ensuite, nous installons dockerd, je ne décrirai pas le processus ici, puisque tout peut déjà être modifié, suivez le lien vers le site officiel et suivez les étapes d'installation de docker sur votre machine virtuelle : https://docs.docker.com/install/linux/docker-ce/debian/
Génération de certificat
Pour contrôler le démon docker à distance, une connexion TLS chiffrée est requise. Pour ce faire, vous devez disposer d'un certificat et d'une clé que vous devez générer et transférer sur votre machine distante. Suivez les étapes indiquées dans les instructions sur le site Web 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 du menu fixe
Dans le script de démarrage du démon docker, supprimez l'option -H df://, cette option indique sur quel hôte le démon docker peut être contrôlé.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Ensuite, créez un fichier de paramètres s'il n'existe pas déjà et définissez les options :
Si tout est vert, alors nous considérons que nous avons configuré avec succès docker sur le serveur.
Mise en place de la livraison continue sur gitlab
Pour que le travailleur gitalab puisse exécuter des commandes sur un hôte docker distant, vous devez décider comment et où stocker les certificats et une clé pour une connexion chiffrée à dockerd. J'ai résolu ce problème en écrivant simplement aux variables dans les paramètres de gitlbab :
titre spoiler
Sortez simplement le contenu des certificats et de la clé via cat : cat ca.pem. Copiez et collez dans les valeurs variables.
Écrivons un script pour le déploiement via gitlab. L'image docker-in-docker (dind) sera utilisée.
Le contenu du script de déploiement avec des 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 problème principal était de "sortir" le contenu des certificats sous la forme normale des variables CI / CD de gitlab. Je ne pouvais pas comprendre pourquoi la connexion à l'hôte distant ne fonctionnait pas. J'ai regardé le journal sudo journalctl -u docker log sur l'hôte, il y a une erreur avec la poignée de main. J'ai décidé de regarder ce qui est généralement stocké dans les variables, pour cela vous pouvez voir cat -A $DOCKER_CERT_PATH/key.pem. Surmonté l'erreur en ajoutant la suppression du caractère caret tr -d 'r'.
De plus, vous pouvez ajouter des tâches post-publication au script à votre discrétion. Vous pouvez consulter la version de travail dans mon référentiel https://gitlab.com/isqad/gitlab-ci-cd