Skip to content

03-06 · 部署到腾讯云

腾讯云是公司当前的默认云。原因不是它最便宜,也不是它最酷,而是 它在国内合规 + 备案 + 稳定 + 与微信生态打通 这件事上是综合最优的。我们 90% 的对外产品都跑在腾讯云上。


一、腾讯云产品选型(公司硬约定)

产品用途我们用不用
轻量应用服务器(Lighthouse)中小项目、demo、内部工具首选(性价比最高、镜像开箱即用)
云服务器 CVM中大型生产、需要复杂网络✅ 需要 VPC / 内网互通时用
TKE / EKS容器编排(k8s)⚠️ 项目稳定且 SLA 高时考虑
云数据库 PostgreSQL生产数据库✅ 推荐(自带备份 / 高可用)
云数据库 Redis生产缓存 / 队列
对象存储 COS用户上传、备份✅(国内访问场景)
CDN / EdgeOne国内加速✅ 国内主流量时配
SSL 证书HTTPS(一年期免费)
DNSPod域名解析(被腾讯云收购)
VPC + 内网互通多服务器组网

禁用 / 慎用清单

  • ❌ 不要随便买"包年套餐"(除非已上线稳定 6 个月)
  • ❌ 不要用腾讯云的"Serverless 函数"做主业务(生态弱、调试痛苦)
  • ⚠️ "云开发 CloudBase" 仅在做小程序时考虑

二、部署形态总览(三种)

我们公司项目按规模选其中一种:

形态 A:单机 Docker Compose(80% 项目)

[Cloudflare DNS / CDN]

[腾讯云 Lighthouse 单机]

[Docker Compose: nginx + api + web + db + redis]

适用:MVP、内部工具、客户 PoC、月活 < 10 万

形态 B:多机 + 云数据库(中型项目)

[Cloudflare DNS / CDN]

[腾讯云 CLB(负载均衡)]

[Lighthouse / CVM × N]  ←  [云数据库 PG / Redis]

适用:日活 1-50 万、有 SLA 要求

形态 C:k8s + 多服务(大型项目)

当你需要 自动扩缩容 / 灰度发布 / 服务网格 时再考虑。新人 6 个月内不要碰


三、形态 A 全流程(最常用,详细版)

3.1 买轻量服务器

套餐推荐配置适用
入门2 核 2GB / 80G SSD / 4M / 300G 流量单一应用 demo
常用4 核 4GB / 80G SSD / 6M / 1.2T 流量公司默认起步
进阶4 核 8GB / 120G SSD / 10M / 2T 流量中等线上业务

地域选择

  • 国内业务 → 广州 / 上海 优先(南北各一台备份更佳)
  • 海外业务 → 香港 / 新加坡 / 硅谷香港不需要备案

镜像

  • 应用镜像 → Docker 直接预装好 Docker / Compose
  • 或选 系统镜像 → Ubuntu 22.04 LTS / 24.04 LTS

3.2 域名 + 备案

场景步骤
国内服务器 + 国内域名必须 ICP 备案(约 7-20 工作日)
国内服务器 + 国外域名(.com / .ai 等)不能用 80/443,且容易被屏蔽 ⚠️
香港服务器 + 任意域名无需备案,首选海外项目
海外服务器 + Cloudflare 反代到任意域名07-Cloudflare全球加速.md

备案流程:腾讯云 → 备案中心 → 关联服务器 → 提交资料(身份证、营业执照、域名证书)→ 短信核验 → 工信部审核。第一次备案务必早办,至少留 3 周缓冲期

3.3 SSH 与基础硬化

bash
# 第一次登入(腾讯云控制台拿初始密码或绑 ssh key)
ssh ubuntu@<lighthouse-ip>

# 创建非 root 用户(如果 Lighthouse 给的是 root)
adduser deploy
usermod -aG sudo,docker deploy

