Initial commit: abyssVpn project
- Tauri desktop app (apps/desktop) - Python Django API service (services/api) - Deployment scripts and docs
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
# AbyssInfo VPN 下次待办
|
||||
|
||||
## 当前状态
|
||||
|
||||
- Netmaker CE 已部署在火山引擎服务器 `101.96.214.81`。
|
||||
- Django API 已部署并由 Caddy 反代:
|
||||
- 健康检查:`https://vpn-api.nm.101-96-214-81.sslip.io/health/`
|
||||
- 飞书 OAuth 回调:`https://vpn-api.nm.101-96-214-81.sslip.io/auth/feishu/callback`
|
||||
- 飞书事件校验:`https://vpn-api.nm.101-96-214-81.sslip.io/auth/feishu/event-callback`
|
||||
- Netmaker 网络已创建:`homevpn`,网段 `100.88.0.0/24`。
|
||||
- 飞书 App ID/Secret 已写入后端 `.env`,登录 URL 接口已验证。
|
||||
- Tauri 客户端已支持 Windows 托盘和 macOS 菜单栏常驻。
|
||||
|
||||
## 重要账号和地址
|
||||
|
||||
- Netmaker Dashboard:`https://dashboard.nm.101-96-214-81.nip.io`
|
||||
- Netmaker API:`https://api.nm.101-96-214-81.nip.io`
|
||||
- Netmaker Broker:`wss://broker.nm.101-96-214-81.nip.io`
|
||||
- Django API:`https://vpn-api.nm.101-96-214-81.sslip.io`
|
||||
- SSH:`ssh -i E:\ai\homeVpn\codex.pem root@101.96.214.81`
|
||||
|
||||
## 下次优先处理
|
||||
|
||||
1. 安装 Windows netclient,并确认 `netclient status` 可执行。
|
||||
2. 用 AbyssInfo VPN 客户端完成飞书登录。
|
||||
3. 点击“一键连接 VPN”,验证后端能签发 Netmaker enrollment token,客户端能成功 `netclient join`。
|
||||
4. 收敛 Netmaker Dashboard 公网暴露风险:
|
||||
- 推荐关闭公网 Dashboard,只通过 SSH 隧道访问。
|
||||
- 或至少给 Dashboard 加 Basic Auth / 安全组白名单。
|
||||
5. 梳理备案和正式域名方案:
|
||||
- 正式生产域名建议备案后替换 `*.nip.io`。
|
||||
- 换域名后同步更新 Netmaker、Django `.env`、飞书回调地址和客户端构建配置。
|
||||
|
||||
## 常用命令
|
||||
|
||||
```powershell
|
||||
# 检查服务器环境
|
||||
cmd /c deploy\00_check_server.bat
|
||||
|
||||
# 检查 Netmaker
|
||||
cmd /c deploy\03_check_netmaker.bat
|
||||
|
||||
# 检查 Django API
|
||||
cmd /c deploy\08_check_api.bat
|
||||
|
||||
# 部署 Django API
|
||||
cmd /c deploy\07_deploy_api.bat
|
||||
|
||||
# 前端构建
|
||||
cd apps\desktop
|
||||
npm run build
|
||||
|
||||
# Rust 检查
|
||||
cd apps\desktop\src-tauri
|
||||
cargo check
|
||||
|
||||
# Tauri 打包
|
||||
cd apps\desktop
|
||||
npm run tauri:build
|
||||
```
|
||||
|
||||
## 当前客户端要求
|
||||
|
||||
- App 首屏必须是飞书登录界面。
|
||||
- 未登录时不展示 VPN 连接按钮,也不检测 netclient。
|
||||
- 登录成功后才进入 VPN 主界面。
|
||||
- VPN 主界面使用手机端单列布局。
|
||||
- App 图标使用蓝白 VPN 图标。
|
||||
@@ -0,0 +1,45 @@
|
||||
# 项目业务目录层级
|
||||
|
||||
## 后端:Django + SQLite
|
||||
|
||||
```text
|
||||
services/api/
|
||||
manage.py
|
||||
requirements.txt
|
||||
.env.example
|
||||
config/ Django 项目配置、路由、ASGI/WSGI
|
||||
common/ 通用鉴权、响应、工具函数
|
||||
accounts/ 飞书登录、用户模型、JWT 签发
|
||||
services/
|
||||
feishu_oauth.py 飞书 OAuth 登录地址和回调辅助逻辑
|
||||
jwt_service.py JWT 签发与解析
|
||||
vpn/ VPN 设备、连接 token、审计日志
|
||||
services/
|
||||
device_service.py 设备绑定和连接 token 发放
|
||||
netmaker_client.py Netmaker API 客户端封装
|
||||
```
|
||||
|
||||
数据库使用 Django 内置 SQLite,配置位于 `services/api/config/settings.py`:
|
||||
|
||||
```python
|
||||
DATABASES = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.sqlite3",
|
||||
"NAME": BASE_DIR / "db.sqlite3",
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 前端:Tauri + Vue 选项式 + Vite
|
||||
|
||||
```text
|
||||
apps/desktop/
|
||||
src/
|
||||
api/ 后端接口封装
|
||||
services/ 客户端业务服务
|
||||
stores/ 本地状态读写
|
||||
views/ Vue 页面,使用 Options API
|
||||
src-tauri/
|
||||
src/commands/ Rust 命令,调用 netclient
|
||||
src/tray.rs Windows 托盘和 macOS 菜单栏常驻逻辑
|
||||
```
|
||||
@@ -0,0 +1,222 @@
|
||||
# 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 连接联调。
|
||||
Reference in New Issue
Block a user