# 知识管理平台自动化工具 - Docker部署版

这是一个基于 Docker 的知识管理平台自动化工具，支持多用户、定时任务、代理IP、VIP管理等功能。

---

## 项目简介

本项目是一个 **Docker 容器化应用**，使用 Flask + Requests + wkhtmltopdf + SQLite 构建，提供：

- 多用户注册登录系统
- 自动化任务（HTTP 模拟）
- 定时任务调度
- 截图管理
- VIP用户管理
- 代理IP支持
- 后台管理系统

---

## 技术栈

- **后端**: Python 3.8+, Flask
- **数据库**: SQLite
- **自动化**: Requests + BeautifulSoup
- **截图**: wkhtmltopdf / wkhtmltoimage
- **容器化**: Docker + Docker Compose
- **前端**: HTML + JavaScript + Socket.IO

---

## 项目结构

```
zsglpt/
├── app.py                          # 启动/装配入口
├── routes/                         # 路由层（Blueprint）
├── services/                       # 业务服务层
├── realtime/                       # SocketIO 事件与推送
├── database.py                     # 数据库稳定门面（对外 API）
├── db/                             # DB 分域实现 + schema/migrations
├── db_pool.py                      # 数据库连接池
├── api_browser.py                  # Requests 自动化（主浏览流程）
├── browser_pool_worker.py          # 截图 WorkerPool
├── app_config.py                   # 配置管理
├── app_logger.py                   # 日志系统
├── app_security.py                 # 安全模块
├── password_utils.py               # 密码工具
├── crypto_utils.py                 # 加解密工具
├── email_service.py                # 邮件服务
├── requirements.txt                # Python依赖
├── requirements-dev.txt            # 开发依赖（不进生产镜像）
├── pyproject.toml                  # ruff/black/pytest 配置
├── Dockerfile                      # Docker镜像构建文件
├── docker-compose.yml              # Docker编排文件
├── templates/                      # HTML模板（含 SPA fallback）
├── app-frontend/                   # 用户端前端源码（可选保留）
├── admin-frontend/                 # 后台前端源码（可选保留）
└── static/                         # 前端构建产物（运行时使用）
    ├── app/                        # 用户端 SPA
    └── admin/                      # 后台 SPA
```

---

## 部署前准备

### 1. 环境要求

- **服务器**: Linux (Ubuntu 20.04+ / CentOS 7+)
- **Docker**: 20.10+
- **Docker Compose**: 1.29+
- **内存**: 4GB+ (推荐8GB)
- **磁盘**: 20GB+

### 2. SSH连接

**注意**: 本文档假设你已经有服务器的SSH访问权限。

你需要准备：
- 服务器IP地址
- SSH用户名和密码（或SSH密钥）
- SSH端口（默认22）

**SSH连接示例**:
```bash
ssh root@your-server-ip
# 或使用密钥
ssh -i /path/to/key root@your-server-ip
```

---

## 快速部署

### 步骤1: 上传项目文件

将整个 `zsgpt2` 文件夹上传到服务器的 `/www/wwwroot/` 目录：

```bash
# 在本地执行（Windows PowerShell 或 Git Bash）
scp -r C:\Users\Administrator\Desktop\zsgpt2 root@your-server-ip:/www/wwwroot/

# 或者使用 FileZilla、WinSCP 等工具上传
```

上传后，服务器上的路径应该是：`/www/wwwroot/zsgpt2/`

### 步骤2: SSH登录服务器

```bash
ssh root@your-server-ip
```

### 步骤3: 进入项目目录

```bash
cd /www/wwwroot/zsgpt2
```

### 步骤4: 创建必要的目录

```bash
mkdir -p data logs 截图
chmod 777 data logs 截图
```

### 步骤5: 构建并启动Docker容器

```bash
# 构建镜像
docker build -t knowledge-automation .

# 启动容器
docker-compose up -d

# 查看容器状态
docker ps | grep knowledge-automation
```

### 步骤6: 检查容器日志

```bash
docker logs -f knowledge-automation-multiuser
```

如果看到以下信息，说明启动成功：
```
服务器启动中...
用户访问地址: http://0.0.0.0:5000
后台管理地址: http://0.0.0.0:5000/yuyx
```

---

