xiangqinxiaochengxu/后台前端与后端系统从零到一上线教程.md

619 lines
12 KiB
Markdown
Raw Normal View History

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