# AbyssInfo VPN 域名备案后续接记录 记录时间:2026-04-28 当前开发先暂停,等待正式域名备案完成后继续。本文用于下次重新进入项目时快速恢复上下文。 ## 当前状态 - 项目根目录:`E:\ai\homeVpn` - 服务端:Django + SQLite - 桌面端:Tauri + Vue Options API + Vite - 云服务器公网 IP:`101.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 端显示: ```text Failed to fetch ``` 测试证据: ```text 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 隧道: ```powershell 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 ``` 前端本地配置: ```env VITE_API_BASE_URL=http://127.0.0.1:18000 VITE_VPN_NETWORK_NAME=homevpn ``` 对应文件: ```text 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 `code` 换 `user_access_token` - 已在服务器验证 `app_access_token` 获取成功。 - 前端构建通过。 - Django API 在服务器部署时 `manage.py check` 通过。 ## 不能写入文档的敏感信息 以下内容不要写入 Markdown 或提交仓库: - 飞书 `appSecret` - Netmaker 管理 token - JWT secret - Django secret key - 任何 enrollment key / VPN 入网 token 这些值目前在本地和服务器 `.env` 文件中维护。 ## 备案完成后需要替换的配置 假设正式域名为: ```text api.example.com dashboard.example.com netmaker-api.example.com broker.example.com ``` 实际继续时按备案后的域名替换。 需要更新: 1. `deploy/config.bat` ```bat set "API_DOMAIN=正式 API 域名" set "API_LEGACY_DOMAIN=旧临时域名或留空后清理" set "NETMAKER_BASE_DOMAIN=正式 Netmaker 基础域名" ``` 2. 前端配置 ```text apps/desktop/.env apps/desktop/.env.local ``` 把临时隧道地址恢复为正式 HTTPS API: ```env VITE_API_BASE_URL=https://正式 API 域名 ``` 3. 飞书开放平台 在飞书应用后台配置回调地址: ```text https://正式 API 域名/auth/feishu/callback ``` 4. 服务器 Django `.env` 部署脚本会根据 `deploy/config.bat` 自动生成: ```env FEISHU_REDIRECT_URI=https://正式 API 域名/auth/feishu/callback DJANGO_ALLOWED_HOSTS=... CORS_ALLOWED_ORIGINS=... ``` 5. Caddy / Netmaker 域名 需要将 Netmaker 相关入口从 `nip.io` 迁到正式域名,包括: ```text 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 部署: ```powershell cmd /c deploy\07_deploy_api.bat ``` 7. 验证正式域名公网访问: ```powershell curl.exe -vk https://正式 API 域名/health/ ``` 8. 重启 Tauri 开发客户端: ```powershell cd apps\desktop npm run tauri:dev ``` 9. 扫码登录测试: - App 启动后应显示飞书扫码二维码。 - 扫码后飞书回调应进入 Django。 - Django 将 `DesktopLoginSession` 状态从 `pending` 改为 `authenticated`。 - 前端轮询成功后进入 VPN 连接页。 ## 下次继续时优先检查 ```powershell Get-Content .\apps\desktop\.env.local Get-Content .\deploy\config.bat ``` ```powershell ssh -i E:\ai\homeVpn\codex.pem root@101.96.214.81 "systemctl status abyssinfo-api --no-pager" ``` ```powershell ssh -i E:\ai\homeVpn\codex.pem root@101.96.214.81 "cd /opt/abyssinfo-home-vpn/api && tail -n 80 .env" ``` 如继续排查扫码状态,可在服务器查询最近会话: ```powershell 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 连接联调。