## 配置Nginx反向代理（可选但推荐）

如果你想通过域名访问，需要配置Nginx反向代理。

### 1. 安装Nginx

```bash
# Ubuntu/Debian
apt update && apt install nginx -y

# CentOS/RHEL
yum install nginx -y
```

### 2. 创建Nginx配置文件

创建文件 `/etc/nginx/conf.d/zsgpt.conf`:

```nginx
server {
    listen 80;
    server_name your-domain.com;  # 替换为你的域名

    # 日志
    access_log /var/log/nginx/zsgpt_access.log;
    error_log /var/log/nginx/zsgpt_error.log;

    # 反向代理
    location / {
        proxy_pass http://127.0.0.1:5001;
        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 50M;

        # WebSocket支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;
    }
}
```

### 3. 重启Nginx

```bash
nginx -t           # 测试配置
nginx -s reload    # 重新加载配置
```

### 4. 配置SSL（推荐）

```bash
# 安装certbot
apt install certbot python3-certbot-nginx -y

# 申请证书
certbot --nginx -d your-domain.com

# 自动续期
certbot renew --dry-run
```

---

## 访问系统

### 用户端

- **HTTP**: `http://your-server-ip:5001`
- **域名**: `http://your-domain.com` (配置Nginx后)
- **HTTPS**: `https://your-domain.com` (配置SSL后)

### 后台管理

- **路径**: `/yuyx`
- **默认账号**: `admin`
- **默认密码**: `admin`

**首次登录后请立即修改密码！**

---

## 系统配置

登录后台后，在"系统配置"页面可以设置：

### 1. 并发控制
- **全局最大并发**: 2 (根据服务器配置调整)
- **单用户并发**: 1

### 2. 定时任务
- **启用定时浏览**: 是/否
- **执行时间**: 02:00 (CST时间)
- **浏览类型**: 应读/注册前未读
- **执行日期**: 周一到周日

### 3. 代理配置
- **启用代理**: 是/否
- **API地址**: http://your-proxy-api.com
- **IP有效期**: 3分钟

---

## Docker常用命令

### 容器管理

```bash
# 启动容器
docker start knowledge-automation-multiuser

# 停止容器
docker stop knowledge-automation-multiuser

# 重启容器
docker restart knowledge-automation-multiuser

# 删除容器
docker rm -f knowledge-automation-multiuser

# 查看容器状态
docker ps -a | grep knowledge-automation
```

### 日志查看

```bash
# 查看实时日志
docker logs -f knowledge-automation-multiuser

# 查看最近100行日志
docker logs --tail 100 knowledge-automation-multiuser

# 查看应用日志文件
tail -f /www/wwwroot/zsgpt2/logs/app.log
```

### 进入容器

```bash
# 进入容器Shell
docker exec -it knowledge-automation-multiuser bash

# 在容器内执行命令
docker exec knowledge-automation-multiuser python -c "print('Hello')"
```

### 重新构建

如果修改了代码，需要重新构建：

```bash
cd /www/wwwroot/zsgpt2

# 停止并删除旧容器
docker-compose down

# 重新构建并启动
docker-compose build
docker-compose up -d
```

---

## 数据备份与恢复

### 1. 备份数据

```bash
cd /www/wwwroot

# 备份整个项目
tar -czf zsgpt2_backup_$(date +%Y%m%d).tar.gz zsgpt2/

# 仅备份数据库
cp /www/wwwroot/zsgpt2/data/app_data.db /backup/app_data_$(date +%Y%m%d).db

# 备份截图
tar -czf screenshots_$(date +%Y%m%d).tar.gz /www/wwwroot/zsgpt2/截图/
```

### 2. 恢复数据

```bash
# 停止容器
docker stop knowledge-automation-multiuser

# 恢复整个项目
cd /www/wwwroot
tar -xzf zsgpt2_backup_20251027.tar.gz

# 恢复数据库
cp /backup/app_data_20251027.db /www/wwwroot/zsgpt2/data/app_data.db

# 重启容器
docker start knowledge-automation-multiuser
```

### 3. 定时备份

添加cron任务自动备份：

```bash
crontab -e
```

添加以下内容：

```bash
# 每天凌晨3点备份
0 3 * * * tar -czf /backup/zsgpt2_$(date +\%Y\%m\%d).tar.gz /www/wwwroot/zsgpt2/data
```

