# Paper Burner X 部署指南

本指南介绍如何部署 Paper Burner X 的 Docker 版本（包含后端和数据库）。

---

## 📋 目录

1. [快速开始](#快速开始)
2. [环境变量配置](#环境变量配置)
3. [部署方式](#部署方式)
4. [常见问题](#常见问题)

---

## 🚀 快速开始

### 前置要求

- Docker 和 Docker Compose 已安装
- Git 已安装（用于克隆仓库）

### 快速部署步骤

```bash
# 1. 克隆仓库
git clone https://github.com/Feather-2/paper-burner-x.git
cd paper-burner-x

# 2. 复制环境变量模板
cp .env.example .env

# 3. 编辑环境变量（重要！）
nano .env  # 或使用其他编辑器

# 4. 启动服务
docker-compose up -d

# 5. 查看日志
docker-compose logs -f
```

---

## 🔧 环境变量配置

### 第一步：复制模板文件

```bash
cp .env.example .env
```

### 第二步：编辑 `.env` 文件

打开 `.env` 文件并修改以下**必须配置**的项目：

#### ⚠️ 必须修改的配置

```bash
# 1. 数据库密码（强烈建议修改）
DB_PASSWORD=你的超强密码123!@#

# 2. JWT 密钥（必须修改，至少 32 个字符）
JWT_SECRET=你的超级安全密钥-至少32个字符-请使用随机字符串

# 3. 管理员账户（首次启动时创建）
ADMIN_EMAIL=admin@yourdomain.com
ADMIN_PASSWORD=你的管理员密码
ADMIN_NAME=管理员
```

#### 🔑 生成安全密钥的方法

**方法 1：使用 OpenSSL（推荐）**
```bash
# 生成 JWT 密钥
openssl rand -base64 32

# 生成数据库密码
openssl rand -base64 24
```

**方法 2：使用 Node.js**
```bash
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
```

**方法 3：在线生成器**
访问 https://randomkeygen.com/ 生成强密码

#### 📝 可选配置

```bash
# OCR 服务（如果需要 OCR 功能）
MINERU_API_TOKEN=your_mineru_token
DOC2X_API_TOKEN=your_doc2x_token

# AI 翻译模型（如果需要后端提供 API keys）
DEEPSEEK_API_KEY=your_deepseek_key
GEMINI_API_KEY=your_gemini_key
CLAUDE_API_KEY=your_claude_key
TONGYI_API_KEY=your_tongyi_key
VOLCANO_API_KEY=your_volcano_key

# CORS 配置（如果需要限制访问域名）
CORS_ORIGIN=https://yourdomain.com,https://app.yourdomain.com

# 其他配置
MAX_UPLOAD_SIZE=100  # 文件上传大小限制（MB）
LOG_LEVEL=info       # 日志级别
```

### 第三步：验证配置

检查你的 `.env` 文件是否包含所有必要的配置：

```bash
# 检查关键配置是否存在
grep -E "DB_PASSWORD|JWT_SECRET|ADMIN_EMAIL|ADMIN_PASSWORD" .env
```

---

## 🐳 部署方式

### 方式 1：使用 Docker Compose（推荐）

**启动服务：**
```bash
docker-compose up -d
```

**查看日志：**
```bash
docker-compose logs -f
```

**停止服务：**
```bash
docker-compose down
```

**重启服务：**
```bash
docker-compose restart
```

**查看运行状态：**
```bash
docker-compose ps
```

### 方式 2：使用一键部署脚本

**Linux/Mac：**
```bash
chmod +x scripts/deploy.sh
./scripts/deploy.sh
```

**Windows (PowerShell)：**
```powershell
.\scripts\deploy.ps1
```

### 方式 3：从 Docker Hub 拉取镜像

```bash
# 拉取最新镜像
docker pull feather2dev/paper-burner-x:latest

# 手动运行（需要先启动 PostgreSQL）
docker run -d \
  --name paper-burner-x \
  -p 3000:3000 \
  -e DATABASE_URL="postgresql://user:pass@host:5432/dbname" \
  -e JWT_SECRET="your-secret-key" \
  -e ADMIN_EMAIL="admin@example.com" \
  -e ADMIN_PASSWORD="admin-password" \
  feather2dev/paper-burner-x:latest
```

---

## 🔍 验证部署

### 1. 检查服务状态

```bash
# 检查容器是否运行
docker-compose ps

# 应该看到两个服务都是 "Up" 状态：
# - paper-burner-x_app
# - paper-burner-x_postgres
```

### 2. 访问服务

- **前端界面**: http://localhost:3000
- **管理面板**: http://localhost:3000/admin
- **API 健康检查**: http://localhost:3000/api/health

### 3. 测试管理员登录

1. 访问 http://localhost:3000/admin
2. 使用 `.env` 中配置的管理员邮箱和密码登录
3. 如果登录成功，说明后端和数据库都正常工作

---

## 🔄 更新部署

### 从 Git 仓库更新

```bash
# 1. 停止服务
docker-compose down

# 2. 拉取最新代码
git pull origin main

# 3. 重新构建镜像
docker-compose build --no-cache

# 4. 启动服务
docker-compose up -d
```

### 从 Docker Hub 更新

```bash
# 1. 停止服务
docker-compose down

# 2. 拉取最新镜像
docker-compose pull

# 3. 启动服务
docker-compose up -d
```

---

## 📊 数据管理

### 数据库备份

```bash
# 备份数据库
docker-compose exec postgres pg_dump -U paperburner paperburner > backup_$(date +%Y%m%d).sql

# 或使用 Docker 卷备份
docker run --rm \
  -v paper-burner-x_postgres_data:/data \
  -v $(pwd):/backup \
  alpine tar czf /backup/postgres_data_backup.tar.gz /data
```

### 数据库恢复

```bash
# 从 SQL 文件恢复
docker-compose exec -T postgres psql -U paperburner paperburner < backup_20250115.sql
```

### 查看数据库

```bash
# 进入数据库容器
docker-compose exec postgres psql -U paperburner -d paperburner

# 常用 SQL 命令
\dt              # 列出所有表
\d User          # 查看 User 表结构
SELECT * FROM "User" LIMIT 5;  # 查看用户数据
```

---

## 🐛 常见问题

### 1. 数据库连接失败

**错误信息：**
```
Error: Environment variable not found: DATABASE_URL
```

**解决方法：**
- 检查 `.env` 文件是否存在
- 检查 `docker-compose.yml` 是否正确引用了 `.env`
- 确保 PostgreSQL 容器已启动：`docker-compose ps`

### 2. 管理员账户无法登录

**可能原因：**
- 首次启动时 `.env` 中的管理员配置不正确
- 数据库中管理员账户未创建

**解决方法：**
```bash
# 查看容器日志，确认管理员是否创建成功
docker-compose logs app | grep -i admin

# 重新创建管理员账户
docker-compose exec app node server/src/utils/initAdmin.js
```

### 3. 端口冲突

**错误信息：**
```
Error: port is already allocated
```

**解决方法：**
修改 `docker-compose.yml` 中的端口映射：
```yaml
ports:
  - "3001:3000"  # 改为 3001 或其他可用端口
```

### 4. 容器启动后立即退出

**排查步骤：**
```bash
# 1. 查看详细日志
docker-compose logs

# 2. 检查环境变量
docker-compose config

# 3. 重新构建
docker-compose build --no-cache
docker-compose up
```

### 5. OpenSSL 兼容性问题（已修复）

如果你使用旧版本的代码遇到以下错误：
```
Error loading shared library libssl.so.1.1
```

**解决方法：**
拉取最新代码，已修复此问题（使用 OpenSSL 3.x）

---

## 🔒 生产环境安全建议

### 1. 使用 HTTPS

使用 Nginx 或 Traefik 作为反向代理，配置 SSL 证书：

```bash
# 在 docker-compose.yml 中启用 Nginx 服务
# 取消注释 nginx 服务部分
```

### 2. 修改默认密码

- ✅ 修改 `DB_PASSWORD`
- ✅ 修改 `JWT_SECRET`（至少 32 个字符）
- ✅ 修改 `ADMIN_PASSWORD`

### 3. 限制 CORS

```bash
# 在 .env 中设置允许的域名
CORS_ORIGIN=https://yourdomain.com
```

### 4. 启用防火墙

```bash
# 只允许特定端口访问
ufw allow 80/tcp
ufw allow 443/tcp
ufw deny 3000/tcp  # 禁止直接访问应用端口
```

### 5. 定期备份

设置定时任务自动备份数据库：
```bash
# 添加到 crontab
0 2 * * * /path/to/backup-script.sh
```

---

## 📚 相关文档

- [README.md](./README.md) - 项目介绍
- [LOCAL_TESTING.md](./LOCAL_TESTING.md) - 本地测试指南
- [docker-compose.yml](./docker-compose.yml) - Docker Compose 配置
- [Dockerfile](./Dockerfile) - Docker 镜像构建配置

---

## 💡 需要帮助？

- 📖 查看文档：[GitHub Wiki](https://github.com/Feather-2/paper-burner-x/wiki)
- 🐛 报告问题：[GitHub Issues](https://github.com/Feather-2/paper-burner-x/issues)
- 💬 讨论交流：[GitHub Discussions](https://github.com/Feather-2/paper-burner-x/discussions)

---

**祝部署顺利！🎉**
