我曾经想过要自动化项目的部署。 gitlab.com会为此提供所有工具,当然我决定通过整理并编写一个小的部署脚本来使用它。 在本文中,我与社区分享了我的经验。
TL; DR
- 配置VPS:禁用root,密码登录,安装dockerd,配置ufw
- 为服务器和客户端生成证书docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl通过tcp套接字启用dockerd控制:删除-H fd选项:/ /来自docker config。
- 在docker.json中注册证书路径
- 在CI / CD设置中的gitlab变量中注册证书内容。 为部署编写一个.gitlab-ci.yml脚本。
我将在Debian发行套件中显示所有示例。
初始VPS设置
因此,例如,您在
DO上购买了一个实例,首先要做的是保护您的服务器免受侵略性外界的侵害。 我不会证明和主张任何东西,只显示我的虚拟服务器的log / var / log /消息:
首先,安装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 root@10.101.10.28
必须指定您的服务器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 /证书生成
要远程管理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目录中。
Dockerd设置
在启动docker守护程序的脚本中,删除-H df://选项,此选项回答哪个主机可以控制docker守护程序。
# At /lib/systemd/system/docker.service [Service] Type=notify ExecStart=/usr/bin/dockerd
接下来,创建一个设置文件(如果尚未存在)并指定选项:
/etc/docker/daemon.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 worker能够在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变量“提取”正常形式的证书内容。 我不明白为什么与远程主机的连接不起作用。 在主机上,我查看了sudo journalctl -u docker日志,出现握手错误。 我决定查看变量中通常存储的内容,为此,您可以看到cat -A $ DOCKER_CERT_PATH / key.pem。 通过添加删除回车符tr -d'\ r'克服了该错误。
在脚本的进一步内容中,您可以随意添加发布后任务。 您可以在我的存储库
https://gitlab.com/isqad/gitlab-ci-cd中查看工作版本