Ik dacht eens na over de automatisering van de implementatie van mijn project. gitlab.com biedt gelukkig alle tools daarvoor aan, en ik besloot natuurlijk gebruik te maken van deze mogelijkheid door een klein implementatiescript te schrijven. In dit artikel deel ik mijn ervaringen met de community.
TL;DR
- VPS instellen: root uitschakelen, inloggen met wachtwoord, dockerd installeren, ufw configureren
- Genereer certificaten voor server en client Schakel het beheer van dockerd via de TCP-socket in: verwijder de -H fd:// optie uit de Docker-configuratie.
- Прописать пути до сертификатов в docker.json
- Voer de inhoud van de certificaten in de GitLab-variabelen in de CI/CD-instellingen in. Schrijf het .gitlab-ci.yml script voor de implementatie.
Alle voorbeelden zal ik tonen op de Debian-distributie.
Initiële VPS-configuratie
Stel, u hebt een instantie gekocht op , het eerste wat u moet doen, is uw server beschermen tegen de agressieve buitenwereld. Ik ga niets bewijzen of beweren, maar ik toon gewoon de log /var/log/messages van mijn virtuele server:
Screenshot
Als eerste installeren we de firewall ufw:
apt-get update && apt-get install ufwStel de standaardpolicy in: blokkeer alle inkomende verbindingen, sta alle uitgaande verbindingen toe:
ufw default deny incoming
ufw default allow outgoingBelangrijk: vergeet niet om SSH-verbinding toe te staan:
ufw allow OpenSSHDe algemene syntaxis is als volgt: Sta verbinding toe via poort: ufw allow 12345, waar 12345 het poortnummer of de naam van de service is. Verbied: ufw deny 12345
We schakelen de firewall in:
ufw enableLog uit de sessie en log opnieuw in via SSH.
Voeg een gebruiker toe, wijs een wachtwoord toe en voeg deze toe aan de sudo-groep.
apt-get install sudo
adduser scoty
usermod -aG sudo scotyDe volgende stap is om inloggen met wachtwoord uit te schakelen. Kopieer hiervoor uw SSH-sleutel naar de server:
ssh-copy-id root@10.101.10.28het IP van de server moet uw eigen zijn. Probeer nu in te loggen met de eerder gemaakte gebruiker, u hoeft geen wachtwoord meer in te voeren. Vervolgens wijzigen we het volgende in de configuratie-instellingen:
sudo nano /etc/ssh/sshd_configschakel inloggen met wachtwoord uit:
PasswordAuthentication noHerstart de sshd-daemon:
sudo systemctl reload sshdNu, als u of iemand anders probeert in te loggen als root, zal dat niet lukken.
Vervolgens installeren we dockerd, ik ga dit proces niet beschrijven, aangezien alles al veranderd kan zijn. Ga naar de link naar de officiële website en doorloop de stappen voor het installeren van Docker op uw virtuele machine:
Generatie van certificaten
Om de Docker-daemon op afstand te beheren, is een versleutelde TLS-verbinding vereist. Hiervoor moet je een certificaat en sleutel genereren en deze naar je externe machine overdragen. Volg de stappen die zijn opgegeven in de instructies op de officiële Docker-website: Alle gegenereerde *.pem-bestanden voor de server, namelijk ca.pem, server.pem, key.pem, moeten in de directory /etc/docker op de server worden geplaatst.
Configuratie van dockerd
In het opstartscript van de Docker-daemon verwijderen we de optie -H df://; deze optie bepaalt op welke host je de Docker-daemon kunt beheren.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerdVervolgens moet je een configuratiebestand aanmaken, als dit nog niet bestaat, en de opties invoeren:
/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
}We staan verbindingen toe via poort 2376:
sudo ufw allow 2376Laten we dockerd opnieuw opstarten met de nieuwe instellingen:
sudo systemctl daemon-reload && sudo systemctl restart dockerLaten we controleren:
sudo systemctl status dockerAls alles "groen" is, beschouwen we het als een succesvolle configuratie van Docker op de server.
Configuratie van continue levering op GitLab
Om ervoor te zorgen dat de GitLab-worker commando's op de externe Docker-host kan uitvoeren, is het noodzakelijk om te bepalen hoe en waar je de certificaten en sleutel voor de versleutelde verbinding met dockerd opslaat. Ik heb dit probleem opgelost door de waarden in de GitLab-instellingen in te voeren als variabelen:
Spoiler-titel
Voer eenvoudig de inhoud van de certificaten en sleutel uit via cat: cat ca.pem. Kopieer en plak in de waarde van de variabelen.
Laten we een script schrijven voor de deployments via GitLab. We zullen de Docker-in-Docker (dind) afbeelding gebruiken.
.gitlab-ci.yml
image:
name: docker/compose:1.23.2
# We herschrijven de entrypoint zodat het werkt in 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 # deployment-script hier
De inhoud van het deployment-script met opmerkingen:
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
Het grootste probleem was om de inhoud van de certificaten uit de variabelen van GitLab CI/CD in normale vorm te "halen". Ik kon niet begrijpen waarom de verbinding met de externe host niet werkte. Ik keek naar de log op de host met sudo journalctl -u docker, daar was een fout tijdens de handshake. Ik besloot te kijken wat er überhaupt in de variabelen was opgeslagen, dat kon met cat -A $DOCKER_CERT_PATH/key.pem. Ik loste de fout op door het verwijderen van het carriage return-teken met tr -d ‘r’.
Vervolgens kunnen er naar eigen inzicht post-release taken aan het script worden toegevoegd. U kunt de werkversie bekijken in mijn repository.
Bron: habr.com
