返回技术专栏

飞牛 NAS 上跑公网可访问的 DeepSeek Harness

ZeroNews 通过采用 nginx+Harness 的部署方式,让 Harness 继续跑在飞牛上,然后通过 ZeroNews HTTPS 公网域名完成 Harness 的远程访问, 让 Harness 不再局限于本机部署。

DeepSeek Harness Web UI 默认监听 http://127.0.0.1:3080。官方对部分配置类 API(模型、凭证、工作区等)做了严格限制:只信任回环来源。本机用 127.0.0.1 打开没问题;一旦把端口挂到 NAS 局域网或公网域名,模型页、远程改设置往往会 403,明文 http://IP 还会踩浏览器安全上下文,出现 crypto.randomUUID is not a function。

ZeroNews 内网穿透

https://zeronews.cc (零讯)是一个企业级安全内网穿透与反向代理平台,专注于为企业及个人提供安全/稳定/高速的内网应用访问方案,可以在企业无固定公网 IP 的网络环境下,几分钟就能为内网中的 DeepSeek Harness Web UI 提供稳定可访问的的 HTTPS 公网域名, 以便于在任何位置任何时候都能访问 DeepSeek Harness Web UI。

在能公网访问的基础上,ZeroNews 还提供 BasicAuth、IP 黑白名单、地址围栏等安全策略能力,让 Harness 在更安全可控的情况下实现公网访问。

image.png

一、在飞牛上安装 ZeroNews 客户端

1.打开飞牛 应用中心,搜索 zeronews,安装并一路下一步, 安装完成后,打开 客户端界面。

image.png

image.png

2.然后打开 https://zeronews.cc → 快速开始,复制 AuthToken。

image.png

3.回到飞牛的 ZeroNews 客户端页面,粘贴 Token,点 绑定。

image.png

等 10–20 秒,客户端状态变为 在线。同时在控制台 关联客户端 里,应能看到这台飞牛。

image.png

image.png

二、先加域名,再加 HTTPS 隧道

由于 docker-compose.yml 部署文档里要回填访问域名,所以域名跟 DSH的 HTTPS 隧道可以先创建。

先添加 DSH Web UI 的自定义域名

1.控制台 → 自定义域名 → 添加域名, 子域起个好记的前缀,例如 dsharp

image.png

image.png

然后添加 DSH HTTPS 隧道

域名添加完成后,再进到 隧道管理 页面添加 dsh web UI 的 HTTPS 隧道 在 dsh 部署的 docker-compose.yaml 中,我们使用 3080 端口对外提供访问,隧道的内网端口输入 3080

添加 HTTPS隧道的具体参数如下:

  • 协议选 HTTPS;
  • 带宽按套餐来,建议 5 兆或更高;
  • 公网域名先选择 自定义域名,然后再选择前面添加好的 dsharp.hn.takin.cc 域名;
  • 绑定设备选这台飞牛;
  • 内网地址默认本机;
  • 内网端口填 3080。

image.png

image.png

三、准备部署目录和 Nginx 配置

DSH HTTPS 隧道添加完成后,回到 飞牛平台上,添加 DSH 容器的部署目录

打开飞牛 文件管理,在「我的文件」里建一个部署目录。例如在 docker 下新建 dsh,后文以这个目录为准。

image.png

在电脑上新建 nginx.conf,然后复制以下内容到 nginx.conf 文件中,再将 nginx.conf 上传到该 dsh 目录(与即将创建的 docker-compose.yml 同级):

events {
    worker_connections 1024;
}

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        listen 80;
        server_name _;

        location / {
            proxy_pass http://deepseek-harness:3080;
            proxy_http_version 1.1;

            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;

            proxy_read_timeout 3600s;
            proxy_send_timeout 3600s;
        }
    }
}

image.png

四、用 Compose 部署 Harness 和 Nginx

在飞牛上我们使用 Docker 部署 Harness 和 Nginx

打开飞牛 Docker → Compose

image.png

image.png

新建项目:

  • 项目名:dsh
  • 路径:选中上一步的 dsh 目录
  • 来源:创建 docker-compose.yml
  • 把下面整段粘进去,把 DSH_TRUSTED_HOSTS 改成你的隧道域名
  • 勾选 创建项目后立即启动,确认
