Skip to content

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

@koen666

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions