xiangqinxiaochengxu/后台前端与后端系统从零到一上线教程.md
2026-05-16 19:01:44 +08:00

619 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 后台前端与后端系统从零到一上线教程
本文档适用于当前项目:
- 后端:`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/` 反代配置正确,前后端就能直接连通。