# 把你公司机器的公钥加进 authorized_keys
mkdir -p /home/deploy/.ssh
echo "ssh-ed25519 AAAA..." >> /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys

# /etc/ssh/sshd_config(公司硬约定)
# PasswordAuthentication no
# PermitRootLogin no
# Port 22  ← 不改也行,但开 fail2ban
sudo systemctl restart ssh

# 防火墙:腾讯云控制台 + 系统层 ufw 双层
sudo ufw allow 22 80 443
sudo ufw enable

公司硬约定

  • 永远 禁用密码登录、禁用 root 登录
  • SSH key 不允许放在公共邮箱或同步盘的明文里
  • 服务器密码 / 密钥 → 公司 1Password / Bitwarden 保险箱

3.4 装 Docker(如果不是 Docker 镜像)

bash
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker
docker --version

# 配置国内镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com"
  ]
}
EOF
sudo systemctl restart docker

mirror.ccs.tencentyun.com 是腾讯云内网镜像源,只在腾讯云服务器上能用,但速度极快

3.5 项目代码上服务器

bash
# 用 ssh key 拉私有 git
sudo apt install -y git
ssh-keygen -t ed25519 -C "deploy@qdy"
cat ~/.ssh/id_ed25519.pub   # 把公钥加到 GitHub / GitLab Deploy Key

mkdir -p ~/deployments
cd ~/deployments
git clone git@github.com:qdy/my-app.git
cd my-app

3.6 docker-compose.prod.yml(公司模板)

yaml
services:
  api:
    image: qdy-registry.cn-shanghai.cr.aliyuncs.com/my-app/api:${TAG:-latest}
    restart: unless-stopped
    env_file: .env.prod
    depends_on:
      db:
        condition: service_healthy
    expose:
      - "8000"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 5s
      retries: 5

  web:
    image: qdy-registry.cn-shanghai.cr.aliyuncs.com/my-app/web:${TAG:-latest}
    restart: unless-stopped
    expose:
      - "80"

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${PG_USER}
      POSTGRES_PASSWORD: ${PG_PASSWORD}
      POSTGRES_DB: ${PG_DB}
      TZ: Asia/Shanghai
      PGTZ: Asia/Shanghai
    volumes:
      - pg-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "${PG_USER}", "-d", "${PG_DB}"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    restart: unless-stopped
    volumes:
      - redis-data:/data

  nginx:
    image: nginx:1.27-alpine
    restart: unless-stopped
    depends_on:
      - api
      - web
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./deploy/nginx/conf.d:/etc/nginx/conf.d:ro
      - ./deploy/nginx/certs:/etc/nginx/certs:ro
      - nginx-cache:/var/cache/nginx

volumes:
  pg-data:
  redis-data:
  nginx-cache:

3.7 nginx 配置(接 HTTPS)

deploy/nginx/conf.d/default.conf

nginx
server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name yourdomain.com www.yourdomain.com;

    ssl_certificate     /etc/nginx/certs/yourdomain.com.pem;
    ssl_certificate_key /etc/nginx/certs/yourdomain.com.key;

    # 安全头
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

    # API
    location /api/ {
        proxy_pass         http://api:8000/api/;
        proxy_set_header   Host $host;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_read_timeout 60s;
    }

    # Web 静态站
    location / {
        proxy_pass http://web:80;
        proxy_set_header Host $host;
    }
}

3.8 SSL 证书

两种方式:

方式 1:腾讯云免费 SSL(推荐)

  • 腾讯云控制台 → SSL 证书 → 申请免费 DV SSL → DNS 验证 → 下载 nginx 格式
  • 一年期,到期前 30 天会提醒续

方式 2:Cloudflare 接管 HTTPS

3.9 启动 + 跑迁移

bash
# 第一次
docker compose -f docker-compose.prod.yml --env-file .env.prod up -d

# 跑数据库 migration(在 api 容器内)
docker compose exec api alembic upgrade head

# 看日志
docker compose logs -f api
docker compose logs -f nginx

