ื”ื’ื“ืจืช ืชืงืœื™ื˜ื•ืจ ื‘ืืžืฆืขื•ืช gitlab

ืคืขื ื—ืฉื‘ืชื™ ืขืœ ืื•ื˜ื•ืžืฆื™ื” ืฉืœ ื”ืคืจื™ืกื” ืฉืœ ื”ืคืจื•ื™ืงื˜ ืฉืœื™. gitlab.com ื‘ื—ื‘ื™ื‘ื•ืช ืžืกืคืงืช ืืช ื›ืœ ื”ื›ืœื™ื ืœื›ืš, ื•ื›ืžื•ื‘ืŸ ืฉื”ื—ืœื˜ืชื™ ืœื ืฆืœ ืืช ื–ื”, ืœื”ื‘ื™ืŸ ืืช ื–ื” ื•ืœื›ืชื•ื‘ ืกืงืจื™ืคื˜ ืคืจื™ืกื” ืงื˜ืŸ. ื‘ืžืืžืจ ื–ื” ืื ื™ ื—ื•ืœืง ืืช ื”ื ื™ืกื™ื•ืŸ ืฉืœื™ ืขื ื”ืงื”ื™ืœื”.

TL; DR

  1. ื”ื’ื“ืจ VPS: ื”ืฉื‘ืช ืืช ื”ืฉื•ืจืฉ, ื”ืชื—ื‘ืจ ืขื ืกื™ืกืžื”, ื”ืชืงืŸ dockerd, ื”ื’ื“ืจ ืืช ufw
  2. ื”ืคืง ืื™ืฉื•ืจื™ื ืขื‘ื•ืจ ืฉืจืช ื•ืœืงื•ื— docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl ืืคืฉืจ ื‘ืงืจืช dockerd ื‘ืืžืฆืขื•ืช ืฉืงืข tcp: ื”ืกืจ ืืช ื”ืืคืฉืจื•ืช -H fd:// ืžืชืฆื•ืจืช ื”-docer.
  3. ืจืฉื•ื ื ืชื™ื‘ื™ื ืœืื™ืฉื•ืจื™ื ื‘-docker.json
  4. ืจื™ืฉื•ื ื‘-gitlab ืžืฉืชื ื™ื ื‘ื”ื’ื“ืจื•ืช CI/CD ืขื ืชื•ื›ืŸ ื”ืื™ืฉื•ืจื™ื. ื›ืชื•ื‘ ืกืงืจื™ืคื˜ .gitlab-ci.yml ืœืคืจื™ืกื”.

ืื ื™ ืืจืื” ืืช ื›ืœ ื”ื“ื•ื’ืžืื•ืช ืขืœ ื”ืคืฆืช ื“ื‘ื™ืืŸ.

ื”ื’ื“ืจืช VPS ืจืืฉื•ื ื™ืช

ืื– ืงื ื™ืช ื“ื•ื’ืžื” ืœืžืฉืœ ื‘ DO, ื”ื“ื‘ืจ ื”ืจืืฉื•ืŸ ืฉืืชื” ืฆืจื™ืš ืœืขืฉื•ืช ื”ื•ื ืœื”ื’ืŸ ืขืœ ื”ืฉืจืช ืฉืœืš ืžื”ืขื•ืœื ื”ื—ื™ืฆื•ืŸ ื”ืื’ืจืกื™ื‘ื™. ืื ื™ ืœื ืื•ื›ื™ื— ืื• ืื˜ืขืŸ ืฉื•ื ื“ื‘ืจ, ืื ื™ ืจืง ืืจืื” ืืช ื”ื™ื•ืžืŸ /var/log/messages ืฉืœ ื”ืฉืจืช ื”ื•ื™ืจื˜ื•ืืœื™ ืฉืœื™:

ืฆื™ืœื•ื ืžืกืšื”ื’ื“ืจืช ืชืงืœื™ื˜ื•ืจ ื‘ืืžืฆืขื•ืช gitlab

ืจืืฉื™ืช, ื”ืชืงืŸ ืืช ื—ื•ืžืช ื”ืืฉ ืฉืœ ufw:

apt-get update && apt-get install ufw

ื‘ื•ืื• ื ืคืขื™ืœ ืืช ืžื“ื™ื ื™ื•ืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ: ื—ืกื•ื ืืช ื›ืœ ื”ื—ื™ื‘ื•ืจื™ื ื”ื ื›ื ืกื™ื, ืืคืฉืจ ืืช ื›ืœ ื”ื—ื™ื‘ื•ืจื™ื ื”ื™ื•ืฆืื™ื:

ufw default deny incoming
ufw default allow outgoing

ื—ืฉื•ื‘: ืืœ ืชืฉื›ื— ืœืืคืฉืจ ืืช ื”ื—ื™ื‘ื•ืจ ื‘ืืžืฆืขื•ืช ssh:

ufw allow OpenSSH

