Еднаш размислував да го автоматизирам распоредувањето на мојот проект. gitlab.com љубезно ги обезбедува сите алатки за ова, и се разбира, решив да ги искористам предностите на тоа, да го сфатам и да напишам мала скрипта за распоредување. Во оваа статија го споделувам моето искуство со заедницата.
TL; ДР
Поставете VPS: оневозможете root, најавете се со лозинка, инсталирајте dockerd, конфигурирајте ufw
Регистрирајте ги патеките до сертификатите во docker.json
Регистрирајте се во променливите gitlab во поставките за CI/CD со содржината на сертификатите. Напишете скрипта .gitlab-ci.yml за распоредување.
Ќе ги покажам сите примери за распределбата на Debian.
Почетно поставување VPS
Така купивте пример на пример во DO, првото нешто што треба да направите е да го заштитите вашиот сервер од агресивниот надворешен свет. Нема да докажам или тврдам ништо, само ќе го покажам дневникот /var/log/пораки на мојот виртуелен сервер:
Екранот
Прво, инсталирајте го заштитниот ѕид на ufw:
apt-get update && apt-get install ufw
Ајде да ја овозможиме стандардната политика: блокирајте ги сите дојдовни врски, дозволете ги сите појдовни врски:
Важно: не заборавајте да ја дозволите врската преку ssh:
ufw allow OpenSSH
Општата синтакса е следна: Дозволете поврзување по порта: ufw allow 12345, каде што 12345 е бројот на портата или името на услугата. Негирајте: ufw deny 12345
Вклучете го заштитниот ѕид:
ufw enable
Излегуваме од сесијата и повторно се најавуваме преку ssh.
Додадете корисник, доделете му лозинка и додајте го во групата sudo.
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 врска. За да го направите ова, треба да имате сертификат и клуч, кои мора да бидат генерирани и префрлени на вашата далечинска машина. Следете ги чекорите дадени во упатствата на официјалната веб-страница на докер: 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
Во скриптата за лансирање на докерскиот демон, ја отстрануваме опцијата -H df://, оваа опција одредува на кој домаќин може да се контролира докерскиот демон.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Следно, треба да креирате датотека за поставки, ако веќе не постои, и да ги наведете опциите:
Ако сè е „зелено“, тогаш сметаме дека успешно го конфигуриравме докерот на серверот.
Поставување континуирана испорака на gitlab
За да може работникот на Гиталаба да извршува команди на далечински домаќин Docker, потребно е да одлучи како и каде да ги складира сертификатите и клучот за шифрирана врска со Dockerd. Го решив овој проблем со едноставно додавање на следново на променливите во поставките за gitlbab:
Наслов на спојлер
Само изнесете ја содржината на сертификатите и клучот преку cat: cat ca.pem. Копирајте и залепете во вредностите на променливите.
Ајде да напишеме скрипта за распоредување преку GitLab. Ќе се користи сликата docker-in-docker (dind).
Содржина на скриптата за распоредување со коментари:
bin/deploy.ш
#!/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 променливите. Не можев да сфатам зошто врската со далечинскиот домаќин не работи. На домаќинот погледнав во log sudo journalctl -u docker, имаше грешка при ракувањето. Решив да погледнам што е генерално зачувано во променливи; за да го направите ова, можете да изгледате вака: cat -A $DOCKER_CERT_PATH/key.pem. Ја надминав грешката со додавање на отстранување на знакот за превоз tr -d 'r'.
Следно, можете да додадете задачи по објавувањето во сценариото по ваша дискреција. Работната верзија можете да ја видите во моето складиште https://gitlab.com/isqad/gitlab-ci-cd