3.10 验证

bash
curl -I https://yourdomain.com
curl https://yourdomain.com/api/health

四、CI / CD(公司模板)

.github/workflows/deploy.yml(GitHub Actions 示意):

yaml
name: deploy

on:
  push:
    branches: [main]
    tags: ["v*"]

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Login to TCR / aliyun
        run: echo "${{ secrets.REG_PASSWORD }}" | docker login \
             qdy-registry.cn-shanghai.cr.aliyuncs.com \
             -u "${{ secrets.REG_USER }}" --password-stdin

      - name: Build & push api
        run: |
          docker build -t qdy-registry.../api:${{ github.sha }} -f api/Dockerfile .
          docker push qdy-registry.../api:${{ github.sha }}

      - name: SSH deploy
        uses: appleboy/ssh-action@v1.0.3
        with:
          host:     ${{ secrets.LIGHTHOUSE_HOST }}
          username: deploy
          key:      ${{ secrets.LIGHTHOUSE_SSH_KEY }}
          script: |
            cd ~/deployments/my-app
            git pull
            export TAG=${{ github.sha }}
            docker compose -f docker-compose.prod.yml --env-file .env.prod up -d
            docker compose exec -T api alembic upgrade head

secrets 必须存在 GitHub Settings → Secrets,永远不要 commit


五、备份策略(公司硬约定)

bash
# 每日 凌晨 3 点 备份 PG,保留 14 天
# /etc/cron.daily/qdy-pg-backup
#!/bin/bash
DATE=$(date +%F)
BACKUP_DIR=/data/backups
mkdir -p $BACKUP_DIR
docker compose -f /home/deploy/deployments/my-app/docker-compose.prod.yml \
  exec -T db pg_dump -U $PG_USER $PG_DB | gzip > $BACKUP_DIR/$DATE.sql.gz
find $BACKUP_DIR -name "*.sql.gz" -mtime +14 -delete

# 同步到 COS(异地容灾)
coscmd upload $BACKUP_DIR/$DATE.sql.gz qdy-backup/$DATE.sql.gz

公司红线

  • 任何生产库必须 本地 + COS 双备份
  • 每月做一次"恢复演练"(在 staging 拉一份生产备份恢复)
  • 备份脚本本身要写进 git,不能只在某台机器上

六、监控(公司最低要求)

工具
日志docker logs → loki / 阿里云 SLS / 腾讯云 CLS
UptimeUptimeRobot(免费)/ 腾讯云云监控
错误追踪Sentry(自部署 / SaaS 都可)
性能OpenTelemetry → Grafana Tempo / Jaeger
成本腾讯云费用账单订阅,超阈值飞书告警

最低底线:Uptime + 错误追踪 必须有。其他可视项目阶段加。


七、Hermes / OpenClaw / Agent 部署的特殊事项

如果你部署的是 Agent 类产品(公司多条流水线都是):

  • GPU 通常不需要:调用云端 LLM 即可
  • 要长任务必备:开 systemd / supervisord 守护
  • 避免短连接:Agent 经常一次任务跑 10 分钟以上,要把 nginx / proxy timeout 调大
  • API Key 必须走 Vault / 环境变量绝不写进镜像
  • 公司私有 MCP 一律走 VPC 内网,不暴露公网

八、未来股东 · 第二周必练

  • [ ] 自己开通一台轻量服务器(公司可报销 / 共享试用)
  • [ ] 跑通"形态 A"完整流程(Docker Compose + nginx + HTTPS)
  • [ ] 配 GitHub Actions,从 push 到上线 < 5 分钟
  • [ ] 把数据库自动备份脚本跑起来,并在 staging 演练一次"误删恢复"
  • [ ] 给服务挂上 UptimeRobot

九、参考资料


继续 → 07 · Cloudflare 全球加速

以股东之心学习 · 以工程师之手交付 · 以 AI 集群之力放大。持之以恒,勇敢探索。