Files
2026-05-27 09:57:34 +08:00

7.0 KiB

项目结构和调用时序

目录结构

路径 职责
pyxray/cli.py 命令行入口。默认启动 Web。
pyxray/web/server.py 创建 Flask app,注册各 API 和生命周期清理。
pyxray/web/dashboard.py 渲染首页。
pyxray/web/jobs.py 内存任务表,当前用于下载任务轮询。
pyxray/web/nodes.py 节点 API。
pyxray/web/xray_assets.py Xray 资源下载 API。
pyxray/web/xray_config.py 配置保存和生成 API。
pyxray/web/xray_service.py Xray 启停和日志 API。
pyxray/web/templates/ Jinja 页面和配置表单。
pyxray/web/static/ 前端 JS/CSS。
pyxray/libs/nodes/ 节点链接解析、标准化、TOML 存储。
pyxray/libs/xray_assets.py 下载和检查 xraygeoip.datgeosite.dat
pyxray/libs/xray_asset_settings.py download.toml 读写。
pyxray/libs/xray_config/ Xray JSON、透明代理脚本、TinyTun 配置和设置存储。
pyxray/libs/xray_runtime.py Xray 子进程管理、端口检查、日志转发。
pyxray/libs/xray_transparent_runtime.py 透明代理脚本执行、回滚、本地 CIDR watcher。
tests/ 单元测试和 Web API 测试。
docs/ 使用和配置文档。
scripts/build.sh Docker 镜像构建脚本。
compose.yaml Docker 透明代理部署。

数据文件

文件 创建方 读写时机
nodes.toml NodeStore 导入、选择、删除节点。
settings.toml XrayConfigSettingsStore 保存配置页设置、生成配置、启动 Xray。
download.toml XrayAssetSettingsStore 保存下载页设置、启动下载任务。
config.json generate_current_xray_config 生成配置、启动 Xray 前。
xray.log XrayServiceManager / TransparentRuntime 启停 Xray、转发 Xray 输出、透明代理脚本日志。
transparent/* write_transparent_rule_files 生成配置、启动 Xray 前。

Web App 装配

flowchart TD
  CLI[pyxray cli] --> RunWeb[run_web]
  RunWeb --> CreateApp[create_app]
  CreateApp --> Jobs[init_job_store]
  CreateApp --> Assets[register_xray_assets]
  CreateApp --> Nodes[register_nodes]
  CreateApp --> Config[register_xray_config]
  CreateApp --> Service[register_xray_service]
  CreateApp --> Lifecycle[_bind_xray_lifecycle]
  CreateApp --> Dashboard[register_dashboard]

首页渲染

sequenceDiagram
  participant B as Browser
  participant D as dashboard.index
  participant A as AssetSettingsStore
  participant N as NodeManager
  participant C as XrayConfigSettingsStore
  participant S as XrayServiceManager

  B->>D: GET /
  D->>A: load download.toml
  D->>N: list_nodes + selected_id
  D->>C: load settings.toml
  D->>S: status
  D-->>B: render index.html

资源下载

sequenceDiagram
  participant B as Browser
  participant API as /api/xray/assets/ensure
  participant Store as XrayAssetSettingsStore
  participant Jobs as JobStore
  participant Worker as _run_asset_job
  participant Assets as ensure_xray_assets

  B->>API: POST form
  API->>Store: save download.toml
  API->>Jobs: start worker
  API-->>B: job_id
  Worker->>Assets: check/download/extract
  Worker->>Jobs: update steps/status
  B->>Jobs: GET job status
  Jobs-->>B: progress/result

节点导入和选择

sequenceDiagram
  participant B as Browser
  participant API as nodes API
  participant M as NodeManager
  participant P as parse_node_link
  participant S as NodeStore

  B->>API: POST /api/nodes/import
  API->>M: import_links
  M->>P: parse + normalize
  M->>S: save nodes.toml
  API-->>B: import results
  B->>API: POST /api/nodes/select
  API->>M: select_node
  M->>S: save selected_id
  API-->>B: selected node

配置生成

sequenceDiagram
  participant B as Browser
  participant API as /api/xray/config/generate
  participant N as NodeManager
  participant S as SettingsStore
  participant G as generate_xray_config
  participant T as write_transparent_rule_files
  participant U as write_tinytun_config_file
  participant FS as data directory

  B->>API: POST generate
  API->>N: get_selected_node
  API->>S: load settings.toml
  API->>G: node + settings
  G-->>API: config dict
  API->>FS: write config.json
  API->>T: write transparent scripts
  API->>U: write tinytun.yaml if needed
  API-->>B: config + paths

启动 Xray 和透明代理

sequenceDiagram
  participant B as Browser
  participant API as /api/xray/service/start
  participant G as generate_current_xray_config
  participant X as XrayServiceManager
  participant R as TransparentRuntime
  participant OS as Host network

  B->>API: POST start
  API->>G: regenerate config and scripts
  API->>X: status
  API->>X: start xray
  X->>X: check inbound ports
  X->>OS: Popen xray run -config config.json
  X->>X: forward stdout/stderr to xray.log
  API->>R: setup settings
  R->>R: cleanup old rules best-effort
  R->>OS: run ip-forward script
  R->>OS: run iptables setup, fallback nft
  R->>OS: run resolv setup
  R->>R: start local CIDR watcher
  API-->>B: running status

停止和清理

sequenceDiagram
  participant B as Browser
  participant API as /api/xray/service/stop
  participant X as XrayServiceManager
  participant R as TransparentRuntime
  participant OS as Host network

  B->>API: POST stop
  API->>X: stop
  X->>R: before_stop cleanup
  R->>R: stop local CIDR watcher
  R->>OS: run resolv cleanup
  R->>OS: run transparent backend cleanup
  X->>OS: terminate xray process
  API-->>B: stopped status

Docker 透明代理部署

flowchart TD
  Compose["docker compose"] --> Container["pyxray container"]
  Container --> HostNet["host network namespace"]
  Container --> ConfigVol["data volume mounted to config"]
  Container --> Resolv["resolv.conf bind mount"]
  Container --> Modules["lib modules read-only mount"]
  HostNet --> XrayPorts["Xray listens on host ports"]
  HostNet --> Rules["iptables nft ip rule affect host"]
  Resolv --> DNS["host DNS hijack when enabled"]

关键点:

Compose 配置 原因
network_mode: host Xray 端口和透明代理规则直接作用于宿主机。
privileged: true 允许改防火墙、策略路由、procfs。
./data:/config 容器重建后状态不丢。
/etc/resolv.conf:/etc/resolv.conf redirect DNS 劫持修改宿主机 DNS。
/lib/modules:/lib/modules:ro 读取宿主机内核模块信息。

修改建议

目标 优先修改位置
增加节点协议 pyxray/libs/nodes/parsers/pyxray/libs/xray_config/outbound.py
增加配置字段 settings.pystore.py、配置模板、generator.py
改 Web API pyxray/web/*.py
改配置生成 pyxray/libs/xray_config/generator.py
改透明代理规则 transparent_rules.py
改规则执行/回滚 xray_transparent_runtime.py
改 Docker 部署 Dockerfilecompose.yamlscripts/build.sh