Community-VyProjects/VyManager
GitHub: Community-VyProjects/VyManager
VyManager 是一个基于现代 Web 界面的集中式 SDN 控制器,用于统一配置、部署和监控多站点的 VyOS 路由器,解决了大规模 VyOS 环境下逐台管理的低效问题。
Stars: 254 | Forks: 27
# VyManager
## 企业级 VyOS 路由器管理系统
通过现代 Web 界面集中管理、部署和监控多站点 VyOS 路由器的平台
## 公测社区版
开放测试版本。我们灵活支持所有活跃的 VyOS 版本,包括滚动发布版。
### [跳转到快速开始](#quick-start)
**[加入我们的 Discord 社区以获取官方更新](https://discord.gg/k9SSkK7wPQ)**
**[在线演示](https://vyprojects.org/)**
### 截图
VyManager 用户界面支持浅色和深色主题。
## 快速开始
### 前置条件
- 主机上已安装 **Docker & Docker Compose**
- 已启用 REST API 和 GraphQL 的 **VyOS 路由器**(参见 [步骤 1](#step-1-enable-the-vyos-rest-api))
## 部署指南
### 步骤 1:启用 VyOS REST API
在部署 VyManager 之前,请在您的 VyOS 路由器上启用 REST API。
通过 SSH 连接到您的 VyOS 路由器并运行:
```
# 进入配置模式
configure
# 创建 API 密钥(将 YOUR_SECURE_API_KEY 替换为一个强壮的随机密钥)
set service https api keys id vymanager key YOUR_SECURE_API_KEY
# 启用 REST 功能(仅限 VyOS 1.5+)
set service https api rest
# 启用 GraphQL(dashboard streaming 需要此功能)
set service https api graphql
# 将 GraphQL 身份验证设置为使用上面定义的 API 密钥
set service https api graphql authentication type key
# 保存并应用
commit
save
exit
```
### 步骤 2:创建项目目录
为 VyManager 创建一个新目录并进入该目录:
```
mkdir vymanager
cd vymanager
```
您将在此目录中创建两个文件:`docker-compose.yml` 和 `.env`。
### 步骤 3:创建 docker-compose.yml
创建一个名为 `docker-compose.yml` 的文件,内容如下:
```
services:
postgres:
image: postgres:16-alpine
container_name: vymanager-postgres
environment:
POSTGRES_USER: vymanager
POSTGRES_PASSWORD: CHANGE_ME_POSTGRES_PASSWORD
POSTGRES_DB: vymanager
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
networks:
- vymanager-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U vymanager -d vymanager"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
backend:
image: ghcr.io/community-vyprojects/vymanager-backend:beta
container_name: vymanager-backend
ports:
- "8000:8000"
volumes:
- ./certs:/usr/local/share/ca-certificates/custom:ro
env_file:
- .env
restart: unless-stopped
networks:
- vymanager-network
depends_on:
postgres:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/docs"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
frontend:
image: ghcr.io/community-vyprojects/vymanager-frontend:beta
container_name: vymanager-frontend
ports:
- "3000:3000"
env_file:
- .env
depends_on:
backend:
condition: service_healthy
postgres:
condition: service_healthy
restart: unless-stopped
networks:
- vymanager-network
networks:
vymanager-network:
driver: bridge
volumes:
postgres_data:
driver: local
```
### 步骤 4:创建 .env 文件
在同一目录中创建一个名为 `.env` 的文件。后端和前端容器都将从此单一文件中读取配置。
在启动之前,您**必须**更改以下值:
1. **`POSTGRES_PASSWORD`** — 在 `docker-compose.yml` 和下面的 `DATABASE_URL` 中**同时**修改;它们必须保持一致。生成方式:`openssl rand -hex 32`
2. **`BETTER_AUTH_SECRET`** — 用于签名和验证会话 token;在文件中会出现**两次**(每个服务一次),且两处的值必须**相同**。生成方式:`openssl rand -base64 32`
3. **`SSH_ENCRYPTION_KEY`** — 用于加密静态存储的 SSH 私钥。生成方式:`openssl rand -hex 32`
4. **`BETTER_AUTH_URL` / `NEXT_PUBLIC_APP_URL`** — 将 `` 替换为用户在浏览器中打开的 IP 或主机名。
5. **`TRUSTED_ORIGINS`** — 用户访问 VyManager 的所有 URL 的逗号分隔列表。
```
# ── 后端 ──────────────────────────────────────────────
# CHANGE_ME_POSTGRES_PASSWORD 必须与 docker-compose.yml 中的 POSTGRES_PASSWORD 匹配
DATABASE_URL=postgresql://vymanager:CHANGE_ME_POSTGRES_PASSWORD@postgres:5432/vymanager
FRONTEND_URL=http://frontend:3000
# 更改此项 — 使用较长的随机字符串(例如 openssl rand -base64 32)
# 必须与下面的 BETTER_AUTH_SECRET 值匹配 — 两个服务都使用此文件
BETTER_AUTH_SECRET=Change-This-To-Something-Secret
# 更改此项 — 使用较长的随机十六进制字符串(例如 openssl rand -hex 32)
SSH_ENCRYPTION_KEY=Change-This-To-A-Hex-String
# ── 前端 ─────────────────────────────────────────────
NODE_ENV=production
VYMANAGER_ENV=production
# 必须与上面的 BETTER_AUTH_SECRET 值相同
BETTER_AUTH_SECRET=Change-This-To-Something-Secret
# 更改此项 — 设置为用户在浏览器中访问 VyManager 的 URL
BETTER_AUTH_URL=http://:3000
NEXT_PUBLIC_APP_URL=http://:3000
# 内部 Docker 网络 URL — 除非重命名 backend service,否则请勿更改
BACKEND_URL=http://backend:8000
# 更改此项 — 以逗号分隔的用户将从中访问 VyManager 的每一个 URL 列表
# 示例:http://192.168.1.50:3000,http://vymanager.lan:3000
TRUSTED_ORIGINS=http://:3000,http://localhost:3000
```
### 步骤 5:启动 VyManager
在 `vymanager` 目录中运行:
```
docker compose up -d
```
Docker 将拉取镜像,启动 PostgreSQL,等待其状态变为 healthy 后,启动后端和前端。首次运行时可能需要一分钟。
检查三个容器是否都在运行:
```
docker compose ps
```
您应该会看到 `vymanager-postgres`、`vymanager-backend` 和 `vymanager-frontend` 都处于 **healthy** / **running** 状态。
### 步骤 6:完成设置向导
1. **打开浏览器** 并访问 `http://:3000`
2. **新手引导向导** 将在首次访问时自动启动:
- **步骤 1**:创建您的管理员账户
- **步骤 2**:创建您的第一个站点(例如:“总部”)
- **步骤 3**:添加您的第一个 VyOS 实例
- Name(名称):为其起一个友好的名称
- Host(主机):您的 VyOS 路由器 IP 地址
- Port(端口):443(默认)
- API Key(API 密钥):您在步骤 1 中创建的密钥
- Version(版本):选择您的 VyOS 版本(1.4 或 1.5)
3. **开始管理!** 您将自动登录并被重定向到控制面板。
## 管理部署
### 常用 Docker 命令
```
# 查看日志(所有服务)
docker compose logs -f
# 查看单个服务的日志
docker compose logs -f backend
docker compose logs -f frontend
docker compose logs -f postgres
# 停止所有服务
docker compose down
# 重启所有服务
docker compose restart
# 重启单个服务
docker compose restart backend
# 拉取最新镜像并重建容器
docker compose pull
docker compose up -d
# 移除所有内容,包括数据库卷
docker compose down -v
```
### 更新 VyManager
当发布新版本时,通过拉取最新镜像进行更新:
```
cd vymanager
docker compose pull
docker compose up -d
```
您的数据库和配置将保留在 `postgres_data` 卷中。
## 架构概述
### 多实例管理
VyManager 采用**多实例架构**,允许您通过单一界面管理多台 VyOS 路由器:
- **站点 (Sites)**:VyOS 实例的逻辑分组(例如:“数据中心 01”,“纽约分部”)
- **实例 (Instances)**:站点内的独立 VyOS 路由器
- **基于角色的访问控制**:每个站点支持 OWNER、ADMIN 和 VIEWER 角色
- **活动会话**:一次连接到一个实例进行配置
### 数据库驱动配置
VyManager 将所有实例配置存储在 PostgreSQL 数据库中:
```
PostgreSQL Database
├── users # User accounts
├── sites # Site groupings
├── instances # VyOS router instances
├── permissions # User-site role mappings
└── active_sessions # Current connections
```
所有 VyOS 实例均通过 Web UI 管理——没有硬编码配置。
## 管理多个 VyOS 实例
### 添加更多站点
1. 导航至 **Site Manager**(点击侧边栏中的 VyOS logo)
2. 点击 **“Add Site”** 按钮
3. 输入站点名称和描述
4. 点击 **“Create Site”**
### 向站点添加实例
1. 在 **Site Manager** 中,从列表中选择一个站点
2. 点击 **“Add Instance”** 按钮
3. 填写实例详细信息:
- **Name**:此路由器的友好名称
- **Description**:可选备注
- **Host**:IP 地址或主机名
- **Port**:HTTPS 端口(默认为 443)
- **API Key**:来自 VyOS 配置的密钥
- **Version**:选择 1.4 或 1.5
- **Protocol**:HTTPS(推荐)或 HTTP
4. 点击 **“Complete Setup”**
### 连接到实例
1. 导航至 **Site Manager**
2. 选择一个站点
3. 在任意实例卡片上点击 **“Connect”**
4. VyManager 将测试连接,验证 API 凭证,并将您重定向到控制面板
5. 您现在可以管理该 VyOS 路由器了!
### 在实例之间切换
- 在侧边栏点击 **“Disconnect Instance”**
- 您将返回 **Site Manager**
- 连接到其他实例
## 基于角色的访问控制
VyManager 实现了细粒度的角色访问控制:
| 角色 | 权限 |
|------|-------------|
| **OWNER** | 完全控制:管理站点,添加/编辑/删除实例,授予权限 |
| **ADMIN** | 管理实例,编辑配置,无法删除站点或管理权限 |
| **VIEWER** | 对配置的只读访问 |
角色按站点分配,允许多租户灵活使用场景。
## 版本感知架构
VyManager 使用版本感知的后端架构支持多种 VyOS 版本(1.4、1.5+)。
### 工作原理
后端采用三层架构:
```
Routers (API Endpoints)
↓
Builders (Batch Operations)
↓
Mappers (Version-Specific Commands)
↓
VyOS Device (1.4 or 1.5)
```
每个功能都暴露一个 `/capabilities` endpoint,用于告知前端连接的 VyOS 版本支持哪些功能。前端根据这些 capabilities 有条件地显示/隐藏功能。
## 开发设置
如果您想贡献代码或从源代码运行 VyManager,请按照以下说明操作。
### 前端开发
```
cd frontend
# 安装依赖
npm install
# 运行开发服务器(启用 hot reload)
npm run dev
# 类型检查
npm run type-check
# Lint
npm run lint
# 为生产环境构建
npm run build
```
### 后端开发
```
cd backend
# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# 安装依赖
pip install -r requirements.txt
# 带 auto-reload 运行
uvicorn app:app --reload --host 0.0.0.0 --port 8000 --proxy-headers
# 查看 API 文档
# 导航到 http://localhost:8000/docs
```
### 数据库迁移
```
cd frontend
# 在 schema 更改后生成迁移
npx prisma migrate dev --name migration_name
# 应用迁移
npx prisma migrate deploy
# 查看数据库
npx prisma studio
```
## 技术栈
### 前端
- **框架**:Next.js 16 (App Router)
- **语言**:TypeScript
- **样式**:Tailwind CSS v4
- **UI 组件**:shadcn/ui
- **图标**:Lucide React
- **身份验证**:Better-auth
- **状态管理**:Zustand
- **数据库 ORM**:Prisma
### 后端
- **框架**:FastAPI
- **语言**:Python 3.11+
- **VyOS SDK**:pyvyos (custom)
- **数据库**:PostgreSQL
- **数据库驱动**:asyncpg
### 基础设施
- **容器**:Docker & Docker Compose
- **数据库**:PostgreSQL 16
- **容器镜像仓库**:GitHub Container Registry (ghcr.io)
## 安全注意事项
1. **更改默认密钥**:在部署前务必更改 `BETTER_AUTH_SECRET` 和数据库密码
2. **使用 HTTPS**:在生产环境部署中启用 SSL/TLS(使用反向代理如 Nginx 或 Traefik)
3. **保护 API 密钥**:安全存储 VyOS API 密钥,切勿将其提交到 git
4. **数据库备份**:定期备份 PostgreSQL 数据库(`postgres_data` 卷)
5. **网络隔离**:在安全的网络分段中运行 VyManager
6. **定期更新**:保持 VyManager 和 VyOS 为最新版本
## 故障排除
### 自定义 CA 证书
如果您的 VyOS 实例使用由私有 CA(例如 FreeIPA、Active Directory CS、内部 PKI)签名的证书,您可以添加您的 CA 证书,以便在启用“Verify SSL”时 VyManager 能够信任它们。
1. 在 `docker-compose.yml` 旁边创建一个 `certs` 目录:
mkdir certs
2. 将您的 CA 证书复制到其中。文件必须为 PEM 编码且扩展名为 `.crt`:
cp /path/to/my-ca.crt ./certs/
3. 重启后端容器:
docker compose restart backend
后端将在启动时自动导入 `certs` 目录中的所有 `.crt` 文件。您可以添加多个 CA 证书——它们都将被信任。
### 无法连接到 VyOS 实例
1. **检查 API 密钥**:验证 VyOS 中的 API 密钥是否与您的输入一致
2. **检查网络**:确保 VyManager 可以访问 VyOS 的 IP 地址
3. **检查端口**:默认为 443,确认未被防火墙阻止
4. **检查 SSL**:如果使用自签名证书,请将“Verify SSL”设置为 false 或添加您的 CA 证书(参见 [自定义 CA 证书](#custom-ca-certificates))
### 容器未启动
```
# 检查容器状态和健康状况
docker compose ps
# 检查错误日志
docker compose logs postgres
docker compose logs backend
docker compose logs frontend
```
### 数据库连接失败
```
# 验证 PostgreSQL 状态是否正常
docker compose ps postgres
# 检查 .env 中的 DATABASE_URL 是否与 postgres service 凭据匹配
# 主机名必须是 "postgres"(Docker service 名称),而不是 "localhost"
```
### 前端无法访问后端
- 验证 `.env` 文件中的 `BACKEND_URL=http://backend:8000`(使用 Docker 服务名称)
- 验证 `TRUSTED_ORIGINS` 包含您在浏览器中访问 VyManager 的 URL
- 检查后端容器是否健康:`docker compose ps backend`
## 贡献
1. Fork 该仓库
2. 创建一个功能分支 (`git checkout -b feature/amazing-feature`)
3. 遵循 `CLAUDE.md` 中的架构模式进行更改
4. 在 VyOS 1.4 和 1.5 上进行全面测试
5. 提交您的更改 (`git commit -m 'feat: add amazing feature'`)
6. 推送到该分支 (`git push origin feature/amazing-feature`)
7. 发起 Pull Request
## 许可证
详情请参阅 LICENSE.md。
## 支持
- **问题反馈**:[GitHub Issues](https://github.com/Community-VyProjects/VyManager/issues)
- **Discord**:[加入我们的社区](https://discord.gg/k9SSkK7wPQ)
- **API 文档**:http://localhost:8000/docs (运行时可用)
- **VyOS 文档**:https://docs.vyos.io/
**专为 VyOS 社区倾心打造**
## 快速开始
### 前置条件
- 主机上已安装 **Docker & Docker Compose**
- 已启用 REST API 和 GraphQL 的 **VyOS 路由器**(参见 [步骤 1](#step-1-enable-the-vyos-rest-api))
## 部署指南
### 步骤 1:启用 VyOS REST API
在部署 VyManager 之前,请在您的 VyOS 路由器上启用 REST API。
通过 SSH 连接到您的 VyOS 路由器并运行:
```
# 进入配置模式
configure
# 创建 API 密钥(将 YOUR_SECURE_API_KEY 替换为一个强壮的随机密钥)
set service https api keys id vymanager key YOUR_SECURE_API_KEY
# 启用 REST 功能(仅限 VyOS 1.5+)
set service https api rest
# 启用 GraphQL(dashboard streaming 需要此功能)
set service https api graphql
# 将 GraphQL 身份验证设置为使用上面定义的 API 密钥
set service https api graphql authentication type key
# 保存并应用
commit
save
exit
```
### 步骤 2:创建项目目录
为 VyManager 创建一个新目录并进入该目录:
```
mkdir vymanager
cd vymanager
```
您将在此目录中创建两个文件:`docker-compose.yml` 和 `.env`。
### 步骤 3:创建 docker-compose.yml
创建一个名为 `docker-compose.yml` 的文件,内容如下:
```
services:
postgres:
image: postgres:16-alpine
container_name: vymanager-postgres
environment:
POSTGRES_USER: vymanager
POSTGRES_PASSWORD: CHANGE_ME_POSTGRES_PASSWORD
POSTGRES_DB: vymanager
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
networks:
- vymanager-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U vymanager -d vymanager"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
backend:
image: ghcr.io/community-vyprojects/vymanager-backend:beta
container_name: vymanager-backend
ports:
- "8000:8000"
volumes:
- ./certs:/usr/local/share/ca-certificates/custom:ro
env_file:
- .env
restart: unless-stopped
networks:
- vymanager-network
depends_on:
postgres:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/docs"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
frontend:
image: ghcr.io/community-vyprojects/vymanager-frontend:beta
container_name: vymanager-frontend
ports:
- "3000:3000"
env_file:
- .env
depends_on:
backend:
condition: service_healthy
postgres:
condition: service_healthy
restart: unless-stopped
networks:
- vymanager-network
networks:
vymanager-network:
driver: bridge
volumes:
postgres_data:
driver: local
```
### 步骤 4:创建 .env 文件
在同一目录中创建一个名为 `.env` 的文件。后端和前端容器都将从此单一文件中读取配置。
在启动之前,您**必须**更改以下值:
1. **`POSTGRES_PASSWORD`** — 在 `docker-compose.yml` 和下面的 `DATABASE_URL` 中**同时**修改;它们必须保持一致。生成方式:`openssl rand -hex 32`
2. **`BETTER_AUTH_SECRET`** — 用于签名和验证会话 token;在文件中会出现**两次**(每个服务一次),且两处的值必须**相同**。生成方式:`openssl rand -base64 32`
3. **`SSH_ENCRYPTION_KEY`** — 用于加密静态存储的 SSH 私钥。生成方式:`openssl rand -hex 32`
4. **`BETTER_AUTH_URL` / `NEXT_PUBLIC_APP_URL`** — 将 `标签:Docker, Docker Compose, GraphQL, IT运维, NPMD, REST API, SDN控制器, Socks5代理, VyOS, Web管理界面, 企业级网络, 多站点管理, 安全防御评估, 广域网管理, 开源网络工具, 测试用例, 网络基础设施, 网络自动化, 网络部署, 网络配置管理, 自动化攻击, 请求拦截, 路由器管理, 逆向工具, 集中化管理