ื”ืชื—ื‘ื™ืจ ื”ื›ืœืœื™ ื”ื•ื ื›ื“ืœืงืžืŸ: ืืคืฉืจ ื—ื™ื‘ื•ืจ ืœืคื™ ื™ืฆื™ืื”: ufw allow 12345, ื›ืืฉืจ 12345 ื”ื•ื ืžืกืคืจ ื”ื™ืฆื™ืื” ืื• ืฉื ื”ืฉื™ืจื•ืช. ื”ื›ื—ืฉื”: ufw deny 12345

ื”ืคืขืœ ืืช ื—ื•ืžืช ื”ืืฉ:

ufw enable

ืื ื• ื™ื•ืฆืื™ื ืžื”ื”ืคืขืœื” ื•ื ื›ื ืกื™ื ืฉื•ื‘ ื“ืจืš ssh.

ื”ื•ืกืฃ ืžืฉืชืžืฉ, ื”ืงืฆื” ืœื• ืกื™ืกืžื” ื•ื”ื•ืกืฃ ืื•ืชื• ืœืงื‘ื•ืฆืช ื”ืกื•ื“ื•.

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, ืื ื™ ืœื ืืชืืจ ืืช ื”ืชื”ืœื™ืš ื›ืืŸ, ืžื›ื™ื•ื•ืŸ ืฉื”ื›ืœ ื›ื‘ืจ ื ื™ืชืŸ ืœืฉื ื•ืช, ืขืงื•ื‘ ืื—ืจ ื”ืงื™ืฉื•ืจ ืœืืชืจ ื”ืจืฉืžื™ ื•ืขื‘ื•ืจ ืขืœ ื”ืฉืœื‘ื™ื ืฉืœ ื”ืชืงื ืช 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/docer ื‘ืฉืจืช.

ื”ื’ื“ืจืช dockerd

ื‘ืกืงืจื™ืคื˜ ื”ื”ืฉืงื” ืฉืœ docker daemon, ืื ื• ืžืกื™ืจื™ื ืืช ื”ืืคืฉืจื•ืช -H df://, ืืคืฉืจื•ืช ื–ื• ืงื•ื‘ืขืช ื‘ืื™ื–ื” ืžืืจื— ื ื™ืชืŸ ืœืฉืœื•ื˜ ื‘ื“ืžื•ืŸ docker.

# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd

ืœืื—ืจ ืžื›ืŸ, ืขืœื™ืš ืœื™ืฆื•ืจ ืงื•ื‘ืฅ ื”ื’ื“ืจื•ืช, ืื ื”ื•ื ืขื“ื™ื™ืŸ ืœื ืงื™ื™ื, ื•ืœืฆื™ื™ืŸ ืืช ื”ืืคืฉืจื•ื™ื•ืช:

/etc/docer/docer.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

ืขืœ ืžื ืช ืฉืขื•ื‘ื“ Gitalaba ื™ื•ื›ืœ ืœื‘ืฆืข ืคืงื•ื“ื•ืช ืขืœ ืžืืจื— Docker ืžืจื•ื—ืง, ื™ืฉ ืฆื•ืจืš ืœื”ื—ืœื™ื˜ ื›ื™ืฆื“ ื•ื”ื™ื›ืŸ ืœืื—ืกืŸ ืื™ืฉื•ืจื™ื ื•ืืช ื”ืžืคืชื— ืœื—ื™ื‘ื•ืจ ืžื•ืฆืคืŸ ืขื Dockerd. ืคืชืจืชื™ ืืช ื”ื‘ืขื™ื” ืขืœ ื™ื“ื™ ื”ื•ืกืคืช ื”ืžืฉืชื ื™ื ื”ื‘ืื™ื ื‘ื”ื’ื“ืจื•ืช gitlbab:

ื›ื•ืชืจืช ืกืคื•ื™ืœืจื”ื’ื“ืจืช ืชืงืœื™ื˜ื•ืจ ื‘ืืžืฆืขื•ืช gitlab

ืคืฉื•ื˜ ืคืœื˜ ืืช ืชื•ื›ืŸ ื”ืื™ืฉื•ืจื™ื ื•ื”ืžืคืชื— ื‘ืืžืฆืขื•ืช 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'.

ืœืื—ืจ ืžื›ืŸ, ืชื•ื›ืœ ืœื”ื•ืกื™ืฃ ืžืฉื™ืžื•ืช ืœืื—ืจ ื”ืฉื—ืจื•ืจ ืœืชืกืจื™ื˜ ืœืคื™ ืฉื™ืงื•ืœ ื“ืขืชืš. ืืชื” ื™ื›ื•ืœ ืœืฆืคื•ืช ื‘ื’ืจืกืช ื”ืขื‘ื•ื“ื” ื‘ืžืื’ืจ ืฉืœื™ https://gitlab.com/isqad/gitlab-ci-cd

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”