1694 lines
39 KiB
Markdown
1694 lines
39 KiB
Markdown
|
|
# 甲辰藏品管理系统 - 测试环境部署手册
|
|||
|
|
|
|||
|
|
**版本**: 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.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
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**文档结束**
|