Files
AIclinicalresearch/docs/07-运维文档/01-环境配置指南.md
HaHafeng 66255368b7 feat(admin): Add user management and upgrade to module permission system
Features - User Management (Phase 4.1):
- Database: Add user_modules table for fine-grained module permissions
- Database: Add 4 user permissions (view/create/edit/delete) to role_permissions
- Backend: UserService (780 lines) - CRUD with tenant isolation
- Backend: UserController + UserRoutes (648 lines) - 13 API endpoints
- Backend: Batch import users from Excel
- Frontend: UserListPage (412 lines) - list/filter/search/pagination
- Frontend: UserFormPage (341 lines) - create/edit with module config
- Frontend: UserDetailPage (393 lines) - details/tenant/module management
- Frontend: 3 modal components (592 lines) - import/assign/configure
- API: GET/POST/PUT/DELETE /api/admin/users/* endpoints

Architecture Upgrade - Module Permission System:
- Backend: Add getUserModules() method in auth.service
- Backend: Login API returns modules array in user object
- Frontend: AuthContext adds hasModule() method
- Frontend: Navigation filters modules based on user.modules
- Frontend: RouteGuard checks requiredModule instead of requiredVersion
- Frontend: Remove deprecated version-based permission system
- UX: Only show accessible modules in navigation (clean UI)
- UX: Smart redirect after login (avoid 403 for regular users)

Fixes:
- Fix UTF-8 encoding corruption in ~100 docs files
- Fix pageSize type conversion in userService (String to Number)
- Fix authUser undefined error in TopNavigation
- Fix login redirect logic with role-based access check
- Update Git commit guidelines v1.2 with UTF-8 safety rules

Database Changes:
- CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled)
- ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code)
- INSERT 4 permissions + role assignments
- UPDATE PUBLIC tenant with 8 module subscriptions

Technical:
- Backend: 5 new files (~2400 lines)
- Frontend: 10 new files (~2500 lines)
- Docs: 1 development record + 2 status updates + 1 guideline update
- Total: ~4900 lines of code

Status: User management 100% complete, module permission system operational
2026-01-16 13:42:10 +08:00

751 lines
17 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.
# 环境配置指南
> **文档版本:** v1.0
> **创建日期:** 2025-11-09
> **维护者:** 技术团队
> **最后更新:** 2025-11-09
---
## 📋 文档说明
本文档记录系统运行所需的全部环境变量配置,包括:
- 数据库连接信息
- LLM API密钥配置
- 第三方服务配置
- 安全相关配置
---
## 🗄️ 数据库配置
### PostgreSQL连接信息
**当前配置:**
```env
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/ai_clinical_research
```
**连接参数说明:**
| 参数 | 当前值 | 说明 |
|------|--------|------|
| 用户名 | postgres | PostgreSQL默认用户 |
| 密码 | postgres | 本地开发密码 |
| 主机 | localhost | 本地数据库 |
| 端口 | 5432 | PostgreSQL默认端口 |
| 数据库名 | ai_clinical_research | 项目数据库 |
**Schema信息**
- **当前Schema** `public`所有13个表
- **计划Schema** 10个隔离SchemaWeek 1实施
- platform_schema
- common_schema
- asl_schema
- aia_schema
- pkb_schema
- dc_schema
- rvw_schema
- admin_schema
- ssa_schema
- st_schema
---
## 🤖 LLM API配置
### 1. DeepSeek API
**用途:** 主力大模型(推理、对话、批处理)
**配置:**
```env
DEEPSEEK_API_KEY=sk-your-deepseek-key
```
**获取方式:**
1. 访问https://platform.deepseek.com
2. 注册/登录账号
3. 进入API Keys页面
4. 创建新的API Key
**使用场景:**
- AI智能问答选题评价、PICO梳理等
- 批处理任务
- 标题摘要初筛
- 全文复筛
**定价:**
- DeepSeek-V3: ¥1/M tokens输入¥2/M tokens输出
---
### 2. 通义千问QwenAPI
**用途:** 备用模型、特定场景优化
**配置:**
```env
DASHSCOPE_API_KEY=sk-your-qwen-key
```
**获取方式:**
1. 访问https://dashscope.console.aliyun.com
2. 开通DashScope服务
3. 创建API Key
**使用场景:**
- 长文本处理Qwen-Long
- 特定领域任务
- 模型对比筛选
**定价:**
- Qwen-Max: ¥0.04/1K tokens
- Qwen-Long: ¥0.005/1K tokens
---
### 3. CloseAI配置代理OpenAI和Claude⭐⭐⭐
**用途:** 通过代理平台稳定访问OpenAI和Claude API
**为什么使用CloseAI**
- ✅ 国内稳定访问,无需科学上网
- ✅ 一个账号同时使用OpenAI和Claude
- ✅ 兼容OpenAI SDK标准接口
- ✅ 最新模型支持GPT-5-Pro、Claude-Sonnet-4.5
**配置:**
```env
# CloseAI统一API Key
CLOSEAI_API_KEY=sk-cu0iepbXYGGx2jc7BqP6ogtSWmP6fk918qV3RUdtGC3Edlpo
# OpenAI端点通过CloseAI代理
CLOSEAI_OPENAI_BASE_URL=https://api.openai-proxy.org/v1
# Claude端点通过CloseAI代理
CLOSEAI_CLAUDE_BASE_URL=https://api.openai-proxy.org/anthropic
```
**支持的模型:**
| 模型系列 | 最新模型 | 说明 |
|---------|---------|------|
| **OpenAI** | `gpt-5-pro` | 最新GPT-5模型 ⭐ |
| OpenAI | `gpt-4-turbo-preview` | GPT-4高性能版本 |
| OpenAI | `gpt-3.5-turbo` | 快速经济版本 |
| **Claude** | `claude-sonnet-4-5-20250929` | 最新Claude-4.5 ⭐ |
| Claude | `claude-3-5-sonnet-20241022` | Claude-3.5稳定版 |
| Claude | `claude-3-opus-20240229` | Claude-3最强版本 |
**获取方式:**
1. 访问https://platform.openai-proxy.org
2. 注册账号并充值
3. 在控制台获取API Key
4. 一个API Key可同时调用OpenAI和Claude
**代码示例TypeScript**
```typescript
import OpenAI from 'openai';
// OpenAI (通过CloseAI)
const openaiClient = new OpenAI({
apiKey: process.env.CLOSEAI_API_KEY,
baseURL: 'https://api.openai-proxy.org/v1',
});
const gptResponse = await openaiClient.chat.completions.create({
model: 'gpt-5-pro',
messages: [{ role: 'user', content: '你好' }],
});
// Claude (通过CloseAI)
const claudeClient = new OpenAI({
apiKey: process.env.CLOSEAI_API_KEY,
baseURL: 'https://api.openai-proxy.org/anthropic',
});
const claudeResponse = await claudeClient.chat.completions.create({
model: 'claude-sonnet-4-5-20250929',
messages: [{ role: 'user', content: '你好' }],
});
```
**使用场景AI智能文献 ⭐):**
- **GPT-5-Pro** 文献精准筛选、质量控制
- **Claude-4.5** 第三方仲裁、结构化输出
- **双模型对比:** DeepSeek + GPT-5-Pro 快速+高质量
- **三模型共识:** 冲突时启用Claude仲裁
**定价(参考):**
- GPT-5-Pro: ~¥0.10/1K tokens输入~¥0.20/1K tokens输出
- Claude-4.5-Sonnet: ~¥0.021/1K tokens输入~¥0.105/1K tokens输出
**注意事项:**
- ⚠️ API Key包含敏感信息不要提交到Git
- ⚠️ 建议定期更换API Key
- ⚠️ 生产环境使用独立的API Key
---
## 🔧 Dify配置RAG引擎
**用途:** 知识库向量检索、RAG问答
**配置:**
```env
DIFY_API_KEY=app-your-dify-key
DIFY_API_URL=http://localhost/v1
```
**部署信息:**
- **本地部署:** Docker Compose
- **访问地址:** http://localhost
- **管理后台:** http://localhost/install
- **向量数据库:** Qdrant内置
**获取API Key**
1. 访问 Dify 管理后台
2. 进入"应用"页面
3. 创建"知识库应用"
4. 复制API Key
**使用场景:**
- 个人知识库文档上传
- @知识库问答
- 智能引用功能
---
## 🔐 安全配置
### JWT密钥
**配置:**
```env
JWT_SECRET=your-secret-key-change-in-production
JWT_EXPIRES_IN=7d
```
**说明:**
- 用于用户认证Token签名
- 建议使用32位以上随机字符串
- 过期时间7天
**生成强密钥(可选):**
```bash
# Node.js生成
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
# OpenSSL生成
openssl rand -hex 32
```
---
## 🌐 服务配置
### 后端服务
**配置:**
```env
PORT=3001
HOST=0.0.0.0
NODE_ENV=development
LOG_LEVEL=info
```
**说明:**
| 参数 | 值 | 说明 |
|------|-----|------|
| PORT | 3001 | 后端服务端口 |
| HOST | 0.0.0.0 | 监听所有网卡 |
| NODE_ENV | development | 开发环境 |
| LOG_LEVEL | info | 日志级别 |
---
### CORS配置
**配置:**
```env
CORS_ORIGIN=http://localhost:5173
```
**说明:**
- 允许前端跨域访问
- 前端开发服务器http://localhost:5173
---
### Redis配置可选
**配置:**
```env
REDIS_URL=redis://localhost:6379
```
**说明:**
- 用于缓存和会话管理
- 当前未强制要求
---
## 📁 文件上传配置
**配置:**
```env
UPLOAD_MAX_SIZE=10485760
UPLOAD_DIR=./uploads
```
**说明:**
| 参数 | 值 | 说明 |
|------|-----|------|
| UPLOAD_MAX_SIZE | 10485760 | 10MB字节 |
| UPLOAD_DIR | ./uploads | 上传文件存储目录 |
---
## 🚀 配置步骤
### 1. 检查环境变量文件
**位置:** `backend/.env`
如果文件不存在,参考以下模板创建:
```env
# ==================== 服务器配置 ====================
PORT=3001
HOST=0.0.0.0
NODE_ENV=development
LOG_LEVEL=info
# ==================== 数据库配置 ====================
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/ai_clinical_research
# ==================== Redis配置 ====================
REDIS_URL=redis://localhost:6379
# ==================== JWT配置 ====================
JWT_SECRET=your-secret-key-change-in-production
JWT_EXPIRES_IN=7d
# ==================== LLM API配置 ====================
# DeepSeek
DEEPSEEK_API_KEY=sk-your-deepseek-key
# 通义千问阿里云DashScope
DASHSCOPE_API_KEY=sk-your-qwen-key
# Gemini可选
GEMINI_API_KEY=your-gemini-key
# ==================== Dify配置 ====================
DIFY_API_KEY=app-your-dify-key
DIFY_API_URL=http://localhost/v1
# ==================== 文件上传配置 ====================
UPLOAD_MAX_SIZE=10485760
UPLOAD_DIR=./uploads
# ==================== CORS配置 ====================
CORS_ORIGIN=http://localhost:5173
```
---
### 2. 验证配置
**启动后端服务:**
```bash
cd backend
npm run dev
```
**检查启动日志:**
```
✓ Prisma schema loaded
✓ Environment variables loaded from .env
✓ Datasource "db": PostgreSQL database "ai_clinical_research"
✓ Server running on http://0.0.0.0:3001
```
**验证数据库连接:**
```bash
cd backend
npx prisma migrate status
```
**预期输出:**
```
Environment variables loaded from .env
Datasource "db": PostgreSQL database "ai_clinical_research", schema "public" at "localhost:5432"
Database schema is up to date!
```
---
### 3. 常见问题排查
#### 问题1数据库连接失败
**错误信息:**
```
Error: Can't reach database server at localhost:5432
```
**解决方案:**
1. 检查PostgreSQL是否启动
2. 验证端口5432是否被占用
3. 确认用户名密码是否正确
**检查PostgreSQL状态Windows**
```bash
# 查看服务状态
Get-Service postgresql*
# 启动服务
Start-Service postgresql-x64-15
```
---
#### 问题2LLM API调用失败
**错误信息:**
```
Error: Invalid API key
```
**解决方案:**
1. 检查API Key是否正确复制
2. 确认API Key是否已激活
3. 检查账户余额是否充足
---
#### 问题3Dify连接失败
**错误信息:**
```
Error: connect ECONNREFUSED 127.0.0.1:80
```
**解决方案:**
1. 检查Dify是否启动`docker-compose ps`
2. 启动Dify`docker-compose up -d`
3. 验证访问:浏览器打开 http://localhost
---
## 🌟 平台基础设施配置2025-11-16 新增)
> **⭐ 重要更新**:为支持云原生部署,新增平台基础设施环境变量
> **详细文档**[平台基础设施规划](../09-架构实施/04-平台基础设施规划.md)
---
### 1. 存储服务配置
#### **本地开发环境**
```bash
# backend/.env.development
STORAGE_TYPE=local
BASE_URL=http://localhost:3001
```
#### **生产环境阿里云OSS**
```bash
# SAE控制台 -> 环境变量配置
STORAGE_TYPE=oss
OSS_REGION=oss-cn-hangzhou
OSS_BUCKET=aiclinical-prod
OSS_ACCESS_KEY_ID=LTAI5t***
OSS_ACCESS_KEY_SECRET=***
OSS_ENDPOINT=https://oss-cn-hangzhou.aliyuncs.com
```
#### **配置说明**
| 变量名 | 必需 | 默认值 | 说明 |
|--------|------|--------|------|
| `STORAGE_TYPE` | ✅ | `local` | 存储类型:`local``oss` |
| `BASE_URL` | 本地 | `http://localhost:3001` | 本地存储访问URL |
| `OSS_REGION` | 生产 | - | OSS区域oss-cn-hangzhou |
| `OSS_BUCKET` | 生产 | - | OSS Bucket名称 |
| `OSS_ACCESS_KEY_ID` | 生产 | - | 阿里云AccessKey ID |
| `OSS_ACCESS_KEY_SECRET` | 生产 | - | 阿里云AccessKey Secret |
---
### 2. 缓存服务配置
#### **本地开发环境**
```bash
# backend/.env.development
CACHE_TYPE=memory
```
#### **生产环境阿里云Redis**
```bash
# SAE控制台 -> 环境变量配置
CACHE_TYPE=redis
REDIS_HOST=r-***.redis.aliyuncs.com
REDIS_PORT=6379
REDIS_PASSWORD=***
REDIS_DB=0
```
#### **配置说明**
| 变量名 | 必需 | 默认值 | 说明 |
|--------|------|--------|------|
| `CACHE_TYPE` | ✅ | `memory` | 缓存类型:`memory``redis` |
| `REDIS_HOST` | Redis | - | Redis主机地址 |
| `REDIS_PORT` | Redis | `6379` | Redis端口 |
| `REDIS_PASSWORD` | Redis | - | Redis密码 |
| `REDIS_DB` | Redis | `0` | Redis数据库编号 |
---
### 3. 数据库连接池配置
#### **本地开发环境**
```bash
# backend/.env.development
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/ai_clinical_research
# 本地开发无需配置连接池
```
#### **生产环境阿里云RDS**
```bash
# SAE控制台 -> 环境变量配置
DATABASE_URL=postgresql://user:password@rm-xxx.aliyuncs.com:5432/prod_db
DB_MAX_CONNECTIONS=400 # RDS最大连接数
MAX_INSTANCES=20 # SAE最大实例数
```
#### **配置说明**
| 变量名 | 必需 | 默认值 | 说明 |
|--------|------|--------|------|
| `DATABASE_URL` | ✅ | - | PostgreSQL连接字符串 |
| `DB_MAX_CONNECTIONS` | 生产 | `400` | RDS最大连接数 |
| `MAX_INSTANCES` | 生产 | `20` | SAE最大实例数 |
**连接数计算**
```
每实例连接数 = DB_MAX_CONNECTIONS / MAX_INSTANCES
示例400 / 20 = 20连接/实例
```
---
### 4. 日志配置
```bash
# 通用配置
LOG_LEVEL=info # debug | info | warn | error
NODE_ENV=development # development | production | test
```
#### **配置说明**
| 变量名 | 必需 | 默认值 | 说明 |
|--------|------|--------|------|
| `LOG_LEVEL` | ✅ | `info` | 日志级别 |
| `NODE_ENV` | ✅ | `development` | 运行环境 |
---
### 5. 功能开关配置
```bash
# 启用的业务模块(逗号分隔)
ENABLED_MODULES=ASL,AIA,PKB,DC,SSA,ST
# 或启用全部
ENABLED_MODULES=*
```
#### **配置说明**
| 模块代码 | 模块名称 | 状态 |
|---------|---------|------|
| `ASL` | AI智能文献 | 开发中 |
| `AIA` | AI智能问答 | 已完成 |
| `PKB` | 个人知识库 | 已完成 |
| `DC` | 数据清洗 | 计划中 |
| `SSA` | 智能统计分析 | 计划中 |
| `ST` | 统计工具 | 计划中 |
---
### 6. 应用配置
```bash
# 应用基础配置
PORT=3001 # 应用端口
BASE_URL=http://localhost:3001
# JWT配置
JWT_SECRET=your-secret-key-here
JWT_EXPIRES_IN=7d
# CORS配置
CORS_ORIGIN=http://localhost:5173
```
---
## 📋 完整环境变量模板
### **backend/.env.development本地开发**
```bash
# ==================== 应用配置 ====================
NODE_ENV=development
PORT=3001
BASE_URL=http://localhost:3001
# ==================== 数据库配置 ====================
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/ai_clinical_research
# ==================== 存储服务 ====================
STORAGE_TYPE=local
# ==================== 缓存服务 ====================
CACHE_TYPE=memory
# ==================== 日志配置 ====================
LOG_LEVEL=debug
# ==================== LLM配置 ====================
DEEPSEEK_API_KEY=sk-***
QWEN_API_KEY=sk-***
# ==================== RAG配置 ====================
DIFY_API_BASE_URL=http://localhost/v1
DIFY_API_KEY=app-***
# ==================== JWT配置 ====================
JWT_SECRET=dev-secret-key-change-in-production
JWT_EXPIRES_IN=7d
# ==================== CORS配置 ====================
CORS_ORIGIN=http://localhost:5173
# ==================== 功能开关 ====================
ENABLED_MODULES=*
```
### **backend/.env.production生产环境**
```bash
# ==================== 应用配置 ====================
NODE_ENV=production
PORT=3001
# ==================== 数据库配置 ====================
DATABASE_URL=postgresql://user:password@rm-xxx.aliyuncs.com:5432/prod_db
DB_MAX_CONNECTIONS=400
MAX_INSTANCES=20
# ==================== 存储服务 ====================
STORAGE_TYPE=oss
OSS_REGION=oss-cn-hangzhou
OSS_BUCKET=aiclinical-prod
OSS_ACCESS_KEY_ID=LTAI5t***
OSS_ACCESS_KEY_SECRET=***
# ==================== 缓存服务 ====================
CACHE_TYPE=redis
REDIS_HOST=r-***.redis.aliyuncs.com
REDIS_PORT=6379
REDIS_PASSWORD=***
REDIS_DB=0
# ==================== 日志配置 ====================
LOG_LEVEL=info
# ==================== LLM配置 ====================
DEEPSEEK_API_KEY=sk-***
QWEN_API_KEY=sk-***
# ==================== RAG配置 ====================
DIFY_API_BASE_URL=https://api.dify.ai/v1
DIFY_API_KEY=app-***
# ==================== JWT配置 ====================
JWT_SECRET=<生产环境强密钥>
JWT_EXPIRES_IN=7d
# ==================== CORS配置 ====================
CORS_ORIGIN=https://app.yourdomain.com
# ==================== 功能开关 ====================
ENABLED_MODULES=ASL,AIA,PKB,DC,SSA,ST
```
---
## 📊 配置检查清单
使用以下清单验证配置完整性:
### **基础配置(必需)**
- [ ] ✅ 数据库连接成功(`npx prisma migrate status`
- [ ] ✅ 存储类型已配置(`STORAGE_TYPE`
- [ ] ✅ 日志级别已配置(`LOG_LEVEL`
- [ ] ✅ JWT密钥已配置
### **LLM配置必需**
- [ ] ✅ DeepSeek API Key配置且可用
- [ ] ✅ Qwen API Key配置且可用
- [ ] ✅ Dify服务运行中`docker-compose ps`
- [ ] ✅ Dify API Key已配置
### **平台基础设施(云原生)**
- [ ] ✅ 存储服务配置正确(本地/OSS
- [ ] ✅ 缓存服务配置正确Memory/Redis
- [ ] ✅ 连接池参数已配置(生产环境)
- [ ] ✅ 功能开关已配置ENABLED_MODULES
### **应用运行(必需)**
- [ ] ✅ 后端服务启动成功端口3001
- [ ] ✅ 前端服务启动成功端口5173
- [ ] ✅ CORS配置正确前端可访问后端API
- [ ] ✅ 可正常使用平台服务storage/logger/cache等
---
## 🔄 配置更新记录
| 日期 | 更新内容 | 更新人 |
|------|---------|--------|
| 2025-11-09 | 初始配置文档创建 | 技术团队 |
| 2025-11-16 | 新增平台基础设施配置章节 | 技术团队 |
---
## 📚 相关文档
- [数据库连接配置](../09-架构实施/02-数据库连接配置.md)
- [部署架构设计](../05-部署文档/01-部署架构设计.md)
- [系统架构总览](../00-项目概述/技术架构总览.md)
---
**文档版本:** v1.0
**最后更新:** 2025-11-09
**维护者:** 技术团队