- 新增 Dashboard.vue 首页(统计卡片、系统分布、在线率趋势) - 路由调整:根路径 / 默认重定向到 /dashboard - 新增品牌图标(logo.svg、favicon) - 登录页、侧边栏、拓扑图视觉增强 - 全局 CSS 变量重定义(GitHub 风格) - 拓扑图新增布局切换和过滤控制 - 更新 README.md 部署指导,删除旧二进制部署说明
196 lines
6.5 KiB
Markdown
196 lines
6.5 KiB
Markdown
# 局域网机器管理后台 (LAN Manager)
|
||
|
||
一个轻量的局域网机器管理后台,用于集中管理多台虚拟机/主机(20 台以内),展示机器信息、服务部署情况及机器之间的转发/依赖关系。
|
||
|
||
## 功能特性
|
||
|
||
- **访客模式**:无需登录,可查看机器在线状态、已同步的系统数据(CPU/内存/磁盘等)、服务列表(脱敏显示)
|
||
- **管理员模式**:登录后可查看完整信息(含 IP、MAC、拓扑关系),执行增删改、SSH 信息获取、导入导出等操作
|
||
- **机器管理**:主机名、IP、MAC、操作系统、备注、在线状态自动检测
|
||
- **服务管理**:为每台机器维护多个服务条目(名称、端口、协议、备注)
|
||
- **关系管理**:建立机器之间的端口转发、依赖、主从等关系
|
||
- **拓扑可视化**:基于 AntV G6 的力导向图,支持拖拽、缩放
|
||
- **SSH 系统信息获取**:支持手动触发,也可配置自动同步;SSH 密码采用 AES-256-GCM 加密存储
|
||
- **数据导入/导出**:JSON 格式完整备份与恢复
|
||
- **操作日志**:记录所有增删改操作及来源 IP
|
||
- **PVE 虚拟机管理**:支持 Proxmox VE 节点管理、VM 状态查看、远程启停操作
|
||
|
||
## 技术栈
|
||
|
||
- **后端**:Go 1.21+ + Gin + SQLite (modernc.org/sqlite)
|
||
- **前端**:Vue 3 + Vite + Element Plus + AntV G6
|
||
- **认证**:Session/Cookie
|
||
- **SSH**:golang.org/x/crypto/ssh(密码认证)
|
||
|
||
## 快速开始
|
||
|
||
### 开发模式
|
||
|
||
```bash
|
||
# 1. 安装前端依赖并启动开发服务器
|
||
cd web
|
||
npm install
|
||
npm run dev
|
||
|
||
# 2. 启动后端(在项目根目录另开终端)
|
||
cd server
|
||
go run .
|
||
```
|
||
|
||
前端开发服务器默认在 `http://localhost:5173`,并代理 `/api` 到 `http://127.0.0.1:8080`。
|
||
|
||
### 生产构建
|
||
|
||
```bash
|
||
make build
|
||
# 生成的 lan-manager 可直接运行
|
||
./lan-manager
|
||
```
|
||
|
||
## Docker 部署(推荐)
|
||
|
||
### 方式一:使用 Docker Compose(推荐)
|
||
|
||
```bash
|
||
# 1. 克隆项目后,直接启动
|
||
docker-compose up -d
|
||
|
||
# 2. 查看日志
|
||
docker-compose logs -f
|
||
|
||
# 3. 停止服务
|
||
docker-compose down
|
||
```
|
||
|
||
服务将运行在 `http://localhost:8080`。
|
||
|
||
数据持久化在 `./data/` 目录(通过 volume 挂载)。
|
||
|
||
### 方式二:手动构建和运行
|
||
|
||
```bash
|
||
# 构建镜像
|
||
docker build -t lan-manager .
|
||
|
||
# 运行容器
|
||
docker run -d \
|
||
--name lan-manager \
|
||
-p 8080:8080 \
|
||
-v $(pwd)/data:/app/data \
|
||
-e ADMIN_PASS=your-secure-password \
|
||
-e ENCRYPT_KEY=your-encrypt-key \
|
||
lan-manager
|
||
```
|
||
|
||
### 方式三:服务器部署(本地构建二进制 + 服务器构建镜像)
|
||
|
||
适用于服务器网络较慢、无法直接拉取 node/golang 镜像的场景:
|
||
|
||
```bash
|
||
# 1. 本地交叉编译 Linux 二进制
|
||
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o server/lan-manager-linux ./server/main.go
|
||
|
||
# 2. 本地构建前端
|
||
cd web && npm run build
|
||
|
||
# 3. 将二进制和 dist/ 上传到服务器
|
||
cp server/lan-manager-linux /server/path/
|
||
cp -r web/dist /server/path/
|
||
|
||
# 4. 在服务器上构建镜像(只需 alpine 基础镜像,无需 node/golang)
|
||
cd /server/path
|
||
docker build -t lan-manager .
|
||
|
||
# 5. 运行容器
|
||
docker run -d \
|
||
--name lan-manager \
|
||
-p 8080:8080 \
|
||
-v $(pwd)/data:/app/data \
|
||
-e ADMIN_PASS=your-secure-password \
|
||
-e ENCRYPT_KEY=your-encrypt-key \
|
||
-e WEB_STATIC_PATH=/app/static \
|
||
--restart unless-stopped \
|
||
lan-manager
|
||
```
|
||
|
||
## Nginx 反向代理示例
|
||
|
||
```nginx
|
||
server {
|
||
listen 443 ssl;
|
||
server_name aa.cn;
|
||
|
||
ssl_certificate /path/to/aa.cn.crt;
|
||
ssl_certificate_key /path/to/aa.cn.key;
|
||
|
||
client_max_body_size 50M;
|
||
|
||
location / {
|
||
proxy_pass http://127.0.0.1:8080;
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
proxy_read_timeout 60s;
|
||
}
|
||
}
|
||
```
|
||
|
||
## 环境变量
|
||
|
||
| 变量名 | 默认值 | 说明 |
|
||
|--------|--------|------|
|
||
| `HOST` | `0.0.0.0` | 监听地址 |
|
||
| `PORT` | `8080` | 监听端口 |
|
||
| `DB_PATH` | `./data/lan-manager.db` | SQLite 数据库路径 |
|
||
| `DATA_DIR` | `./data` | 数据目录 |
|
||
| `ADMIN_USER` | `admin` | 管理员用户名 |
|
||
| `ADMIN_PASS` | `admin` | 管理员密码(生产环境务必修改) |
|
||
| `SESSION_SECRET` | `lan-manager-secret-change-in-production` | Session 密钥 |
|
||
| `ENCRYPT_KEY` | `lan-manager-default-key-change-in-production` | SSH 密码 AES 加密密钥 |
|
||
| `PING_INTERVAL` | `60` | Ping 检测间隔(秒) |
|
||
| `SSH_TIMEOUT` | `10` | SSH 连接超时(秒) |
|
||
| `LOG_RETENTION_DAYS` | `0` | 日志保留天数(0 表示永久保留) |
|
||
| `UI_REFRESH_INTERVAL` | `10000` | 前端页面自动刷新间隔(毫秒,0 表示关闭) |
|
||
| `WEB_STATIC_PATH` | `""` | 外置静态文件目录(空则使用 embed) |
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
lan-manager/
|
||
├── server/ # Go 后端
|
||
│ ├── main.go
|
||
│ ├── config/
|
||
│ ├── db/
|
||
│ ├── handlers/
|
||
│ ├── middleware/
|
||
│ ├── models/
|
||
│ ├── services/
|
||
│ └── static/ # 嵌入的前端构建产物
|
||
├── web/ # Vue 前端
|
||
│ ├── src/
|
||
│ ├── public/ # 静态资源(logo、favicon 等)
|
||
│ └── dist/ # 构建产物
|
||
├── Dockerfile # Docker 构建文件
|
||
├── docker-compose.yml # Docker Compose 配置
|
||
├── Makefile
|
||
├── go.mod
|
||
└── README.md
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
- **生产环境务必修改**:`ADMIN_PASS`、`SESSION_SECRET`、`ENCRYPT_KEY`
|
||
- **SSH 密码安全**:数据库中 SSH 密码经 AES-256-GCM 加密存储,API 永不返回密码明文
|
||
- **自动同步 SSH**:若机器已保存 SSH 用户名和密码,后台每次 Ping 检测成功后会自动通过 SSH 抓取系统信息并同步到数据库
|
||
- **在线检测机制**:每分钟对所有机器 IP 执行 ICMP Ping,3 秒内无响应视为离线
|
||
- **磁盘显示策略**:机器列表卡片仅展示 `/` 根分区占用;详情页展示所有真实磁盘分区
|
||
|
||
## Docker 部署注意事项
|
||
|
||
1. **数据持久化**:通过 volume 挂载 `./data` 目录到容器,确保数据在容器重建后不丢失
|
||
2. **网络访问**:容器需要访问宿主机网络或目标局域网,默认使用 bridge 网络模式
|
||
3. **Ping 权限**:容器内可能需要 `NET_RAW` 能力才能执行 ICMP ping,已在 Dockerfile 中通过 `setcap` 配置
|
||
4. **环境变量**:建议通过 `.env` 文件或 Docker Compose 管理敏感配置
|
||
5. **静态文件**:使用 `WEB_STATIC_PATH` 环境变量时,需确保路径在容器内存在且可读
|