Une fois, j'ai pensé à automatiser le déploiement de mon projet. gitlab.com fournit aimablement tous les outils pour cela, et bien sûr j'ai décidé de l'utiliser en triant 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, connexion par mot de passe, installer dockerd, configurer ufw
- 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 le contrôle dockerd via le socket tcp: supprimez l'option -H fd: / / depuis la configuration de docker.
- Enregistrer les chemins de certificat dans docker.json
- Enregistrez-vous dans les variables gitlab dans les paramètres CI / CD avec le contenu du certificat. Écrivez un script .gitlab-ci.yml pour le déploiement.
Je vais montrer tous les exemples sur le kit de distribution Debian.
Configuration initiale de VPS
Vous avez donc 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 et ne revendiquerai rien, il suffit de montrer le journal / var / log / messages de mon serveur virtuel:
Tout d'abord, installez le pare-feu ufw:
apt-get update && apt-get install ufw
Activez la stratégie par défaut: bloquez toutes les connexions entrantes, autorisez toutes les connexions sortantes:
ufw default deny incoming ufw default allow outgoing
Important: n'oubliez pas d'autoriser la connexion ssh:
ufw allow OpenSSH
La syntaxe générale est la suivante: Autoriser une connexion au port: ufw allow 12345, où 12345 est le numéro de port ou le nom du service. Refuser: ufw deny 12345
Activez le pare-feu:
ufw enable
Nous quittons la session et nous reconnectons via ssh.
Ajoutez l'utilisateur, attribuez-lui un mot de passe et ajoutez-le au groupe sudo.
apt-get install sudo adduser scoty usermod -aG sudo scoty
Ensuite, selon le plan, vous devez désactiver la saisie du mot de passe. Pour ce faire, copiez votre clé ssh sur le serveur:
ssh-copy-id root@10.101.10.28
L'IP de votre serveur doit être spécifiée. 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 saisie du 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 ne fonctionnera pas.
Ensuite, définissez dockerd, je ne décrirai pas le processus ici, car tout peut déjà être modifié, suivez le lien vers 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 ce faire, vous devez disposer d'un certificat et d'une clé, qui doivent être générés et transférés 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 Tout généré * .pem les fichiers du serveur, à savoir ca.pem, server.pem, key.pem doivent être placés dans le répertoire / etc / docker du serveur.
Configuration de Dockerd
Dans le script pour lancer le démon docker, supprimez l'option -H df: //, cette option répond à l'hôte qui peut contrôler le démon docker.
# At /lib/systemd/system/docker.service [Service] Type=notify ExecStart=/usr/bin/dockerd
Ensuite, créez un fichier de paramètres, s'il n'est pas déjà là et prescrivez des options:
/etc/docker/daemon.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 }
Activons les connexions sur le port 2376:
sudo ufw allow 2376
Redémarrez dockerd avec les nouveaux paramètres:
sudo systemctl daemon-reload && sudo systemctl restart docker
Vérifier:
sudo systemctl status docker
Si tout est vert, nous pensons que nous avons réussi à configurer docker sur le serveur.
Configuration de la livraison continue sur gitlab
Pour que le travailleur gitalab puisse exécuter des commandes sur l'hôte distant docker, il est nécessaire de déterminer comment et où stocker les certificats et la clé pour une connexion cryptée avec dockerd. J'ai résolu ce problème en l'écrivant simplement dans des variables dans les paramètres de gitlbab:
Affichez simplement le contenu des certificats et de la clé via cat:
cat ca.pem
. Copiez et collez dans la valeur des variables.
Écrivons le script du déploiement via gitlab. L'image docker-in-docker (dind) sera utilisée.
.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 #
Le 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 «d'extraire» le contenu des certificats sous forme normale à partir des variables gitlab CI / CD. Je ne pouvais pas comprendre pourquoi la connexion à l'hôte distant ne fonctionnait pas. Sur l'hôte, j'ai regardé le journal de docker sudo journalctl -u, il y a une erreur de prise de contact. 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. L'erreur a été surmontée en ajoutant la suppression du symbole de chariot tr -d '\ r'.
Plus loin dans le script, vous pouvez ajouter des tâches post-publication à votre discrétion. Vous pouvez voir la version de travail dans mon référentiel
https://gitlab.com/isqad/gitlab-ci-cd