# 局域网机器管理后台 (LAN Manager)

一个轻量的局域网机器管理后台，用于集中管理多台虚拟机/主机（20 台以内），展示机器信息、服务部署情况及机器之间的转发/依赖关系。

## 功能特性

- **访客模式**：无需登录，可查看机器在线状态、已同步的系统数据（CPU/内存/磁盘等）、服务列表（脱敏显示）
- **管理员模式**：登录后可查看完整信息（含 IP、MAC、拓扑关系），执行增删改、SSH 信息获取、导入导出等操作
- **机器管理**：主机名、IP、MAC、操作系统、备注、在线状态自动检测
- **服务管理**：为每台机器维护多个服务条目（名称、端口、协议、备注）
- **关系管理**：建立机器之间的端口转发、依赖、主从等关系
- **拓扑可视化**：基于 AntV G6 的力导向图，支持拖拽、缩放
- **SSH 系统信息获取**：支持手动触发，也可配置自动同步；SSH 密码采用 AES-256-GCM 加密存储
- **数据导入/导出**：JSON 格式完整备份与恢复
- **操作日志**：记录所有增删改操作及来源 IP

## 技术栈

- **后端**：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
```

## Debian 12 一键部署

```bash
# 1. 解压部署包
tar -xzf deploy/lan-manager-debian12.tar.gz
cd lan-manager-debian12

# 2. 编辑环境变量（务必修改 ADMIN_PASS 和 ENCRYPT_KEY）
nano lan-manager.env

# 3. 执行安装脚本
sudo bash install.sh
```

安装完成后服务自动启动，通过 `systemctl status 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/
├── deploy/                # Debian 12 部署包
├── docs/                  # 需求文档与计划
├── scripts/               # systemd 服务示例
├── server/                # Go 后端
│   ├── main.go
│   ├── config/
│   ├── db/
│   ├── handlers/
│   ├── middleware/
│   ├── models/
│   ├── services/
│   └── static/            # 嵌入的前端构建产物
├── web/                   # Vue 前端
│   ├── src/
│   └── dist/
├── 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 秒内无响应视为离线
- **磁盘显示策略**：机器列表卡片仅展示 `/` 根分区占用；详情页展示所有真实磁盘分区
