# 局域网机器管理后台 (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` 环境变量时,需确保路径在容器内存在且可读