shirainbown 74bab47a5b feat: optimize ping interval to 30s and SSH sync to 10min with timeout protection
- Change ping interval from 60s to 30s (configurable via PING_INTERVAL)
- Change SSH info sync from every ping to every 10 minutes (via ssh_synced_at)
- Add SSH command timeout (8s) to prevent hanging on unresponsive hosts
- Add concurrency limit (5) for SSH sync operations
- Change frontend UI refresh interval from 10s to 30s
- Fix: remove hardcoded 30s step, use configured interval directly
- Fix: ensure ping loop continues even if individual machine fails
2026-06-19 18:08:06 +08:00

局域网机器管理后台 (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
  • SSHgolang.org/x/crypto/ssh密码认证

快速开始

开发模式

# 1. 安装前端依赖并启动开发服务器
cd web
npm install
npm run dev

# 2. 启动后端(在项目根目录另开终端)
cd server
go run .

前端开发服务器默认在 http://localhost:5173,并代理 /apihttp://127.0.0.1:8080

生产构建

make build
# 生成的 lan-manager 可直接运行
./lan-manager

Docker 部署(推荐)

方式一:使用 Docker Compose推荐

# 1. 克隆项目后,直接启动
docker-compose up -d

# 2. 查看日志
docker-compose logs -f

# 3. 停止服务
docker-compose down

服务将运行在 http://localhost:8080

数据持久化在 ./data/ 目录(通过 volume 挂载)。

方式二:手动构建和运行

# 构建镜像
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 镜像的场景:

# 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 反向代理示例

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_PASSSESSION_SECRETENCRYPT_KEY
  • SSH 密码安全:数据库中 SSH 密码经 AES-256-GCM 加密存储API 永不返回密码明文
  • 自动同步 SSH:若机器已保存 SSH 用户名和密码,后台每次 Ping 检测成功后会自动通过 SSH 抓取系统信息并同步到数据库
  • 在线检测机制:每分钟对所有机器 IP 执行 ICMP Ping3 秒内无响应视为离线
  • 磁盘显示策略:机器列表卡片仅展示 / 根分区占用;详情页展示所有真实磁盘分区

Docker 部署注意事项

  1. 数据持久化:通过 volume 挂载 ./data 目录到容器,确保数据在容器重建后不丢失
  2. 网络访问:容器需要访问宿主机网络或目标局域网,默认使用 bridge 网络模式
  3. Ping 权限:容器内可能需要 NET_RAW 能力才能执行 ICMP ping已在 Dockerfile 中通过 setcap 配置
  4. 环境变量:建议通过 .env 文件或 Docker Compose 管理敏感配置
  5. 静态文件:使用 WEB_STATIC_PATH 环境变量时,需确保路径在容器内存在且可读
Description
No description provided
Readme 349 MiB
Languages
Vue 58.3%
Go 37.6%
JavaScript 2.8%
Dockerfile 0.8%
HTML 0.3%
Other 0.2%