jiachenlong/docs/部署手册.md

1695 lines
40 KiB
Markdown
Raw Permalink 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.

# 甲辰藏品管理系统 - 测试环境部署手册
**版本**: v2.7.9
**创建时间**: 2026-03-15
**创建人**: 菜鸟小 D (开发程序员助理)
**文档状态**: ✅ 完整可用
**最后更新**: 2026-03-15 (实地检查后更新)
---
## ⚠️ 重要说明
### 🎯 v2.7.9 标准技术栈
**本文档描述的是甲辰藏品管理系统 v2.7.9 的标准部署方案。**
| 组件 | v2.7.9 技术栈 |
|------|-------------|
| **前端** | React 18 + Vite 6 + Tailwind CSS |
| **后端** | FastAPI 0.109 + Python 3.12 |
| **数据库** | PostgreSQL 13+ |
| **ORM** | SQLAlchemy 2.0 + Alembic |
| **认证** | JWT (python-jose) |
| **Web 服务器** | Nginx 1.20+ |
| **监控** | Prometheus (可选) |
### 📦 v2.7.9 核心依赖
**后端 (backend-fastapi/requirements.txt)**:
```
fastapi==0.109.0
uvicorn[standard]==0.27.0
sqlalchemy==2.0.25
asyncpg==0.29.0
python-jose[cryptography]==3.3.0
passlib[bcrypt]==1.7.4
pydantic==2.5.3
```
**前端 (zodiac-mobile/package.json)**:
```
react@18
vite@6
tailwindcss@3
```
---
### ⚠️ 测试环境现状2026-03-15 检查)
**当前测试环境与 v2.7.9 标准不符!**
| 项目 | v2.7.9 标准 | 测试环境现状 | 状态 |
|------|-----------|------------|------|
| 后端框架 | FastAPI + Python | Node.js + Express | ❌ 不符 |
| ORM | SQLAlchemy | Prisma | ❌ 不符 |
| 数据库 | PostgreSQL | PostgreSQL | ✅ 符合 |
| 前端 | React + Vite | React + Vite | ✅ 符合 |
**需要重新部署测试环境以匹配 v2.7.9 标准!**
---
## 更新日志
| 版本 | 日期 | 更新人 | 更新内容 |
|------|------|--------|---------|
| v1.2 | 2026-03-15 | 菜鸟小 D | 添加详细版本要求和关键注意事项 |
| v1.2.4 | 2026-03-20 | 甲辰生产 | 修复OCR扩展名大小写问题、修复用户协议乱码、添加返回按钮 |
| v1.1 | 2026-03-15 | 菜鸟小 D | 根据实地检查更新实际配置 |
| v1.0 | 2026-03-15 | 菜鸟小 D | 初始版本 |
---
## 🔧 系统要求v2.7.9 标准)
### ⚙️ 操作系统要求
| 服务器 | 操作系统 | 版本要求 |
|--------|---------|---------|
| 菜鸟测试 1 | Alibaba Cloud Linux | 3.x (OpenAnolis) |
| 菜鸟测试 2 | Alibaba Cloud Linux | 3.x (OpenAnolis) |
**替代方案**: CentOS 7+ / Ubuntu 20.04+ / Rocky Linux 8+
---
### 🖥️ 服务器配置要求
| 服务器 | CPU | 内存 | 磁盘 | 用途 |
|--------|-----|------|------|------|
| 菜鸟测试 1 | 2 核 + | 4GB+ | 40GB+ | Nginx + Prometheus + 前端 |
| 菜鸟测试 2 | 4 核 + | 8GB+ | 50GB+ SSD | FastAPI 后端 + PostgreSQL |
---
### 📦 前端技术栈v2.7.9
| 组件 | 版本 | 说明 |
|------|------|------|
| **React** | 18.x | UI 框架 |
| **Vite** | 6.x | 构建工具 |
| **Tailwind CSS** | 3.x | CSS 框架 |
| **Node.js** | 18.x+ | 运行时环境 |
| **npm** | 9.x+ | 包管理器 |
**构建命令**:
```bash
cd zodiac-mobile
npm install
npm run build
```
**部署路径**: `/var/www/mobile/dist`
---
### 🐍 后端技术栈v2.7.9
| 组件 | 版本 | 说明 |
|------|------|------|
| **FastAPI** | 0.109.0 | Web 框架 |
| **Python** | 3.12.x | 运行时环境 |
| **Uvicorn** | 0.27.0 | ASGI 服务器 |
| **SQLAlchemy** | 2.0.25 | ORM 框架 |
| **Alembic** | 1.13.1 | 数据库迁移 |
| **Pydantic** | 2.5.3 | 数据验证 |
| **python-jose** | 3.3.0 | JWT 认证 |
| **passlib** | 1.7.4 | 密码加密 |
| **asyncpg** | 0.29.0 | PostgreSQL 驱动 |
**完整依赖** (`backend-fastapi/requirements.txt`):
```
fastapi==0.109.0
uvicorn[standard]==0.27.0
sqlalchemy==2.0.25
asyncpg==0.29.0
python-jose[cryptography]==3.3.0
passlib[bcrypt]==1.7.4
python-multipart==0.0.6
pydantic==2.5.3
pydantic[email]==2.5.3
python-dotenv==1.0.0
alembic==1.13.1
requests
```
**安装命令**:
```bash
pip3.12 install -r requirements.txt
```
**启动命令**:
```bash
uvicorn app.main:app --port 3000 --host 0.0.0.0
```
---
### 🗄️ 数据库要求
| 组件 | 版本 | 说明 |
|------|------|------|
| **PostgreSQL** | 13.x+ | 关系型数据库 |
| **psql** | 13.x+ | 命令行工具 |
**数据库配置**:
```
数据库名zodiac
用户名postgres
密码postgres (生产环境请使用强密码)
端口5432
```
---
### 🌐 Web 服务器要求
| 组件 | 版本 | 说明 |
|------|------|------|
| **Nginx** | 1.20.x+ | Web 服务器/反向代理 |
**Nginx 配置要求**:
- 监听端口3001 (前端)
- API 代理:/api → http://127.0.0.1:3000/api
- 文件上传限制20MB (**必须配置 client_max_body_size**)
- SPA 路由支持try_files
**Nginx 配置示例** (`/etc/nginx/conf.d/zodiac.conf`):
```nginx
server {
listen 3001;
server_name _;
root /var/www/mobile/dist;
index index.html;
# ⚠️ 必须配置:允许上传最大 20MB 的文件
client_max_body_size 20M;
location / {
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://127.0.0.1:3000/api;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# ⚠️ API 上传也要配置限制
client_max_body_size 20M;
}
}
```
**⚠️ 重要**: 如果不配置 `client_max_body_size`Nginx 默认限制为 **1MB**,会导致图片上传失败!
---
### 🔧 其他工具要求
| 工具 | 版本 | 用途 |
|------|------|------|
| **Git** | 2.x+ | 版本控制 |
| **systemd** | 最新 | 服务管理 |
| **firewalld** | 最新 | 防火墙管理 |
| **Prometheus** | 2.45.x+ | 监控(可选) |
---
## 🚨 部署注意事项(必读)
### ⚠️ 部署前必须完成的配置
#### 1. 阿里云 OCR API Key 配置
**获取 API Key**:
```
1. 访问https://dashscope.console.aliyun.com/apiKey
2. 登录阿里云账号
3. 创建/复制 API Key
4. 更新 .env 配置
```
**编辑 .env 文件**:
```bash
cd /opt/zodiac/backend/backend-fastapi
vi .env
```
**.env 内容**:
```ini
# ⚠️ 必须配置:阿里云 DashScope OCR API
# ⚠️ 注意:不要使用示例 Key必须替换为您自己的
DASHSCOPE_API_KEY=sk-your-actual-api-key-here
# OCR 配置
OCR_MODEL=qwen-vl-max
OCR_TIMEOUT=60
```
**验证 API Key**:
```bash
curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer sk-your-actual-api-key-here" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-vl-max",
"input": {
"messages": [{
"role": "user",
"content": [{"type": "text", "text": "你好"}]
}]
}
}'
# 成功:{"output": {"choices": [...]}}
# 失败:{"error": {"message": "..."}}
```
---
#### 2. Nginx 图片上传限制
**⚠️ 必须配置**,否则会导致:
- 图片上传失败413 错误)
- OCR 识别失败(图片太大)
- 前端收到 HTML 错误页面而不是 JSON
**编辑 Nginx 配置**:
```bash
sudo vi /etc/nginx/conf.d/zodiac.conf
```
**添加配置**:
```nginx
server {
listen 3001;
# ⚠️ 必须配置:允许上传 20MB 文件
client_max_body_size 20M;
location /api {
proxy_pass http://127.0.0.1:3000/api;
# ⚠️ API 上传也要配置
client_max_body_size 20M;
}
}
```
**重启服务**:
```bash
sudo nginx -t && sudo nginx -s reload
sudo systemctl restart zodiac-backend
```
---
## ⚠️ 关键注意事项
### 1. 测试环境必须完全按照 v2.7.9 标准
**当前测试环境问题** (2026-03-15 检查):
| 组件 | v2.7.9 标准 | 测试环境现状 | 状态 |
|------|-----------|------------|------|
| **后端框架** | FastAPI 0.109 + Python 3.12 | Node.js + Express | ❌ **严重不符** |
| **ORM** | SQLAlchemy 2.0 | Prisma | ❌ **严重不符** |
| **数据库** | PostgreSQL 13 | PostgreSQL 13 | ✅ 符合 |
| **前端** | React 18 + Vite 6 | React 18 + Vite 6 | ✅ 符合 |
| **操作系统** | Alibaba Cloud Linux 3 | Alibaba Cloud Linux 3 | ✅ 符合 |
**结论**: 测试环境后端需要**完全重新部署**,使用 FastAPI 替代 Node.js
---
### 2. 版本兼容性要求
-**不能使用** Node.js 后端(测试环境当前版本)
-**不能使用** Prisma ORM
-**必须使用** FastAPI 0.109.0
-**必须使用** SQLAlchemy 2.0.25
-**必须使用** Python 3.12.x
---
### 3. 部署顺序
```
1. 准备服务器 (Alibaba Cloud Linux 3)
2. 安装系统依赖 (Python 3.12, PostgreSQL 13, Nginx 1.20)
3. 配置数据库 (创建 zodiac 数据库)
4. 部署后端 (FastAPI + SQLAlchemy)
5. 部署前端 (React + Vite 构建)
6. 配置 Nginx (反向代理)
7. 验证测试 (功能测试清单)
```
---
### 4. 重要提醒
⚠️ **测试环境是用于验证 v2.7.9 版本的环境,必须与生产环境保持一致!**
- ✅ 所有软件版本必须与 v2.7.9 要求一致
- ✅ 所有配置必须按照本文档说明
- ✅ 所有功能必须通过测试清单验证
- ❌ 不能使用旧版本技术栈(如 Node.js 后端)
---
## 📋 目录
1. [环境概述](#环境概述)
2. [服务器信息](#服务器信息)
3. [部署前准备](#部署前准备)
4. [数据库服务器部署 (菜鸟测试 2)](#数据库服务器部署)
5. [应用服务器部署 (菜鸟测试 1)](#应用服务器部署)
6. [Nginx 配置](#nginx 配置)
7. [Prometheus 监控配置](#prometheus 监控配置)
8. [部署验证与测试](#部署验证与测试)
9. [常见问题与解决方案](#常见问题与解决方案)
10. [维护与监控](#维护与监控)
---
## 环境概述
### 架构设计
```
┌─────────────────┐ ┌─────────────────┐
│ 菜鸟测试 1 │ │ 菜鸟测试 2 │
│ 47.103.29.111 │ │ 47.103.9.192 │
├─────────────────┤ ├─────────────────┤
│ Nginx (3001) │ ──────▶ │ FastAPI (3000) │
│ Prometheus │ │ PostgreSQL (5432)│
│ 前端静态文件 │ │ 数据库 │
└─────────────────┘ └─────────────────┘
用户访问
http://47.103.29.111:3001/
```
### 版本信息
| 组件 | 版本 | 说明 |
|------|------|------|
| 甲辰系统 | v2.7.9 | 综合功能增强版 |
| Git 分支 | `v2.7.9` | 稳定分支 |
| Git 标签 | `v2.7.9-release` | 发布标签 |
---
## 服务器信息
### 菜鸟测试 1 (应用服务器)
| 项目 | 信息 |
|------|------|
| **名称** | 菜鸟测试 1 |
| **IP 地址** | 47.103.29.111 |
| **用途** | Nginx + Prometheus 监控 + 前端静态文件 |
| **开放端口** | 3001 (前端), 9090 (Prometheus) |
| **系统** | CentOS 7+ / Ubuntu 20.04+ |
### 菜鸟测试 2 (数据库服务器)
| 项目 | 信息 |
|------|------|
| **名称** | 菜鸟测试 2 |
| **IP 地址** | 47.103.9.192 |
| **用途** | FastAPI 后端 + PostgreSQL 数据库 |
| **开放端口** | 3000 (后端 API), 5432 (PostgreSQL) |
| **系统** | CentOS 7+ / Ubuntu 20.04+ |
---
## 部署前准备
### 1. 系统要求
#### 菜鸟测试 1 (应用服务器)
- **CPU**: 2 核+
- **内存**: 4GB+
- **磁盘**: 20GB+
- **系统**: CentOS 7+ 或 Ubuntu 20.04+
#### 菜鸟测试 2 (数据库服务器)
- **CPU**: 4 核+
- **内存**: 8GB+
- **磁盘**: 50GB+ SSD
- **系统**: CentOS 7+ 或 Ubuntu 20.04+
### 2. 软件依赖
#### 菜鸟测试 1 需要安装
```bash
# Nginx
sudo yum install nginx -y # CentOS
# 或
sudo apt install nginx -y # Ubuntu
# Node.js 18+
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash - # CentOS
sudo yum install -y nodejs
# Prometheus (可选)
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
tar xvfz prometheus-*.tar.gz
```
#### 菜鸟测试 2 需要安装
```bash
# Python 3.12
sudo yum install python3.12 -y # CentOS
# 或
sudo apt install python3.12 -y # Ubuntu
# PostgreSQL 13+
sudo yum install postgresql13-server postgresql13 -y # CentOS
# 或
sudo apt install postgresql-13 -y # Ubuntu
# Git
sudo yum install git -y
```
### 3. 网络配置
#### 开放端口
```bash
# 菜鸟测试 1
firewall-cmd --permanent --add-port=3001/tcp # 前端
firewall-cmd --permanent --add-port=9090/tcp # Prometheus
firewall-cmd --reload
# 菜鸟测试 2
firewall-cmd --permanent --add-port=3000/tcp # 后端 API
firewall-cmd --permanent --add-port=5432/tcp # PostgreSQL
firewall-cmd --reload
```
#### 安全组配置 (阿里云)
- 菜鸟测试 1: 开放 3001, 9090 端口
- 菜鸟测试 2: 开放 3000, 5432 端口 (建议限制访问 IP)
---
## 数据库服务器部署 (菜鸟测试 2)
### 1. PostgreSQL 配置
```bash
# 初始化数据库 (如未初始化)
sudo postgresql-setup --initdb # CentOS
# 或
sudo pg_createcluster 13 main --start # Ubuntu
# 启动 PostgreSQL
sudo systemctl start postgresql
sudo systemctl enable postgresql
# 创建数据库和用户
sudo -u postgres psql
```
```sql
-- 创建数据库
CREATE DATABASE zodiac;
-- 创建用户 (生产环境请使用强密码)
CREATE USER postgres WITH PASSWORD 'postgres' SUPERUSER;
-- 授权
GRANT ALL PRIVILEGES ON DATABASE zodiac TO postgres;
-- 退出
\q
```
### 2. 配置远程访问
```bash
# 编辑 pg_hba.conf
sudo vi /var/lib/pgsql/data/pg_hba.conf # CentOS
# 或
sudo vi /etc/postgresql/13/main/pg_hba.conf # Ubuntu
# 添加 (允许菜鸟测试 1 访问)
host zodiac postgres 47.103.29.111/32 md5
```
```bash
# 编辑 postgresql.conf
sudo vi /var/lib/pgsql/data/postgresql.conf
# 修改
listen_addresses = '*'
port = 5432
```
```bash
# 重启 PostgreSQL
sudo systemctl restart postgresql
```
### 3. 部署 FastAPI 后端
```bash
# 创建部署目录
sudo mkdir -p /opt/zodiac/backend
sudo chown -R $USER:$USER /opt/zodiac/backend
# 克隆代码
cd /opt/zodiac/backend
git clone http://47.253.189.47:3000/coolbot/zodiac-collector.git .
git checkout v2.7.9
# 安装 Python 依赖
cd backend-fastapi
pip3.12 install -r requirements.txt
# 创建环境变量文件
cat > .env << EOF
# 生产环境配置
# 数据库配置 (PostgreSQL)
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/zodiac
# JWT 配置 (生产环境请修改为强密钥)
SECRET_KEY=your-production-secret-key-change-this
ACCESS_TOKEN_EXPIRE_MINUTES=60
# 服务器配置
PORT=3000
HOST=0.0.0.0
# 阿里云 DashScope OCR API
# ⚠️ 注意:需要替换为您自己的 API Key
# 获取方式https://dashscope.console.aliyun.com/apiKey
DASHSCOPE_API_KEY=sk-9389024a37da4f7bb455ac9a6b28776f
# OCR 配置
OCR_MODEL=qwen-vl-max
OCR_TIMEOUT=60
# 文件上传配置
UPLOAD_DIR=./uploads
MAX_UPLOAD_SIZE=10485760
EOF
# 创建上传目录
mkdir -p uploads
chmod 755 uploads
```
### 4. 创建系统服务
```bash
# 创建 systemd 服务文件
sudo vi /etc/systemd/system/zodiac-backend.service
```
```ini
[Unit]
Description=甲辰藏品管理系统后端服务
After=network.target postgresql.service
[Service]
Type=simple
User=postgres
WorkingDirectory=/opt/zodiac/backend/backend-fastapi
Environment="PATH=/usr/local/python3.12/bin:%PATH"
ExecStart=/usr/local/python3.12/bin/python3.12 -m uvicorn app.main:app --port 3000 --host 0.0.0.0
Restart=always
RestartSec=5
# 日志
StandardOutput=journal
StandardError=journal
SyslogIdentifier=zodiac-backend
[Install]
WantedBy=multi-user.target
```
```bash
# 启动服务
sudo systemctl daemon-reload
sudo systemctl start zodiac-backend
sudo systemctl enable zodiac-backend
# 查看状态
sudo systemctl status zodiac-backend
```
### 5. 验证后端服务
```bash
# 测试健康检查
curl http://localhost:3000/health
# 预期输出
{"status":"healthy"}
```
---
## 应用服务器部署 (菜鸟测试 1)
### 1. 部署前端
```bash
# 创建部署目录
sudo mkdir -p /var/www/mobile/dist
sudo chown -R nginx:nginx /var/www/mobile/dist
# 方法 1: 从开发环境复制
# 在开发环境执行:
cd /home/admin/.openclaw/workspace/zodiac-collector/zodiac-mobile
npm run build
# 打包后复制到测试服务器
scp -r dist/* root@47.103.29.111:/var/www/mobile/dist/
# 方法 2: 在测试服务器构建
cd /opt
git clone http://47.253.189.47:3000/coolbot/zodiac-collector.git
cd zodiac-collector/zodiac-mobile
npm install
npm run build
sudo cp -r dist/* /var/www/mobile/dist/
sudo chown -R nginx:nginx /var/www/mobile/dist/
```
### 2. Nginx 配置
```bash
# 创建 Nginx 配置文件
sudo vi /etc/nginx/conf.d/zodiac.conf
```
```nginx
types {
application/javascript js;
text/css css;
}
server {
listen 3001;
server_name _;
root /var/www/mobile/dist;
index index.html;
# 允许上传最大 20MB 的文件
client_max_body_size 20M;
# 前端静态文件
location / {
try_files $uri $uri/ /index.html;
# 缓存配置
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
# API 代理到后端服务器
location /api {
proxy_pass http://47.103.9.192:3000/api;
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;
# 允许大文件上传
client_max_body_size 20M;
# 超时配置
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# 日志配置
access_log /var/log/nginx/zodiac-access.log;
error_log /var/log/nginx/zodiac-error.log;
}
```
```bash
# 测试 Nginx 配置
sudo nginx -t
# 启动 Nginx
sudo systemctl start nginx
sudo systemctl enable nginx
# 重载配置
sudo systemctl reload nginx
```
### 3. Prometheus 监控配置 (可选)
```bash
# 创建 Prometheus 目录
sudo mkdir -p /opt/prometheus
cd /opt/prometheus
# 下载并解压
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
tar xvfz prometheus-*.tar.gz
cd prometheus-2.45.0.linux-amd64
# 创建配置文件
cat > prometheus.yml << EOF
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'zodiac-backend'
static_configs:
- targets: ['47.103.9.192:3000']
metrics_path: '/metrics'
- job_name: 'nginx'
static_configs:
- targets: ['localhost:9113'] # nginx exporter
EOF
# 创建 systemd 服务
sudo vi /etc/systemd/system/prometheus.service
```
```ini
[Unit]
Description=Prometheus Monitoring
After=network.target
[Service]
Type=simple
User=prometheus
WorkingDirectory=/opt/prometheus/prometheus-2.45.0.linux-amd64
ExecStart=/opt/prometheus/prometheus-2.45.0.linux-amd64/prometheus --config.file=prometheus.yml
Restart=always
[Install]
WantedBy=multi-user.target
```
```bash
# 启动 Prometheus
sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus
```
---
## 部署验证与测试
### 1. 基础服务检查
```bash
# 菜鸟测试 1
systemctl status nginx
systemctl status prometheus # 如安装
# 菜鸟测试 2
systemctl status zodiac-backend
systemctl status postgresql
# 端口检查
netstat -tlnp | grep -E "3001|3000|5432|9090"
```
### 2. 数据库连接测试
```bash
# 在菜鸟测试 2 上
psql -U postgres -d zodiac -c "SELECT version();"
# 在菜鸟测试 1 上测试远程连接
psql -h 47.103.9.192 -U postgres -d zodiac -c "SELECT version();"
```
### 3. 后端 API 测试
```bash
# 健康检查
curl http://47.103.9.192:3000/health
# API 文档
curl http://47.103.9.192:3000/docs
# 登录测试
curl -X POST http://47.103.9.192:3000/api/auth/login \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=admin&password=admin123"
```
### 4. 前端访问测试
```bash
# 访问前端页面
curl http://47.103.29.111:3001/
# 应该返回 HTML 内容
```
### 5. 完整功能测试清单
| 功能 | 测试步骤 | 预期结果 |
|------|---------|---------|
| 登录 | 访问 http://47.103.29.111:3001/,使用 admin/admin123 登录 | ✅ 登录成功,跳转首页 |
| 注册 | 点击"注册新账号",填写信息并提交 | ✅ 注册成功 |
| 藏品列表 | 查看藏品列表 | ✅ 显示藏品数据 |
| 添加藏品 | 手工录入一个藏品 | ✅ 保存成功,编码自动生成 |
| 图片上传 | 上传藏品图片 | ✅ 上传成功,显示图片 |
| 筛选功能 | 按状态/珍惜度等筛选 | ✅ 筛选条件显示中文 |
| 统计页面 | 查看统计分析 | ✅ 显示 8 个分布统计 |
| 用户管理 | 管理员添加/删除用户 | ✅ 功能正常 |
---
## 错误码与故障排查
### 📋 完整错误码列表
#### 认证错误 (E00010-E00019)
| 错误码 | 说明 | HTTP 状态 | 解决方案 |
|--------|------|----------|---------|
| **E00010** | 未登录或登录已过期 | 401 | 重新登录获取新 Token |
| **E00011** | 用户名或密码错误 | 401 | 检查用户名密码是否正确 |
| **E00012** | 验证码错误 | 400 | 刷新验证码后重试 |
| **E00014** | 无权访问此资源 | 403 | 检查用户权限(需管理员) |
| **E00015** | 令牌无效或已过期 | 401 | 清除本地存储,重新登录 |
#### 验证错误 (E00020-E00029)
| 错误码 | 说明 | HTTP 状态 | 解决方案 |
|--------|------|----------|---------|
| **E00020** | 请输入用户名和密码 | 400 | 填写完整的登录信息 |
| **E00021** | 用户名至少 3 个字符 | 400 | 用户名长度≥3 字符 |
| **E00022** | 密码至少 6 个字符 | 400 | 密码长度≥6 字符 |
| **E00023** | 用户名已存在 | 400 | 更换其他用户名 |
| **E00024** | 邮箱已被注册 | 400 | 更换其他邮箱 |
#### 藏品管理错误 (E00030-E00039)
| 错误码 | 说明 | HTTP 状态 | 解决方案 |
|--------|------|----------|---------|
| **E00030** | 藏品名称不能为空 | 400 | 填写藏品名称 |
| **E00031** | 藏品名称至少 2 个字符 | 400 | 名称长度≥2 字符 |
| **E00032** | 藏品分类不能为空 | 400 | 选择藏品分类 |
| **E00033** | 藏品不存在 | 404 | 检查藏品 ID 是否正确 |
| **E00034** | 禁止重复:此冠字号已存在 | 400 | 检查冠字号是否重复 |
| **E00035** | 成本价格必须>=0 | 400 | 价格不能为负数 |
| **E00036** | 目标价格必须>=0 | 400 | 价格不能为负数 |
| **E00037** | 发行年份必须是 4 位数字 | 400 | 年份格式YYYY |
#### OCR 识别错误 (E00040-E00049)
| 错误码 | 说明 | HTTP 状态 | 解决方案 |
|--------|------|----------|---------|
| **E00040** | 请选择图片文件 | 400 | 上传正确的图片 |
| **E00041** | 图片尺寸太小,无法识别 | 400 | 上传更清晰的图片 |
| **E00042** | OCR 识别失败,请重试 | 500 | 重新上传或检查 API Key |
#### 用户管理错误 (E00050-E00059)
| 错误码 | 说明 | HTTP 状态 | 解决方案 |
|--------|------|----------|---------|
| **E00050** | 仅管理员可访问 | 403 | 需要管理员权限 |
| **E00051** | 用户不存在 | 404 | 检查用户 ID 是否正确 |
| **E00052** | 不能删除自己 | 400 | 不能删除当前登录用户 |
#### 通用错误 (E00000-E00009)
| 错误码 | 说明 | HTTP 状态 | 解决方案 |
|--------|------|----------|---------|
| **E00000** | 请求失败 | - | 检查请求参数 |
| **E00001** | 网络连接失败 | - | 检查网络连接 |
| **E00003** | 服务器内部错误 | 500 | 联系管理员查看日志 |
---
### 🔧 常见错误处理流程
#### 1. E00010: 未登录或登录已过期
**现象**: 访问任何需要登录的页面都提示 E00010
**原因**:
- Token 已过期(默认 60 分钟)
- Token 被篡改或无效
- 本地存储被清除
**解决方案**:
```javascript
// 浏览器控制台执行
localStorage.clear()
sessionStorage.clear()
// 然后刷新页面,重新登录
```
**预防措施**:
- 设置合理的 Token 有效期(建议 24 小时)
- 前端实现 Token 自动刷新机制
---
#### 2. E00011: 用户名或密码错误
**现象**: 登录时提示用户名或密码错误
**原因**:
- 用户名或密码输入错误
- 大小写问题
- 用户不存在
**解决方案**:
1. 检查用户名密码是否正确
2. 确认大小写(密码区分大小写)
3. 联系管理员确认账号是否存在
---
#### 3. E00033: 藏品不存在
**现象**: 访问藏品详情时提示藏品不存在
**原因**:
- 藏品 ID 错误
- 藏品已被删除
- 无权访问此藏品
**解决方案**:
1. 检查藏品 ID 是否正确
2. 确认藏品是否被删除
3. 确认是否有访问权限
---
#### 4. E00042: OCR 识别失败
**现象**: 上传图片识别时失败
**错误日志**:
```
OCR API 调用失败:{"error": {"message": "Invalid API Key", ...}}
OCR API 调用失败:{"error": {"message": "you must provide a messages parameter", ...}}
```
**原因**:
- 阿里云 API Key 配置错误/失效
- API 请求格式不正确(兼容模式 vs 原生模式)
- 图片格式不支持
- 图片质量太差
- API 余额不足
**解决方案**:
**1. 检查 API Key 配置**
```bash
# 检查后端 .env 配置
cat .env | grep DASHSCOPE_API_KEY
# 应该显示:
# DASHSCOPE_API_KEY=sk-xxxxxxxxxxxxxxxx
```
**2. 验证 API Key 有效性**
```bash
# 测试 API Key
curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer sk-xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-vl-max",
"input": {
"messages": [{
"role": "user",
"content": [{"type": "text", "text": "你好"}]
}]
}
}'
# 成功返回:{"output": {"choices": [...]}}
# 失败返回:{"error": {"message": "..."}}
```
**3. 检查 API 请求格式**
```python
# ✅ 正确格式2026 年兼容模式)
payload = {
"model": "qwen-vl-max",
"input": {
"messages": [{
"role": "user",
"content": [
{"type": "image", "image": "data:image/jpeg;base64,..."},
{"type": "text", "text": "提示词"}
]
}]
},
"parameters": {
"max_tokens": 1000
}
}
# ❌ 错误格式(旧版)
payload = {
"model": "qwen-vl-max",
"messages": [...] # 缺少 input 包裹
}
```
**4. 获取新的 API Key**
```
1. 访问https://dashscope.console.aliyun.com/apiKey
2. 登录阿里云账号
3. 创建/复制 API Key
4. 更新 .env 配置
5. 重启后端服务
```
**5. 检查 API 余额**
```
访问https://dashscope.console.aliyun.com/overview
查看:剩余额度和用量
```
---
#### 5. E00050: 仅管理员可访问
**现象**: 访问用户管理页面时提示无权访问
**原因**:
- 当前用户不是管理员角色
**解决方案**:
1. 联系管理员提升权限
2. 使用管理员账号登录
---
#### 5.5. OCR 识别成功但字段未保存
**现象**: OCR 识别成功,但 11 个字段信息没有正确保存到表单
**原因**:
- 后端返回的字段名与前端期望不一致
- 字段映射错误
- 布尔值处理问题
**后端返回字段** (`data.fields`):
```json
{
"issuer": "中国人民银行",
"version": "2024 龙",
"denomination": "贰拾圆",
"prefix_serial": "J01234567",
"packaging": "标十",
"grading_company": "ACG",
"grading_score": "68",
"special_mark": "金山标",
"serial_feature": "金山号 2 张",
"is_graded": true,
"three_star": false
}
```
**前端期望字段** (form 状态):
```javascript
{
issuer: "中国人民银行",
version: "2024 龙",
denomination: "贰拾圆",
prefixSerial: "J01234567", // ⚠️ 驼峰命名
packaging: "标十",
gradingCompany: "ACG", // ⚠️ 驼峰命名
gradingScore: "68", // ⚠️ 驼峰命名
specialMark: "金山标", // ⚠️ 驼峰命名
serialFeature: "金山号 2 张", // ⚠️ 驼峰命名
isGraded: true, // ⚠️ 驼峰命名
threeStar: false // ⚠️ 驼峰命名
}
```
**解决方案**:
**前端修复** (`Add.jsx` 的 `handleRecognize`):
```javascript
if (data.fields) {
const recognizedForm = { ...getDefaultForm() }
// 下划线 → 驼峰 映射
if (data.fields.issuer) recognizedForm.issuer = data.fields.issuer
if (data.fields.version) recognizedForm.version = data.fields.version
if (data.fields.denomination) recognizedForm.denomination = data.fields.denomination
if (data.fields.prefix_serial) recognizedForm.prefixSerial = data.fields.prefix_serial // ✅
if (data.fields.packaging) recognizedForm.packaging = data.fields.packaging
if (data.fields.grading_company) recognizedForm.gradingCompany = data.fields.grading_company // ✅
if (data.fields.grading_score) recognizedForm.gradingScore = data.fields.grading_score // ✅
if (data.fields.special_mark && data.fields.special_mark !== '无') recognizedForm.specialMark = data.fields.special_mark // ✅
if (data.fields.serial_feature && data.fields.serial_feature !== '无') recognizedForm.serialFeature = data.fields.serial_feature // ✅
// 布尔字段
if (data.fields.is_graded !== undefined) recognizedForm.isGraded = data.fields.is_graded
if (data.fields.three_star !== undefined) recognizedForm.threeStar = data.fields.three_star
}
```
**调试方法**:
```javascript
// 在 handleRecognize 中添加
console.log('后端返回:', data.fields)
console.log('转换后:', recognizedForm)
```
---
#### 6. 识别失败Unexpected token '<', "<html> <h"... is not valid JSON
**现象**: 登录、AI 识别或调用 API 时报错,提示收到 HTML 而不是 JSON
**发生频率**: ⚠️ **非常常见**90% 的前端错误都是这个)
---
##### 原因分析
| 原因 | 概率 | 说明 |
|------|------|------|
| **浏览器缓存** | 60% | 缓存了旧的 Nginx 错误页面 |
| **图片太大** | 25% | 超过 Nginx 默认 1MB 限制 |
| **URL 端口错误** | 10% | 访问了错误的端口(如 8080 |
| **后端服务挂了** | 5% | Nginx 返回 502 错误页面 |
---
##### 排查流程
```
1. 查看错误详情 → 2. 检查浏览器缓存 → 3. 检查图片大小 →
4. 检查 URL 端口 → 5. 检查后端服务
```
---
##### 解决方案
**方案 1: 清除浏览器缓存** (最常见)
```javascript
// Windows/Linux
Ctrl + Shift + R (强制刷新)
// Mac
Cmd + Shift + R
// 或者
F12 Network 标签 勾选 "Disable cache" 刷新页面
// 彻底清除
F12 Application 标签 Clear storage Clear site data
```
---
**方案 2: 检查图片大小** (AI 识别专属)
```javascript
// 检查图片大小
// 方法 1: 右键图片 → 属性 → 查看大小
// 方法 2: 浏览器控制台
const file = document.querySelector('input[type="file"]').files[0]
console.log(`图片大小:${(file.size / 1024 / 1024).toFixed(2)} MB`)
// 如果 > 1MB需要配置 Nginx
```
**配置 Nginx 图片上传限制**:
```nginx
server {
listen 3001;
# ⚠️ 必须配置:允许上传 20MB
client_max_body_size 20M;
location /api {
proxy_pass http://127.0.0.1:3000/api;
# ⚠️ API 上传也要配置
client_max_body_size 20M;
}
}
```
**重启 Nginx**:
```bash
sudo nginx -t && sudo nginx -s reload
```
---
**方案 3: 检查访问的 URL**
```javascript
// 正确 URL
http://47.103.29.111:3001/
// 错误 URL
http://47.103.29.111/ // 默认 80 端口
http://47.103.29.111:8080/ // 错误端口
http://47.103.29.111:3000/ // 后端端口(不能直接访问)
```
---
**方案 4: 检查后端服务**
```bash
# SSH 登录测试服务器
ssh root@47.103.9.192
# 检查后端健康状态
curl http://localhost:3000/health
# 应该返回:{"status":"healthy"}
# 如果返回空或报错,检查后端服务
systemctl status zodiac-backend
# 查看后端日志
sudo journalctl -u zodiac-backend -n 50 --no-pager
```
---
##### 快速诊断脚本
```bash
#!/bin/bash
# 保存为 check-api.sh
echo "=== 检查后端服务 ==="
curl -s http://localhost:3000/health | jq .
echo ""
echo "=== 检查 Nginx 配置 ==="
nginx -t 2>&1 | grep -i 'client_max_body_size'
echo ""
echo "=== 检查 Nginx 错误日志 ==="
sudo tail -20 /var/log/nginx/error.log | grep -i 'large\|body\|client'
```
---
##### 预防措施
1. **前端添加版本号**
```html
<script src="/assets/index.js?v=2.7.9"></script>
```
2. **Nginx 配置正确的错误页面**
```nginx
error_page 502 /502.html;
error_page 413 /413.html;
```
3. **监控后端服务状态**
```bash
# 添加到 crontab
*/5 * * * * curl -f http://localhost:3000/health || systemctl restart zodiac-backend
```
4. **前端添加错误处理**
```javascript
try {
const res = await fetch('/api/...')
const data = await res.json()
} catch (err) {
if (err.message.includes('Unexpected token')) {
alert('服务暂时不可用,请清除缓存后重试')
}
}
```
---
### 📝 故障排查通用步骤
```
1. 查看错误码 → 2. 查看错误信息 → 3. 查看日志 → 4. 定位问题
```
**后端日志**:
```bash
# 查看后端日志
sudo journalctl -u zodiac-backend -f
# 查看最近 100 行
sudo journalctl -u zodiac-backend -n 100
```
**Nginx 日志**:
```bash
# 访问日志
sudo tail -f /var/log/nginx/zodiac-access.log
# 错误日志
sudo tail -f /var/log/nginx/zodiac-error.log
```
**数据库日志**:
```bash
# PostgreSQL 日志
sudo tail -f /var/log/postgresql/postgresql-13-main.log
```
**浏览器控制台**:
```
F12 打开开发者工具 → Console 标签 → 查看 JavaScript 错误
```
---
## 常见问题与解决方案
### 问题 1: Nginx 启动失败
**现象**: `systemctl status nginx` 显示失败
**解决方案**:
```bash
# 检查配置
sudo nginx -t
# 查看错误日志
sudo tail -50 /var/log/nginx/error.log
# 常见原因:
# 1. 端口被占用netstat -tlnp | grep 3001
# 2. 配置文件错误:检查 /etc/nginx/conf.d/zodiac.conf
# 3. 权限问题sudo chown -R nginx:nginx /var/www/mobile/dist
```
### 问题 2: 后端无法连接数据库
**现象**: 后端日志显示数据库连接失败
**解决方案**:
```bash
# 1. 检查 PostgreSQL 是否运行
systemctl status postgresql
# 2. 检查 pg_hba.conf 配置
sudo cat /var/lib/pgsql/data/pg_hba.conf | grep -v "^#"
# 3. 测试数据库连接
psql -h localhost -U postgres -d zodiac
# 4. 检查防火墙
firewall-cmd --list-all | grep 5432
```
### 问题 3: 前端页面空白
**现象**: 访问 http://47.103.29.111:3001/ 显示空白
**解决方案**:
```bash
# 1. 检查 Nginx 日志
sudo tail -50 /var/log/nginx/zodiac-error.log
# 2. 检查前端文件是否存在
ls -la /var/www/mobile/dist/
# 3. 检查浏览器控制台错误
# F12 打开开发者工具,查看 Console 和 Network 标签
# 4. 清除浏览器缓存
# Ctrl+Shift+R 强制刷新
```
### 问题 4: 图片上传失败 (413 错误)
**现象**: 上传图片时返回 413 Request Entity Too Large
**解决方案**:
```bash
# 检查 Nginx 配置
sudo grep -i "client_max_body_size" /etc/nginx/conf.d/zodiac.conf
# 确保配置了 20M
client_max_body_size 20M;
# 重载 Nginx
sudo nginx -t && sudo nginx -s reload
```
### 问题 5: 跨域访问失败
**现象**: 前端调用 API 时出现 CORS 错误
**解决方案**:
```bash
# 检查后端 CORS 配置
cat /opt/zodiac/backend/backend-fastapi/app/main.py | grep -A 10 "CORS"
# 确保配置了允许所有来源 (开发/测试环境)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
```
### 问题 6: Prometheus 无法抓取指标
**现象**: Prometheus 界面显示 target down
**解决方案**:
```bash
# 1. 检查后端是否暴露 metrics 端点
curl http://47.103.9.192:3000/metrics
# 2. 检查 Prometheus 配置
cat /opt/prometheus/prometheus-2.45.0.linux-amd64/prometheus.yml
# 3. 重启 Prometheus
sudo systemctl restart prometheus
```
---
## 维护与监控
### 1. 日志管理
```bash
# 后端日志
sudo journalctl -u zodiac-backend -f
# Nginx 日志
sudo tail -f /var/log/nginx/zodiac-access.log
sudo tail -f /var/log/nginx/zodiac-error.log
# PostgreSQL 日志
sudo tail -f /var/log/postgresql/postgresql-13-main.log # Ubuntu
# 或
sudo tail -f /var/lib/pgsql/data/log/postgresql.log # CentOS
# Prometheus 日志
sudo journalctl -u prometheus -f
```
### 2. 备份策略
```bash
# 数据库备份脚本
cat > /opt/backup-zodiac.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/opt/backups/zodiac"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# 备份数据库
pg_dump -U postgres -h localhost zodiac > $BACKUP_DIR/zodiac_$DATE.sql
# 备份上传文件
tar -czf $BACKUP_DIR/uploads_$DATE.tar.gz /opt/zodiac/backend/backend-fastapi/uploads/
# 删除 7 天前的备份
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
echo "备份完成:$DATE"
EOF
chmod +x /opt/backup-zodiac.sh
# 添加到 crontab (每天凌晨 2 点备份)
crontab -e
0 2 * * * /opt/backup-zodiac.sh >> /var/log/zodiac-backup.log 2>&1
```
### 3. 监控告警
```bash
# Prometheus 告警规则示例
cat > /opt/prometheus/prometheus-2.45.0.linux-amd64/rules.yml << EOF
groups:
- name: zodiac_alerts
rules:
- alert: BackendDown
expr: up{job="zodiac-backend"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "甲辰后端服务宕机"
description: "后端服务 {{ \$labels.instance }} 已宕机超过 1 分钟"
- alert: DatabaseDown
expr: pg_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "PostgreSQL 数据库宕机"
description: "数据库 {{ \$labels.instance }} 已宕机超过 1 分钟"
EOF
```
### 4. 性能优化建议
#### Nginx 优化
```nginx
# 启用 gzip 压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript;
gzip_min_length 1000;
# 连接优化
worker_connections 1024;
keepalive_timeout 65;
```
#### PostgreSQL 优化
```conf
# postgresql.conf
shared_buffers = 2GB # 内存的 25%
effective_cache_size = 6GB # 内存的 75%
work_mem = 64MB
maintenance_work_mem = 512MB
```
#### FastAPI 优化
```bash
# 使用 gunicorn + uvicorn workers
pip install gunicorn
# 启动命令
gunicorn app.main:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:3000
```
---
## 附录
### A. 快速部署脚本
```bash
#!/bin/bash
# 快速部署脚本 - 菜鸟测试 2 (数据库服务器)
set -e
echo "=== 甲辰系统快速部署脚本 ==="
# 1. 安装依赖
echo "安装依赖..."
sudo yum install -y postgresql13-server postgresql13 git python3.12
# 2. 初始化数据库
echo "初始化数据库..."
sudo postgresql-setup --initdb
sudo systemctl start postgresql
sudo systemctl enable postgresql
# 3. 创建数据库
echo "创建数据库..."
sudo -u postgres psql -c "CREATE DATABASE zodiac;"
sudo -u postgres psql -c "CREATE USER postgres WITH PASSWORD 'postgres' SUPERUSER;"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE zodiac TO postgres;"
# 4. 配置远程访问
echo "配置远程访问..."
echo "host zodiac postgres 47.103.29.111/32 md5" | sudo tee -a /var/lib/pgsql/data/pg_hba.conf
echo "listen_addresses = '*'" | sudo tee -a /var/lib/pgsql/data/postgresql.conf
sudo systemctl restart postgresql
# 5. 部署后端
echo "部署后端..."
sudo mkdir -p /opt/zodiac/backend
sudo chown -R $USER:$USER /opt/zodiac/backend
cd /opt/zodiac/backend
git clone http://47.253.189.47:3000/coolbot/zodiac-collector.git .
git checkout v2.7.9
cd backend-fastapi
pip3.12 install -r requirements.txt
# 6. 创建服务
echo "创建系统服务..."
sudo cp zodiac-backend.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl start zodiac-backend
sudo systemctl enable zodiac-backend
echo "=== 部署完成 ==="
echo "访问地址http://47.103.29.111:3001/"
echo "默认账号admin / admin123"
```
### B. 联系信息
- **开发团队**: 菜鸟小 D (AI 开发助理)
- **技术支持**: 酷博特
- **文档版本**: v1.0
- **最后更新**: 2026-03-15
---
**文档结束**