Files
GoProxy/DATA_DIRECTORY.md
isboyjc 0cff1ea6a6 docs: 📝 update environment configuration and data directory documentation
- Revised `.env.example` to clarify data storage configuration for local development and Docker usage.
- Enhanced `DATA_DIRECTORY.md` with detailed instructions on data persistence, backup, and recovery using Docker Named Volumes.
- Updated `docker-compose.yml` to utilize Named Volume for data storage, ensuring data persistence across container lifecycles.
- Adjusted README to reflect changes in data directory management and deployment instructions.
2026-03-29 05:17:56 +08:00

7.1 KiB
Raw Blame History

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

/var/lib/docker/volumes/goproxy-data/_data/

查看数据

# 进入运行中的容器
docker exec -it proxygo sh

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

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

备份数据

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

恢复数据

# 停止服务
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 文件夹中。

查看数据

# 直接查看宿主机目录
ls -lh data/

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

备份数据

# 简单打包
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 中:

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

volumes:
  goproxy-data:              # 定义卷

优势

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

使用本地目录(本地开发)

docker run 中:

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

为什么需要持久化?

持久化数据

  • 容器重启/更新后代理池数据不丢失
  • 配置修改持久保存
  • 源状态(断路器)持续跟踪

不挂载的后果

  • 每次重启都需要重新抓取代理(耗时、耗资源)
  • WebUI 的配置修改会丢失
  • 源的失败记录清零(可能重复尝试失效源)

Docker Compose 配置

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

说明

  • 宿主机目录:./datadocker-compose.yml 所在目录下)
  • 容器内路径:/app/data
  • 首次启动会自动创建 data/ 目录

Docker Run 配置

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 后会重置。

🔍 查看数据

查看数据库内容

# 进入 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;"

查看配置文件

cat data/config.json | jq .

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

🧹 清理数据

重置代理池(保留配置)

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

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

完全重置(包括配置)

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

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

Docker 容器重置

# 停止并删除容器
docker compose down

# 删除数据卷
rm -rf data/

# 重新启动(全新环境)
docker compose up -d

🔒 备份数据

手动备份

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

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

定时备份脚本

#!/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"

恢复数据

# 停止服务
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 目录到新服务器即可