# Data 目录说明

GoProxy 的所有运行时数据和配置存储在数据目录中。

**默认配置**（`docker-compose.yml`）：使用 Docker Named Volume `goproxy-data`，由 Docker 自动管理，数据持久化且独立于容器生命周期。

## 📁 目录内容

### 1. SQLite 数据库文件

**`proxy.db`** - 主数据库文件（约 1-10MB，取决于池子大小）

包含两张表：

**`proxies` 表**：代理池数据
- 代理地址、协议类型
- 出口 IP、地理位置
- 延迟、质量等级
- 使用统计（使用次数、成功次数、失败次数）
- 状态信息（active/degraded/candidate_replace）
- 时间戳（最后使用、最后检查、创建时间）

**`source_status` 表**：代理源状态
- 源 URL
- 成功/失败次数、连续失败次数
- 最后成功/失败时间
- 状态（active/degraded/disabled）
- 禁用到期时间

### 2. SQLite WAL 模式文件

**`proxy.db-shm`** - 共享内存文件（临时）
- WAL 模式的索引文件
- 进程运行时存在，停止后可能自动删除

**`proxy.db-wal`** - 预写日志文件（临时）
- 存储未提交的数据库事务
- checkpoint 后会合并到主数据库
- 提高并发性能

### 3. 配置文件

**`config.json`** - 运行时配置（通过 WebUI 修改的配置）

包含：
- 池子容量配置（max_size、http_ratio、min_per_protocol）
- 延迟标准配置（max_latency_*）
- 验证配置（concurrency、timeout）
- 健康检查配置（interval、batch_size）
- 优化配置（interval、replace_threshold）

> 💡 **注意**：`config.json` 是运行时生成的，首次启动时不存在，使用默认配置。通过 WebUI 修改配置后会自动保存到此文件。

## 📍 数据位置

### Dokploy / 生产部署（Named Volume）

**卷名称**：`goproxy-data`

**实际位置**（Linux）：
```bash
/var/lib/docker/volumes/goproxy-data/_data/
```

**查看数据**：
```bash
# 进入运行中的容器
docker exec -it proxygo sh

# 查看数据目录
ls -lh /app/data/

# 查看数据库
sqlite3 /app/data/proxy.db "SELECT COUNT(*) FROM proxies;"
```

**备份数据**：
```bash
# 手动导出卷
docker run --rm -v goproxy-data:/data -v $(pwd):/backup \
  alpine tar czf /backup/goproxy-backup-$(date +%Y%m%d).tar.gz -C /data .
```

**恢复数据**：
```bash
# 停止服务
docker compose down

# 恢复备份
docker run --rm -v goproxy-data:/data -v $(pwd):/backup \
  alpine sh -c "cd /data && tar xzf /backup/goproxy-backup-20260328.tar.gz"

# 重启服务
docker compose up -d
```

### 本地开发（相对路径挂载）

如果使用 `docker run -v "$(pwd)/data:/app/data"`，数据会保存在项目目录的 `./data` 文件夹中。

**查看数据**：
```bash
# 直接查看宿主机目录
ls -lh data/

# 查看数据库
sqlite3 data/proxy.db "SELECT COUNT(*) FROM proxies;"
```

**备份数据**：
```bash
# 简单打包
tar czf goproxy-backup-$(date +%Y%m%d).tar.gz data/

# 或仅备份数据库
cp data/proxy.db backups/proxy-$(date +%Y%m%d).db
```

## 🐳 Docker 挂载配置

### 使用 Named Volume（推荐）

在 `docker-compose.yml` 中：

```yaml
volumes:
  - goproxy-data:/app/data  # Named Volume

volumes:
  goproxy-data:              # 定义卷
```

**优势**：
- ✅ 数据持久化，容器删除不丢失
- ✅ Docker 自动管理，无需关心具体路径
- ✅ 支持备份和迁移
- ✅ 适合生产环境和自动化部署

### 使用本地目录（本地开发）

在 `docker run` 中：

```bash
docker run -v "$(pwd)/data:/app/data" ...
```

### 为什么需要持久化？

**持久化数据**：
- 容器重启/更新后代理池数据不丢失
- 配置修改持久保存
- 源状态（断路器）持续跟踪