services:
  deepseek-harness:
    image: alliot/deepseek-harness:0.1.0-rc.6.2
    restart: unless-stopped
    user: root
    expose:
      - "3080"
    environment:
      DSH_TRUSTED_HOSTS: dsharp.hn.takin.cc
      DSH_ALLOW_REMOTE_CONFIGURATION: "1"
      DSH_TELEMETRY_DISABLED: "1"
    volumes:
      - ./data:/home/node/.dsh
      - ./work:/work
      - type: bind
        source: ./workspace
        target: /workspace
    read_only: true
    tmpfs:
      - /tmp:rw,nosuid,nodev,size=1g
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL
    stop_grace_period: 10s
    networks:
      - dsh-network

  nginx-proxy:
    image: nginx:alpine
    container_name: dsh-nginx-proxy
    restart: unless-stopped
    ports:
      - "3080:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - deepseek-harness
    networks:
      - dsh-network

networks:
  dsh-network:
    driver: bridge

image.png

等待 dsh 项目的镜像拉去完成并启动,启动后确认容器是否正常运行即可

image.png

image.png

这里几个注意事项说明一下:

  • user: root 避免飞牛把运行用户改成普通账号后,挂载目录写不进去。
  • Harness 不要再映射 3080:3080,只 expose 给 Nginx;对外只有 Nginx 的 3080:80。
  • ./workspace 挂到容器 /workspace,后面添加工作区就选这个路径。
  • ./data 是 Harness 配置和会话数据,备份时整目录带走。
  • 改过 DSH_TRUSTED_HOSTS 必须重建项目,不要只重启。

两个容器都是绿色运行中后,本机 3080 已经起来。接下来不要用 http://飞牛IP:3080 去配模型——明文 IP 不是安全上下文,提供方目录会加载失败。直接走已经建好的 HTTPS 域名。

五、用域名打开 Web UI,完成基础配置

DSH 容器运行正常后,就可以通过浏览器打开 DSH 隧道的域名访问 DSH Web UI

https://dsharp.hn.takin.cc

image.png

打开 DSH Web UI 后,我们需要先对 DSH 完成基础配置 配置模型 API Key 可以直接配置 deepseek 的 api key

image.png

添加工作区 回到主界面,新建工作区,目录选容器内的 /workspace,对应飞牛 dsh/workspace 目录。Agent 改文件、跑命令都落在这里,容器重建不会丢。

image.png

image.png

image.png

工作区建好后,开一个会话,先问一句:

你能做什么

image.png

能正常回复,说明域名、Nginx、受信 Host 和模型都通了。

六、给隧道做安全加固

由于 Harness Web UI 本身没有登录认证,同时它的操作权限又比较大,又能改文件、跑命令,域名一旦泄露风险很大。

所以这里在我们 ZeroNews 的网关入口,给 DeepSeek Harness 的 HTTPS 隧道进行安全加固,这里我们使用 BasicAuth 给 dsh web UI 添加一层账号认证

BasicAuth 在隧道 的 流量策略中配置 BasicAuth 认证

image.png

点击编辑:启用,填写 用户名:密码,保存。

image.png

image.png

刷新域名,应先弹出浏览器登录框。随便输一组应被拒绝;输入正确账号后进入 Web UI,说明鉴权生效。

image.png

image.png

除了 BasicAuth ,ZeroNews 还支持 IP 白名单 或 地址围栏(地域访问控制),用户可以根据实际情况开启配置

地址围栏(地域访问控制) 地址围栏通过识别访问来源IP的位置,实现基于国家/省份的地域访问控制,能有效减少用户访问的来源范围,降低攻击面。 当我们 DSH 都固定在某一个省份时,我们可以开启地址围栏只允许这个省份访问 在流量策略中的 Geo Location 配置地址围栏 如,只允许广东省访问

image.png

image.png

image.png

Harness 这类高权限面板:BasicAuth 必须开;白名单或围栏按实际情况再开一项。

小结

我们把 DeepSeek Harness 部署在可以长期跑在内网NAS,工作区、密钥、改文件/跑命令的能力都留在本机;然后通过 ZeroNews 的BaiscAuth / 地址围栏 / IP黑白名单等安全措施进行安全可靠的公网发布,有效的限制可访问的用户范围及用户身份,让我们在任何位置都能 安全的远程执行/查看任务。