Боре ман дар бораи автоматикунонии ҷойгиркунии лоиҳаи худ фикр кардам. gitlab.com бо меҳрубонӣ тамоми абзорҳоро барои ин пешниҳод мекунад ва албатта ман қарор додам, ки аз он истифода барам, онро муайян карда, скрипти хурди густаришро нависам. Дар ин мақола ман таҷрибаи худро бо ҷомеа мубодила мекунам.
ХИБ; DR
- VPS-ро насб кунед: решаро хомӯш кунед, бо парол ворид шавед, dockerd-ро насб кунед, ufw-ро танзим кунед
- Барои сервер ва муштарӣ сертификатҳо эҷод кунед
docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Назорати dockerd-ро тавассути васлаки tcp фаъол созед: имконоти -H fd:// -ро аз конфигуратсияи докер хориҷ кунед. - Роҳҳоро ба сертификатҳо дар docker.json сабт кунед
- Дар тағирёбандаҳои gitlab дар танзимоти CI/CD бо мундариҷаи сертификатҳо сабти ном кунед. Барои густариш скрипти .gitlab-ci.yml нависед.
Ман ҳама мисолҳоро дар тақсимоти Debian нишон медиҳам.
Танзимоти ибтидоии VPS
Ҳамин тавр, шумо мисол харидед
Screenshot
Аввалан, девори ufw -ро насб кунед:
apt-get update && apt-get install ufw
Биёед сиёсати пешфарзро фаъол созем: ҳама пайвастҳои воридотӣ баста шаванд, ба ҳама пайвастҳои баромад иҷозат диҳед:
ufw default deny incoming
ufw default allow outgoing
Муҳим: фаромӯш накунед, ки ба пайвастшавӣ тавассути ssh иҷозат диҳед:
ufw allow OpenSSH
Синтаксиси умумӣ чунин аст: Ба пайвастшавӣ тавассути порт иҷозат диҳед: ufw иҷозат диҳед 12345, ки дар он 12345 рақами порт ё номи хидмат аст. Инкор кардан: ufw рад кардан 12345
Сипарро фаъол кунед:
ufw enable
Мо аз сессия мебароем ва аз нав тавассути ssh ворид мешавем.
Истифодабаранда илова кунед, ба ӯ парол таъин кунед ва ӯро ба гурӯҳи sudo илова кунед.
apt-get install sudo
adduser scoty
usermod -aG sudo scoty
Баъдан, мувофиқи нақша, шумо бояд воридшавии паролро хомӯш кунед. Барои ин, калиди ssh-и худро ба сервер нусхабардорӣ кунед:
ssh-copy-id [email protected]
IP сервер бояд аз они шумо бошад. Акнун кӯшиш кунед, ки бо истифода аз корбаре, ки қаблан офаридаед, ворид шавед; ба шумо дигар парол ворид кардан лозим нест. Баъд, дар танзимоти конфигуратсия, инҳоро тағир диҳед:
sudo nano /etc/ssh/sshd_config
вуруди паролро хомӯш кунед:
PasswordAuthentication no
Демони sshd-ро аз нав оғоз кунед:
sudo systemctl reload sshd
Ҳоло агар шумо ё ягон каси дигар кӯшиш кунед, ки ҳамчун корбари реша ворид шавед, он кор намекунад.
Минбаъд, dockerd-ро насб кунед, ман равандро дар ин ҷо тавсиф намекунам, зеро ҳама чизро аллакай тағир додан мумкин аст, истиноди вебсайти расмиро пайгирӣ кунед ва қадамҳои насби докерро дар мошини виртуалии худ гузаред:
Таҳияи сертификатҳо
Барои аз фосилаи дур идора кардани демони докер, пайвасти рамзшудаи TLS лозим аст. Барои ин ба шумо лозим аст, ки сертификат ва калид дошта бошед, ки онҳо бояд тавлид ва ба мошини дурдаст интиқол дода шаванд. Қадамҳои дар дастурҳои вебсайти расмии docker овардашударо иҷро кунед:
Насб кардани dockerd
Дар скрипти оғози демони докер мо опсияи -H df://-ро нест мекунем, ин хосият муайян мекунад, ки дар кадом ҳост демони докер идора карда мешавад.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Баъдан, шумо бояд файли танзимотро эҷод кунед, агар он аллакай вуҷуд надошта бошад ва имконотро муайян кунед:
/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
}
Биёед ба пайвастшавӣ дар порти 2376 иҷозат диҳем:
sudo ufw allow 2376
Биёед dockerd-ро бо танзимоти нав бозоғоз кунем:
sudo systemctl daemon-reload && sudo systemctl restart docker
Биёед тафтиш кунем:
sudo systemctl status docker
Агар ҳама чиз "сабз" бошад, мо фикр мекунем, ки мо докерро дар сервер бомуваффақият танзим кардем.
Танзими интиқоли пайваста дар gitlab
Барои он ки коргари Гиталаба тавонистааст фармонҳоро дар ҳости дурдасти Docker иҷро кунад, бояд муайян кард, ки чӣ гуна ва дар куҷо нигоҳ доштани сертификатҳо ва калиди пайвасти рамзшуда бо Dockerd. Ман ин мушкилотро тавассути илова кардани тағирёбандаҳо дар танзимоти gitlbab ҳал кардам:
Сарлавҳаи спойлер
Танҳо мундариҷаи сертификатҳо ва калидро тавассути cat бароред: cat ca.pem
. Нусхабардорӣ ва ба арзишҳои тағирёбанда часбонед.
Биёед скриптро барои густариш тавассути GitLab нависед. Тасвири docker-in-docker (dind) истифода мешавад.
.gitlab-ci.yml
image:
name: docker/compose:1.23.2
# перепишем entrypoint , чтобы работало в 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 # скрипт деплоя тут
Мундариҷаи скрипти густариш бо шарҳҳо:
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
Мушкилоти асосӣ ин "кашидани" мундариҷаи сертификатҳо дар шакли муқаррарӣ аз тағирёбандаҳои gitlab CI/CD буд. Ман фаҳмида наметавонистам, ки чаро пайвастшавӣ ба мизбони дурдаст кор намекунад. Дар мизбон ман ба log sudo journalctl -u docker нигоҳ кардам, ҳангоми дастфишорӣ хатогӣ ба вуҷуд омад. Ман қарор додам, ки он чизеро, ки одатан дар тағирёбандаҳо нигоҳ дошта мешавад, бубинам; барои ин, шумо метавонед чунин назар кунед: cat -A $DOCKER_CERT_PATH/key.pem. Ман хатогиро тавассути илова кардани аломати вагонча tr -d 'r' бартараф кардам.
Баъдан, шумо метавонед ба скрипт бо ихтиёри худ вазифаҳои пас аз нашр илова кунед. Шумо метавонед версияи кориро дар анбори ман дидан кунед
Манбаъ: will.com