1. 概述与适用场景
1. 目标:在越南 CN2 网络的 VPS 上为开发团队建立稳定的自动化部署与持续集成(CI)流水线。
2. 适用对象:需要对中国大陆有良好连接、部署多服务(Web/API/微服务)的团队。
3. 输出:包含初始化脚本、Docker 化部署、CI Runner(GitLab/GitHub/Drone)与 Ansible 自动化示例。
2. 前期准备与选型
1. 选购:选择支持 CN2 或 CN2-like 提供商(需明确路由到中国的 ASN),建议选越南河内/胡志明节点,至少2CPU/4GB内存。
2. 账号与密钥:准备 VPS 控制台账号、密码并优先启用 SSH 密钥认证。
3. 域名与证书:提前解析域名到 VPS 公网 IP,准备使用 Let's Encrypt 自动签发证书。
3. 系统与网络初始化(以 Ubuntu 22.04 为例)
1. 登录:ssh root@your_vps_ip(推荐先在本地生成密钥 ssh-keygen 并上传到控制台)。
2. 系统更新:apt update && apt -y upgrade && apt -y autoremove。
3. 时区与用户:timedatectl set-timezone Asia/Ho_Chi_Minh;adduser deployer && usermod -aG sudo deployer。
4. SSH 安全:编辑 /etc/ssh/sshd_config,禁止密码登录(PasswordAuthentication no),更改端口(可选),重启 sshd。
4. CN2 网络调优与内核设置
1. 查看路由与延迟:traceroute -n 1.2.3.4 或 mtr -r -c 10 to your target,确认出口路径为 CN2。
2. 开启 BBR:echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf; echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf; sysctl -p。
3. 增强连接数:调整 /etc/sysctl.conf 增加 net.ipv4.ip_local_port_range, net.core.somaxconn 等并生效。
5. 基础软件安装(Docker + docker-compose + git)
1. 安装 Docker:curl -fsSL https://get.docker.com | sh。
2. 添加用户:usermod -aG docker deployer。
3. 安装 docker-compose(v2)或使用 docker compose 插件:apt install docker-compose-plugin 或 curl 下载 docker-compose 二进制。
4. 安装 Git、htop、jq:apt install -y git htop jq。
6. 容器化与镜像管理
1. Dockerfile 与 docker-compose.yml:为每个服务编写 Dockerfile(明确基础镜像、构建步骤、暴露端口)。
2. 私有镜像仓库:建议使用 Docker Hub/GitLab Container Registry 或自建 Harbor;在 CI 中配置凭证(DOCKER_USERNAME/DOCKER_PASSWORD 或 token)。
3. 本地测试:docker compose -f docker-compose.yml up -d --build; docker compose ps。
7. 自动化部署方案(SSH + Docker Compose 示例)
1. 思路:CI 构建镜像并推送到镜像仓库;CI 通过 SSH 登录到 VPS,拉取镜像并用 docker-compose pull && docker-compose up -d 更新。
2. 在 VPS 上准备部署目录 /opt/apps/myapp 和 docker-compose.prod.yml,放置 .env(敏感信息通过 CI Secret 注入,不保存在仓库)。
3. 在 CI 中使用 ssh key(私钥加入 CI Secret),示例命令:ssh -o StrictHostKeyChecking=no deployer@vps "cd /opt/apps/myapp && docker-compose pull && docker-compose up -d --remove-orphans"。
8. 使用 Ansible 实现更复杂的自动化
1. 安装 Ansible 控制节点(可在 CI runner 或本地):pip3 install ansible。
2. inventory 示例:vps ansible_host=IP ansible_user=deployer ansible_ssh_private_key_file=~/.ssh/id_rsa。
3. playbook 示例:- name: deploy app hosts: vps tasks: - name: git pull ... - name: docker compose pull ... 使用 templates 部署配置并重启服务。
4. 在 CI 中执行:ansible-playbook -i inventory deploy.yml,将敏感变量存入 Ansible Vault 或 CI secret。
9. CI Runner 部署(GitLab Runner / GitHub Actions Self-hosted / Drone)
1. GitLab Runner:apt-get install -y gitlab-runner;gitlab-runner register(填写 CI URL、token、执行器 shell/docker)。
2. GitHub Actions Self-hosted:在仓库 Settings -> Actions -> Runners 添加新 runner,下载并运行 runner 服务,配置为 systemd。
3. Drone:Docker 部署 Drone Server + Runner,连接到 Git 仓库并通过 webhook 触发。
4. 推荐使用带有 docker 权限的 runner,实现构建镜像并直接推送到仓库。
10. 日志、监控与告警
1. 日志集中:使用 Filebeat/Fluentd 将容器日志推送到 ELK/EFK 或第三方服务。
2. 容器监控:部署 cAdvisor + Prometheus + Grafana;安装 node_exporter 监控 VPS 指标。
3. 告警:Prometheus Alertmanager 或使用外部告警(邮件/钉钉/Slack)。
11. 灰度、回滚与高可用策略
1. 镜像打标签:CI 构建时使用语义版本或 Git SHA(例如 myapp:1.2.3 或 myapp:sha-abcdef)。
2. 回滚:保留旧标签并在需要时 docker-compose pull && docker-compose up -d image:oldtag。
3. 灰度:利用两个服务实例(myapp-v1, myapp-v2)与反向代理(nginx)按比例切流或使用流量开关进行验证。
12. 常见注意事项与安全加固
1. 密钥管理:CI 中只放私钥的必要权限并设置过期策略,VPS 上使用限制性 sudo 规则。
2. 防火墙:使用 ufw 或 iptables 仅开放必要端口(SSH 非默认端口、HTTP/HTTPS)。
3. 备份:定期备份数据库与 /opt/apps 配置,测试恢复流程。
13. 问:在越南 CN2 VPS 上部署时最容易遇到的网络问题是什么?
答:最常见是路由不走 CN2 或存在丢包、高延迟,导致从中国访问不稳定;解决方法是先用 mtr/traceroute 验证路径,必要时与 VPS 提供商确认 ASN 与出口节点,或更换到确认为 CN2 的线路节点。
14. 问:CI 如何安全地将敏感配置(数据库密码、API Key)注入到部署环境?
答:把敏感变量保存在 CI 系统的 Secret/Variables 中(例如 GitLab CI/ GitHub Actions Secrets),部署时由 CI 在运行时写入服务器的 .env 或使用 Ansible Vault,避免将明文写入仓库或镜像。
15. 问:如何在 CI 流程中实现零停机部署?
答:可以采用蓝绿或滚动更新策略:在 Docker Compose 层面使用新容器先启动并健康检查通过后切换反向代理(nginx)到新实例,或使用 Kubernetes/Swarm 做原生滚动更新;若仅使用 docker-compose,可借助 nginx upstream 变更并平滑下线旧实例。
来源:面向开发团队的越南vps cn2环境自动化部署与CI流程