Jag funderade en gång på automatiseringen av distributionen av mitt projekt. gitlab.com tillhandahåller alla verktyg för detta, så jag beslutade mig för att utnyttja dem, efter att ha tagit reda på hur man skriver ett litet distributionsscript. I artikeln delar jag med mig av min erfarenhet till gemenskapen.
TL;DR
- Konfigurera VPS: stänga av root, inloggning med lösenord, installera dockerd, konfigurera ufw
- Generera certifikat för server och klient Aktivera hantering av dockerd via tcp-socket: ta bort alternativet -H fd:// från docker-konfigurationen.
- Прописать пути до сертификатов в docker.json
- Mata in certifikatens innehåll i GitLab CI/CD-variabler. Skriv ett .gitlab-ci.yml-script för distribution.
Jag kommer att visa alla exempel på Debian-distributionen.
Initial konfiguration av VPS
Så du har köpt en instans, till exempel på , det första du måste göra är att skydda din server från en aggressiv extern värld. Jag kommer inte att bevisa eller påstå något, jag visar bara loggen /var/log/messages från min virtuella server:
Skärmdump
Först installerar vi brandväggen ufw:
apt-get update && apt-get install ufwVi aktiverar standardpolicy: blockera alla inkommande anslutningar, tillåta alla utgående anslutningar:
ufw default deny incoming
ufw default allow outgoingViktigt: glöm inte att tillåta ssh-anslutning:
ufw allow OpenSSHDen allmänna syntaxen är: Tillåt anslutning via port: ufw allow 12345, där 12345 är portnumret eller tjänstens namn. Förbjud: ufw deny 12345
Aktivera brandväggen:
ufw enableLogga ut från sessionen och logga in igen via ssh.
Lägg till en användare, ställ in ett lösenord och lägg till den i sudo-gruppen.
apt-get install sudo
adduser scoty
usermod -aG sudo scotyDärefter ska vi stänga av inloggning med lösenord. För detta, kopiera din ssh-nyckel till servern:
ssh-copy-id root@10.101.10.28serverns ip-adress ska vara din. Försök nu att logga in med den tidigare skapade användaren, du behöver inte ange lösenord längre. Gå sedan till konfigurationsinställningarna och ändra följande:
sudo nano /etc/ssh/sshd_configstäng av inloggning med lösenord:
PasswordAuthentication noStarta om sshd-demonen:
sudo systemctl reload sshdOm du eller någon annan försöker logga in som root-användare, kommer det inte att gå.
Därefter installerar vi dockerd, jag kommer inte att beskriva processen här, eftersom allt kan ha ändrats, gå till den officiella webbplatsen och följ installationsstegen för docker på din virtuella maskin:
Generering av certifikat
För att hantera Docker-demonen på distans krävs en krypterad TLS-anslutning. För detta behövs ett certifikat och en nyckel som måste genereras och överföras till din fjärrmaskin. Följ stegen angivna i instruktionerna på den officiella Docker-webbplatsen: Alla genererade *.pem-filer för servern, nämligen ca.pem, server.pem, key.pem måste placeras i katalogen /etc/docker på servern.
Inställning av dockerd
I skriptet för att starta Docker-demonen tar vi bort alternativet -H df://, detta alternativ anger vilken värd som kan hantera Docker-demonen.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerdDärefter ska vi skapa en inställningsfil om den inte redan finns och ange alternativen:
/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
}Vi tillåter anslutningar via port 2376:
sudo ufw allow 2376Vi startar om dockerd med de nya inställningarna:
sudo systemctl daemon-reload && sudo systemctl restart dockerLåt oss kontrollera:
sudo systemctl status dockerOm allt är "grönt" anser vi att vi framgångsrikt har konfigurerat Docker på servern.
Inställning av continuous delivery på GitLab
För att GitLab-arbetaren ska kunna köra kommandon på den fjärranslutna Docker-värden behöver vi bestämma hur och var vi ska lagra certifikat och nycklar för den krypterade anslutningen till dockerd. Jag löste det här problemet genom att helt enkelt skriva in det som variabler i inställningarna för GitLab:
Spoiler Rubrik
Skriv bara ut innehållet i certifikaten och nyckeln med cat: cat ca.pem. Kopiera och klistra in i värdesträngarna.
Låt oss skriva ett skript för distribution via GitLab. Det kommer att använda Docker-in-Docker (dind) bilden.
.gitlab-ci.yml
image:
name: docker/compose:1.23.2
# Vi skriver om entrypoint så att det fungerar i 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 # distributionsskript här
Innehållet i distributionsskriptet med kommentarer:
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
Det största problemet var att "extrahera" certifikatens innehåll från GitLab CI/CD variabler i ett korrekt format. Jag kunde inte förstå varför anslutningen till den fjärranslutna värden inte fungerade. På värden tittade jag i loggen sudo journalctl -u docker, där fanns ett fel vid handskakningen. Jag beslöt att kontrollera vad som faktiskt lagras i variablerna, för att göra det kan du se så här cat -A $DOCKER_CERT_PATH/key.pem. Jag övervann felet genom att lägga till borttagning av tecknet för vagnslutning tr -d 'r'.
I scenariet kan du lägga till post-release-uppgifter efter eget val. Du kan bekanta dig med arbetsversionen i mitt repository.
Källa: habr.com
