GridPerch 使用教程

开箱即用的轻量级分布式运维监控系统 · 服务端 + 采集端协同工作,可监控数千台主机

产品概述

GridPerch 是一款开箱即用的轻量级分布式运维监控系统,主打极简部署、自动化运行、零模板零脚本。 服务端与采集端协同工作,可监控数千台主机。

核心监控指标

指标说明采集端
CPU 使用率整体使用率,采样 1 秒取平均每秒
CPU 温度读取内核 hwmon 温度通道,取 CPU 相关传感器最大值每轮
内存使用率物理内存占用百分比每轮
磁盘容量逐分区容量与使用率每轮
磁盘 IO读写速率(KB/s)与 IOPS每轮
硬盘 SMART整体健康度,需要 smartmontools每轮
系统负载1 / 5 / 15 分钟负载(Windows 恒为 0)每轮
MAC 地址主网卡物理地址每轮
连接数量TCP 连接总数与已建立数每轮
网卡流量上下行速率(KB/s)与包速率每轮
硬件系统信息操作系统、CPU 型号、核数、主机名每轮
关于可选指标 CPU 温度与硬盘 SMART 依赖物理硬件:虚拟机与云主机通常没有温度传感器, SMART 也需要 root 权限且云盘往往不暴露。此时这两项显示为「未采集」, 不会被判定为异常。

支持的资源监控

服务器进程应用

进程存活检查(按名称),可配置异常时自动执行恢复命令。

文件防篡改

SHA256 指纹基线比对,默认改动后持续告警直到还原或重新基线。

端口监听

本地端口监听检查,从采集端本机视角发起。

日志文件

关键字与正则增量监控,只读新增内容不重复告警。

Docker 容器

容器数量与状态;指定容器后可采集 CPU 与内存并设阈值。

数据库

MySQL / Redis / Kafka / RabbitMQ / Elasticsearch 真实建连探测。

数据表

MySQL 真实连接并执行 SQL,可做行数与状态校验。

服务接口 API

HTTP 接口可用性与状态码校验,支持期望状态码与响应关键字。

可视化与告警

能力说明
自研监控大屏ECharts 可视化,8 套模板,支持全屏投屏,每套模板有独立地址
统计分析图表CPU / 内存 / 磁盘 IO / 网络流量 / 系统负载趋势,支持 1 小时到 7 天窗口
指令下发批量执行向指定主机批量下发 shell 命令,agent 拉取执行并回传退出码与输出
告警信息推送邮件、钉钉、企业微信、飞书、Slack、通用 Webhook
告警闭环认领 / 释放、处理备注、按「主机 + 监控项 + 级别 + 时间段」静默、未认领超时催办
内置使用教程本页面:各系统部署指南 + 文件挂载清单

告警闭环怎么用

告警的价值不在于「发出来」,而在于「有人管、有记录、有结论」。控制台「告警」页提供四件事:

动作效果
认领点一下即记下「谁在处理、什么时候接手的」,避免两个人同时查同一件事。重复认领会提示当前处理人
处理备注写下排查过程与结论,备注直接显示在告警内容下方,导出 CSV/Excel 一并带出
静默值班期间做割接、已知问题复发时用。规则按主机 + 监控项 + 级别 + 时间段匹配,静默期内告警照常入库留痕,只是不发邮件、不推机器人;到期自动恢复,也可随时删除立即恢复
催办告警超过设定分钟数仍无人认领,会再推一轮带「未认领催办」前缀的通知,防止半夜的告警沉在聊天记录里没人跟。系统设置 → 告警与提醒 里配置,填 0 关闭
静默是按「主机 + 监控项」而不是按单条告警生效的 —— 同一故障每个冷却窗口都会入库一条新记录,按单条静默只能挡住一条,挡不住后面每一次复发。

关键特性

特性说明
极轻量Go 语言 + SQLite 单文件,服务端常驻内存 20MB 以内
跨平台一致采集端基于 OSHI 思路的 gopsutil 组件抽象,Linux / Windows / macOS / Unix 行为一致
上报可调默认每分钟上报一次,间隔由平台统一下发,无需登录主机修改
全中文 UI部署即用,界面与文档全中文
部署方式支持 Docker Compose / 1Panel / 宝塔面板 / docker 与二进制直接运行

架构与端口

┌──────────────┐POST /agent/minTask┌───────────────┐     ┌──────────┐
│ gridperch-  │───────────────────►│ gridperch-   │────►│ SQLite   │
│ agent        │  JSON + MD5(token) │ server        │     │ 单文件库 │
│ 采集端        │◄───────────────────│ 服务端 / 控制台 │◄────│ 读写分离 │
│ 本地探针│  GET /agent/tasks     └───┬───────┬───┘     └──────────┘
└──────────────┘                          │       │ 平台代拉(可选)
                                  内嵌静态资源     ▼       ▼
                              Web 控制台 + 大屏   ┌──────────────────┐
                                (浏览器)        │ 授权系统(独立)   │
                                                  └──────────────────┘
