Skip to content

[Enhancement] 内网穿透:让 DeepGraph Web 服务可被外网访问 #20

Description

@koen666

背景

DeepGraph Web Dashboard 默认只监听本机 127.0.0.1:8080(或 localhost:8080),外网无法直接访问。当前部署在服务器/内网环境时,需要手动配置内网穿透才能从外部浏览器打开。

本 issue 仅关注「服务如何被外网访问」,不涉及 Dashboard UI 样式或在前端展示 tunnel URL。

现状

已有 shell 脚本方案,但未产品化:

文件 作用
start_background.sh screen 启动 web + cloudflared tunnel + processor
scripts/run_tunnel_forever.sh cloudflared 崩溃后自动重启
scripts/keep_deepgraph_alive.sh 检测 web/tunnel 进程,缺失则重启
status_background.sh 从 log 解析当前公网 URL
stop_background.sh 停止 tunnel 与 web

当前穿透方式:

cloudflared tunnel --url http://127.0.0.1:8080
# 生成临时地址如 https://xxxx.trycloudflare.com

文档见 SYSTEM.mdHANDOFF.md

问题

  1. 无开箱即用python main.py 只起 Flask,不会自动建立外网通道;用户需另开终端跑 cloudflared
  2. URL 不稳定:Quick Tunnel 重启后域名可能变化,需 grep 日志获取新地址
  3. 路径硬编码:脚本中 ROOT="/home/billion-token/Deepgraph"CF_BIN="/home/billion-token/bin/cloudflared" 换机器即失效
  4. 进程管理分散:web / tunnel / main processor 三个 screen 会话,缺乏统一启动入口
  5. 方案单一:只验证了 cloudflared Quick Tunnel,未支持 Named Tunnel(固定域名)、frp、ngrok 等常见方案
  6. 安全空白:穿透后 Dashboard 无鉴权,外网任何人可访问内部 research 数据

期望能力

P0 — 最小可用

  • 一条命令启动「Web + 外网穿透」,例如:
    python main.py --expose
    #
    ./scripts/start_with_tunnel.sh
  • 启动成功后终端打印 公网 URL(并写入 logs/tunnel-url.txt
  • tunnel 进程退出时自动重启(复用/改进 run_tunnel_forever.sh
  • 配置项放入 config.py 或环境变量,去除硬编码路径:
    EXPOSE_ENABLED=true
    EXPOSE_PROVIDER=cloudflared  # cloudflared | frp | ngrok
    EXPOSE_LOCAL_PORT=8080
    CLOUDFLARED_BIN=cloudflared

P1 — 稳定与安全

  • 支持 Cloudflare Named Tunnel(固定 subdomain,避免 URL 漂移)
  • 可选访问控制:Basic Auth / Bearer Token / IP allowlist(至少 remote 模式默认开启一种)
  • README 增加「仅本地访问」vs「外网暴露」两种部署说明

P2 — 扩展

  • 支持 frp / ngrok 作为可插拔 provider
  • Docker Compose:docker compose --profile expose up
  • 健康检查端点 /api/health 供外部 monitor 探测 tunnel 是否正常

非目标(本 issue 不做)

  • Dashboard 顶部展示/复制公网链接(属 UI issue)
  • SSE、PDF 大文件传输优化(可另开 issue)
  • 修改 Flask 业务 API

验收标准

  1. 在新机器上按 README 配置后,无需 SSH 手动 grep 日志,即可获得可访问的 HTTPS 公网 URL
  2. cloudflared 意外退出后 30s 内自动恢复穿透
  3. 关闭 --expose 时行为与现在完全一致(仅 localhost)
  4. (P1)Named Tunnel 模式下 URL 固定不变

相关文件

  • main.py
  • config.py
  • start_background.sh, stop_background.sh, status_background.sh
  • scripts/run_tunnel_forever.sh, scripts/keep_deepgraph_alive.sh

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions