Files
abyssVpn/docs/resume-after-domain-icp.md
arthur_chen f69efb67ad Initial commit: abyssVpn project
- Tauri desktop app (apps/desktop)
- Python Django API service (services/api)
- Deployment scripts and docs
2026-05-15 09:06:10 +08:00

5.7 KiB
Raw Permalink Blame History

AbyssInfo VPN 域名备案后续接记录

记录时间:2026-04-28

当前开发先暂停,等待正式域名备案完成后继续。本文用于下次重新进入项目时快速恢复上下文。

当前状态

  • 项目根目录:E:\ai\homeVpn
  • 服务端:Django + SQLite
  • 桌面端:Tauri + Vue Options API + Vite
  • 云服务器公网 IP101.96.214.81
  • SSH 私钥路径:E:\ai\homeVpn\codex.pem
  • 远端应用目录:/opt/abyssinfo-home-vpn
  • 当前临时 API 域名:https://vpn-api.nm.101-96-214-81.sslip.io
  • 当前 Netmaker 域名仍使用:*.nm.101-96-214-81.nip.io

暂停原因

本机访问 https://vpn-api.nm.101-96-214-81.sslip.io 时 TLS 会被重置,导致 Tauri 端显示:

Failed to fetch

测试证据:

HTTP/1.1 302 OK
Server: Suzaku
Location: https://webblock.volcengine.com

判断原因:

  • 火山引擎大陆节点对公网 80/443 的 Web 域名访问存在备案/接入限制。
  • sslip.io / nip.io 这类临时解析域名不是正式备案域名,公网访问容易被拦截。
  • HTTP 会被重定向到 webblock.volcengine.com
  • HTTPS 在 TLS 握手阶段被直接断开,所以客户端表现为 TLS reset / Failed to fetch
  • 服务器内部访问 Django API 正常,不是 Django、Caddy、Tauri 代码本身的问题。

当前临时开发方案

为了绕过公网 Web 入口拦截,当前本地开发使用 SSH 隧道:

ssh -i E:\ai\homeVpn\codex.pem -o StrictHostKeyChecking=no -o ExitOnForwardFailure=yes -N -L 18000:127.0.0.1:8000 root@101.96.214.81

前端本地配置:

VITE_API_BASE_URL=http://127.0.0.1:18000
VITE_VPN_NETWORK_NAME=homevpn

对应文件:

apps/desktop/.env.local

注意:这个测试方式依赖后台 ssh.exe 隧道进程,关闭后前端就无法访问远端 Django API。

已完成的重要改动

  • Tauri App 名称已改为 AbyssInfo VPN
  • 登录页要求先飞书登录,再进入 VPN 连接页面。
  • 前端改成移动端样式布局。
  • Windows / macOS 托盘常驻已加入。
  • 自定义标题栏已启用,禁用了系统标题栏。
  • 服务器已部署 Netmaker。
  • 服务器已部署 Django API。
  • 后端数据库使用 SQLite。
  • 后端飞书 token 链路已改为官方 v1 方式:
    • 先通过 app_id/app_secret 获取 app_access_token
    • 再用 OAuth codeuser_access_token
  • 已在服务器验证 app_access_token 获取成功。
  • 前端构建通过。
  • Django API 在服务器部署时 manage.py check 通过。

不能写入文档的敏感信息

以下内容不要写入 Markdown 或提交仓库:

  • 飞书 appSecret
  • Netmaker 管理 token
  • JWT secret
  • Django secret key
  • 任何 enrollment key / VPN 入网 token

这些值目前在本地和服务器 .env 文件中维护。

备案完成后需要替换的配置

假设正式域名为:

api.example.com
dashboard.example.com
netmaker-api.example.com
broker.example.com

实际继续时按备案后的域名替换。

需要更新:

  1. deploy/config.bat
set "API_DOMAIN=正式 API 域名"
set "API_LEGACY_DOMAIN=旧临时域名或留空后清理"
set "NETMAKER_BASE_DOMAIN=正式 Netmaker 基础域名"
  1. 前端配置
apps/desktop/.env
apps/desktop/.env.local

把临时隧道地址恢复为正式 HTTPS API:

VITE_API_BASE_URL=https://正式 API 域名
  1. 飞书开放平台

在飞书应用后台配置回调地址:

https://正式 API 域名/auth/feishu/callback
  1. 服务器 Django .env

部署脚本会根据 deploy/config.bat 自动生成:

FEISHU_REDIRECT_URI=https://正式 API 域名/auth/feishu/callback
DJANGO_ALLOWED_HOSTS=...
CORS_ALLOWED_ORIGINS=...
  1. Caddy / Netmaker 域名

需要将 Netmaker 相关入口从 nip.io 迁到正式域名,包括:

dashboard
api
broker
vpn-api

备案完成后的建议执行顺序

  1. 确认正式域名 DNS A 记录都指向 101.96.214.81
  2. 确认火山引擎备案和接入状态已生效。
  3. 修改 deploy/config.bat
  4. 修改 apps/desktop/.env.env.local
  5. 在飞书开放平台配置正式回调地址。
  6. 执行 Django API 部署:
cmd /c deploy\07_deploy_api.bat
  1. 验证正式域名公网访问:
curl.exe -vk https://正式 API 域名/health/
  1. 重启 Tauri 开发客户端:
cd apps\desktop
npm run tauri:dev
  1. 扫码登录测试:
  • App 启动后应显示飞书扫码二维码。
  • 扫码后飞书回调应进入 Django。
  • Django 将 DesktopLoginSession 状态从 pending 改为 authenticated
  • 前端轮询成功后进入 VPN 连接页。

下次继续时优先检查

Get-Content .\apps\desktop\.env.local
Get-Content .\deploy\config.bat
ssh -i E:\ai\homeVpn\codex.pem root@101.96.214.81 "systemctl status abyssinfo-api --no-pager"
ssh -i E:\ai\homeVpn\codex.pem root@101.96.214.81 "cd /opt/abyssinfo-home-vpn/api && tail -n 80 .env"

如继续排查扫码状态,可在服务器查询最近会话:

ssh -i E:\ai\homeVpn\codex.pem root@101.96.214.81 @'
cd /opt/abyssinfo-home-vpn/api
/opt/abyssinfo-home-vpn/.venv-api/bin/python manage.py shell <<'PY'
from accounts.models import DesktopLoginSession
for s in DesktopLoginSession.objects.order_by('-created_at')[:10]:
    print(s.session_id, s.status, s.error, s.created_at.isoformat(), s.updated_at.isoformat())
PY
'@

当前结论

开发暂停点不是业务代码问题,而是临时域名在火山引擎大陆公网 80/443 上被拦截。备案正式域名完成后,优先恢复正式 HTTPS 域名访问,再继续扫码登录和 VPN 连接联调。