1. 在云空间控制台创建账号并开通计费;准备好目标VPS(建议Ubuntu 22.04);
2. 在代码托管平台(GitHub/GitLab)建立仓库并推送代码;生成并保存SSH公钥用于VPS登录;
3. 选择镜像仓库(Docker Hub 或 云空间提供的私有镜像仓库),准备域名与DNS,可以绑定浮动IP(若云空间支持)。
2. 在云空间控制台:选择台湾节点、选择合适的CPU/内存和磁盘、选择Ubuntu 22.04镜像,填写SSH公钥以免使用密码;
设置安全组/防火墙:开放22(SSH)、80、443、以及应用端口(如3000);绑定弹性IP或配置域名A记录指向该IP。
3. 远程SSH登录到VPS后执行(示例命令):
sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker $USER && sudo systemctl enable --now docker
安装docker-compose(或使用docker compose插件):sudo apt install -y docker-compose-plugin 或 sudo curl -L "https://github.com/docker/compose/releases/download/v2.x/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && sudo chmod +x /usr/local/bin/docker-compose
4. 在本地或CI中编写Dockerfile和docker-compose.yml,示例构建推送命令:
docker build -t yourrepo/yourapp:${GITHUB_SHA::8} .
docker login -u $DOCKER_USER -p $DOCKER_PASS
docker push yourrepo/yourapp:${GITHUB_SHA::8}
在CI中使用变量管理仓库账号,确保CI Runner有访问权限(在GitHub Actions使用secrets,GitLab使用CI/CD Variables)。
5. 创建.github/workflows/deploy.yml,关键步骤:checkout、设置环境、build镜像并push、通过SSH登录到VPS执行部署脚本。
在Actions里可用appleboy/ssh-action或自写ssh命令:ssh -o StrictHostKeyChecking=no deploy@VPS_IP "cd /home/deploy/app && docker-compose pull && docker-compose up -d --force-recreate"。
注意:在云空间请将SSH私钥(Base64或直接key)存入Actions Secrets,并在workflow中恢复为私钥文件以供ssh使用。
6. 在VPS上创建部署用户与目录:sudo adduser deploy; sudo mkdir -p /home/deploy/app; sudo chown deploy:deploy /home/deploy/app。
示例docker-compose.yml包含image: yourrepo/yourapp:latest(或具体tag)、环境变量、端口映射与健康检查;将docker-compose.yml和.env放在该目录,并确保docker-compose pull && docker-compose up -d可正确拉取并启动容器。
7. 推荐使用带tag的镜像(例如按commit SHA或版本号),CI每次推送新的tag并在部署时拉取该tag;若部署失败可通过docker image ls与docker run回退到旧tag。
示例回滚命令:docker-compose pull && docker-compose up -d --no-build --force-recreate --timeout 30;或手动docker tag oldimage:sha latest并docker-compose up以回退。
8. 将敏感信息放在CI secrets或云空间的Secret管理(若有),避免将.env提交到仓库。
在部署时CI将密钥写入VPS的 /home/deploy/app/.env,并确保文件权限为600,且部署用户不是root以降低风险。
9. 使用docker logs -f container查看启动日志;建议配置简单的监控:Prometheus + Grafana或使用云空间提供的监控服务。
在docker-compose中配置healthcheck以便CI或负载均衡器判断服务是否就绪,例:healthcheck: test: ["CMD","curl","-f","http://localhost:3000/health"] interval:30s timeout:5s retries:3。
10. 若CI构建失败:查看CI日志、确保基础镜像能拉取、依赖缓存正确;若部署失败:ssh到VPS执行docker-compose logs、检查防火墙与端口。
若是DNS或域名问题:使用curl或dig检查解析;若SSL证书问题:使用certbot renew并检查80/443是否开放。
11. 建议在云空间选择就近台湾节点以降低延迟;使用私有镜像仓库和镜像加速器提升拉取速度;在CI中开启缓存(Docker layer cache)减少构建时间。
如果访问量较大考虑使用反向代理(Nginx)+多个容器或Kubernetes,逐步把部署迁移到更高可用架构。
12. 问:如何在云空间上确保自动部署的安全性? 答:使用SSH密钥替代密码,CI secrets管理所有敏感变量;VPS创建非root部署用户并限制sudo权限;开启云空间安全组限制来源IP(如仅CI Runner IP或CI服务IP段);使用TLS(Let's Encrypt)并定期更新证书;定期更新系统与Docker补丁。
13. 问:在CI中如何安全传递环境变量/机密到VPS? 答:把机密保存在CI平台的Secrets/Variables(如GITHUB_SECRETS/GITLAB_CI_VARIABLES),在部署阶段通过ssh将变量写入VPS目录下的.env(权限600),或在docker-compose中使用外部secret机制;切忌直接把敏感值写到仓库或日志中。
14. 问:当集成CI后部署失败,我应如何快速定位问题? 答:先看CI日志找到失败步骤(构建、测试、push、ssh),若是构建错误检查Dockerfile与依赖,若是push失败检查仓库认证,若SSH连接失败检查密钥与安全组/防火墙,若远程启动失败ssh到VPS执行docker-compose logs与docker ps查看容器状态并修正。