{"id":49919993,"url":"https://github.com/losret/rustracker","last_synced_at":"2026-05-18T20:01:26.841Z","repository":{"id":357938775,"uuid":"1238154786","full_name":"LOSRET/rustracker","owner":"LOSRET","description":"A lightweight, high-performance HTTP BitTorrent tracker with a real-time dashboard, written in Rust","archived":false,"fork":false,"pushed_at":"2026-05-16T19:41:28.000Z","size":204091,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-16T19:49:57.290Z","etag":null,"topics":["bencode","bittorrent","bittorrent-tracker","rust","tracker"],"latest_commit_sha":null,"homepage":"https://tracker.7471.top","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LOSRET.png","metadata":{"files":{"readme":"README-zh.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-13T21:36:53.000Z","updated_at":"2026-05-16T19:38:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/LOSRET/rustracker","commit_stats":null,"previous_names":["losret/rustracker"],"tags_count":34,"template":false,"template_full_name":null,"purl":"pkg:github/LOSRET/rustracker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LOSRET%2Frustracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LOSRET%2Frustracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LOSRET%2Frustracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LOSRET%2Frustracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LOSRET","download_url":"https://codeload.github.com/LOSRET/rustracker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LOSRET%2Frustracker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33189279,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-18T09:27:30.708Z","status":"ssl_error","status_checked_at":"2026-05-18T09:27:28.300Z","response_time":71,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bencode","bittorrent","bittorrent-tracker","rust","tracker"],"created_at":"2026-05-16T19:14:03.653Z","updated_at":"2026-05-18T20:01:26.798Z","avatar_url":"https://github.com/LOSRET.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"[English](./README.md) | 中文\n\n# rustracker\n\n[![Version](https://img.shields.io/badge/version-0.1.88-blue.svg)](https://github.com/LOSRET/rustracker/releases)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](./LICENSE)\n[![Rust](https://img.shields.io/badge/Rust-2021--edition-orange.svg)](https://www.rust-lang.org)\n\n一个轻量、高性能的 HTTP BitTorrent 跟踪器，内置实时监控面板，使用 Rust 编写。\n\n## 功能亮点\n\n**核心协议**\n- 符合 BEP 3 规范的 `announce` 和 `scrape` 端点\n- 紧凑的 IPv4/IPv6 peer 编码\n- Bencode 编码的跟踪器响应\n- 可配置的通告间隔和 peer 超时时间\n\n**实时监控面板**\n- Web 面板与 Tracker 共用同一 HTTP 端口，无需独立前端服务\n- ECharts 趋势图表：种子数、Peer 数、做种数、下载数，支持 24小时 / 3天 / 7天 时间范围\n- Top 100 种子页面，支持按 Peers / Seeders / Leechers / Downloaded 排序\n- Top 15 客户端分布趋势图\n- 中英文双语界面，自动检测语言\n\n**运维特性**\n- 64 分片并发 Tracker 池，高吞吐低争用\n- 102 种 BitTorrent 客户端识别（qBittorrent、Transmission、µTorrent、Aria2、迅雷等）\n- 种子黑名单热重载——编辑文件即可生效，无需重启\n- 可选的趋势数据持久化到 JSONL（7 天保留，10 分钟采样）\n- Ctrl+C / SIGTERM 优雅关闭\n- 基于 `tracing` 的结构化日志，支持 `RUST_LOG` 环境变量过滤\n\n**部署**\n- 单一二进制文件，零外部依赖\n- Linux `systemd` 安装脚本，提供中文交互菜单\n- GitHub Actions CI/CD：版本号变更时自动构建并发布\n\n## 快速开始\n\n### 前置要求\n\n- [Rust](https://www.rust-lang.org/tools/install) 1.74+（edition 2021）\n\n### 从源码构建并运行\n\n```bash\ngit clone https://github.com/LOSRET/rustracker.git\ncd rustracker\ncargo run --release -- --listen 127.0.0.1:8080\n```\n\n在浏览器中打开 `http://127.0.0.1:8080` 即可查看监控面板。\n\n### 预编译二进制\n\n从 [GitHub Releases](https://github.com/LOSRET/rustracker/releases) 下载最新版本：\n- `rustracker.exe` — Windows x86_64\n- `rustracker-linux` — Linux x86_64\n- `rustracker-linux-vX.Y.Z.tar.gz` — Linux 归档包（含安装脚本）\n\n## 命令行参数\n\n| 参数 | 环境变量 | 默认值 | 说明 |\n|------|---------|--------|------|\n| `--listen` | `RUSTRACKER_LISTEN` | `0.0.0.0:8080` | 监听地址 |\n| `--interval-secs` | `RUSTRACKER_INTERVAL_SECS` | `1800` | 通告间隔（秒） |\n| `--peer-timeout-secs` | `RUSTRACKER_PEER_TIMEOUT_SECS` | `3000` | Peer 过期超时（秒） |\n| `--blacklist` | `RUSTRACKER_BLACKLIST` | — | 种子黑名单文件路径 |\n| `--trends-file` | `RUSTRACKER_TRENDS_FILE` | — | 趋势数据 JSONL 持久化路径 |\n\n每个参数均可通过环境变量或命令行参数设置，命令行优先。\n\n```bash\n# 示例：使用环境变量\nexport RUSTRACKER_LISTEN=0.0.0.0:6969\nexport RUSTRACKER_INTERVAL_SECS=900\ncargo run --release\n```\n\n## API 端点\n\n### 健康检查\n\n```\nGET /healthz\n```\n\n响应：`200 OK`，内容为 `ok`。\n\n### Announce（通告）\n\n```\nGET /announce?info_hash=\u003c20字节\u003e\u0026peer_id=\u003c20字节\u003e\u0026port=6881\u0026uploaded=0\u0026downloaded=0\u0026left=0\u0026event=started\u0026compact=1\n```\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `info_hash` | 是 | 20 字节的百分比编码种子信息哈希 |\n| `peer_id` | 是 | 20 字节的百分比编码 Peer 标识 |\n| `port` | 是 | Peer 的监听端口 |\n| `uploaded` | 否 | 已上传总字节数 |\n| `downloaded` | 否 | 已下载总字节数 |\n| `left` | 否 | 剩余需下载字节数 |\n| `event` | 否 | `started`、`completed`、`stopped` 或留空 |\n| `compact` | 否 | `1` 使用紧凑编码（默认），`0` 使用字典编码 |\n| `numwant` | 否 | 返回的 peer 数量（默认 100，最大 400） |\n\n响应（Bencode 编码）：\n\n```\nd8:completei5e10:downloadedi0e10:incompletei3e8:intervali1800e5:peers60:...(紧凑二进制)...e\n```\n\n紧凑 peer 格式：每个 IPv4 peer 占 6 字节（4 字节 IP + 2 字节端口，大端序）。IPv6 peer 占 18 字节，通过 `peers6` 键返回。\n\n### Scrape（统计查询）\n\n```\nGET /scrape?info_hash=\u003c20字节\u003e[\u0026info_hash=...]\n```\n\n支持多个 `info_hash` 参数。响应（Bencode 编码）：\n\n```\nd5:filesd20:\u003cinfo_hash\u003ed8:completei5e10:downloadedi10e10:incompletei3eeee\n```\n\n### 统计 API\n\n```\nGET /api/stats\n```\n\n返回 JSON：\n\n```json\n{\n  \"interval\": 1800,\n  \"peer_timeout\": 3000,\n  \"torrents\": 42,\n  \"peers\": 128,\n  \"seeders\": 85,\n  \"leechers\": 43,\n  \"completed\": 310,\n  \"history\": [\n    {\"timestamp\": 1715800000, \"torrents\": 40, \"peers\": 120, \"seeders\": 80, \"leechers\": 40}\n  ]\n}\n```\n\n### 客户端分布\n\n```\nGET /api/clients\n```\n\n返回 JSON，包含 Top 15 客户端类型及其历史 peer 数量。\n\n### Top 100 种子\n\n```\nGET /api/top100?sort=peers\n```\n\n| 查询参数 | 可选值 | 默认值 |\n|---------|--------|--------|\n| `sort` | `peers`、`seeders`、`leechers`、`downloaded` | `peers` |\n\n返回 JSON，按指定指标排列的 Top 100 活跃种子。\n\n## Web 监控面板\n\nTracker 在同一端口的 `/` 路径提供功能完整的监控面板：\n\n- **概览页面** — Peers、Seeders、Leechers、Torrents 和 Completed 实时计数\n- **趋势图表** — 交互式 ECharts 图表，支持 24小时 / 3天 / 7天 时间范围切换\n- **客户端图表** — Top 15 BitTorrent 客户端的 peer 数量趋势\n- **Top 100 页面** — 最活跃种子的可排序表格\n- **免责声明** — 面向公众部署时的内置法律声明\n- **国际化** — 自动检测中文/英文，支持手动切换\n\n静态资源（`style.css`、`app.js`）由服务器缓存 1 小时。\n\n## 种子黑名单\n\n创建一个文本文件，每行一个 40 字符的十六进制 `info_hash`：\n\n```\n# 被屏蔽的种子\ne09b1c0c4b174ef2b25c8de662941777fb3f2d7a\n```\n\n通过 `--blacklist blacklist.txt` 或 `RUSTRACKER_BLACKLIST` 传入路径。\n\n- 被黑名单中的种子在 `announce` 时会被拒绝（HTTP 403）\n- `scrape` 结果会静默排除黑名单中的种子\n- 文件每 5 秒检测一次变更——编辑保存后无需重启\n- 无效行会以警告形式记录并跳过\n\n## 趋势数据持久化\n\n默认情况下，趋势数据（种子数、peer 数、做种数、下载数、客户端分布）存储在内存中，重启后丢失。要启用持久化：\n\n```bash\ncargo run --release -- --trends-file /var/lib/rustracker/trends.jsonl\n```\n\n- 数据每 10 分钟采样一次，保留 7 天\n- 会创建两个 JSONL 文件：\n  - `\u003c路径\u003e`（如 `trends.jsonl`）——每个时间戳的种子数/peer 数/做种数/下载数\n  - 同目录下的 `top_clients.jsonl`——每个时间戳的客户端分布\n- 重启时自动从磁盘加载历史数据\n- Linux 安装脚本默认在 `/var/lib/rustracker/trends.jsonl` 启用此功能\n\n## 项目架构\n\n```\n┌──────────────────────────────────────────────────────┐\n│                    Axum HTTP 服务器                    │\n│  /announce  /scrape  /healthz  /  /api/*             │\n└──────────┬───────────────────────────────────────────┘\n           │\n           ▼\n┌──────────────────────┐     ┌─────────────────────────┐\n│    TrackerPool        │     │     TrendStore           │\n│  (64 分片 RwLock)     │     │  (7 天 JSONL 历史)       │\n│                       │     │  10 分钟采样              │\n│  ┌─────────────────┐  │     └─────────────────────────┘\n│  │ Tracker 分片 0   │  │\n│  │  BTreeMap\u003c       │  │     ┌─────────────────────────┐\n│  │   InfoHash,      │  │     │   黑名单监视器            │\n│  │   Swarm          │  │     │  (5 秒文件重载)           │\n│  │  \u003e               │  │     │  HashSet\u003cInfoHash\u003e        │\n│  └─────────────────┘  │     └─────────────────────────┘\n│  ... (×64 分片)       │\n└───────────────────────┘\n```\n\n- **分片**：Tracker 池使用 64 个分片，每个分片独立 `RwLock`，在高并发下最小化争用\n- **Peer 存储**：紧凑的二进制格式，IPv4 每 peer 6 字节、IPv6 每 peer 18 字节——无逐 peer 堆分配\n- **过期清理**：后台任务每 1 秒清扫过期 peer\n- **客户端识别**：编译时生成的 256×256 查找表，用于 Azureus 风格的 peer ID 前缀匹配，同时支持非标准格式的前缀匹配\n\n## 客户端识别\n\nTracker 可从 peer ID 前缀识别 **102 种 BitTorrent 客户端**，包括：\n\n| 类别 | 客户端 |\n|------|--------|\n| 主流 | qBittorrent、Transmission、µTorrent、BitTorrent、Deluge、Vuze、BiglyBT |\n| 轻量 | Aria2、libtorrent、rTorrent、KTorrent、FrostWire |\n| Web 端 | WebTorrent、Brave |\n| 经典 | FlashGet、GetRight、LimeWire、Shareaza |\n| 国产 | 迅雷（Thunder）、QQ旋风、百度网盘 |\n| 其他 | Tixati、Halite、BitComet、BitSpirit、MLDonkey |\n\n客户端标签通过 `/api/clients` 端点暴露，并展示在面板的客户端分布图表中。\n\n## Linux 安装\n\n发布包中包含 `install-linux.sh`。将 Linux 二进制文件和脚本放在同一目录下，然后运行：\n\n```bash\nsudo sh install-linux.sh\n```\n\n安装程序提供中文交互菜单，支持：\n\n1. 安装或更新\n2. 卸载\n3. 启动 / 停止 / 重启服务\n4. 查看状态\n5. 查看配置\n6. 修改配置（监听地址、通告间隔、超时时间）\n\n非交互式命令：\n\n```bash\nsudo sh install-linux.sh install\nsudo sh install-linux.sh status\nsudo sh install-linux.sh configure\nsudo sh install-linux.sh restart\nsudo sh install-linux.sh uninstall\n```\n\n**安装后的默认文件布局：**\n\n| 路径 | 说明 |\n|------|------|\n| `/opt/rustracker/rustracker` | 二进制文件 |\n| `/etc/rustracker.env` | 环境变量配置 |\n| `/etc/rustracker/blacklist.txt` | 种子黑名单 |\n| `/etc/rustracker/trends.jsonl` | 趋势数据 |\n| `/etc/systemd/system/rustracker.service` | systemd 服务单元 |\n\n对于监听地址，仅输入端口号（如 `6969`）会被接受并保存为 `0.0.0.0:6969`。\n\n## 负载测试\n\n两个内置的压测示例：\n\n### 简单负载测试\n\n```bash\ncargo run --release --example announce_load -- 2000 200 100\n#                                       总请求数 并发数 种子数\n```\n\n按持续时间模式：\n\n```bash\ncargo run --release --example announce_load -- \\\n  --duration-secs 30 --concurrency 200 --torrents 100\n```\n\n### 高级负载测试\n\n```bash\ncargo run --release --example load_test -- \\\n  --duration 60 \\\n  --concurrency 500 \\\n  --torrents 1000 \\\n  --peers 50000 \\\n  --scrape-weight 1 \\\n  --announce-weight 5 \\\n  --keep-alive \\\n  --progress-interval 5\n```\n\n特性：Zipf 分布模拟真实种子热度、peer 生命周期事件（started/completed/stopped）、40% 做种比例、延迟百分位统计（p50/p95/p99）。\n\n## 开发指南\n\n### 构建\n\n```bash\ncargo build --release\n```\n\n### 测试\n\n```bash\ncargo test\n```\n\n### 交叉编译 Linux（从 Windows）\n\n项目包含 `.cargo/config.toml`，配置了 zig-cc 工具链用于 musl 静态链接：\n\n```bash\ncargo build --release --target x86_64-unknown-linux-musl\n```\n\n### 日志\n\n通过 `RUST_LOG` 环境变量控制日志详细程度：\n\n```bash\nRUST_LOG=debug cargo run --release\nRUST_LOG=rustracker=trace cargo run --release\n```\n\n## 许可证\n\n[MIT](./LICENSE)\n\n## 致谢\n\n- [opentracker](https://erdgeist.org/arts/software/opentracker/)（作者 Dirk Engling）— peer 选择算法设计受 opentracker 的定步长均匀随机选择策略启发。采用 [Beerware](https://erdgeist.org/beerware.html) 许可证。\n- [PBH-BTN/quick-references](https://github.com/PBH-BTN/quick-references) — BitTorrent 客户端 peer_id 识别参考表。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flosret%2Frustracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flosret%2Frustracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flosret%2Frustracker/lists"}