αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αžŸαŸŠαžΈαžŒαžΈαžαžΆαž˜αžšαž™αŸˆ gitlab

αžαŸ’αž‰αž»αŸ†αž’αŸ’αž›αžΆαž”αŸ‹αž‚αž·αžαž’αŸ†αž–αžΈαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αŸ” gitlab.com αžŸαžΌαž˜αž•αŸ’αžαž›αŸ‹αž§αž”αž€αžšαžŽαŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡ αž αžΎαž™αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž”αŸ’αžšαžΎαžœαžΆαžŠαŸ„αž™αž€αŸ†αžŽαžαŸ‹αžœαžΆαž…αŸαž‰ αž αžΎαž™αžŸαžšαžŸαŸαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžαžΌαž…αž˜αž½αž™αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‡αžΆαž˜αž½αž™αžŸαž αž‚αž˜αž“αŸαŸ”

TL; αž€αž»αž„

  1. αžŠαŸ†αž‘αžΎαž„ VPSαŸ– αž”αž·αž‘αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš root, αž…αžΌαž›αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹, αžŠαŸ†αž‘αžΎαž„ dockerd, αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ ufw
  2. αž”αž„αŸ’αž€αžΎαžαžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž—αŸ’αž‰αŸ€αžœ docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl αž”αžΎαž€αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ dockerd αžαžΆαž˜αžšαž™αŸˆαžšαž“αŸ’αž’ tcpαŸ– αž™αž€αž‡αž˜αŸ’αžšαžΎαžŸ -H fd:// αž…αŸαž‰αž–αžΈ docker config αŸ”
  3. αž€αŸ†αžŽαžαŸ‹αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαž“αŸ…αž€αŸ’αž“αž»αž„ docker.json
  4. αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž€αŸ’αž“αž»αž„αž’αžαŸαžš gitlab αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ CI/CD αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžšαŸ” αžŸαžšαžŸαŸαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž” .gitlab-ci.yml αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ”

αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž§αž‘αžΆαž αžšαžŽαŸαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž›αžΎαž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™ Debian αŸ”

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ VPS αžŠαŸ†αž”αžΌαž„

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž’αŸ’αž“αž€αž”αžΆαž“αž‘αž·αž‰αž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™αž“αŸ…αž›αžΎ DOαžšαžΏαž„αžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž‚αžΊαž€αžΆαžšαž–αžΆαžšαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž–αžΈαž–αž·αž—αž–αžαžΆαž„αž€αŸ’αžšαŸ…αžŠαŸ‚αž›αžˆαŸ’αž›αžΆαž“αž–αžΆαž“αŸ” αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž˜αž·αž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹ αž¬αž’αŸ‡αž’αžΆαž„αž’αŸ’αžœαžΈαž“αŸ„αŸ‡αž‘αŸ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž€αŸ†αžŽαžαŸ‹αž αŸαžαž» /var/log/messages αž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž“αž·αž˜αŸ’αž˜αž·αžαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αŸ–

αžšαžΌαž”αžαžαž’αŸαž€αŸ’αžšαž„αŸ‹αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αžŸαŸŠαžΈαžŒαžΈαžαžΆαž˜αžšαž™αŸˆ gitlab

αžŠαŸ†αž”αžΌαž„αžŠαŸ†αž‘αžΎαž„ ufw firewallαŸ–

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 αžšαž”αžŸαŸ‹ server αžαŸ’αžšαžΌαžœαžαŸ‚αž‡αžΆαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž₯αž‘αžΌαžœβ€‹αž–αŸ’αž™αžΆαž™αžΆαž˜β€‹αž…αžΌαž›β€‹αž€αŸ’αžšαŸ„αž˜β€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž˜αž»αž“ αž’αŸ’αž“αž€β€‹αž˜αž·αž“β€‹αž…αžΆαŸ†αž”αžΆαž…αŸ‹β€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αž–αžΆαž€αŸ’αž™β€‹αžŸαž˜αŸ’αž„αžΆαžαŸ‹β€‹αž‘αŸ€αžβ€‹αž‘αŸαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αžŸαžΌαž˜αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

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/

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžš

