Kartą galvojau apie savo projekto diegimo automatizavimą. gitlab.com maloniai pateikia visus tam reikalingus įrankius, ir, žinoma, nusprendžiau tuo pasinaudoti, išsiaiškinti ir parašyti nedidelį diegimo scenarijų. Šiame straipsnyje dalinuosi savo patirtimi su bendruomene.
Taigi, pavyzdžiui, nusipirkote egzempliorių adresu DO, pirmas dalykas, kurį turite padaryti, yra apsaugoti savo serverį nuo agresyvaus išorinio pasaulio. Nieko neįrodysiu ir neteigsiu, tiesiog parodysiu savo virtualaus serverio žurnalą /var/log/messages:
Ekrano kopija
Pirmiausia įdiekite ufw ugniasienę:
apt-get update && apt-get install ufw
Įgalinkime numatytąją politiką: blokuoti visus gaunamus ryšius, leisti visus išeinančius ryšius:
Bendroji sintaksė yra tokia: Leisti ryšį naudojant prievadą: ufw allow 12345, kur 12345 yra prievado numeris arba paslaugos pavadinimas. Neleisti: ufw deny 12345
Įjunkite ugniasienę:
ufw enable
Išeiname iš sesijos ir vėl prisijungiame per ssh.
Pridėkite vartotoją, priskirkite jam slaptažodį ir pridėkite jį prie sudo grupės.
Serverio IP turi būti jūsų. Dabar pabandykite prisijungti naudodami anksčiau sukurtą vartotoją; jums nebereikia įvesti slaptažodžio. Tada konfigūracijos nustatymuose pakeiskite šiuos nustatymus:
sudo nano /etc/ssh/sshd_config
išjungti slaptažodžio prisijungimą:
PasswordAuthentication no
Iš naujo paleiskite sshd demoną:
sudo systemctl reload sshd
Dabar, jei jūs ar kas nors kitas bandys prisijungti kaip root naudotojas, tai neveiks.
Tada įdiekite dockerd, aš čia neaprašysiu proceso, nes viską jau galima pakeisti, spustelėkite nuorodą į oficialią svetainę ir atlikite docker diegimo virtualioje mašinoje veiksmus: https://docs.docker.com/install/linux/docker-ce/debian/
Sertifikatų generavimas
Norint nuotoliniu būdu valdyti dokerio demoną, reikalingas šifruotas TLS ryšys. Norėdami tai padaryti, turite turėti sertifikatą ir raktą, kurie turi būti sugeneruoti ir perkelti į nuotolinį įrenginį. Atlikite veiksmus, pateiktus instrukcijose oficialioje docker svetainėje: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Visi serveriui sukurti *.pem failai, būtent ca.pem, server.pem, key.pem, turi būti patalpinti serverio /etc/docker kataloge.
„Dockerd“ nustatymas
Docker demono paleidimo scenarijuje pašaliname parinktį -H df://. Ši parinktis nustato, kuriame pagrindiniame kompiuteryje galima valdyti dokerio demoną.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Tada turėtumėte sukurti nustatymų failą, jei jo dar nėra, ir nurodyti parinktis:
Jei viskas yra „žalia“, manome, kad sėkmingai sukonfigūravome dokerį serveryje.
Nepertraukiamo pristatymo nustatymas „gitlab“.
Kad „Gitalaba“ darbuotojas galėtų vykdyti komandas nuotoliniame „Docker“ pagrindiniame kompiuteryje, būtina nuspręsti, kaip ir kur saugoti sertifikatus ir šifruoto ryšio su „Dockerd“ raktą. Aš išsprendžiau šią problemą tiesiog pridėdamas šiuos kintamuosius „gitlbab“ nustatymuose:
Spoilerio pavadinimas
Tiesiog išveskite sertifikatų turinį ir raktą per cat: cat ca.pem. Nukopijuokite ir įklijuokite į kintamųjų reikšmes.
Parašykime scenarijų diegimui per „GitLab“. Bus naudojamas docker-in-docker (dind) vaizdas.
#!/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
Pagrindinė problema buvo „ištraukti“ sertifikatų turinį normalia forma iš gitlab CI/CD kintamųjų. Negalėjau suprasti, kodėl neveikia ryšys su nuotoliniu kompiuteriu. Priegloboje pažiūrėjau į log sudo journalctl -u docker, rankos paspaudimo metu įvyko klaida. Nusprendžiau pažvelgti į tai, kas paprastai saugoma kintamuosiuose; norėdami tai padaryti, galite atrodyti taip: cat -A $DOCKER_CERT_PATH/key.pem. Įveikiau klaidą pašalindamas vežimėlio simbolį tr -d 'r'.
Tada savo nuožiūra prie scenarijaus galite pridėti užduotis po išleidimo. Darbinę versiją galite peržiūrėti mano saugykloje https://gitlab.com/isqad/gitlab-ci-cd