---

## 常见问题

### 1. 容器启动失败

**问题**: `docker-compose up -d` 失败

**解决方案**:
```bash
# 查看详细错误
docker-compose logs

# 检查端口占用
netstat -tlnp | grep 5001

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

### 2. 502 Bad Gateway

**问题**: Nginx返回502错误

**解决方案**:
```bash
# 检查容器是否运行
docker ps | grep knowledge-automation

# 检查端口是否监听
netstat -tlnp | grep 5001

# 测试直接访问
curl http://127.0.0.1:5001

# 检查Nginx配置
nginx -t
```

### 3. 数据库锁定

**问题**: "database is locked"

**解决方案**:
```bash
# 重启容器
docker restart knowledge-automation-multiuser

# 如果问题持续,优化数据库
cd /www/wwwroot/zsgpt2
cp data/app_data.db data/app_data.db.backup
sqlite3 data/app_data.db "VACUUM;"
```

### 4. 内存不足

**问题**: 容器OOM (Out of Memory)

**解决方案**:

修改 `docker-compose.yml`：

```yaml
services:
  knowledge-automation:
    mem_limit: 2g
    memswap_limit: 2g
```

然后重启：

```bash
docker-compose down
docker-compose up -d
```

### 5. 截图工具未安装

**问题**: wkhtmltoimage 命令不存在

**解决方案**:
```bash
# 进入容器手动安装
docker exec -it knowledge-automation-multiuser bash
apt-get update
apt-get install -y wkhtmltopdf

# 验证安装
wkhtmltoimage --version
```

---

## 性能优化

### 1. 调整并发参数

根据服务器配置调整：
- **2核4GB**: 全局并发=1, 单用户并发=1
- **4核8GB**: 全局并发=2, 单用户并发=1
- **8核16GB**: 全局并发=4, 单用户并发=2

### 2. 启用代理IP

避免IP被封，提高成功率：
- 选择稳定的代理服务商
- 设置合适的IP有效期（3-5分钟）
- 启用自动重试机制

### 3. 定期清理数据

系统会自动清理7天前的数据，也可以手动清理：

```bash
# 清理7天前的截图
find /www/wwwroot/zsgpt2/截图 -name "*.jpg" -mtime +7 -delete

# 清理旧日志
find /www/wwwroot/zsgpt2/logs -name "*.log" -mtime +30 -delete

# 优化数据库
sqlite3 /www/wwwroot/zsgpt2/data/app_data.db "VACUUM;"
```

---

## 安全建议

### 1. 修改默认密码

首次登录后立即修改：
- 管理员密码
- 用户密码

### 2. 配置防火墙

```bash
# 只开放必要端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload

# 禁止直接访问5001端口（仅Nginx可访问）
iptables -A INPUT -p tcp --dport 5001 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 5001 -j DROP
```

### 3. 启用HTTPS

强烈建议使用HTTPS加密传输：

```bash
certbot --nginx -d your-domain.com
```

### 4. 限制SSH访问

```bash
# 修改SSH端口（可选）
vi /etc/ssh/sshd_config
# Port 22222

# 禁止root密码登录（使用密钥）
PermitRootLogin prohibit-password
PasswordAuthentication no

# 重启SSH服务
systemctl restart sshd
```

---

## 监控与维护

### 1. 系统监控

推荐使用以下工具：
- **Docker Stats**: `docker stats knowledge-automation-multiuser`
- **Grafana + Prometheus**: 可视化监控
- **Uptime Kuma**: 服务可用性监控

### 2. 日志分析

```bash
# 统计今日任务数
grep "浏览完成" /www/wwwroot/zsgpt2/logs/app.log | grep $(date +%Y-%m-%d) | wc -l

# 查看错误日志
grep "ERROR" /www/wwwroot/zsgpt2/logs/app.log | tail -20

# 查看最近的登录
grep "登录成功" /www/wwwroot/zsgpt2/logs/app.log | tail -10
```

### 3. 数据库维护

```bash
# 定期优化数据库（每月一次）
docker exec knowledge-automation-multiuser python3 << 'EOF'
import sqlite3
conn = sqlite3.connect('/app/data/app_data.db')
conn.execute('VACUUM')
conn.close()
print("数据库优化完成")
EOF
```

---

## 更新升级

### 1. 更新代码

```bash
# 停止容器
docker-compose down