端口协议用途是否必需
9999HTTP控制台 + 大屏 + 采集端上报 + 安装脚本下发必需
9999ICMP服务端主动探测目标主机连通性按需
22 / 3389 / 3306 / 6379 / 5672 …各协议服务端探针按监控项配置主动连接目标按需
默认只有一个端口 服务端只监听 9999。目标主机只需要能访问这个端口即可接入采集端, 不需要在每台被监控主机上开放任何端口(监控项探测是服务端主动发起的)。

Docker Compose 部署推荐

最省事的方式。整个系统一个容器、一个数据目录,备份就是拷一个目录。

1. 准备目录

mkdir -p /opt/gridperch/data
cd /opt/gridperch

2. 编写 docker-compose.yml

services:
  gridperch:
    image: gridperch/gridperch:latest
    container_name: gridperch
    restart: unless-stopped
    ports:
      - "9999:9999"
    volumes:
      # SQLite 数据库所在目录,必须挂载,否则容器重建后数据全丢
      - ./data:/opt/gridperch/data
      # 采集端发布物缓存目录(用于一键安装采集端),可选
      - ./releases:/opt/gridperch/releases
    environment:
      # 监听地址:保持默认,不要写成 127.0.0.1,否则其他主机接不进来
      GRIDPERCH_ADDR: ":9999"
      # SQLite 文件路径
      GRIDPERCH_DB: "/opt/gridperch/data/gridperch.db"
      # 采集端通信密钥,两端必须一致,建议部署后立即修改
      GRIDPERCH_TOKEN: "请改成你自己的密钥"
      # 控制台初始账号密码,仅首次启动生效
      GRIDPERCH_ADMIN_USER: "admin"
      GRIDPERCH_ADMIN_PASS: "请改成强密码"
      # 对外访问地址,反向代理 / 端口映射场景务必显式指定
      # 安装脚本与采集端升级下载都用它拼装绝对地址
      GRIDPERCH_PUBLIC_URL: "http://192.168.1.10:9999"
      # 历史数据保留天数,0 表示永久保留
      GRIDPERCH_RETENTION: "30"
      # 超过该秒数未上报判定主机离线
      GRIDPERCH_OFFLINE_SEC: "180"
    healthcheck:
      test: ["CMD", "wget", "-qO-", "http://127.0.0.1:9999/"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s
GRIDPERCH_PUBLIC_URL 最容易填错 填了 127.0.0.1 或 localhost 时, 在服务端本机生成的安装命令拷到其他主机执行必然失败。 必须是其他主机能访问到的地址。

3. 启动

docker compose up -d
docker compose logs -f --tail=100

看到 控制台访问地址:http://…:9999 即启动成功,浏览器打开该地址,用上面设置的账号登录。

4. 常用运维命令

docker compose restart gridperch   # 重启
docker compose stop gridperch      # 停止
docker compose up -d                # 启动
docker compose logs -f              # 跟踪日志
docker compose pull && docker compose up -d   # 拉新版并重建

1Panel 部署

  1. 安装 Docker 应用

    在 1Panel 左侧「应用商店」搜索并安装 Docker(若已安装可跳过)。

  2. 新建容器

    「容器」→「创建容器」,填写:

    字段值
    名称gridperch
    镜像gridperch/gridperch:latest
    重启策略始终重启
    端口映射主机 9999 → 容器 9999
    文件夹新建 /opt/gridperch/data
    挂载/opt/gridperch/data → /opt/gridperch/data(读写)
    环境变量见下方表格
  3. 设置环境变量
    变量建议值
    GRIDPERCH_TOKEN自定义强密钥
    GRIDPERCH_ADMIN_USERadmin
    GRIDPERCH_ADMIN_PASS自定义强密码
    GRIDPERCH_PUBLIC_URLhttp://服务器IP:9999
  4. 配置反向代理(可选)

    「网站」→「创建网站 → 反向代理」,域名如 monitor.example.com, 代理地址填 http://127.0.0.1:9999。 配了反向代理后务必把 GRIDPERCH_PUBLIC_URL 改成 https://monitor.example.com。

  5. 防火墙放行

    服务器防火墙与云安全组都要放行 9999/TCP(或反向代理的 443)。

宝塔面板部署

  1. 安装 Docker 管理器

    「软件商店」→ 搜索 Docker 管理器 → 安装。

  2. 添加容器

    「Docker」→「容器管理」→「添加容器」,镜像填 gridperch/gridperch:latest, 端口映射 9999:9999,目录挂载 /opt/gridperch/data 到 /opt/gridperch/data。

  3. 设置环境变量

    同 1Panel,注意 GRIDPERCH_PUBLIC_URL 要填对外可达地址。

  4. 反向代理

    「网站」→ 添加站点 → 反向代理到 http://127.0.0.1:9999。

  5. 放行端口

    「安全」→ 添加放行端口 9999。

Linux 二进制部署

不想用容器时,直接跑二进制。服务端只需要 glibc 与一个可写目录。

1. 下载并安装

mkdir -p /opt/gridperch/data && cd /opt/gridperch
curl -fLo gridperch-server https://github.com/sangxi/gridperch/releases/latest/download/gridperch-server-linux-amd64
curl -fLo gridperch-agent   https://github.com/sangxi/gridperch/releases/latest/download/gridperch-agent-linux-amd64
chmod +x gridperch-server gridperch-agent
./gridperch-server -version

2. 前台试跑

./gridperch-server \
  -addr :9999 \
  -db ./data/gridperch.db \
  -token '你的通信密钥' \
  -user admin -pass '你的控制台密码' \
  -public-url 'http://192.168.1.10:9999'

确认能访问 http://服务器IP:9999 后再做成systemd 服务。

3. 注册为 systemd 服务

sudo tee /etc/systemd/system/gridperch.service >/dev/null <<'EOF'
[Unit]
Description=GridPerch 运维监控服务端
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/gridperch
ExecStart=/opt/gridperch/gridperch-server -addr :9999 -db /opt/gridperch/data/gridperch.db -token 你的通信密钥 -user admin -pass 你的控制台密码 -public-url http://192.168.1.10:9999
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now gridperch
sudo systemctl status gridperch --no-pager
把密钥写进 unit 文件要注意 -token 会以明文出现在 /etc/systemd/system/gridperch.service 中。 该文件默认只有 root 可读,一般可以接受;若安全要求更高,改用环境文件: EnvironmentFile=/etc/gridperch/gridperch.env(权限设为 600)。

4. 常用命令

systemctl restart gridperch
journalctl -u gridperch -f          # 实时日志
journalctl -u gridperch --since today

Windows 部署

服务端

# 解压到 C:\GridPerch
cd C:\GridPerch
.\gridperch-server.exe -addr :9999 -db .\data\gridperch.db -token 你的通信密钥

注册为开机自启(需管理员 PowerShell):

$action = New-ScheduledTaskAction -Execute 'C:\GridPerch\gridperch-server.exe' `
  -Argument '-addr :9999 -db C:\GridPerch\data\gridperch.db -token 你的通信密钥'
$trigger= New-ScheduledTaskTrigger -AtStartup
$principal = New-ScheduledTaskPrincipal -UserId 'SYSTEM' -RunLevel Highest
Register-ScheduledTask -TaskName 'gridperch' -Action $action -Trigger $trigger `
  -Principal $principal -Force
Start-ScheduledTask -TaskName 'gridperch'

放行防火墙

netsh advfirewall firewall add rule name="GridPerch" dir=in action=allow protocol=TCP localport=9999

采集端日常运维

Start-ScheduledTask -TaskName gridperch-agent                          # 手动重启
Get-ScheduledTask -TaskName gridperch-agent | Select-Object State              # 查看状态(应为 Running)
Get-ScheduledTaskInfo -TaskName gridperch-agent | Select-Object LastRunTime,LastTaskResult
Unregister-ScheduledTask -TaskName gridperch-agent -Confirm:$false             # 卸载

文件挂载清单

部署前按这张表核对,避免出现「重启后数据全丢」这类事故。

目录结构

/opt/gridperch/
├── gridperch-server          # 服务端二进制(容器内为镜像自带,不用挂)
├── gridperch-agent           # 采集端二进制(仅手工部署采集端时需要)
├── data/
│   ├── gridperch.db# SQLite 主库 必须挂载
│   ├── gridperch.db-wal      # WAL 日志,与主库同目录
│   └── gridperch.db-shm      # 共享内存索引,与主库同目录
├── releases/                  # 采集端发布物缓存(可选,用于一键安装采集端)
│   └── gridperch-agent-linux-amd64
└── gridperch-file-baseline.json   # 文件防篡改基线(仅采集端,产生在采集端本机)

挂载对照表

宿主机路径容器内路径读写必需性不挂的后果
/opt/gridperch/data /opt/gridperch/data 读写 必需 容器重建后所有历史指标、告警、资产、账号全部丢失
/opt/gridperch/releases /opt/gridperch/releases 读写 可选 一键安装采集端时提示「服务端尚未发布 xx/xx 的采集端版本」
— /etc/localtime 只读 建议 容器内时区变成 UTC,告警时间与主机时间差8 小时
/opt/gridperch/gridperch-file-baseline.json — 读写 仅采集端 采集端重启后文件防篡改基线丢失,首次运行会重建基线
最关键的一条 data 目录必须挂载。SQLite 数据库是整个系统唯一的状态存储, 不挂载等于每次重建容器都从零开始。

时区配置

services:
  gridperch:
    environment:
      TZ: "Asia/Shanghai"
    volumes:
      - /etc/localtime:/etc/localtime:ro

文件权限参考

文件属主权限
gridperch-serverroot755
gridperch-agentroot755
data/运行用户750
data/gridperch.db运行用户640
releases/运行用户755
systemd unitroot644

端口与防火墙

系统命令
CentOS / RHEL / Rockyfirewall-cmd --add-port=9999/tcp --permanent && firewall-cmd --reload
Ubuntu / Debianufw allow 9999/tcp
Windowsnetsh advfirewall firewall add rule name="GridPerch" dir=in action=allow protocol=TCP localport=9999
验证连通性 在目标主机上先执行 curl http://服务端IP:9999/, 能返回页面再执行安装命令。这一步能提前 90% 的连通性问题。

一键安装采集端

  1. 控制台生成命令

    登录控制台 → 左侧「监控」→「添加主机」→ 选择系统与架构、填写主机名 → 复制命令。

  2. 确认目标平台已发布

    页面会提前校验该「系统 + 架构」是否已有可下发的采集端版本。 平台是按系统 + 架构分别发布的, linux/amd64 发布过不等于 linux/arm64 就能装。

  3. 在目标主机执行

    Linux / macOS:

    curl -fsSL "http://服务端IP:9999/install.sh?wgToken=密钥MD5&name=web-01" | sudo bash

    Windows(管理员 PowerShell,单行):

    Invoke-Expression (Invoke-WebRequest -UseBasicParsing "http://服务端IP:9999/install.ps1?wgToken=密钥MD5&name=win-01").Content
  4. 脚本自动完成的事

    识别系统与架构 → 查询平台下发版本 → 下载二进制 → 校验 SHA256 → 拉取平台下发的运行配置 → 注册开机自启的系统服务 (Linux 用 systemd、macOS 用 launchd、Windows 用计划任务)。

  5. 确认上线

    主机自动出现在「主机监控」列表中,默认每分钟上报一次。

命令里为什么只有一个 MD5 安装命令只带 -server / -token-hash / -name 三个必要参数。 通信密钥以 MD5 指纹形式下发,命令行历史与 systemd 单元文件里都不会留下明文口令。 其余运行配置(上报间隔、执行指令开关、更新策略等)全部由平台统一下发并热更新, 改配置不需要登录任何一台主机。

手工部署采集端

不便执行脚本的场景(安全管控、离线环境)可以手工安装。

Linux(systemd)

sudo install -m 0755 gridperch-agent /usr/local/bin/
sudo tee /etc/systemd/system/gridperch-agent.service >/dev/null <<'EOF'
[Unit]
Description=GridPerch 采集端
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/gridperch-agent -server http://服务端IP:9999 -token 你的通信密钥 -name 本机名
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now gridperch-agent
sudo systemctl status gridperch-agent --no-pager
journalctl -u gridperch-agent -f

macOS(launchd)

sudo install -m 0755 gridperch-agent /usr/local/bin/
sudo tee /Library/LaunchDaemons/gridperch-agent.plist >/dev/null <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key><string>gridperch-agent</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/gridperch-agent</string>
    <string>-server</string><string>http://服务端IP:9999</string>
    <string>-token</string><string>你的通信密钥</string>
  </array>
  <key>RunAtLoad</key><true/>
  <key>KeepAlive</key><true/>
  <key>StandardOutPath</key><string>/var/log/gridperch-agent.log</string>
  <key>StandardErrorPath</key><string>/var/log/gridperch-agent.log</string>
</dict>
</plist>
EOF

sudo launchctl load -w /Library/LaunchDaemons/gridperch-agent.plist

卸载

# Linux
sudo systemctl disable --now gridperch-agent
sudo rm -f /etc/systemd/system/gridperch-agent.service /usr/local/bin/gridperch-agent

# macOS
sudo launchctl unload /Library/LaunchDaemons/gridperch-agent.plist
sudo rm -f /Library/LaunchDaemons/gridperch-agent.plist /usr/local/bin/gridperch-agent

# Windows
Unregister-ScheduledTask -TaskName gridperch-agent -Confirm:$false

主机记录会保留,历史数据按服务端保留天数自动清理。

容器内采集宿主主机

需要监控 Docker 所在宿主机的物理指标时,把宿主机根目录挂进容器。

services:
  gridperch-agent:
    image: gridperch/gridperch-agent:latest
    container_name: gridperch-agent
    restart: unless-stopped
    pid: host
    network_mode: host
    volumes:
      # 只读挂载宿主机根目录,让采集端看到真实的 /proc、/sys
      - /:/host:ro,rslave
    environment:
      - TZ=Asia/Shanghai
    command:
      - -server=http://服务端IP:9999
      - -token=你的通信密钥
      - -name=容器宿主机名
只读挂载 ro 一定要加。采集端只需要读 /proc、/sys, 不需要也不应该能修改宿主机文件。

服务端配置项

命令行参数优先于环境变量。完整清单如下。

参数环境变量默认值说明
-addrGRIDPERCH_ADDR:9999HTTP 监听地址
-dbGRIDPERCH_DB./data/gridperch.dbSQLite 文件路径
-tokenGRIDPERCH_TOKENgridperch采集端通信密钥,两端必须一致
-userGRIDPERCH_ADMIN_USERadmin控制台账号(仅首次启动生效)
-passGRIDPERCH_ADMIN_PASSgridperch控制台密码(仅首次启动生效)
-retentionGRIDPERCH_RETENTION30历史数据保留天数,0 表示永久
-purgeGRIDPERCH_PURGE_INTERVAL3600历史清理间隔(秒)
-offlineGRIDPERCH_OFFLINE_SEC180超过该秒数未上报判定离线
-public-urlGRIDPERCH_PUBLIC_URL自动反推对外访问地址,反向代理下务必显式指定;若配成回环 / 内网 / CGNAT 地址,启动日志会警告(避免生成的安装命令写死内网地址导致目标主机连不上)
-cpu-alertGRIDPERCH_CPU_ALERT90CPU 告警阈值(%)
-mem-alertGRIDPERCH_MEM_ALERT90内存告警阈值(%)
-disk-alertGRIDPERCH_DISK_ALERT90磁盘告警阈值(%)
-load-alertGRIDPERCH_LOAD_ALERT10系统负载告警阈值
-alert-cooldownGRIDPERCH_ALERT_COOLDOWN_MIN10同类告警去重冷却(分钟)
-login-alertGRIDPERCH_LOGIN_ALERTtrue主机登录用户变化时生成提醒
-probe-workersGRIDPERCH_PROBE_WORKERS64服务端主动探测并发度
-read-connsGRIDPERCH_READ_CONNS8SQLite 读连接池大小
-write-queueGRIDPERCH_WRITE_QUEUE8192上报写队列容量
-release-dirGRIDPERCH_RELEASE_DIR数据库同级 releases/采集端发布包目录
-hubGRIDPERCH_HUB默认内置(地址已内置,无需填写)授权中心地址;-hub "" 表示完全离线
-hub-tokenGRIDPERCH_HUB_TOKEN内置授权中心拉取令牌。默认使用程序内置令牌,无需配置;仅当改用自建授权中心时才需覆盖。令牌不以明文出现在源码、二进制、界面与日志中
-hub-intervalGRIDPERCH_HUB_INTERVAL_MIN5代拉间隔(分钟)
-hub-auto-updateGRIDPERCH_HUB_AUTO_UPDATEdownload服务端自更新:download 自动就位 / check 只提示 / off 关闭
-hub-uaGRIDPERCH_HUB_UA空访问授权中心的 User-Agent,被网关按 UA 拦截时可覆盖
-hub-restartGRIDPERCH_HUB_RESTARTauto平台升级换完二进制后的生效方式:auto(默认)自动重启使新版本生效;off 只替换文件不重启,需人工重启
-license-secretGRIDPERCH_LICENSE_SECRET空授权签名密钥;旧格式(WGC- / OPSM1- / OPSM-)需与服务端、授权中心一致,新格式(GRIDPERCH2-)改用内置公钥,无需此值
-licenseGRIDPERCH_LICENSE_KEY空授权码(机器码对应的许可证),启动时导入并校验
-license-machineGRIDPERCH_LICENSE_MACHINE自动本机机器码,离线或特殊场景可显式指定
-free-hostsGRIDPERCH_LICENSE_FREE_HOSTS10免费额度内可监控的主机数
-free-usersGRIDPERCH_LICENSE_FREE_USERS3免费额度内可创建的控制台用户数

授权中心通信

平台默认已接入内置授权中心(地址已内置在程序里,无需手动填写),每次同步做四件事:

  1. 拉取并校验导入授权码(授权中心签发后最长一个间隔内生效)
  2. 下载各平台采集端发布物到本地 releases/,设为下发版本
  3. 检测到服务端自身有新版本时自动下载、校验 SHA256、替换二进制;就位后按 -hub-restart 决定是否自动重启生效(默认自动)
  4. 把采集端升级结果回执授权中心
采集端发布物按平台逐个补拉(1.1.1 起) 授权系统按请求的 os/arch 返回对应发布物,因此服务端会对 linux/amd64、linux/arm64、darwin/amd64、darwin/arm64、windows/amd64 共 5 个平台逐个查询补拉,彻底修复「Linux 服务端装不上 Windows 采集端 / 提示『授权系统尚未发布该平台』」的问题。 除当前平台外的其它平台补拉改到后台执行,避免「立即检查更新」被网关超时(HTTP 524)拖死。 授权端下载接口只认 ?token= 查询串鉴权(不认 X-Opsm-Hub-Token 请求头),平台下载时自动带上。
采集端不直接访问授权中心 内网采集端只需要能连到监控端的 9999 端口,不需要为每台被监控主机开通任何出网策略。 只有监控端需要访问公网。
网关拦截是最常见的问题 若授权中心前置了开启 Bot 防护的 CDN(Cloudflare 等), 程序客户端会被人机校验挡下并返回 403,页面上会明确提示这一点。 处理方式是在网关上为 /api/* 路径放行,或改用不挂代理的接口子域, 或直接加 -hub "" 转为完全离线模式(功能不受影响)。

控制台「在线升级」「授权购买」页不再展示授权中心域名,也去掉了跳转到授权站的按钮(1.1.4 起)。

采集端配置项

参数环境变量默认值说明
-serverGRIDPERCH_SERVERhttp://127.0.0.1:9999服务端地址
-tokenGRIDPERCH_TOKENgridperch通信密钥,与服务端一致
-token-hash—空密钥的 MD5,与 -token 二选一
-nameGRIDPERCH_HOSTNAME本机主机名平台显示名称
-intervalGRIDPERCH_INTERVAL60上报间隔(秒),平台下发时被覆盖
-updateGRIDPERCH_UPDATEautoauto 自动升级 / check 只检查 / off 关闭
-update-intervalGRIDPERCH_UPDATE_INTERVAL_MIN30版本检查间隔(分钟)
-allow-commandGRIDPERCH_ALLOW_COMMANDtrue是否执行服务端下发的指令
-remote-configGRIDPERCH_REMOTE_CONFIGautoauto 接受平台下发 / off 只用本地参数
-install-dirGRIDPERCH_INSTALL_DIR可执行文件目录升级时替换二进制的目标目录
运行时改配置不用重装 控制台「系统设置 → 采集端配置」改全局默认值, 「主机监控 → 主机行的采集端配置」给单台主机覆盖。 采集端在下个刷新周期自动生效,不需要登录主机、不需要重启进程。

主机重命名与删除 1.1.5 起

「主机监控」列表里每台主机行的操作区(最右侧一排图标)有 重命名(铅笔)与 删除(垃圾桶)两个图标,仅管理员可见; 鼠标悬停在图标上会显示完整说明,其余图标依次是 下发指令(终端)、采集端配置(滑块)、归类(文件夹)。 主机名支持中文、日文等任意语言文字(1.1.5 起修复了中文名被一键安装脚本清成一串 - 的问题)。

重命名

主机名由采集端的 -name 启动参数决定,平台无法远端修改已部署主机上的服务参数。 因此平台侧的做法是:把该主机名下的全部数据迁移到新名字,并登记「旧名 → 新名」映射。 迁移范围包括指标、告警、系统事件、目录归属、采集端配置、监控项里的「作用主机」,以及资产管理中的「关联监控主机」。

改完不用重装采集端 采集端仍会按自身配置的旧名上报,平台自动归到新名字下,所以改名后不会冒出第二台「旧名」主机。 什么时候想彻底换掉采集端的名字,重装一次(1.1.5 起的安装脚本)即可。

删除

删除会连同该主机的全部历史数据一起清理,不可撤销。 注意:若该主机的采集端仍在运行,它会在下次上报时被重新发现—— 有活着的采集端就是在线主机。要让它彻底不再出现,请先在目标主机上停用或卸载采集端 (sudo systemctl disable --now gridperch-agent)。

可视化大屏

大屏共 8 套模板,全部用 ECharts 渲染(已内嵌为本地资源,内网离线可用)。

模板名称独立地址适合场景
1经典三栏/screen/1常规值班大屏,左概览中趋势右告警
2KPI 矩阵/screen/2领导汇报,十个核心指标一目了然
3环形指标/screen/3整体健康度展示,四个大圆环
4主机明细/screen/4资产规模大、需要逐台核对时
5告警视图/screen/5以告警为核心的处理中心大屏
6资源全景/screen/6十二宫格,趋势与排行一屏看完
7双屏对称/screen/7左右双屏拼接,左主机右告警
8容量与硬件/screen/8容量规划与硬盘健康巡检

操作方式

操作说明
← →切换上/下一套模板,地址同步变为 /screen/N
F进入/退出全屏投屏
Esc退出全屏
时间窗口下拉切换 1 小时 / 3 小时 / 12 小时 / 1 天 / 7 天
自动轮播按钮每 30 秒自动切换模板,投屏长时间无人值守时用

修改大屏名称

大屏顶部那个名字(以及浏览器标签页标题)不再是写死的,可以改成自己单位的叫法: 系统设置 →「界面定制」→ 大屏标题,填完保存即可。

  • 留空时自动使用「系统名称 + 运维监控中心」——只改系统名称也能整体换名,默认安装下仍是「GridPerch 运维监控中心」
  • 改完最迟 10 秒(一次刷新周期)就反映到大屏上,不用重开投屏页面
  • 标题过长时头部按省略号截断,鼠标悬停可看全称,不会把两侧的时钟、模板下拉挤变形

投屏建议

  • 浏览器按 F11 或点大屏内的「全屏」按钮,隐藏浏览器边框
  • 1920×1080 用模板 2 或 6;3840×1080 双屏用模板 7
  • 不同屏幕固定不同地址,例如主屏 /screen/2、副屏 /screen/5

图表变成空白?升级到 1.1.6 1.1.6 已修

1.1.6 之前有个缺陷:大屏刚打开时图表正常,约 10 秒后(正好一个自动刷新周期) KPI 数字仍在跳动、所有图表面板却一起变成空白。原因是每次刷新都会重建整块页面 DOM,而 ECharts 实例还绑在被移除的旧容器上,新数据被画到了已经不在页面里的 画布上。1.1.6 起改为「只要容器换了就重建实例」,已彻底修复——升级到 1.1.6 及以上版本即可,无需改动任何配置。

备份与恢复

全部状态都在一个 SQLite 文件里,备份就是拷文件。

在线热备份(推荐)

直接复制 gridperch.db 可能在写入过程中拿到不一致的快照。 用 SQLite 自带的备份命令更稳妥:

# 需要容器内有 sqlite3,或用官方镜像临时起一个
sqlite3 /opt/gridperch/data/gridperch.db ".backup '/opt/gridperch/backup/gridperch-$(date +%F).db'"

停机冷备份(最简单可靠)

docker compose stop gridperch
tar czf /backup/gridperch-$(date +%F).tar.gz -C /opt/gridperch data
docker compose start gridperch

恢复

docker compose stop gridperch
tar xzf /backup/gridperch-2026-10-11.tar.gz -C /opt/gridperch
docker compose start gridperch

建议的定时备份

# 每天 03:17 冷备一次,保留 14 天
17 3 * * * cd /opt/gridperch && \
  tar czf /backup/gridperch-$(date +\%F).tar.gz data && \
  find /backup -name 'gridperch-*.tar.gz' -mtime +14 -delete
备份一定要演练恢复 备份文件存在不等于能恢复。至少每季度在测试环境完整恢复一次。

升级与回滚

服务端升级

# Docker
docker compose pull && docker compose up -d

# 二进制(手工替换,务必按下面 5 步)
sudo systemctl stop gridperch
sudo cp /opt/gridperch/gridperch-server /opt/gridperch/gridperch-server.bak
sudo cp 新版/gridperch-server /opt/gridperch/gridperch-server
sudo systemctl start gridperch

手工替换二进制升级步骤

  1. 备份旧二进制

    sudo cp /opt/gridperch/gridperch-server /opt/gridperch/gridperch-server.bak

  2. 清理待生效标记文件

    sudo rm -f /opt/gridperch/.gridperch-server.pending

    不清掉的话,启动时程序会认为「上次升级尚未生效」而回滚到 .bak,表现为「换了二进制又变回旧版」。这一步最关键。

  3. 替换二进制并赋权

    sudo cp 新版/gridperch-server /opt/gridperch/gridperch-server && sudo chmod +x /opt/gridperch/gridperch-server

  4. 重启服务

    sudo systemctl restart gridperch

  5. 校验版本

    /opt/gridperch/gridperch-server -version

前端(HTML / JS / CSS)通过 //go:embed all:web 编译进同一个二进制,因此升级只需替换这一个二进制文件,无需另行部署静态资源。

平台自升级与自动重启(1.1.3 起)

服务端自身在平台升级换完二进制后会自动重启使新版本生效,不再需要人工 systemctl restart:

  • systemd(unit 用 Restart=always):进程退出后由 systemd 用新版本拉起
  • Docker Compose(restart: unless-stopped):容器 PID 1 退出后由 compose 重启容器
  • 手工 nohup 启动:自行拉起同参数的新进程后退出;端口被占用会重试,最多 20 秒
  • 新版本启动失败:下次启动时自动回滚到 .bak

行为由 -hub-restart 控制:auto(默认)自动重启生效;off 只替换文件不重启,需人工重启。启动时端口被占用会自动重试最多 20 秒,覆盖「新进程先起、旧进程后退」的交接窗口。

升级后清一次前端缓存(1.1.2 起) 内嵌前端资源统一带 Cache-Control: no-cache,升级后浏览器与反向代理不会再用旧前端。 若页面表现异常,仍建议 Ctrl+F5 强制刷新一次。

采集端自动升级

采集端按平台配置的检查间隔(默认 30 分钟)查询版本,发现新版本会自行 下载 → 校验 SHA256 → 替换二进制 → 重启,全程不需要登录目标主机。

  • 由 systemd / launchd 托管时直接退出交给服务管理器拉起,不会同时跑两个进程
  • 替换走「旧文件改名 → 新文件落位」的原子流程,Windows 上正在运行的 exe 也能安全替换
  • 校验不过直接中止并保留原进程;替换失败会回滚旧文件

回滚

采集端发布物按「系统 + 架构」分别登记,每个平台可保留多个版本, 其中一个是下发版本——改它就是灰度或回滚。 在控制台「在线升级」页操作即可。

常见问题排查

部署类

现象原因处理
其他主机打不开控制台只监听了回环地址改用 -addr :9999,启动日志会主动提示
采集端装不上目标主机访问不到服务端地址先在目标主机 curl http://服务端IP:9999/ 自测
服务端尚未发布 xx/xx 的采集端版本该「系统 + 架构」没有发布物在「添加主机」页看已发布平台列表,按系统+架构分别发布
Windows 报「无法连接到远程服务器」地址填了 127.0.0.1 或防火墙未放行换成目标机可达地址,放行 9999/TCP
Linux 提示未找到 curl精简镜像缺工具yum install -y curl 或 apt-get install -y curl
提示需要管理员权限Windows 安装脚本要求管理员 PowerShell右键「以管理员身份运行」
重启后数据全丢data 目录没挂载按文件挂载清单挂上 /opt/gridperch/data
告警时间差 8 小时容器时区是 UTC设置 TZ=Asia/Shanghai 并挂载 /etc/localtime
Windows 7 / 8 / 8.1 / Server 2008 R2 / 2012 / 2012 R2 上采集端双击后闪退,没有窗口也没有日志Go 1.21 起编译的程序要求 Windows 10 / Server 2016 以上:随机数源依赖 bcryptprimitives.dll(Win7/2008R2 没有),且砍掉了 WSASocket / LoadLibraryEx 的旧回退。进程在 runtime 初始化阶段就退出,早于任何业务日志改用兼容产物 gridperch-agent-windows-amd64-win7.exe(Go 1.20 构建),并在「版本发布」页勾选旧系统兼容版上传一次 —— 1.2.3 起安装脚本按系统版本自动选、自升级也只拿兼容版,不再需要 -remote-config off -update off(1.2.2 及更早仍需)。Win7 / 2008 R2 只有 PowerShell 2.0,用系统自带的 schtasks.exe 注册开机自启
旧系统一键安装报「尚未发布…旧系统兼容版」平台只有正式版,没有兼容版记录(授权系统那条线只存一份产物)控制台「版本发布」→「采集端发布物(本地上传)」→ 填同一个版本号、勾选「旧系统兼容版」上传;正式版与兼容版并存,互不覆盖
「授权系统返回 HTTP 502(网关错误)」请求已到达反向代理/CDN,但它没能从上游的授权中心拿到应答 —— 不是 -hub 地址写错查四处:中心进程是否在跑、proxy_pass 端口是否一致、上游是 HTTPS 时是否加了 proxy_ssl_server_name on;、中心侧日志有没有收到请求。「在线升级」页会显示响应页面标题与 Server 头,据此判断卡在哪一层
「返回的是网页,说明地址落到了静态站点上」-hub 指到了站点首页而不是接口-hub 只写到域名的上一级(可带子路径),形如 https://域名;/api/v1/check 由程序自己拼,误填了也会被自动削掉

数据类

现象原因处理
主机显示离线但实际在线采集端没在跑,或网络不通检查采集端服务状态;确认能访问服务端 9999
指标全是 0采集端刚重启,首轮采样缺基准磁盘 IO 与网速第二轮上报起生效,属正常
温度、SMART 显示「未采集」虚拟机/云主机没有对应硬件属正常现象,不影响判定
Windows 负载恒为 0Windows 无 loadavg 机制属正常现象,页面已标注
监控项一直正常但没数据目标配置写错看监控项的最近一次消息,失败原因会写明

授权中心类

现象原因处理
同步返回 401 提示拉取令牌不正确授权中心当前配置的令牌与平台发出的不一致授权中心的令牌已改为编译内置,核对两侧内置值是否一致;或临时用 -hub-token 显式覆盖
同步返回 403 + Just a moment...CDN 人机校验拦下程序客户端在网关上为 /api/* 配置跳过规则;或改用不挂代理的接口子域;或 -hub "" 转离线
同步返回 HTML 而非 JSON-hub 指向了网页地址应为默认内置的授权中心地址(已内置程序,无需手动填写),不要带接口路径
一直显示「尚未签发授权」授权中心还没给本机机器码签发拿控制台显示的机器码去授权中心后台签发
授权导入后校验失败(提示签名校验失败)公钥抄错,或旧格式密钥不一致新格式(GRIDPERCH2-)看启动日志的「授权验签公钥指纹」是否与授权中心一致,不一致就是公钥抄错了;旧格式(WGC-/OPSM1-/OPSM-)才需要两端 -license-secret 一致
日志反复刷「同步失败」授权中心不可达已自动退避(最长 30 分钟一次),无需处理
发现新版本但不自动升级-hub-auto-update 为 check/off改回 download,或手动点「拉取并升级」
提示「可升级到 X」但版本号永远不变,服务还反复重启授权端把旧产物登记成了新版本号(典型:改了 -v 却没重新构建,--skip-build 复用了上一版 dist)——二进制自报版本没变,每轮同步都会「再升一次」1.1.7 起平台与采集端在替换前都会先执行新二进制的 -version 自检,自报版本不高于当前就直接拒绝替换并给出报错;按报错重新构建、重新上传真正的该版本号即可(release.sh 也会在上传前比对 dist/VERSION 拦下这种误传)

登录与控制台类

现象原因处理
登录后明确提示「用户名或密码错误」账号或密码不正确(1.1.2 起给出明确原因,不再「点了没反应」)核对账号密码;注意控制台账号为首次启动时的 -user/-pass(环境变量 GRIDPERCH_ADMIN_USER/GRIDPERCH_ADMIN_PASS),仅首次启动生效
登录后明确提示「账号已停用」该控制台用户被停用用其他管理员在「系统设置 → 用户管理」重新启用

排查顺序

  1. 看服务端日志:docker compose logs --tail=200 或 journalctl -u gridperch -n 200
  2. 看采集端日志:Linux journalctl -u gridperch-agent -n 200, Windows Get-ScheduledTaskInfo -TaskName gridperch-agent
  3. 在目标主机自测连通性:curl http://服务端IP:9999/
  4. 自测授权中心:curl -o /dev/null -w '%{http_code}' "https://<你的授权中心地址>/api/v1/check?token=xxx",期望 200
  5. 看控制台「操作审计」,确认配置改动是否生效
  6. 看控制台「系统设置 → 机器人推送 / 邮件」,确认告警通道是否可用(可点测试)