ReglowAdmin 小白生产环境部署指南
ReglowAdmin 小白生产环境部署指南
适用项目:
coding/backend-python+coding/frontend-admin
适用平台:阿里云 ECS、腾讯云 CVM、华为云 ECS,以及其他普通 Linux 云服务器
推荐部署方式:Docker Compose 一机部署(前端 + 后端 + MySQL + Redis)
文档目标:让第一次部署生产环境的人,也能理解“为什么这样做”,并把开发代码安全、稳定地跑到公网。
1. 先用一句话理解部署
开发环境像“你家厨房”:你可以边做边尝、随手改配方。
生产环境像“正式餐厅”:要有后厨、仓库、收银、监控、消防、备用钥匙,不能靠临时发挥。
把 ReglowAdmin 部署到生产环境,本质上就是把下面这些角色安顿好:
| 角色 | 在项目里的东西 | 像什么 | 作用 |
|---|---|---|---|
| 前端 | frontend-admin | 门面和菜单 | 用户在浏览器里看到的后台页面 |
| 后端 | backend-python | 厨师和业务规则 | 处理登录、权限、员工、角色、素材、协议等业务 |
| MySQL | mysql 容器 | 账本和档案柜 | 保存业务数据,不能随便丢 |
| Redis | redis 容器 | 临时便签和排队器 | 存验证码、限流计数、缓存等短期数据 |
| Nginx | 前端容器内置 | 前台接待 | 分发静态页面,把 /api 请求转给后端 |
| Docker Compose | docker-compose.yml | 总管家 | 一条命令启动所有服务 |
| Alembic | alembic | 数据库装修队 | 自动创建/升级数据库表结构 |
| 健康检查 | /health/ready | 体检表 | 判断服务能不能接客 |
| 指标接口 | /metrics | 仪表盘数据源 | 给监控系统看访问量、耗时等 |
2. 为什么推荐 Docker Compose 部署
小白最容易踩的坑是:本地能跑,服务器不能跑。
原因通常是:
- 本地 Python 版本和服务器 Python 版本不同;
- 本地 Node 版本和服务器 Node 版本不同;
- 本地有某些依赖,服务器没有;
- 本地连 SQLite,服务器要连 MySQL;
- 本地 Redis 没开,生产验证码/限流失效;
- 前端打包后接口路径不对;
- 数据库表没迁移;
- 文件上传目录没持久化。
Docker 的作用就像“打包好的标准厨房”:锅、灶、调料、摆放方式都固定。你把这套厨房搬到阿里云、腾讯云、华为云,做出来的菜基本一样。
Docker Compose 的作用就像“开店清单”:
当前项目已经具备这些生产部署基础:
- 根目录有
docker-compose.yml; - 后端有
coding/backend-python/Dockerfile; - 后端启动时会执行
alembic upgrade head自动迁移数据库; - 前端有
coding/frontend-admin/Dockerfile; - 前端有
coding/frontend-admin/nginx.conf,负责静态页面和接口反代; - Compose 已包含
mysql、redis、backend、frontend四个服务; - 后端已有
/health、/health/live、/health/ready、/metrics。
3. 生产环境和开发环境最大的区别
3.1 开发环境追求“方便”
开发时常见做法:
DEBUG=true;- 用默认密码;
- 前后端分别启动;
- 数据库随便删了重建;
- 报错直接看控制台;
- 接口可以跨域乱连;
- 文件放本地目录。
这适合写代码,但不适合上线。
3.2 生产环境追求“稳定、安全、可恢复”
生产环境要遵守这些核心规律:
| 规律 | 通俗解释 | ReglowAdmin 对应做法 |
|---|---|---|
| 配置不能写死 | 密码不能贴在门口 | 用 .env 注入数据库密码、JWT_SECRET、CORS_ORIGINS |
| 数据必须持久化 | 账本不能放临时桌面 | MySQL、Redis、uploads 使用 Docker volume |
| 服务必须可检查 | 店长要知道厨房有没有开火 | /health/ready 检查数据库和 Redis |
| 入口要统一 | 客人只能从正门进 | 浏览器访问前端 Nginx,Nginx 再转发 API |
| 后端不直接暴露更安全 | 厨房不直接对街营业 | 生产建议只开放 80/443,后端 8000 仅内网使用 |
| 数据库结构要迁移 | 装修要按图纸施工 | 后端启动执行 Alembic 迁移 |
| 缓存和限流要用 Redis | 不能靠每个服务自己的小纸条 | 验证码、短信、限流计数优先走 Redis |
| 上线前要能回滚 | 新菜单翻车要能换回旧菜单 | 保留旧镜像/旧代码,数据库先备份 |
4. ReglowAdmin 当前生产部署架构
推荐的一机部署结构如下:
这套结构的优点是:
- 小白容易部署;
- 各云厂商基本通用;
- 项目已有配置文件支持;
- 后续可平滑升级到更专业架构:云数据库、云 Redis、对象存储、负载均衡、CDN。
5. 云服务器怎么选
阿里云 ECS、腾讯云 CVM、华为云 ECS 名字不同,本质都是“一台远程 Linux 电脑”。
5.1 小型生产环境推荐配置
| 用途 | 推荐 |
|---|---|
| CPU | 2 核起步,建议 4 核 |
| 内存 | 4GB 起步,建议 8GB |
| 系统盘 | 40GB 起步,建议 80GB |
| 操作系统 | Ubuntu 22.04 LTS / Ubuntu 24.04 LTS / Debian 12 / Alibaba Cloud Linux 3 |
| 带宽 | 2Mbps 起步,正式建议 5Mbps+ |
| 架构 | x86_64,除非你明确知道 ARM 兼容性 |
如果只是演示环境:2 核 4GB 可以跑。
如果是企业内部多人使用:建议 4 核 8GB 起步。
如果上传素材较多:磁盘要更大,后续建议接对象存储 OSS/COS/OBS。
5.2 安全组/防火墙开放端口
生产最小开放:
| 端口 | 是否开放公网 | 说明 |
|---|---|---|
| 22 | 限制自己的 IP | SSH 登录服务器 |
| 80 | 开放 | HTTP 访问 |
| 443 | 开放 | HTTPS 访问 |
| 8000 | 不建议开放 | 后端接口端口,建议只给 Docker 内部使用 |
| 3306 | 不开放 | MySQL,绝不能直接暴露公网 |
| 6379 | 不开放 | Redis,绝不能直接暴露公网 |
形象理解:
- 80/443 是“正门”;
- 22 是“员工通道”,最好只允许你自己的办公 IP;
- 3306/6379 是“账本房”和“便签柜”,不能开到大街上;
- 8000 是“厨房门”,正常让 Nginx 内部转交就行。
6. 阿里云、腾讯云、华为云部署前准备
三家云厂商操作名称略有不同,但步骤规律一样。
6.1 创建云服务器
阿里云
- 产品:ECS 云服务器;
- 网络:专有网络 VPC;
- 镜像:Ubuntu 22.04 LTS 或 Alibaba Cloud Linux 3;
- 安全组:开放 22、80、443;
- 绑定公网 IP;
- 推荐绑定弹性公网 IP,方便后续迁移。
腾讯云
- 产品:CVM 云服务器;
- 网络:私有网络 VPC;
- 镜像:Ubuntu 22.04 LTS;
- 安全组:开放 22、80、443;
- 分配公网 IP。
华为云
- 产品:ECS 弹性云服务器;
- 网络:VPC;
- 镜像:Ubuntu 22.04 LTS;
- 安全组:开放 22、80、443;
- 绑定弹性公网 IP。
6.2 绑定域名
如果有域名,去 DNS 控制台添加解析:
例如:
为什么要域名?
- HTTPS 证书通常需要域名;
- 用户更容易访问;
- 后续迁移服务器时,只改 DNS,不用通知所有人换地址。
7. 服务器初始化
下面以 Ubuntu 为例。先 SSH 登录服务器:
如果不是 root 用户,用:
7.1 更新系统
为什么要更新?
就像新手机开机先升级系统,修补已知安全漏洞,避免用旧组件裸奔。
7.2 安装常用工具
这些工具分别用于:
git:拉代码;curl/wget:下载和测试接口;vim:编辑配置;ca-certificates/gnupg:安装软件源和证书。
7.3 安装 Docker
推荐使用 Docker 官方安装脚本:
启动 Docker:
检查版本:
7.4 安装 Docker Compose
新版 Docker 通常自带 Compose 插件,检查:
如果能看到版本号,就可以继续。
8. 上传或拉取项目代码
推荐把项目放在 /opt/reglow_project:
8.1 如果代码在 Git 仓库
8.2 如果是本地压缩包
在本地打包上传到服务器,例如上传到 /opt/reglow_project.zip,然后服务器上解压:
确保目录结构类似:
9. 配置生产环境变量
项目根目录已有 .env.docker.example,先复制成 .env:
示例:
9.1 每个变量是什么意思
| 变量 | 说明 | 为什么重要 |
|---|---|---|
MYSQL_ROOT_PASSWORD | MySQL root 密码 | 数据库最高权限,必须复杂 |
MYSQL_DATABASE | 业务数据库名 | 后端连接这个库 |
MYSQL_USER | 业务数据库用户 | 不建议业务用 root 直连 |
MYSQL_PASSWORD | 业务数据库密码 | 泄露就等于数据有风险 |
JWT_SECRET | 登录 Token 签名密钥 | 相当于系统的“印章”,必须保密 |
CORS_ORIGINS | 允许访问后端的前端域名 | 防止随便哪个网页都能调你的接口 |
9.2 JWT_SECRET 怎么生成
可以在服务器上生成:
把输出填到 .env 的 JWT_SECRET。
为什么不能用默认值?
JWT_SECRET 就像银行印章。默认值人人都知道,别人就可能伪造登录凭证。
9.3 CORS_ORIGINS 怎么填
如果你用域名:
如果暂时没有 HTTPS,只用 IP 测试:
不要在生产环境写:
当前后端配置会在 DEBUG=false 时禁止 CORS 通配符,这是正确的安全设计。
10. 一条命令启动生产环境
在项目根目录执行:
这条命令会做几件事:
- 拉取 MySQL 镜像;
- 拉取 Redis 镜像;
- 构建后端镜像;
- 构建前端镜像;
- 创建 Docker 网络;
- 创建数据卷;
- 启动 MySQL;
- 启动 Redis;
- 等 MySQL/Redis 健康后启动后端;
- 后端入口脚本执行
alembic upgrade head; - 后端启动 Uvicorn;
- 前端 Nginx 启动并对外监听 80。
查看服务状态:
查看日志:
只看后端日志:
只看前端日志:
11. 验证部署是否成功
11.1 检查容器状态
理想状态:
11.2 检查后端健康接口
/health 说明后端进程活着。/health/ready 说明后端能连 MySQL 和 Redis,更适合作为生产探活。
返回类似:
如果是:
说明后端活着,但数据库或 Redis 有问题。
11.3 浏览器访问
打开:
或:
如果页面能打开,说明前端 Nginx 正常。
如果登录接口正常,说明 Nginx → 后端 → MySQL/Redis 链路基本正常。
12. HTTPS 怎么配置
生产环境强烈建议上 HTTPS。HTTP 像“明信片”,路上谁都可能看到内容;HTTPS 像“加密信封”。
12.1 最省心做法:云厂商负载均衡 + 免费证书
阿里云、腾讯云、华为云都支持:
优点:
- 证书由云平台管理;
- 续期更省心;
- 后续多台服务器扩容方便。
12.2 单机做法:服务器上加反向代理或改 Nginx
可以使用 Caddy、Nginx + Certbot 等方式。小白推荐 Caddy,因为自动签证书比较简单。
示意结构:
如果使用这种方式,Compose 里的 frontend 端口可以改成只绑定本机:
然后 Caddy 转发到 127.0.0.1:8080。
注意:当前项目默认 Compose 直接把 frontend 暴露到
80:80,适合快速部署。上 HTTPS 后可以再做一层外部代理。
13. 数据库、Redis、上传文件为什么要用 volume
当前 docker-compose.yml 已经配置:
这非常重要。
容器像“可替换的外卖盒”,坏了可以扔;数据像“账本”,不能跟盒子一起扔。
| 数据 | volume | 丢了会怎样 |
|---|---|---|
| MySQL 数据 | mysql_data | 员工、角色、菜单、业务数据丢失 |
| Redis 数据 | redis_data | 验证码、限流计数、缓存丢失,通常可接受但不应频繁丢 |
| 上传文件 | backend_uploads | 素材、头像、文件丢失 |
所以:
- 可以重建容器;
- 可以重建镜像;
- 但不要随便删 volume。
危险命令:
-v 会删除数据卷,小白生产环境不要用。
正确停止:
14. 备份和恢复
生产环境一定要备份。没有备份的系统,不叫上线,叫冒险。
14.1 备份 MySQL
如果 shell 没读到 .env,可以先:
再执行备份。
14.2 备份上传文件
14.3 恢复 MySQL
先确认你真的要恢复,因为会覆盖现有数据。
14.4 备份规律
| 场景 | 建议 |
|---|---|
| 每天有业务数据 | 每天自动备份 MySQL |
| 上传素材多 | 每天或每周备份 uploads |
| 每次发版前 | 先备份数据库 |
| 大版本升级 | 备份数据库 + 上传文件 + 当前代码版本 |
15. 日常运维常用命令
15.1 查看服务
15.2 查看日志
15.3 重启某个服务
15.4 重启全部服务
15.5 重新构建并启动
15.6 进入后端容器
15.7 查看健康状态
15.8 查看指标
16. 怎么从开发代码发布到生产
推荐流程:
16.1 本地提交代码
16.2 服务器拉取最新代码
如果不是 Git 部署,就重新上传压缩包并覆盖代码,但注意不要覆盖 .env 和数据目录。
16.3 发版前备份
16.4 重新构建并启动
后端启动时会自动执行:
这意味着数据库表结构会跟随代码升级。
16.5 发版后检查
浏览器检查:
- 登录是否正常;
- 菜单是否正常;
- 员工/角色/菜单/素材等核心页面是否正常;
- 上传是否正常;
- 控制台是否有明显报错。
17. 回滚怎么做
上线失败不可怕,可怕的是没有回滚方案。
17.1 代码回滚
如果用 Git:
找到上一个稳定版本的 commit,然后:
如果你不熟悉 Git 回滚,至少要保留上一个稳定压缩包。
17.2 数据库回滚
数据库回滚要非常谨慎。一般流程:
- 停止服务;
- 备份当前坏状态,防止二次事故;
- 恢复发版前备份;
- 启动旧代码;
- 验证业务。
停止服务:
恢复备份后再启动:
17.3 为什么数据库回滚更危险
代码像菜单,换回旧菜单比较容易。
数据库像账本,如果新版本已经写入新格式的数据,再强行换旧格式,可能对不上。
所以发版前备份数据库非常重要。
18. 常见故障排查
18.1 页面打不开
检查:
可能原因:
- 云安全组没开 80;
- frontend 容器没启动;
- 服务器防火墙拦截;
- 域名 DNS 没解析到正确 IP。
18.2 页面打开了,但登录失败
检查后端:
可能原因:
- backend 没启动;
- MySQL 没健康;
- Redis 没健康;
.env的 JWT_SECRET/CORS_ORIGINS 配置错误;- Nginx 反代路径异常。
18.3 后端启动失败,提示 JWT_SECRET
如果看到类似:
说明你还在用默认密钥。编辑 .env:
把 JWT_SECRET 改成随机长字符串,然后:
18.4 数据库连接失败
检查 MySQL:
常见原因:
.env数据库密码写错;- 第一次启动 MySQL 初始化未完成;
- 数据卷中已有旧密码,改
.env不会自动改老数据库密码。
如果是生产数据,不要轻易删 volume。
18.5 Redis 连接失败
检查:
Redis 主要影响:
- 验证码;
- 短信验证码;
- 登录/短信限流;
- 字典缓存。
当前代码有内存降级,但生产多实例不建议长期依赖降级。
18.6 上传文件丢了
检查 backend_uploads volume 是否还在:
不要执行:
因为它会删除 volume。
19. 阿里云、腾讯云、华为云的进一步生产化建议
一机 Docker Compose 适合第一阶段上线。业务增长后,可以逐步升级。
19.1 数据库上云托管
| 云厂商 | 产品 |
|---|---|
| 阿里云 | RDS MySQL |
| 腾讯云 | TencentDB for MySQL |
| 华为云 | RDS for MySQL |
为什么用云数据库?
- 自动备份;
- 高可用;
- 监控告警;
- 扩容更方便;
- 不怕你误删 MySQL 容器。
切换方式:
然后 Compose 可以去掉本地 mysql 服务,或保留但不用。
19.2 Redis 上云托管
| 云厂商 | 产品 |
|---|---|
| 阿里云 | 云数据库 Redis 版 |
| 腾讯云 | TencentDB for Redis |
| 华为云 | DCS for Redis |
修改:
19.3 上传文件放对象存储
| 云厂商 | 产品 |
|---|---|
| 阿里云 | OSS |
| 腾讯云 | COS |
| 华为云 | OBS |
为什么要对象存储?
本地 uploads 像把照片放在店里电脑硬盘。服务器坏了,照片可能没了。对象存储像专门的云相册,有高可靠、多副本、CDN 加速。
当前后端已有 S3 相关配置字段:
是否能直接启用,要以当前素材模块实现为准。上线初期可以先用本地 volume,业务增长后再迁移对象存储。
19.4 使用负载均衡
| 云厂商 | 产品 |
|---|---|
| 阿里云 | SLB / ALB |
| 腾讯云 | CLB |
| 华为云 | ELB |
负载均衡像“门口排队分流员”:
- 可以挂 HTTPS 证书;
- 可以把流量转到多台服务器;
- 可以做健康检查;
- 某台服务器挂了自动摘掉。
初期一台服务器可以不用,访问量上来后再加。
19.5 使用 CDN
前端静态资源、图片素材多时,可以用:
| 云厂商 | 产品 |
|---|---|
| 阿里云 | CDN |
| 腾讯云 | CDN |
| 华为云 | CDN |
CDN 像把常用文件提前放到离用户更近的小仓库,用户访问更快,也减轻服务器压力。
20. 生产安全清单
上线前逐项检查:
- 服务器安全组只开放 22、80、443;
- 22 端口最好限制自己的 IP;
- MySQL 3306 不开放公网;
- Redis 6379 不开放公网;
- 后端 8000 不直接开放公网,或至少仅限内网;
-
.env中 JWT_SECRET 已改为随机长字符串; -
DEBUG=false; - CORS_ORIGINS 只填真实域名,不使用
*; - 已配置 HTTPS;
- 已备份数据库;
- 已确认 uploads 文件有备份策略;
- 管理员默认密码已修改;
- 不把
.env提交到 Git 仓库; - 定期更新系统和镜像。
21. 生产运维核心规律总结
21.1 容器可以随便换,数据不能随便动
容器是“外卖盒”,数据是“账本”。
删容器通常没事,删 volume 可能就是事故。
21.2 配置要放环境变量,不要写进代码
代码是公开菜谱,配置是保险柜密码。
密码、密钥、数据库地址都应该通过 .env 管理。
21.3 所有服务都要有健康检查
服务不是“进程在”就等于“能用”。
后端活着但连不上 MySQL,也不能接客。
所以 /health/ready 比 /health 更适合生产探活。
21.4 上线前先备份,出事才能回头
没有备份的上线,就像不带降落伞跳伞。
发版前备份数据库,是最低成本的保险。
21.5 暴露得越少,越安全
公网只开必要入口:80/443。
数据库、Redis、后端内部端口不该直接暴露。
21.6 先简单稳定,再逐步专业化
第一阶段:Docker Compose 单机跑稳。
第二阶段:HTTPS、备份、监控补齐。
第三阶段:云数据库、云 Redis、对象存储、负载均衡、CDN。
第四阶段:CI/CD、多实例、灰度发布。
不要一开始就追求复杂架构。复杂不是高级,稳定才是高级。
22. 推荐上线步骤总清单
23. 当前项目相关文件索引
| 文件 | 作用 |
|---|---|
docker-compose.yml | 一键启动 MySQL、Redis、后端、前端 |
.env.docker.example | 生产环境变量示例 |
coding/backend-python/Dockerfile | 构建后端镜像 |
coding/backend-python/docker-entrypoint.sh | 后端容器启动前执行 Alembic 迁移 |
coding/backend-python/alembic.ini | Alembic 配置 |
coding/backend-python/alembic/ | 数据库迁移脚本目录 |
coding/backend-python/core/config.py | 后端配置读取与生产安全校验 |
coding/backend-python/core/redis_client.py | Redis 客户端封装 |
coding/backend-python/core/rate_limit.py | Redis 固定窗口限流 |
coding/backend-python/core/observability.py | 健康检查与 Prometheus 指标 |
coding/frontend-admin/Dockerfile | 构建前端并用 Nginx 托管 |
coding/frontend-admin/nginx.conf | 前端 SPA 和 API 反向代理配置 |
24. 最后给小白的一句话
部署不是“把代码丢到服务器上跑起来”这么简单。
真正的生产部署,是让系统在没人盯着的时候也能稳定工作;出了问题能看见、能定位、能恢复。
ReglowAdmin 现在已经具备较好的生产部署基础:Docker Compose、MySQL、Redis、Alembic、Nginx、健康检查、指标接口都已准备好。
你要做的是:把配置填对,把端口管住,把数据备份好,把上线流程固定下来。
做到这四点,小白也能稳稳地把项目上线。