# 备份数据
cp -r data data.backup
cp -r 截图 截图.backup

# 上传新代码（覆盖旧文件）
# 使用 scp 或 FTP 工具上传

# 重新构建并启动
docker-compose build
docker-compose up -d
```

### 2. 数据库迁移

如果数据库结构有变化，应用会自动迁移。

查看迁移日志：

```bash
docker logs knowledge-automation-multiuser | grep "数据库"
```

---

## 端口说明

| 端口 | 说明 | 映射 |
|------|------|------|
| 5000 | 容器内应用端口 | - |
| 5001 | 主机映射端口 | 容器5000 → 主机5001 |
| 80 | HTTP端口 | Nginx |
| 443 | HTTPS端口 | Nginx |

---

## 环境变量

可以在 `docker-compose.yml` 中设置的环境变量：

| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| TZ | 时区 | Asia/Shanghai |
| PYTHONUNBUFFERED | Python输出缓冲 | 1 |
| WKHTMLTOIMAGE_PATH | wkhtmltoimage 可执行文件路径 | 自动探测 |
| WKHTMLTOIMAGE_JS_DELAY_MS | JS 等待时间（毫秒） | 3000 |
| WKHTMLTOIMAGE_WIDTH | 截图宽度 | 1920 |
| WKHTMLTOIMAGE_HEIGHT | 截图高度（视口高度） | 1080 |
| WKHTMLTOIMAGE_FULL_PAGE | 是否输出全页截图（忽略视口高度/裁剪） | 0 |
| WKHTMLTOIMAGE_ZOOM | 渲染缩放比例 | 1.0 |
| WKHTMLTOIMAGE_CROP_WIDTH | 裁剪宽度（0 表示不裁剪） | 默认跟随截图宽度 |
| WKHTMLTOIMAGE_CROP_HEIGHT | 裁剪高度（0 表示不裁剪） | 默认跟随截图高度 |
| WKHTMLTOIMAGE_CROP_X | 裁剪起点 X | 0 |
| WKHTMLTOIMAGE_CROP_Y | 裁剪起点 Y | 0 |
| WKHTMLTOIMAGE_QUALITY | JPG截图质量 | 95 |
| WKHTMLTOIMAGE_TIMEOUT_SECONDS | 截图超时时间（秒） | 60 |
| WKHTMLTOIMAGE_USER_AGENT | 截图使用的 UA | Chrome 120 |

---

## 技术支持

### 项目信息

- **项目名称**: 知识管理平台自动化工具
- **版本**: Docker 多用户版
- **技术栈**: Python + Flask + Requests + wkhtmltopdf + SQLite + Docker

### 常用文档链接

- [Docker 官方文档](https://docs.docker.com/)
- [Flask 官方文档](https://flask.palletsprojects.com/)
- [wkhtmltopdf 官方文档](https://wkhtmltopdf.org/)

### 故障排查

遇到问题时，请按以下顺序检查：

1. **容器日志**: `docker logs knowledge-automation-multiuser`
2. **应用日志**: `cat /www/wwwroot/zsgpt2/logs/app.log`
3. **Nginx日志**: `cat /var/log/nginx/zsgpt_error.log`
4. **系统资源**: `docker stats`, `htop`, `df -h`

---

## 许可证

本项目仅供学习和研究使用。

---

**文档版本**: v1.0
**更新日期**: 2025-10-29
**适用版本**: Docker多用户版

---

## 快速上手命令清单

```bash
# 1. 上传文件
scp -r zsgpt2 root@your-ip:/www/wwwroot/

# 2. SSH登录
ssh root@your-ip

# 3. 进入目录并创建必要目录
cd /www/wwwroot/zsgpt2
mkdir -p data logs 截图
chmod 777 data logs 截图

# 4. 启动容器
docker-compose up -d

# 5. 查看日志
docker logs -f knowledge-automation-multiuser

# 6. 访问系统
# 浏览器打开: http://your-ip:5001
# 后台管理: http://your-ip:5001/yuyx
# 默认账号: admin / admin
```

完成！🎉
