Es reiz domāju par sava projekta izvietošanas automatizāciju. gitlab.com laipni nodrošina visus šim nolūkam nepieciešamos rīkus, un, protams, es nolēmu to izmantot, izdomājot un uzrakstot nelielu izvietošanas skriptu. Šajā rakstā es dalos savā pieredzē ar sabiedrību.
Es parādīšu visus piemērus par Debian izplatīšanu.
Sākotnējā VPS iestatīšana
Tātad jūs iegādājāties piemēru, piemēram, vietnē DO, pirmā lieta, kas jums jādara, ir aizsargāt savu serveri no agresīvas ārpasaules. Es neko nepierādīšu un neapgalvošu, es tikai parādīšu sava virtuālā servera žurnālu /var/log/messages:
Ekrānuzņēmums
Vispirms instalējiet ufw ugunsmūri:
apt-get update && apt-get install ufw
Iespējosim noklusējuma politiku: bloķēt visus ienākošos savienojumus, atļaut visus izejošos savienojumus:
Servera IP ir jābūt jūsu. Tagad mēģiniet pieteikties, izmantojot iepriekš izveidoto lietotāju; jums vairs nav jāievada parole. Pēc tam konfigurācijas iestatījumos mainiet tālāk norādīto.
sudo nano /etc/ssh/sshd_config
atspējot paroles pieteikšanos:
PasswordAuthentication no
Restartējiet sshd dēmonu:
sudo systemctl reload sshd
Tagad, ja jūs vai kāds cits mēģinās pieteikties kā root lietotājs, tas nedarbosies.
Pēc tam instalējiet dockerd, es šeit neaprakstīšu procesu, jo visu jau var mainīt, sekojiet saitei uz oficiālo vietni un veiciet docker instalēšanas darbības virtuālajā mašīnā: https://docs.docker.com/install/linux/docker-ce/debian/
Sertifikātu ģenerēšana
Lai attālināti vadītu docker dēmonu, ir nepieciešams šifrēts TLS savienojums. Lai to izdarītu, jums ir nepieciešams sertifikāts un atslēga, kas ir jāģenerē un jāpārsūta uz attālo iekārtu. Veiciet darbības, kas sniegtas instrukcijās oficiālajā docker vietnē: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Visi servera ģenerētie *.pem faili, proti, ca.pem, server.pem, key.pem, ir jāievieto servera direktorijā /etc/docker.
Dockerd iestatīšana
Docker dēmona palaišanas skriptā mēs noņemam opciju -H df://. Šī opcija nosaka, kurā resursdatorā var vadīt docker dēmonu.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Pēc tam jums vajadzētu izveidot iestatījumu failu, ja tas vēl neeksistē, un norādīt opcijas:
Lai Gitalaba darbinieks varētu izpildīt komandas attālā Docker resursdatorā, ir jāizlemj, kā un kur saglabāt sertifikātus un atslēgu šifrētam savienojumam ar Dockerd. Es atrisināju šo problēmu, vienkārši pievienojot gitlbab iestatījumos mainīgajiem lielumiem:
Spoilera virsraksts
Vienkārši izvadiet sertifikātu saturu un atslēgu, izmantojot cat: cat ca.pem. Kopējiet un ielīmējiet mainīgo vērtībās.
Uzrakstīsim skriptu izvietošanai, izmantojot GitLab. Tiks izmantots docker-in-docker (dind) attēls.
#!/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
Galvenā problēma bija sertifikātu satura “izvilkšana” normālā formā no gitlab CI/CD mainīgajiem. Es nevarēju saprast, kāpēc savienojums ar attālo saimniekdatoru nedarbojas. Uzņēmējā es paskatījos uz log sudo journalctl -u docker, rokasspiediena laikā radās kļūda. Es nolēmu apskatīt to, kas parasti tiek saglabāts mainīgajos; lai to izdarītu, varat izskatīties šādi: cat -A $DOCKER_CERT_PATH/key.pem. Es pārvarēju kļūdu, pievienojot karieta rakstzīmes tr -d 'r' noņemšanu.
Pēc tam skriptam pēc saviem ieskatiem varat pievienot uzdevumus pēc izlaišanas. Darba versiju varat apskatīt manā repozitorijā https://gitlab.com/isqad/gitlab-ci-cd