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

223 lines
5.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 连接联调。