[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-83029":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":12,"openIssues":13,"contributorsCount":13,"subscribersCount":13,"size":13,"stars1d":13,"stars7d":14,"stars30d":15,"stars90d":13,"forks30d":13,"starsTrendScore":12,"compositeScore":16,"rankGlobal":8,"rankLanguage":8,"license":17,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":18,"hasPages":18,"topics":20,"createdAt":8,"pushedAt":8,"updatedAt":21,"readmeContent":22,"aiSummary":23,"trendingCount":13,"starSnapshotCount":13,"syncStatus":24,"lastSyncTime":25,"discoverSource":26},83029,"MizuPanel","LeoKon3\u002FMizuPanel","LeoKon3",null,"Go",110,4,1,0,25,45,2.1,"Other",false,"main",[],"2026-06-12 02:04:30","\u003Cp align=\"center\">\n  \u003Cimg src=\"assets\u002Fmizupanel-banner.svg\" alt=\"MizuPanel banner\" width=\"100%\" \u002F>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgo.dev\u002F\">\u003Cimg alt=\"Go\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGo-1.24-00ADD8?logo=go&logoColor=white\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Freact.dev\u002F\">\u003Cimg alt=\"React\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FReact-UI-61DAFB?logo=react&logoColor=0F172A\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fvite.dev\u002F\">\u003Cimg alt=\"Vite\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FVite-build-646CFF?logo=vite&logoColor=white\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fwww.sqlite.org\u002F\">\u003Cimg alt=\"SQLite\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSQLite-storage-003B57?logo=sqlite&logoColor=white\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fwww.docker.com\u002F\">\u003Cimg alt=\"Docker\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FDocker-compose-2496ED?logo=docker&logoColor=white\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fwww.mysql.com\u002F\">\u003Cimg alt=\"MySQL\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FMySQL-optional-4479A1?logo=mysql&logoColor=white\">\u003C\u002Fa>\n  \u003Cimg alt=\"Self-hosted\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fself--hosted-monitoring-14B8A6\">\n  \u003Cimg alt=\"Status\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fstatus-v0.1_preview-F59E0B\">\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cstrong>轻量级自托管服务器监控面板\u003C\u002Fstrong>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  中文 · \u003Ca href=\"README.en.md\">English\u003C\u002Fa>\n\u003C\u002Fp>\n\n---\n\n## 概览\n\nMizuPanel 是一个面向个人服务器和小型服务器集群的轻量级自托管监控面板。它由 Server、Dashboard 和 Agent 组成。Agent 主动通过 WebSocket 连接 Server，并上报 CPU、内存、磁盘、网络和负载指标。\n\n> 注意：当前预览版本暂时没有登录门禁。`\u002Fapi\u002Finstall\u002Fcommand` 可以在未认证情况下生成安装 token。公网暴露 MizuPanel 之前，请先恢复最小管理员认证。\n\n## 功能特性\n\n核心功能：\n\n- 多节点服务器列表和节点详情。\n- CPU、内存、磁盘、网络和 Load 指标。\n- 历史指标查询，默认指标保留 6 小时。\n- Dashboard 生成 Linux 和 Windows Agent 安装命令。\n- Agent 主动连接 Server；目标主机不需要暴露 Agent 端口。\n\n技术栈与部署：\n\n- React + Vite + Tailwind CSS v3 Dashboard。\n- Server 托管 Web 静态资源、安装脚本和 Agent 下载文件。\n- SQLite 本地持久化，可选 MySQL 存储。\n- Docker Compose 部署，默认使用 SQLite。\n- 一次性 `install_token` 用于首次注册，长期 `node_token` 用于后续重连。\n- Release 包内置 Linux amd64 \u002F arm64 和 Windows amd64 Agent 二进制。\n\n## 架构\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"assets\u002Fmizupanel-architecture.svg\" alt=\"MizuPanel architecture diagram\" width=\"100%\" \u002F>\n\u003C\u002Fp>\n\n## 界面预览\n\n| Dashboard | 历史记录 |\n| --- | --- |\n| \u003Cimg src=\"assets\u002Fscreenshots\u002Fdashboard.png\" alt=\"MizuPanel Dashboard\" width=\"100%\" \u002F> | \u003Cimg src=\"assets\u002Fscreenshots\u002Fhistory.png\" alt=\"指标历史记录\" width=\"100%\" \u002F> |\n\n| 系统设置 | 添加主机 |\n| --- | --- |\n| \u003Cimg src=\"assets\u002Fscreenshots\u002Fsettings.png\" alt=\"系统设置\" width=\"100%\" \u002F> | \u003Cimg src=\"assets\u002Fscreenshots\u002Fadd-host.png\" alt=\"添加主机\" width=\"100%\" \u002F> |\n\n| Web 终端 |\n| --- |\n| \u003Cimg src=\"assets\u002Fscreenshots\u002Fterminal.png\" alt=\"Web 终端\" width=\"100%\" \u002F> |\n\n## Docker 快速启动\n\nDocker 是目前最简单的运行方式。默认 Compose 使用 SQLite，所以一条命令即可启动：\n\n```bash\ndocker compose up -d\n```\n\n打开 Dashboard：\n\n```text\nhttp:\u002F\u002F127.0.0.1:8080\n```\n\n默认情况下 Compose 只绑定 `127.0.0.1`，避免在没有登录门禁时直接暴露到所有网卡。你自己在服务器或局域网使用时，可以显式开放：\n\n```bash\nMIZUPANEL_BIND_ADDR=0.0.0.0 docker compose up -d\n```\n\n然后打开：\n\n```text\nhttp:\u002F\u002F你的服务器IP:8080\n```\n\nSQLite 模式使用 `docker\u002Fserver.sqlite.yaml`，镜像构建时会把它复制为容器内的 `\u002Fapp\u002Fserver.yaml`。运行数据会持久化到：\n\n```text\n.\u002Fdata\u002Fmizupanel.db\n```\n\n常用命令：\n\n```bash\ndocker compose logs -f\ndocker compose down\n```\n\n### Docker 使用 MySQL\n\nMySQL Compose 使用 `docker\u002Fserver.mysql.yaml`，启动时会挂载到容器内的 `\u002Fapp\u002Fserver.yaml`。先通过环境变量设置数据库信息：\n\n```bash\nexport MIZUPANEL_MYSQL_DATABASE=mizupanel\nexport MIZUPANEL_MYSQL_USERNAME=mizupanel\nexport MIZUPANEL_MYSQL_PASSWORD='换成你的数据库密码'\nexport MIZUPANEL_MYSQL_ROOT_PASSWORD='换成你的Root密码'\n```\n\n启动 MySQL 版本：\n\n```bash\ndocker compose -f docker-compose.mysql.yml up -d\n```\n\n如果需要让服务器 IP 或局域网访问，显式开放绑定地址：\n\n```bash\nMIZUPANEL_BIND_ADDR=0.0.0.0 docker compose -f docker-compose.mysql.yml up -d\n```\n\nMySQL 数据保存在 Docker volume：\n\n```text\nmizupanel_mizupanel-mysql-data\n```\n\n停止但保留数据：\n\n```bash\ndocker compose -f docker-compose.mysql.yml down\n```\n\n停止并删除 MySQL 数据 volume：\n\n```bash\ndocker compose -f docker-compose.mysql.yml down -v\n```\n\n## Release 包结构\n\n按 Server 所在机器架构选择对应的发布包目标：\n\n```bash\nmake package-linux-amd64 # x86_64 \u002F amd64 服务器\nmake package-linux-arm64 # ARM64 \u002F aarch64 服务器\n```\n\n`make build`、`make package` 和 `make build-x86` 会构建 amd64 包；`make build-arm` 会构建 arm64 包。\n\n选中的目标会生成对应 release 目录和压缩包：\n\n```text\ndist\u002F\n├── mizupanel-linux-amd64\u002F\n├── mizupanel-linux-amd64.tar.gz\n├── mizupanel-linux-arm64\u002F\n└── mizupanel-linux-arm64.tar.gz\n```\n\n每个解压后的包都包含：\n\n```text\nmizupanel-linux-amd64\u002F\n├── mizupanel-server\n├── server.example.yaml\n├── data\u002F\n├── scripts\u002F\n│   ├── install-agent.sh\n│   ├── install-agent.ps1\n│   ├── uninstall-agent.sh\n│   └── uninstall-agent.ps1\n├── systemd\u002F\n│   ├── mizupanel-server.service\n│   └── mizupanel-agent.service\n├── downloads\u002F\n│   ├── mizupanel-agent-linux-amd64\n│   ├── mizupanel-agent-linux-arm64\n│   └── mizupanel-agent-windows-amd64.exe\n└── web\u002F\n    ├── index.html\n    └── assets\u002F\n```\n\nServer 使用 CGO SQLite，所以 arm64 Server 包需要 arm64 C 交叉编译器，例如 `aarch64-linux-gnu-gcc`。Debian\u002FUbuntu 可以通过 `sudo apt install gcc-aarch64-linux-gnu` 安装。\n\n## 发布包部署\n\n### 1. 准备 release 目录\n\n```bash\nmake build\ntar -xzf dist\u002Fmizupanel-linux-amd64.tar.gz\ncd mizupanel-linux-amd64\ncp server.example.yaml server.yaml\n```\n\narm64 服务器请执行 `make package-linux-arm64` 并改用 `mizupanel-linux-arm64.tar.gz`。`server.example.yaml` 是版本管理里的配置模板。`server.yaml` 是本机运行时配置，复制出来后可以按实际环境修改，不会影响模板文件。发布包已包含 `data\u002F` 目录，默认数据库路径会写入 `.\u002Fdata\u002Fmizupanel.db`。\n\n### 2. 修改 `server.yaml`\n\n```yaml\nserver:\n  listen: \":8080\" # MizuPanel Server 的 HTTP 监听地址。\n  public_url: \"\" # 用于生成 Agent 安装命令的公网面板地址；留空时会从请求 Host 推断。\n  enable_terminal: true # 启用浏览器终端路由；Linux Agent 仍需 features.terminal: true。\n\nstorage:\n  driver: \"sqlite\" # sqlite | mysql，默认使用 SQLite。\n  database_path: \".\u002Fdata\u002Fmizupanel.db\" # 旧版 SQLite 路径配置，保留兼容。\n  sqlite:\n    path: \".\u002Fdata\u002Fmizupanel.db\"\n  mysql:\n    host: \"127.0.0.1\"\n    port: 3306\n    username: \"mizupanel\"\n    password: \"\"\n    database: \"mizupanel\"\n\nmetrics:\n  retention: \"6h\" # 历史指标保留时间。\n  cleanup_interval: \"10m\" # 按保留策略清理历史指标的执行间隔。\n\nsecurity:\n  # agent_token 是可选配置，只在你需要长期 bootstrap token 时设置。\n  # 推荐优先使用 Dashboard 生成的一次性 install token 添加主机。\n  # agent_token: \"change-this-to-a-random-secret\" # 可选的长期 Agent bootstrap token；不要暴露在浏览器或公开文档里。\n```\n\n如果 Agent 会从其他机器访问面板，建议设置 `public_url`：\n\n```yaml\nserver:\n  public_url: \"http:\u002F\u002F你的服务器IP:8080\"\n```\n\n### 3. 直接启动 Server\n\n```bash\n.\u002Fmizupanel-server -config server.yaml\n```\n\n打开：\n\n```text\nhttp:\u002F\u002F你的服务器IP:8080\n```\n\n### 4. 可选：使用 systemd 托管\n\nRelease 包内置 `systemd\u002Fmizupanel-server.service` 示例，适合安装到 `\u002Fopt\u002Fmizupanel` 后托管运行；按实际路径调整 service 文件后执行 `systemctl enable --now mizupanel-server` 即可。\n\n## Agent 设置\n\n打开 Dashboard，点击 **添加主机**。Linux 主机可以选择 **SSH 自动安装**，由 Server 一次性使用你输入的 root SSH 凭据完成安装；也可以选择 **手动命令安装**，复制命令到目标机器执行。SSH 凭据不会保存到数据库、不会回显，也不会写入日志。\n\nLinux 安装默认按自用 root 运维模式执行，会自动启用节点终端和 Docker 容器监控。第一版 SSH 自动安装\u002F卸载只支持 Linux root 用户，不支持 sudo 和 Windows。Linux 手动安装\u002F卸载命令也要求在 root shell 中执行。\n\n\u003Cdetails>\n\u003Csummary>Linux 安装命令示例\u003C\u002Fsummary>\n\n```bash\ncurl -fsSL 'http:\u002F\u002F你的面板地址:8080\u002Fscripts\u002Finstall-agent.sh' -o install-agent.sh \\\n  && chmod +x install-agent.sh \\\n  && .\u002Finstall-agent.sh \\\n    --binary-base-url 'http:\u002F\u002F你的面板地址:8080\u002Fdownloads' \\\n    --server-url 'ws:\u002F\u002F你的面板地址:8080\u002Fapi\u002Fagent\u002Fws' \\\n    --token 'one-time-install-token' \\\n    --mode 'ops' \\\n    --node-id \"$(hostname)\" \\\n    --name \"$(hostname)\" \\\n    --enable-docker \\\n    --enable-terminal\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>Windows 安装命令示例\u003C\u002Fsummary>\n\n```powershell\npowershell -NoProfile -ExecutionPolicy Bypass -Command \"`$ErrorActionPreference='Stop'; `$script = Join-Path `$env:TEMP ('mizupanel-install-' + [guid]::NewGuid().ToString() + '.ps1'); Invoke-WebRequest -Uri 'http:\u002F\u002F你的面板地址:8080\u002Fscripts\u002Finstall-agent.ps1' -UseBasicParsing -OutFile `$script -ErrorAction Stop; & `$script `\n    -BinaryBaseUrl 'http:\u002F\u002F你的面板地址:8080\u002Fdownloads' `\n    -ServerUrl 'ws:\u002F\u002F你的面板地址:8080\u002Fapi\u002Fagent\u002Fws' `\n    -Token 'one-time-install-token' `\n    -NodeId `$env:COMPUTERNAME `\n    -Name `$env:COMPUTERNAME\"\n```\n\n\u003C\u002Fdetails>\n\nLinux 安装脚本会从 `downloads\u002F` 中选择匹配系统架构的 Agent 文件，然后安装为：\n\n```text\n\u002Fusr\u002Flocal\u002Fmizupanel\u002Fmizupanel-agent\n\u002Fusr\u002Flocal\u002Fmizupanel\u002Fagent.yaml\n\u002Fetc\u002Fsystemd\u002Fsystem\u002Fmizupanel-agent.service\n```\n\n查看 Linux Agent 服务：\n\n```bash\nsystemctl status mizupanel-agent\njournalctl -u mizupanel-agent -f\n```\n\nLinux Agent 安装权限：\n\n- `\u002Fusr\u002Flocal\u002Fmizupanel` 由 `root:root` 管理。\n- `\u002Fusr\u002Flocal\u002Fmizupanel\u002Fmizupanel-agent` 由 root 拥有并可执行。\n- `\u002Fusr\u002Flocal\u002Fmizupanel\u002Fagent.yaml` 由 `mizupanel-agent:mizupanel-agent` 拥有，权限为 `0600`。\n- systemd `ReadWritePaths` 只允许写入 `agent.yaml`，Agent 可以持久化换发后的 `node_token`，但不能替换自己的二进制文件。\n\nWindows 安装脚本会下载 `mizupanel-agent-windows-amd64.exe`，安装为 `C:\\Program Files\\MizuPanel\\mizupanel-agent.exe`，写入 `C:\\Program Files\\MizuPanel\\agent.yaml`，并注册 `mizupanel-agent` Windows Service。\n\n卸载 Linux Agent：\n\n```bash\ncurl -fsSL 'http:\u002F\u002F你的面板地址:8080\u002Fscripts\u002Funinstall-agent.sh' -o uninstall-agent.sh \\\n  && chmod +x uninstall-agent.sh \\\n  && .\u002Funinstall-agent.sh\n```\n\n卸载 Windows Agent 需要在管理员 PowerShell 中执行：\n\n```powershell\npowershell -NoProfile -ExecutionPolicy Bypass -Command \"`$ErrorActionPreference='Stop'; `$script = Join-Path `$env:TEMP ('mizupanel-uninstall-' + [guid]::NewGuid().ToString() + '.ps1'); Invoke-WebRequest -Uri 'http:\u002F\u002F你的面板地址:8080\u002Fscripts\u002Funinstall-agent.ps1' -UseBasicParsing -OutFile `$script -ErrorAction Stop; & `$script\"\n```\n\n卸载会停止并删除 Agent 服务，同时删除 Agent 安装目录；不会删除 Server 数据库里的节点记录或历史指标。\n\n生成的 Agent 配置使用分块 YAML：\n\n```yaml\nserver:\n  url: \"ws:\u002F\u002F你的面板地址:8080\u002Fapi\u002Fagent\u002Fws\"\n  token: \"one-time-install-token\"\n\nnode:\n  id: \"oracle-sg-01\"\n  name: \"Oracle SG\"\n\nruntime:\n  interval: \"5s\"\n  mode: \"ops\"\n\nfeatures:\n  docker: true\n  terminal: true\n```\n\n## Token 模型\n\n| Token           | 生命周期           | 谁生成                                     | 存放位置                              | 用途                  |\n| --------------- | ------------------ | ------------------------------------------ | ------------------------------------- | --------------------- |\n| `install_token` | 一次性             | Dashboard 创建添加主机命令时由 Server 生成 | 不持久化给 Agent                      | 只用于 Agent 首次注册 |\n| `node_token`    | 长期，每个节点独立 | Server 在首次注册成功后换发                | Agent 本机配置文件；Server 端保存哈希 | Agent 重启和断线重连  |\n\n注册流程：\n\n```text\nDashboard 生成 install_token\n        ↓\nAgent 首次注册\n        ↓\nServer 验证 install_token\n        ↓\nServer 换发 node_token\n        ↓\nAgent 后续使用 node_token 重连\n```\n\n`install_token` 不应作为持久凭据使用；`node_token` 在 Server 端只保存哈希，不保存明文。\n\n## 致谢\n\n感谢 Linux.do 社区的反馈、讨论和启发。\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Flinux.do\u002F\">\u003Cimg alt=\"Linux.do community\" src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLinux.do-community-0ea5e9?style=for-the-badge\">\u003C\u002Fa>\n\u003C\u002Fp>\n","MizuPanel 是一个面向个人服务器和小型服务器集群的轻量级自托管监控面板。它通过 WebSocket 实时收集并展示 CPU、内存、磁盘、网络及负载等关键指标，并支持历史数据查询，默认保留6小时。项目采用Go语言开发后端服务，前端则基于React + Vite构建，提供直观易用的用户界面。存储方面，MizuPanel默认使用SQLite进行本地持久化，同时也支持MySQL作为可选方案。此外，整个系统可以通过Docker Compose轻松部署，非常适合需要对少量服务器进行高效管理和监控的小团队或个人开发者使用。",2,"2026-06-11 04:09:56","CREATED_QUERY"]