12 KiB
后台前端与后端系统从零到一上线教程
本文档适用于当前项目:
- 后端:
backend/,FastAPI - 后台前端:
admin-web/,Vue 3 + Vite - 域名:
ghxiangqin.com - 对外接口地址:
https://ghxiangqin.com/api/v1
目标效果:
- 访问
https://ghxiangqin.com/打开后台管理系统 - 访问
https://ghxiangqin.com/api/v1/...调用后端接口 - 外网只开放
80和443 backend只在服务器本机监听127.0.0.1:8000
1. 上线方案总览
这套项目推荐按下面方式部署:
admin-web不长期跑npm run devadmin-web执行npm run build,生成静态文件- 静态文件交给 Nginx 直接托管
backend用uvicorn跑在本机端口127.0.0.1:8000- 宝塔/Nginx 对外只暴露一个站点域名
ghxiangqin.com - Nginx 负责把
/api/请求转发到backend
最后的访问关系如下:
https://ghxiangqin.com/-> 后台前端静态页面https://ghxiangqin.com/api/v1/*-> FastAPI 后端https://ghxiangqin.com/health-> 后端健康检查
2. 服务器准备
建议服务器环境:
- Linux 服务器一台
- 已安装宝塔面板
- 已安装 Nginx
- 已安装 MySQL 8
- 已安装 Redis
- 已安装 Python 3.10 或更高版本
- 已安装 Node.js 18 或更高版本
还需要提前准备:
- 域名
ghxiangqin.com - 域名 A 记录解析到服务器公网 IP
- 服务器安全组/防火墙放行
80、443
3. 上传项目代码
把整个项目上传到服务器,比如:
/www/wwwroot/xqxcx
建议最终目录结构如下:
/www/wwwroot/xqxcx/
├─ admin-web/
├─ backend/
├─ miniprogram/
└─ 其它文档
4. 创建数据库
登录 MySQL,执行:
CREATE DATABASE dating_app DEFAULT CHARACTER SET utf8mb4;
如果数据库名不是 dating_app,后面 .env 里要同步改。
5. 配置后端环境变量
进入后端目录:
cd /www/wwwroot/xqxcx/backend
复制环境变量模板:
cp .env.example .env
然后编辑 .env,至少改这些值:
APP_NAME=dating-mini-program-api
APP_ENV=production
APP_DEBUG=false
API_V1_PREFIX=/api/v1
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=你的数据库密码
MYSQL_DATABASE=dating_app
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD=
JWT_SECRET_KEY=换成一串复杂随机字符串
JWT_ALGORITHM=HS256
JWT_ACCESS_TOKEN_EXPIRE_MINUTES=10080
WX_APPID=你的小程序APPID
WX_SECRET=你的小程序SECRET
COS_REGION=你的腾讯云COS地域
COS_SECRET_ID=你的COS_SECRET_ID
COS_SECRET_KEY=你的COS_SECRET_KEY
COS_BUCKET=你的COS桶名
COS_BASE_URL=你的COS访问地址
WX_TEMPLATE_AUDIT_RESULT=审核结果模板ID
WX_TEMPLATE_MATCH_SUCCESS=匹配成功模板ID
注意:
APP_DEBUG上线必须改成falseJWT_SECRET_KEY不要继续用默认值- 如果 Redis 没设密码,
REDIS_PASSWORD可以留空
6. 安装后端依赖
仍在 backend/ 目录执行:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
如果服务器命令是 python,就把 python3 改成 python。
7. 执行数据库迁移
在 backend/ 目录执行:
source .venv/bin/activate
alembic upgrade head
成功后,数据库里会生成项目需要的数据表。
8. 初始化后台管理员账号
在 backend/ 目录执行:
source .venv/bin/activate
python scripts/init_admin.py
初始化后,后台默认管理员一般可用:
- 用户名:
admin - 密码:以脚本实际输出或项目默认说明为准
首次登录后建议立刻改密码。
9. 启动后端服务
9.1 临时启动测试
先手动启动确认能跑:
cd /www/wwwroot/xqxcx/backend
source .venv/bin/activate
uvicorn main:app --host 127.0.0.1 --port 8000
然后本机检查:
curl http://127.0.0.1:8000/health
正常应返回:
{"status":"ok"}
9.2 正式常驻启动
生产环境建议用宝塔的 Python 项目管理器、Supervisor,或 systemd 来托管进程。
如果你用宝塔的 Supervisor,命令可填:
cd /www/wwwroot/xqxcx/backend && /www/wwwroot/xqxcx/backend/.venv/bin/uvicorn main:app --host 127.0.0.1 --port 8000
关键点:
- 只监听
127.0.0.1 - 不要直接暴露
8000给公网 - 对外统一走 Nginx 反向代理
10. 打包后台前端
进入前端目录:
cd /www/wwwroot/xqxcx/admin-web
安装依赖:
npm install
执行打包:
npm run build
打包完成后会生成:
admin-web/dist/
说明:
dist/里是纯静态文件- 不需要再运行
npm run dev - 不需要给前端单独开端口
11. 创建宝塔站点
在宝塔面板里创建站点:
- 域名填:
ghxiangqin.com - 如果需要,也加上:
www.ghxiangqin.com - PHP 版本选“纯静态”或不启用 PHP
- 网站目录建议设为:
/www/wwwroot/ghxiangqin.com
创建完成后,把 admin-web/dist/ 里的所有文件复制到这个目录:
/www/wwwroot/ghxiangqin.com
注意是复制 dist 目录中的内容,不是把 dist 整个目录原样套进去。
最终应该像这样:
/www/wwwroot/ghxiangqin.com/index.html
/www/wwwroot/ghxiangqin.com/assets/...
12. 配置 Nginx 反向代理
12.1 未配置 SSL 证书前的可用版
如果你还没申请 HTTPS 证书,先用下面配置:
server {
listen 80;
server_name ghxiangqin.com www.ghxiangqin.com;
root /www/wwwroot/ghxiangqin.com;
index index.html index.htm;
client_max_body_size 20m;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /health {
proxy_pass http://127.0.0.1:8000/health;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
12.2 配置 SSL 证书后的正式版
在宝塔站点中先申请 Let's Encrypt 证书,成功后再用 HTTPS 配置。
如果证书由宝塔自动配置,通常只需要保留宝塔生成的证书路径,再加上下面的 location 即可。
示例正式版:
server {
listen 80;
server_name ghxiangqin.com www.ghxiangqin.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name ghxiangqin.com www.ghxiangqin.com;
ssl_certificate /www/server/panel/vhost/cert/ghxiangqin.com/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/ghxiangqin.com/privkey.pem;
root /www/wwwroot/ghxiangqin.com;
index index.html index.htm;
client_max_body_size 20m;
location / {
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /health {
proxy_pass http://127.0.0.1:8000/health;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
说明:
/用于托管后台前端静态页面/api/反代到 FastAPItry_files ... /index.html是为了支持 Vue 路由刷新client_max_body_size 20m是为了后续上传图片时不被拦截
13. 申请 SSL 证书
微信小程序正式环境要求接口必须是 HTTPS,所以上线最终一定要配置证书。
宝塔操作步骤:
- 打开站点
ghxiangqin.com - 进入
SSL - 选择 Let's Encrypt
- 申请证书
- 申请成功后启用证书
- 按需开启“强制 HTTPS”
如果 Nginx 保存时报:
no "ssl_certificate" is defined for the "listen ... ssl" directive
说明你先写了 listen 443 ssl,但证书还没配好。
这时先用“未配置 SSL 证书前的可用版”,不要先写 443 ssl。
14. 检查后台前端和后端联通
先确认以下地址是否正常:
-
后端健康检查
https://ghxiangqin.com/health -
后端公开配置
https://ghxiangqin.com/api/v1/auth/public-config -
后台首页
https://ghxiangqin.com/
如果后台登录页能打开,但登录失败,重点检查:
backend进程是否真的在运行- Nginx
/api/反向代理是否生效 - MySQL 是否可连接
- 管理员账号是否初始化完成
15. 小程序侧需要同步的配置
当前代码默认接口地址已经切到:
https://ghxiangqin.com/api/v1
但微信公众平台还需要额外配置合法域名。
需要在微信公众平台配置:
-
request 合法域名添加
https://ghxiangqin.com -
如果图片走你自己的域名,也要把图片域名加入合法域名
如果没配置,真机或正式版会报:
request:fail url not in domain list
16. 后台前端更新流程
以后后台前端改了代码,更新方式如下:
cd /www/wwwroot/xqxcx/admin-web
npm install
npm run build
然后把新的 dist/ 内容覆盖到:
/www/wwwroot/ghxiangqin.com/
一般不需要重启 Nginx。
17. 后端更新流程
以后后端改了代码,更新方式如下:
cd /www/wwwroot/xqxcx/backend
source .venv/bin/activate
pip install -r requirements.txt
alembic upgrade head
然后重启后端进程管理器中的服务,例如:
- 宝塔 Python 项目
- Supervisor
- systemd
18. 常见问题排查
18.1 首页能打开,但接口 404
说明前端静态站点正常,但 /api/ 反代没有生效。
重点检查 Nginx 里是否有:
location /api/ {
proxy_pass http://127.0.0.1:8000;
}
18.2 接口 502 Bad Gateway
说明 Nginx 找不到后端。
检查:
uvicorn是否运行中- 是否监听在
127.0.0.1:8000 - 宝塔反代目标地址是否写对
18.3 刷新后台子页面 404
说明 Vue 路由回退没配好。
确保 Nginx 有:
location / {
try_files $uri $uri/ /index.html;
}
18.4 宝塔保存 Nginx 失败
如果错误里提到 SSL 证书缺失,就说明证书还没配置好。
先删掉:
listen 443 ssl http2;
等证书申请完成后再启用 HTTPS 配置。
18.5 小程序请求失败
检查:
https://ghxiangqin.com/api/v1/auth/public-config是否可访问- 微信后台是否配置合法域名
- SSL 证书是否有效
- 是否被防火墙拦截
19. 推荐的最终部署结构
推荐结构如下:
/www/wwwroot/
├─ xqxcx/
│ ├─ backend/
│ ├─ admin-web/
│ └─ miniprogram/
└─ ghxiangqin.com/
├─ index.html
└─ assets/
说明:
- 源码放在
xqxcx/ - 前端打包结果单独放在站点目录
ghxiangqin.com/ - Nginx 直接托管站点目录
- 后端继续从源码目录运行
20. 一次完整上线的最短操作清单
按顺序执行:
- 上传项目到服务器
- 创建 MySQL 数据库
dating_app - 配置
backend/.env - 创建后端虚拟环境并安装依赖
- 执行
alembic upgrade head - 执行
python scripts/init_admin.py - 启动
backend到127.0.0.1:8000 - 执行
admin-web/npm install - 执行
admin-web/npm run build - 把
dist/内容复制到/www/wwwroot/ghxiangqin.com/ - 在宝塔站点配置 Nginx:
/静态站点,/api/反代后端 - 访问
http://ghxiangqin.com/health检查后端 - 访问
http://ghxiangqin.com/检查后台 - 申请 SSL 证书
- 切换到 HTTPS
- 在微信公众平台配置
https://ghxiangqin.com为合法域名
21. 本项目当前已经确认的地址
当前项目中已经统一使用:
后台前端默认接口地址:
https://ghxiangqin.com/api/v1
小程序默认接口地址:
https://ghxiangqin.com/api/v1
所以只要 Nginx 的 /api/ 反代配置正确,前后端就能直接连通。