一、先判断:你的项目是哪种形态?
用 Cursor、TRAE、Claude Code 这类 AI Coding 工具做完的项目,通常落在五种形态之一。部署方式由形态决定——不要跳过这一步直接上 Docker。
| 项目形态 | 典型特征 | 推荐部署方式 | 需要容器? |
|---|---|---|---|
| 纯静态站 | React / Vue / Vite,npm run build 产出 HTML/CSS/JS | 对象存储 + CDN(OSS / COS) | 不需要 |
| 静态 + 少量函数 | 前端静态,只有几个简单接口 | 静态托管 + 云函数 | 通常不需要 |
| SSR / Node API | Next.js SSR、Express、NestJS | 容器部署 + 反向代理 | 需要 |
| Python API | FastAPI / Flask / Django | 容器部署 + 反向代理 | 需要 |
| 多服务 | 前后端 + 数据库 + Redis + Worker | Docker Compose / 专用服务器 | 需要 |
怎么判断?看三个地方:package.json 的 scripts(有没有 build、start);有没有 requirements.txt 或 pyproject.toml;有没有数据库、Redis、后台任务。如果 build 之后只是 dist 目录里一堆静态文件,它就是纯静态站。
二、纯静态站:最便宜、最省心的上线路径
React/Vue/Vite 构建出来的静态站,不需要服务器、不需要 Docker:
- 执行
npm run build产出 dist 目录 - 上传到对象存储(阿里云 OSS / 腾讯云 COS),开启静态网站托管
- 绑定域名,挂 CDN 加速
成本对比:一台最低配云服务器每月几十元起,而静态托管 + CDN 对个人项目的流量费用通常每月不到十元——而且没有服务器被攻击、磁盘写满、进程崩溃这类运维问题,天然抗流量峰值。
注意:前端路由使用 BrowserRouter 时,要把存储桶的默认文档和错误文档都设为 index.html,否则用户刷新页面会直接 404。
三、SSR / Node / Python 服务:需要常驻进程
Next.js SSR、Express、FastAPI 这类项目有常驻进程,需要一台真正运行它们的环境:
- 单服务:一个容器 + 一个反向代理(Nginx 或 Caddy 处理 HTTPS 和端口转发)
- 用容器而不是裸跑
npm start,核心价值是环境一致性和自动重启策略 - 必须提供
/health健康检查端点,编排、监控、负载均衡都依赖它 - 服务要监听
0.0.0.0而不是127.0.0.1,否则容器外永远访问不通
四、多服务项目:Docker Compose 讲清楚一切
前端 + API + PostgreSQL + Redis + 后台 Worker 的项目,用一个 docker-compose.yml 定义所有服务:网络、依赖顺序、数据卷、重启策略。
- 数据库数据必须挂载卷(volume),否则容器重建数据就没了
- 各服务配置 healthcheck,用
depends_on: condition: service_healthy控制启动顺序 - 环境变量用
.env文件与 compose 定义分离,.env 永远不进 Git
五、无论哪种形态,上线前都查这几项
- 生产配置通过环境变量注入,不写死在代码里
- 前端请求的 API 地址来自环境变量,不是 localhost
- CORS 收紧到具体域名,不用通配符
- 在干净目录重新 clone 后构建能通过
- 数据库迁移脚本可重复执行
- 明文密钥、Debug 模式已清理(详见安全检查指南)
六、第一次上线最容易翻车的 5 个点
- 前端把 API 地址写死成 localhost——本地好好的,部署后所有请求打到用户自己电脑上
- Node 服务监听 127.0.0.1——容器内健康,容器外永远连不通,必须监听 0.0.0.0
- .env 没进容器——启动即崩,而且报错信息常常不指向真正原因
- 数据库迁移没执行——页面能打开,所有接口 500
- 静态资源路径大小写——Windows 上正常,Linux 服务器上 404
结语
部署方式没有高级低级之分,只有合适不合适。判断形态 → 选对路径 → 过一遍检查清单,第一次上线可以很顺。如果不想自己处理这些环节,宇视星提供从安全检查、部署决策到云上落地的完整上线服务。