Ich dachte einmal darüber nach, wie ich die Bereitstellung meines Projekts automatisieren kann. gitlab.com stellt dafür alle nötigen Werkzeuge zur Verfügung, und ich habe mich entschlossen, sie zu nutzen, indem ich mich einarbeitete und ein kleines Bereitstellungsskript schrieb. In diesem Artikel teile ich meine Erfahrungen mit der Community.
TL;DR
- VPS einrichten: Root deaktivieren, Passwortanmeldung abschalten, dockerd installieren, ufw konfigurieren
- Zertifikate für Server und Client generieren Aktivieren Sie die Verwaltung von dockerd über einen TCP-Socket: Entfernen Sie die Option -H fd:// aus der Docker-Konfiguration.
- Прописать пути до сертификатов в docker.json
- Fügen Sie die Zertifikat-Inhalte in die GitLab-Variablen in den CI/CD-Einstellungen ein. Schreiben Sie ein .gitlab-ci.yml-Skript für die Bereitstellung.
Alle Beispiele werde ich auf der Distribution Debian zeigen.
Erstkonfiguration des VPS
Sie haben zum Beispiel einen Instance bei gekauft. Das erste, was Sie tun müssen, ist, Ihren Server vor der aggressiven Außenwelt zu schützen. Ich werde nichts beweisen oder behaupten, sondern einfach die Protokolldatei /var/log/messages meines virtuellen Servers zeigen:
Screenshot
Als Erstes installieren wir die Firewall ufw:
apt-get update && apt-get install ufwWir aktivieren die Standardrichtlinie: Alle eingehenden Verbindungen blockieren, alle ausgehenden Verbindungen erlauben:
ufw default deny incoming
ufw default allow outgoingWichtig: Vergessen Sie nicht, die SSH-Verbindung zu erlauben:
ufw allow OpenSSHDie allgemeine Syntax lautet: Erlauben Sie eine Verbindung über den Port: ufw allow 12345, wobei 12345 die Portnummer oder den Dienstnamen ist. Verbieten: ufw deny 12345
Aktivieren Sie die Firewall:
ufw enableVerlassen Sie die Sitzung und melden Sie sich erneut über SSH an.
Fügen Sie einen Benutzer hinzu, setzen Sie ein Passwort und fügen Sie ihn zur Gruppe sudo hinzu.
apt-get install sudo
adduser scoty
usermod -aG sudo scotyIm nächsten Schritt sollten Sie die Anmeldung per Passwort deaktivieren. Kopieren Sie dazu Ihren SSH-Schlüssel auf den Server:
ssh-copy-id root@10.101.10.28Die IP des Servers sollte Ihre eigene sein. Versuchen Sie nun, sich mit dem zuvor erstellten Benutzer anzumelden, ein Passwort ist nicht mehr erforderlich. Änderungen in der Konfigurationsdatei vornehmen:
sudo nano /etc/ssh/sshd_configdeaktivieren Sie die Anmeldung per Passwort:
PasswordAuthentication noStarten Sie den SSH-Dienst neu:
sudo systemctl reload sshdJetzt wird niemand, auch nicht Sie, sich über den Benutzer root anmelden können.
Installieren Sie nun dockerd; diesen Prozess werde ich nicht näher beschreiben, da sich möglicherweise alles geändert hat. Besuchen Sie die offizielle Webseite und folgen Sie den Schritten zur Installation von Docker auf Ihrer virtuellen Maschine:
Zertifikate generieren
Für die remote Verwaltung des Docker-Daemons ist eine verschlüsselte TLS-Verbindung erforderlich. Dazu benötigen Sie ein Zertifikat und einen Schlüssel, die generiert und auf Ihre entfernte Maschine übertragen werden müssen. Folgen Sie den Anweisungen auf der offiziellen Docker-Website. Alle generierten *.pem-Dateien für den Server, nämlich ca.pem, server.pem, key.pem, müssen in das Verzeichnis /etc/docker auf dem Server verschoben werden.
Konfiguration von dockerd
Im Startskript des Docker-Daemons entfernen wir die Option -H df://, diese Option gibt an, auf welchem Host der Docker-Daemon verwaltet werden kann.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerdErstellen Sie eine Konfigurationsdatei, falls diese noch nicht existiert, und fügen Sie die Optionen hinzu:
/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
}Erlauben Sie Verbindungen über den Port 2376:
sudo ufw allow 2376Starten Sie dockerd mit den neuen Einstellungen neu:
sudo systemctl daemon-reload && sudo systemctl restart dockerÜberprüfen Sie den Status:
sudo systemctl status dockerWenn alles "grün" ist, haben wir Docker erfolgreich auf dem Server konfiguriert.
Einrichtung der Continuous Delivery auf GitLab
Um einen GitLab-Worker in der Lage zu versetzen, Befehle auf einem Remote-Docker-Host auszuführen, muss man entscheiden, wie und wo man die Zertifikate und den Schlüssel für die verschlüsselte Verbindung mit dockerd speichert. Ich habe dieses Problem gelöst, indem ich die Variablen in den GitLab-Einstellungen festgelegt habe:
Spoilerüberschrift
Geben Sie einfach den Inhalt der Zertifikate und des Schlüssels mit cat aus: cat ca.pem. Kopieren und fügen Sie in die Werte der Variablen ein.
Lassen Sie uns ein Skript für die Bereitstellung über GitLab schreiben. Wir werden das docker-in-docker (dind) Image verwenden.
.gitlab-ci.yml
image:
name: docker/compose:1.23.2
# Ändern Sie den entrypoint, damit es in dind funktioniert
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 # Bereitstellungsskript hier
Inhalt des Bereitstellungsskripts mit Kommentaren:
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
Das Hauptproblem bestand darin, die Inhalte der Zertifikate aus den GitLab CI/CD-Variablen in einem nutzbaren Format "herauszuziehen". Ich konnte nicht nachvollziehen, warum die Verbindung zum Remote-Host nicht funktionierte. Auf dem Host habe ich das Protokoll mit sudo journalctl -u docker überprüft und dort einen Fehler beim Handshake festgestellt. Ich habe mich entschieden, zu prüfen, was überhaupt in den Variablen gespeichert ist. Dazu kann man folgendes verwenden: cat -A $DOCKER_CERT_PATH/key.pem. Ich habe den Fehler behoben, indem ich das Entfernen des Wagenrücklaufzeichens tr -d ‘r’ hinzugefügt habe.
Im nächsten Schritt können Sie nach Belieben Post-Release-Tasks in das Skript einfügen. Die funktionierende Version können Sie in meinem Repository einsehen.
Quelle: habr.com
