主题
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-app3.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
- 把域名 NS 指向 Cloudflare
- 在 Cloudflare 配置"完全(严格)"加密 + Origin CA 证书
- 详见 07-Cloudflare全球加速.md
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 nginx3.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 headsecrets 必须存在 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 |
| Uptime | UptimeRobot(免费)/ 腾讯云云监控 |
| 错误追踪 | 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 全球加速