Una volta ho pensato di automatizzare la distribuzione del mio progetto. gitlab.com fornisce gentilmente tutti gli strumenti per questo, e ovviamente ho deciso di usarlo capendolo e scrivendo un piccolo script di distribuzione. In questo articolo, condivido la mia esperienza con la comunità.
Registrati nelle variabili gitlab nelle impostazioni CI/CD con il contenuto dei certificati. Scrivi uno script .gitlab-ci.yml per la distribuzione.
Mostrerò tutti gli esempi sulla distribuzione Debian.
Configurazione iniziale del VPS
Qui hai acquistato un'istanza ad esempio su DO, la prima cosa da fare è proteggere il tuo server dall'aggressivo mondo esterno. Non dimostrerò o affermerò nulla, mostrerò solo il registro /var/log/messages del mio server virtuale:
Screenshot
Innanzitutto, installa il firewall ufw:
apt-get update && apt-get install ufw
Abilita il criterio predefinito: blocca tutte le connessioni in entrata, consenti tutte le connessioni in uscita:
Importante: non dimenticare di consentire la connessione tramite ssh:
ufw allow OpenSSH
La sintassi generale è: Consenti connessione sulla porta: ufw consenti 12345, dove 12345 è il numero di porta o il nome del servizio. Nega: ufw nega 12345
Attiva firewall:
ufw enable
Usciamo dalla sessione e accediamo nuovamente tramite ssh.
Aggiungi un utente, assegnagli una password e aggiungilo al gruppo sudo.
L'ip del server deve essere il tuo. Ora prova ad accedere con l'utente creato in precedenza, non è più necessario inserire una password. Successivamente, nelle impostazioni di configurazione, modificare quanto segue:
sudo nano /etc/ssh/sshd_config
disabilita accesso con password:
PasswordAuthentication no
Riavvia il demone sshd:
sudo systemctl reload sshd
Ora se tu o qualcun altro provate ad accedere come root, fallirà.
Successivamente, installiamo dockerd, non descriverò qui il processo, poiché tutto può già essere modificato, segui il collegamento al sito Web ufficiale e segui i passaggi per l'installazione di docker sulla tua macchina virtuale: https://docs.docker.com/install/linux/docker-ce/debian/
Generazione del certificato
Per controllare il demone docker da remoto, è necessaria una connessione TLS crittografata. Per fare ciò, è necessario disporre di un certificato e di una chiave da generare e trasferire sul computer remoto. Segui i passaggi indicati nelle istruzioni sul sito web ufficiale di docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Tutti i file *.pem generati per il server, vale a dire ca.pem, server.pem, key.pem, devono essere inseriti nella directory /etc/docker sul server.
configurazione della finestra mobile
Nello script di avvio del daemon docker, rimuovere l'opzione -H df://, questa opzione indica su quale host può essere controllato il daemon docker.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Successivamente, crea un file delle impostazioni se non esiste già e imposta le opzioni:
Se tutto è verde, consideriamo di aver configurato correttamente la finestra mobile sul server.
Impostazione della consegna continua su gitlab
Affinché il lavoratore gitalab sia in grado di eseguire comandi su un host docker remoto, è necessario decidere come e dove archiviare i certificati e una chiave per una connessione crittografata a dockerd. Ho risolto questo problema semplicemente scrivendo alle variabili nelle impostazioni di gitlbab:
titolo spoiler
Basta emettere il contenuto dei certificati e della chiave tramite cat: cat ca.pem. Copia e incolla nei valori delle variabili.
Scriviamo uno script per la distribuzione tramite gitlab. Verrà utilizzata l'immagine docker-in-docker (dind).
Il contenuto dello script di distribuzione con i commenti:
bin/distribuire.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
Il problema principale era quello di "tirare fuori" il contenuto dei certificati nella forma normale dalle variabili CI/CD di gitlab. Non riuscivo a capire perché la connessione all'host remoto non funzionasse. Ho guardato il sudo journalctl -u docker log sull'host, c'è un errore con l'handshake. Ho deciso di guardare cosa è generalmente memorizzato nelle variabili, per questo puoi vedere cat -A $DOCKER_CERT_PATH/key.pem. L'errore è stato risolto aggiungendo la rimozione del carattere di accento circonflesso tr -d 'r'.
Inoltre, puoi aggiungere attività post-rilascio allo script a tua discrezione. Puoi controllare la versione funzionante nel mio repository https://gitlab.com/isqad/gitlab-ci-cd