Задумаўся неяк раз я аб аўтаматызацыі разгортвання свайго праекту. gitlab.com ласкава дае для гэтага ўсе прылады, і я вядома вырашыў скарыстацца, разабраўшыся і напісаўшы невялікі сцэнар дэплою. У артыкуле я дзялюся сваім досведам з супольнасцю.
Прапісаць у зменныя gitlab у наладах CI/CD са змесцівам сертыфікатаў. Напісаць скрыпт .gitlab-ci.yml для дэплою.
Усе прыклады я буду паказваць на дыстрыбутыве Debian.
Першапачатковая настройка VPS
Вось вы купілі інстанс напрыклад на DO, першае, што неабходна зрабіць, гэта абараніць ваш сервер ад агрэсіўнага знешняга свету. Я не буду нічога даказваць і сцвярджаць, проста пакажу лог /var/log/messages свайго віртуальнага сервера:
Скрыншот
Па-першае ўсталюем фаервол ufw:
apt-get update && apt-get install ufw
Уключым палітыку па змаўчанні: блакуем усе ўваходныя злучэнні, дазваляем усе выходныя злучэнні:
ip сервера павінен быць пазначаны ваш. Паспрабуйце зараз залагініцца пад створаным раней карыстачом, пароль уводзіць больш не трэба. Далей у наладах канфігурацыі змяняем наступнае:
sudo nano /etc/ssh/sshd_config
адключаем уваход па паролі:
PasswordAuthentication no
Перазапускаем дэман sshd:
sudo systemctl reload sshd
Цяпер калі вы ці нехта іншы паспрабуе ўвайсці праз карыстальніка root, у яго нічога не атрымаецца.
Далей ставім dockerd, тут працэс ужо не буду апісваць, бо ўсё можа быць ужо зменена, схадзіце па спасылцы на афіцыйны сайт і прайдзіце этапы ўсталёўкі docker на вашу віртуалку: https://docs.docker.com/install/linux/docker-ce/debian/
Генерацыя сертыфікатаў
Каб кіраваць дэманам докера выдалена патрабуецца шыфраванае TLS злучэнне. Для гэтага неабходна мець сертыфікат і ключ, якія трэба згенераваць і перанесці на выдаленую вашу машыну. Выконвайце крокам, зададзеным у інструкцыі на афіцыйным сайце docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Усе згенераваныя *.pem файлы для сервера, а менавіта ca.pem, server.pem, key.pem трэба змясціць у дырэкторыю /etc/docker на серверы.
Настройка dockerd
У сцэнары запуску дэмана docker прыбіраем опцыю -H df://, гэтая опцыя адказвае, на якім хасце можна кіраваць дэманам докера.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Далей варта стварыць файл налад, калі яго яшчэ няма і прапісаць опцыі:
Калі ўсё "зялёнае", то лічым, што на серверы мы паспяхова наладзілі docker.
Настройка continuous deleivery на gitlab
Для таго каб воркер гиталаба змог выконваць каманды на выдаленым хасце докера неабходна вызначыцца, як і дзе захоўваць сертыфікаты і ключ для шыфраванага злучэння з dockerd. Я вырашыў дадзеную праблему проста прапісаўшы ў зменныя ў наладах gitlbab:
Загаловак спойлера
Проста выводзьце змесціва сертыфікатаў і ключа праз cat: cat ca.pem. Капіюеце і ўстаўляеце ў значэнне зменных.
Прапішам сцэнар для дэплою праз гітлаб. Выкарыстоўваць будзе docker-in-docker (dind) вобраз.
#!/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
Асноўная праблема была ў тым, каб "выцягнуць" з зменных gitlab CI/CD змесціва сертыфікатаў у нармалёвым выглядзе. Я не мог зразумець, чаму не працавала злучэнне з выдаленым хастом. На хасце паглядзеў часопіс sudo journalctl -u docker, тамака памылка пры поціску рукі. Вырашыў зірнуць, што наогул захоўваецца ў зменных, для гэтага можна паглядзець так cat -A $DOCKER_CERT_PATH/key.pem. Памылку падужаў, дадаўшы выдаленне знака карэткі tr -d 'r'.
Далей у сцэнар можна дадаць пост-рэлізныя цягі на сваё меркаванне. Азнаёміцца з працоўнай версіяй можаце ў маім рэпазітары https://gitlab.com/isqad/gitlab-ci-cd