feat: implement VPN platform management and real protocol services

This commit is contained in:
Logan.Li committed 2026-07-22 21:49:13 +08:00
commit 58c036c34c
45 files changed
+9244

No files matched your search

+110
View File
@@ -0,0 +1,110 @@
# VPN 专线管理平台
Gin + Vue3 + SQLite 的多协议 VPN 专线 Web 管理平台:**单二进制交付、配置简单、管理便捷、可扩展自定义协议**。
## 支持协议
| 协议 | 实现方式 | 场景 |
|---|---|---|
| WireGuard | 系统 `wg` / `wg-quick`,密钥自动生成 | 内部接入、移动办公(首选) |
| IPSec | StrongSwan `swanctl`,内置 Cisco/飞塔/华为/华三模板 | **第三方对接**、站点互联 |
| L2TP/IPSec | StrongSwan + xl2tpd | 手机/老设备兼容 |
| FRP | 直接管理 `frps` / `frpc`(TOML) | 内网穿透、端口映射 |
| OpenVPN | 进程管理 + 配置模板 + PKI 脚本 | 老项目兼容 |
| 自定义协议 | 插件命令钩子(Create/Start/Stop/Status/Config) | 任意协议扩展 |
## 核心功能
- **专线列表**:名称/协议/状态/流量/到期时间,一键启停、编辑、删除、下载配置、WireGuard 二维码
- **创建向导**:选协议 → 填参数 → 自动生成服务端与客户端配置
- **IPSec 第三方对接专页**:设备模板预置 Phase1/Phase2 参数、双方参数一致性检查、一键连通性测试、对端参考配置导出
- **节点管理**:多中继节点(本机内置,远程节点预留)
- **协议插件**:注册命令钩子即接入新协议,钩子通过 stdin 接收专线配置 JSON
- **安全**:PSK/私钥 AES-GCM 加密存储、配置文件 0600 权限、操作审计
## 快速开始
### 单二进制构建与运行(默认,不使用 Docker)
```bash
# 方式一:一键构建并运行
./run.sh run
# 方式二:make
make run
```
`run.sh` 会自动完成「构建前端 → 编译 Go → 启动单二进制」全流程,监听 `:8080`,默认账号 **admin / admin123**。
### 分步构建
```bash
./run.sh build # 全量构建(前端 + 二进制)
./run.sh build-frontend # 仅构建前端
./run.sh build-binary # 仅编译二进制(需先构建前端)
./opsx-vpn # 直接运行二进制
```
### 开发模式(前后端分离)
```bash
./run.sh dev
# 前端 http://localhost:5173(vite dev,代理 /api 到后端)
# 后端 http://localhost:8080(go run)
```
### 常用命令
| 命令 | 说明 |
|---|---|
| `./run.sh run` | 构建并后台运行单二进制(默认) |
| `./run.sh build` | 全量构建(前端 + 后端二进制) |
| `./run.sh dev` | 开发模式(前后端分离) |
| `./run.sh stop` | 停止所有服务 |
| `./run.sh restart` | 重启服务 |
| `./run.sh status` | 查看服务状态 |
## 环境变量
| 变量 | 默认 | 说明 |
|---|---|---|
| `VPN_LISTEN_ADDR` | `:8080` | 监听地址 |
| `VPN_DATA_DIR` | `./data` | 数据目录(SQLite、密钥、实例配置) |
## 项目结构
```
frontend/ # Vue3 + Element Plus 前端
backend/
main.go # Gin 入口(内嵌前端 embed.FS)
internal/
api/ # REST 路由与鉴权
core/ # Protocol 统一接口 + 注册中心
model/ # GORM 数据模型
store/ # SQLite + AES-GCM 密钥存储
service/ # 协议实现
wireguard/ ipsec/ l2tp/ frp/ openvpn/
custom/ # 自定义协议插件
monitor/ # 状态/流量采集、到期自动停止
```
## 自定义协议插件契约
在「协议插件」页注册 5 个命令钩子,平台执行时将 `{"id","name","protocol","config"}` JSON 写入 stdin:
| 钩子 | 约定 |
|---|---|
| Start(必填) | 启动实例,失败退出码非 0 |
| Stop | 停止实例 |
| Status | stdout 输出 `running` / `stopped` |
| Config | stdout 输出客户端配置文本(供下载) |
| Create(可选) | 创建时调用,用于渲染配置 |
## 依赖检测与部署状态
平台启动时自动检测 `wg / swanctl / xl2tpd / openvpn / frps / frpc`。依赖缺失时仍可创建和导出配置,但专线会标记为**未部署**,启动操作将明确报错;安装对应依赖后即可由平台启动和管理真实进程。
## 交付形态
- **单二进制**:前端构建后通过 `go:embed` 内嵌进 Go 二进制,`./opsx-vpn` 单文件即可运行(含 SPA + REST API + SQLite)
- 不依赖 Docker、不依赖外部数据库