Minsan naisip ko ang pag-automate ng deployment ng aking proyekto. Ang gitlab.com ay magiliw na nagbibigay ng lahat ng mga tool para dito, at siyempre nagpasya akong gamitin ito sa pamamagitan ng pag-uunawa nito at pagsulat ng isang maliit na script ng pag-deploy. Sa artikulong ito, ibinabahagi ko ang aking karanasan sa komunidad.
Tl; DR
I-set up ang VPS: huwag paganahin ang root, password login, i-install ang dockerd, i-configure ang ufw
Magtakda ng mga path sa mga certificate sa docker.json
Magrehistro sa mga variable ng gitlab sa mga setting ng CI / CD kasama ang mga nilalaman ng mga sertipiko. Sumulat ng .gitlab-ci.yml script para sa deployment.
Ipapakita ko ang lahat ng mga halimbawa sa pamamahagi ng Debian.
Paunang pag-setup ng VPS
Dito ka bumili ng isang instance halimbawa sa DO, ang unang bagay na dapat gawin ay protektahan ang iyong server mula sa agresibong labas ng mundo. Hindi ko patunayan o igigiit ang anuman, ipapakita ko lang ang /var/log/messages log ng aking virtual server:
Screenshot
Una, i-install ang ufw firewall:
apt-get update && apt-get install ufw
Paganahin ang default na patakaran: i-block ang lahat ng papasok na koneksyon, payagan ang lahat ng papalabas na koneksyon:
Mahalaga: huwag kalimutang payagan ang koneksyon sa pamamagitan ng ssh:
ufw allow OpenSSH
Ang pangkalahatang syntax ay: Payagan ang koneksyon sa port: ufw allow 12345, kung saan ang 12345 ay ang port number o pangalan ng serbisyo. Deny: ufw deny 12345
I-on ang firewall:
ufw enable
Lumabas kami sa session at mag-log in muli sa pamamagitan ng ssh.
Magdagdag ng user, magtalaga sa kanya ng password, at idagdag siya sa sudo group.
Ang ip ng server ay dapat na sa iyo. Ngayon subukang mag-log in sa ilalim ng user na nilikha ng mas maaga, hindi mo na kailangang magpasok ng isang password. Susunod, sa mga setting ng pagsasaayos, baguhin ang sumusunod:
sudo nano /etc/ssh/sshd_config
huwag paganahin ang pag-login ng password:
PasswordAuthentication no
I-restart ang sshd daemon:
sudo systemctl reload sshd
Ngayon kung ikaw o ibang tao ay sumusubok na mag-log in bilang root, ito ay mabibigo.
Susunod, nag-install kami ng dockerd, hindi ko ilalarawan ang proseso dito, dahil ang lahat ay maaari nang mabago, sundin ang link sa opisyal na website at dumaan sa mga hakbang ng pag-install ng docker sa iyong virtual machine: https://docs.docker.com/install/linux/docker-ce/debian/
Pagbuo ng sertipiko
Upang makontrol ang docker daemon nang malayuan, kinakailangan ang isang naka-encrypt na koneksyon sa TLS. Para magawa ito, kailangan mong magkaroon ng certificate at key na kailangan mong gawin at ilipat sa iyong remote na makina. Sundin ang mga hakbang na ibinigay sa mga tagubilin sa opisyal na website ng docker: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Lahat ng nabuong *.pem file para sa server, katulad ng ca.pem, server.pem, key.pem, ay dapat ilagay sa /etc/docker directory sa server.
setup ng docker
Sa docker daemon startup script, alisin ang -H df:// na opsyon, ang opsyong ito ay nagsasabi kung aling host ang docker daemon ay maaaring kontrolin.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
Susunod, lumikha ng isang file ng mga setting kung wala pa ito at itakda ang mga pagpipilian:
Kung berde ang lahat, pagkatapos ay isinasaalang-alang namin na matagumpay naming na-configure ang docker sa server.
Pagse-set up ng tuluy-tuloy na paghahatid sa gitlab
Upang ang manggagawang gitalab ay makapagsagawa ng mga utos sa isang malayuang docker host, kailangan mong magpasya kung paano at saan mag-iimbak ng mga sertipiko at isang susi para sa isang naka-encrypt na koneksyon sa dockerd. Nalutas ko ang problemang ito sa pamamagitan lamang ng pagsulat sa mga variable sa mga setting ng gitlbab:
pamagat ng spoiler
I-output lamang ang mga nilalaman ng mga sertipiko at susi sa pamamagitan ng pusa: cat ca.pem. Kopyahin at i-paste sa mga variable na halaga.
Sumulat tayo ng script para sa pag-deploy sa pamamagitan ng gitlab. Ang docker-in-docker (dind) na imahe ay gagamitin.
Ang pangunahing problema ay ang "bunutin" ang mga nilalaman ng mga sertipiko sa normal na anyo mula sa mga variable ng gitlab CI / CD. Hindi ko maisip kung bakit hindi gumana ang koneksyon sa remote host. Tiningnan ko ang sudo journalctl -u docker log sa host, may error sa handshake. Nagpasya akong tingnan kung ano ang karaniwang nakaimbak sa mga variable, para dito makikita mo ang cat -A $DOCKER_CERT_PATH/key.pem. Napagtagumpayan ang error sa pamamagitan ng pagdaragdag ng pag-alis ng character na caret na tr -d 'r'.
Dagdag pa, maaari kang magdagdag ng mga post-release na gawain sa script ayon sa iyong paghuhusga. Maaari mong tingnan ang gumaganang bersyon sa aking imbakan https://gitlab.com/isqad/gitlab-ci-cd