Una vegada vaig pensar a automatitzar el desplegament del meu projecte. gitlab.com ofereix amablement totes les eines per a això i, per descomptat, vaig decidir aprofitar-ho, esbrinant-ho i escrivint un petit script de desplegament. En aquest article comparteixo la meva experiència amb la comunitat.
Registreu-vos a les variables de gitlab a la configuració de CI/CD amb el contingut dels certificats. Escriviu un script .gitlab-ci.yml per al desplegament.
Mostraré tots els exemples de la distribució Debian.
Configuració inicial del VPS
Així que heu comprat una instància per exemple a DO, el primer que heu de fer és protegir el vostre servidor del món exterior agressiu. No demostraré ni afirmaré res, només mostraré el registre /var/log/messages del meu servidor virtual:
Captura de pantalla
Primer, instal·leu el tallafoc ufw:
apt-get update && apt-get install ufw
Activem la política predeterminada: bloqueja totes les connexions entrants, permet totes les connexions sortints:
Important: no oblideu permetre la connexió mitjançant ssh:
ufw allow OpenSSH
La sintaxi general és la següent: Permetre una connexió per port: ufw allow 12345, on 12345 és el número de port o el nom del servei. Denegar: ufw denegar 12345
Activa el tallafoc:
ufw enable
Sortim de la sessió i tornem a iniciar sessió mitjançant ssh.
Afegiu un usuari, assigneu-li una contrasenya i afegiu-lo al grup sudo.
La ip del servidor ha de ser teva. Ara proveu d'iniciar sessió amb l'usuari que vau crear anteriorment; ja no cal que introduïu una contrasenya. A continuació, a la configuració de configuració, canvieu el següent:
sudo nano /etc/ssh/sshd_config
desactivar l'inici de sessió amb contrasenya:
PasswordAuthentication no
Reinicieu el dimoni sshd:
sudo systemctl reload sshd
Ara, si vostè o algú altre intenteu iniciar sessió com a usuari root, no funcionarà.
A continuació, instal·leu dockerd, no descriuré el procés aquí, ja que ja es pot canviar tot, seguiu l'enllaç al lloc web oficial i seguiu els passos per instal·lar docker a la vostra màquina virtual: https://docs.docker.com/install/linux/docker-ce/debian/
Generació de certificats
Per controlar el dimoni Docker de forma remota, cal una connexió TLS xifrada. Per fer-ho, cal tenir un certificat i una clau, que s'han de generar i transferir a la seva màquina remota. Seguiu els passos que s'indiquen a les instruccions del lloc web oficial de Docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Tots els fitxers *.pem generats per al servidor, és a dir, ca.pem, server.pem, key.pem, s'han de col·locar al directori /etc/docker del servidor.
Configuració de dockerd
A l'script de llançament del dimoni docker, eliminem l'opció -H df://, aquesta opció determina en quin host es pot controlar el dimoni docker.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
A continuació, hauríeu de crear un fitxer de configuració, si encara no existeix, i especificar les opcions:
Si tot és "verd", considerem que hem configurat correctament Docker al servidor.
Configuració de l'enviament continu a gitlab
Perquè el treballador de Gitalaba pugui executar ordres en un host Docker remot, cal decidir com i on emmagatzemar els certificats i la clau per a una connexió xifrada amb Dockerd. Vaig resoldre aquest problema simplement afegint el següent a les variables de la configuració de gitlbab:
títol de l'spoiler
Només heu de generar el contingut dels certificats i la clau mitjançant cat: cat ca.pem. Copieu i enganxeu als valors de la variable.
Escrivim un script per al desplegament mitjançant GitLab. S'utilitzarà la imatge docker-in-docker (dind).
Contingut de l'script de desplegament amb comentaris:
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
El problema principal va ser "treure" el contingut dels certificats de forma normal de les variables CI/CD de gitlab. No he pogut esbrinar per què la connexió amb l'amfitrió remot no funcionava. A l'amfitrió, vaig mirar el registre sudo journalctl -u docker, hi va haver un error durant l'encaixada de mans. Vaig decidir mirar què s'emmagatzema generalment a les variables; per fer-ho, podeu semblar així: cat -A $DOCKER_CERT_PATH/key.pem. Vaig superar l'error afegint l'eliminació del caràcter de carro tr -d 'r'.
A continuació, podeu afegir tasques posteriors al llançament a l'script segons el vostre criteri. Podeu veure la versió de treball al meu repositori https://gitlab.com/isqad/gitlab-ci-cd