Egyszer gondolkodtam azon, hogy automatizáljam a projektem telepítését. A gitlab.com kedvesen megad ehhez minden eszközt, és természetesen úgy döntöttem, kihasználom, kitalálom és megírok egy kis telepítési szkriptet. Ebben a cikkben megosztom tapasztalataimat a közösséggel.
TL, DR
VPS beállítása: a root letiltása, jelszóval való bejelentkezés, a dockerd telepítése, az ufw konfigurálása
Regisztrálja a tanúsítványok elérési útját a docker.json fájlban
Regisztráljon a gitlab változókban a CI/CD beállításokban a tanúsítványok tartalmával. Írjon egy .gitlab-ci.yml szkriptet a telepítéshez.
Megmutatom az összes példát a Debian disztribúcióról.
A VPS kezdeti beállítása
Tehát vásárolt egy példányt például a címen DO, az első dolog, amit meg kell tennie, hogy megvédje szerverét az agresszív külvilágtól. Nem bizonyítok és nem állítok semmit, csak megmutatom a virtuális szerverem /var/log/messages naplóját:
screenshot
Először telepítse az ufw tűzfalat:
apt-get update && apt-get install ufw
Engedélyezzük az alapértelmezett házirendet: minden bejövő kapcsolat letiltása, minden kimenő kapcsolat engedélyezése:
Fontos: ne felejtse el engedélyezni az ssh-n keresztüli kapcsolatot:
ufw allow OpenSSH
Az általános szintaxis a következő: Kapcsolódás engedélyezése portonként: ufw allow 12345, ahol 12345 a portszám vagy a szolgáltatás neve. Deny: ufw deny 12345
Kapcsolja be a tűzfalat:
ufw enable
Kilépünk a munkamenetből, és újra bejelentkezünk ssh-n keresztül.
Adjon hozzá egy felhasználót, rendeljen hozzá egy jelszót, és adja hozzá a sudo csoporthoz.
A szerver ip-jének a tiédnek kell lennie. Most próbáljon meg bejelentkezni a korábban létrehozott felhasználóval; többé nem kell jelszót megadnia. Ezután a konfigurációs beállításokban módosítsa a következőket:
sudo nano /etc/ssh/sshd_config
jelszavas bejelentkezés letiltása:
PasswordAuthentication no
Indítsa újra az sshd démont:
sudo systemctl reload sshd
Ha Ön vagy valaki más root felhasználóként próbál bejelentkezni, az nem fog működni.
Ezután telepítse a dockerd-t, itt nem írom le a folyamatot, mivel már mindent meg lehet változtatni, kövesse a hivatalos webhelyre mutató hivatkozást, és kövesse a docker virtuális gépre történő telepítésének lépéseit: https://docs.docker.com/install/linux/docker-ce/debian/
Tanúsítványok generálása
A docker démon távoli vezérléséhez titkosított TLS-kapcsolat szükséges. Ehhez rendelkeznie kell egy tanúsítvánnyal és egy kulccsal, amelyeket le kell generálni és át kell vinni a távoli gépre. Kövesse a docker hivatalos webhelyén található utasításokban megadott lépéseket: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl A kiszolgálóhoz létrehozott összes *.pem fájlt, nevezetesen a ca.pem, server.pem, key.pem, a kiszolgáló /etc/docker könyvtárába kell helyezni.
Dockerd beállítása
A docker démon indító szkriptjében eltávolítjuk a -H df:// opciót, ez az opció határozza meg, hogy a docker démon melyik gazdagépen vezérelhető.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Ezután hozzon létre egy beállításfájlt, ha még nem létezik, és adja meg a beállításokat:
Ha minden „zöld”, akkor úgy véljük, hogy sikeresen konfiguráltuk a dockert a szerveren.
Folyamatos kézbesítés beállítása a gitlab-on
Ahhoz, hogy a Gitalaba dolgozó parancsokat tudjon végrehajtani egy távoli Docker-gazdagépen, el kell döntenie, hogyan és hol tárolja a tanúsítványokat és a Dockerddel való titkosított kapcsolat kulcsát. Ezt a problémát úgy oldottam meg, hogy egyszerűen hozzáadtam a következőket a változókhoz a gitlbab beállításaiban:
Spoiler cím
Csak adja ki a tanúsítványok tartalmát és a kulcsot a cat-on keresztül: cat ca.pem. Másolja és illessze be a változó értékekbe.
Írjunk egy szkriptet a GitLabon keresztüli telepítéshez. A docker-in-docker (dind) kép kerül felhasználásra.
#!/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
A fő probléma az volt, hogy a gitlab CI/CD változóiból normál formában „kihúzzuk” a tanúsítványok tartalmát. Nem tudtam rájönni, miért nem működik a kapcsolat a távoli gazdagéppel. A gazdagépen megnéztem a log sudo journalctl -u dockert, hiba történt a kézfogás közben. Úgy döntöttem, hogy megnézem, mi van általában a változókban tárolva; ehhez a következőképpen nézhet ki: cat -A $DOCKER_CERT_PATH/key.pem. Kiküszöböltem a hibát a tr -d 'r' kocsikarakter eltávolításával.
Ezután saját belátása szerint hozzáadhat kiadás utáni feladatokat a szkripthez. A működő verziót megtekintheti a tárhelyemben https://gitlab.com/isqad/gitlab-ci-cd