**不挂载的后果**：
- ❌ 每次重启都需要重新抓取代理（耗时、耗资源）
- ❌ WebUI 的配置修改会丢失
- ❌ 源的失败记录清零（可能重复尝试失效源）

### Docker Compose 配置

```yaml
volumes:
  - ${DATA_DIR:-./data}:/app/data
```

**说明**：
- 宿主机目录：`./data`（docker-compose.yml 所在目录下）
- 容器内路径：`/app/data`
- 首次启动会自动创建 `data/` 目录

### Docker Run 配置

```bash
docker run -d \
  -v "$(pwd)/data:/app/data" \  # 挂载 data 目录
  -e DATA_DIR=/app/data \        # 告诉程序数据目录位置
  ghcr.io/isboyjc/goproxy:latest
```

## 📊 数据大小

根据池子配置，预计文件大小：

| 池子大小 | proxy.db | proxy.db-wal | config.json | 总计 |
|---------|----------|--------------|-------------|------|
| 50 个代理 | ~1 MB | ~200 KB | ~500 B | ~1.2 MB |
| 100 个代理 | ~2 MB | ~400 KB | ~500 B | ~2.4 MB |
| 200 个代理 | ~4 MB | ~800 KB | ~500 B | ~4.8 MB |
| 500 个代理 | ~10 MB | ~2 MB | ~500 B | ~12 MB |

> 💡 **注意**：WAL 文件大小会动态变化，checkpoint 后会重置。

## 🔍 查看数据

### 查看数据库内容

```bash
# 进入 data 目录
cd data/

# 查看所有代理
sqlite3 proxy.db "SELECT address, protocol, exit_location, latency, quality_grade FROM proxies LIMIT 10;"

# 查看质量分布
sqlite3 proxy.db "SELECT quality_grade, COUNT(*) FROM proxies GROUP BY quality_grade;"

# 查看国家分布
sqlite3 proxy.db "SELECT SUBSTR(exit_location, 1, 2) AS country, COUNT(*) FROM proxies GROUP BY country ORDER BY COUNT(*) DESC;"

# 查看源状态
sqlite3 proxy.db "SELECT url, status, consecutive_fails, last_success FROM source_status;"
```

### 查看配置文件

```bash
cat data/config.json | jq .
```

如果还没有通过 WebUI 修改配置，这个文件可能不存在（使用默认配置）。

## 🧹 清理数据

### 重置代理池（保留配置）

```bash
# 仅清空代理表
sqlite3 data/proxy.db "DELETE FROM proxies;"

# 或删除整个数据库（下次启动重新创建）
rm -f data/proxy.db*
```

### 完全重置（包括配置）

```bash
# 删除整个 data 目录
rm -rf data/

# 下次启动会自动创建并使用默认配置
```

### Docker 容器重置

```bash
# 停止并删除容器
docker compose down

# 删除数据卷
rm -rf data/

# 重新启动（全新环境）
docker compose up -d
```

## 🔒 备份数据

### 手动备份

```bash
# 备份整个 data 目录
tar -czf goproxy-backup-$(date +%Y%m%d).tar.gz data/

# 或仅备份数据库
cp data/proxy.db backups/proxy-$(date +%Y%m%d).db
```

### 定时备份脚本

```bash
#!/bin/bash
# backup.sh

BACKUP_DIR="backups"
DATE=$(date +%Y%m%d-%H%M%S)

mkdir -p $BACKUP_DIR
cp data/proxy.db "$BACKUP_DIR/proxy-$DATE.db"

# 保留最近 7 天的备份
find $BACKUP_DIR -name "proxy-*.db" -mtime +7 -delete

echo "✅ 备份完成: $BACKUP_DIR/proxy-$DATE.db"
```

### 恢复数据

```bash
# 停止服务
docker compose down

# 恢复数据库
cp backups/proxy-20260328.db data/proxy.db

# 重启服务
docker compose up -d
```

## ⚠️ 注意事项

1. **WAL 文件**：停止服务前会自动 checkpoint，无需手动处理
2. **并发安全**：多个容器不要共享同一个 data 目录（SQLite 不支持多进程写入）
3. **权限问题**：确保容器有权限读写 data 目录
4. **备份时机**：建议在服务停止时备份，避免数据不一致
5. **迁移数据**：直接复制整个 data 目录到新服务器即可