αžŠαžΎαž˜αŸ’αž”αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸαž˜αž·αž“ docker αž–αžΈαž…αž˜αŸ’αž„αžΆαž™ αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ 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 αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ”

αž€αžΆαžšαžŠαŸ†αž‘αžΎαž„ docker

αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž” docker daemon startup αžŠαž€αž‡αž˜αŸ’αžšαžΎαžŸ -H df:// αž‡αž˜αŸ’αžšαžΎαžŸαž“αŸαŸ‡αž”αŸ’αžšαžΆαž”αŸ‹αžαžΆαžαžΎ host αžŽαžΆαžŠαŸ‚αž› docker daemon αž’αžΆαž…αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž”αžΆαž“αŸ”

# 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

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αžœαžΈαŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž˜αžΆαž“αž–αžŽαŸŒαž”αŸƒαžαž„ αž“αŸ„αŸ‡αž™αžΎαž„αž–αž·αž…αžΆαžšαžŽαžΆαžαžΆαž™αžΎαž„αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ docker αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαŸ”

αžšαŸ€αž”αž…αŸ†αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž”αž“αŸ’αžαž“αŸ…αž›αžΎ gitlab

αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž”αž»αž‚αŸ’αž‚αž›αž·αž€ gitalab αž’αžΆαž…αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“ docker αž–αžΈαž…αž˜αŸ’αž„αžΆαž™ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž–αžΈαžšαž”αŸ€αž” αž“αž·αž„αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžš αž“αž·αž„αž€αžΌαž“αžŸαŸ„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž”αž‘αŸ… dockerd αŸ” αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž“αŸαŸ‡αžŠαŸ„αž™αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžŸαžšαžŸαŸαžšαž‘αŸ…αž€αžΆαž“αŸ‹αž’αžαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹ gitlbabαŸ–

αž…αŸ†αžŽαž„αž‡αžΎαž„ spoilerαž€αžΆαžšαžŠαŸ†αž‘αžΎαž„αžŸαŸŠαžΈαžŒαžΈαžαžΆαž˜αžšαž™αŸˆ gitlab

αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž”αž‰αŸ’αž…αŸαž‰αžαŸ’αž›αžΉαž˜αžŸαžΆαžšαž“αŸƒαžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžš αž“αž·αž„αž‚αž“αŸ’αž›αžΉαŸ‡αžαžΆαž˜αžšαž™αŸˆαž†αŸ’αž˜αžΆαŸ– 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 αŸ” αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž’αžΆαž…αž™αž›αŸ‹αž”αžΆαž“αžαžΆαž αŸαžαž»αž’αŸ’αžœαžΈαž”αžΆαž“αž‡αžΆαž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž–αžΈαž…αž˜αŸ’αž„αžΆαž™αž˜αž·αž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž› sudo journalctl -u docker log αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“ αž˜αžΆαž“αž€αŸ†αž αž»αžŸαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž…αžΆαž”αŸ‹αžŠαŸƒαŸ” αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžšαž€αž˜αžΎαž›αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž‡αžΆαž‘αžΌαž‘αŸ…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αž“αž»αž„αž’αžαŸαžš αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰αž†αŸ’αž˜αžΆ -A $DOCKER_CERT_PATH/key.pemαŸ” αž™αž€αžˆαŸ’αž“αŸ‡αž›αžΎαž€αŸ†αž αž»αžŸαžŠαŸ„αž™αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαžŠαž€αžαž½αž’αž€αŸ’αžŸαžš tr -d 'r' αž…αŸαž‰αŸ”

αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž“αŸ’αžαŸ‚αž˜αž€αž·αž…αŸ’αž…αž€αžΆαžšαž€αŸ’αžšαŸ„αž™αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž‘αŸ…αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžαžΆαž˜αž€αžΆαžšαžŸαŸ†αžšαŸαž…αž…αž·αžαŸ’αžαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† https://gitlab.com/isqad/gitlab-ci-cd

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