iSrvd

September 7, 2026 · View on GitHub

名称源自 "it is a server daemon"srv 对应 Linux 惯例目录 /srvd 代表 daemon。发音:读作 "I served"(/ˈaɪ sɜːrvd/),谐音"爱服务"。

基于 Go + Vue 3 构建的轻量级运维面板,集成文件管理、Docker 容器编排、APISIX/Caddy 网关配置、Web 终端、GPU 监控、计划任务与 AI 助手,为个人服务器与中小型团队提供一站式管理体验。

功能特性

模块功能
系统概览CPU、内存、磁盘、网络、Go 运行时与 GPU 监控,支持历史数据采集、服务可用性探测和在线升级
文件管理浏览、上传、下载、编辑、创建/删除目录、重命名、权限修改、压缩/解压
Web 终端基于 xterm.js 的 Shell 终端,支持容器终端接入
SSH 远程管理管理主机与可复用凭据,支持密码/私钥认证、浏览器终端和 SFTP 文件管理
AI 助手内置 Copilot,基于 CopilotKit + AG-UI 协议,通过内置 OpenAPI 目录调用后端接口,支持页面上下文、工具卡片与写操作审批,兼容 OpenAI API 的 LLM 接入
计划任务定时任务调度,支持 Shell/BAT/PowerShell/可执行文件,以及 Docker 临时容器或已有容器执行模式
APISIX路由、Consumer、上游(Upstream)、SSL 证书、插件配置(PluginConfig)、插件列表、访问授权管理
CaddyHTTP 服务、路由、Basic Auth、SSL 证书、全局选项管理,支持原始配置编辑
Docker容器、镜像、网络、卷、镜像仓库管理,容器文件、实时日志、资源统计、终端接入、镜像构建/推送/拉取
Swarm集群信息、节点、服务、任务管理,服务日志、强制更新、加入令牌管理
Compose文件编辑、Docker Compose / Swarm Stack 部署与重部署
成员管理多用户、家目录隔离、路由级权限控制、API 令牌、TOTP 二次验证和 Passkey 无密码登录
系统管理配置管理、操作审计日志、OIDC 认证集成、代理认证头登录
移动端响应式布局,适配移动设备

技术栈

层级技术
后端Go 1.25+ / Gin / golang-jwt
前端Vue 3 / TypeScript / Tailwind CSS / Pinia
终端xterm.js
容器Docker / APISIX / Caddy
AI兼容 OpenAI API 的 LLM 接入,前端基于 CopilotKit + AG-UI 协议

Docker 部署

提供三个镜像版本:

镜像说明
rehiy/isrvd:slim默认版本,仅含 isrvd,适合大多数场景
rehiy/isrvd:apisixisrvd + APISIX,集成 API 网关
rehiy/isrvd:caddyisrvd + Caddy,集成反向代理与 TLS 管理

CNB 流水线会同步推送到 CNB Docker 制品库,镜像路径为 docker.cnb.cool/<repo-slug>:<tag>,支持 slimcaddyapisix 三个标签,其中 slim 同时作为 latest。 国内 Docker 部署可将下方示例中的 rehiy/isrvd:<tag> 替换为 docker.cnb.cool/rehiy/isrvd:<tag>

Docker 版默认管理员账号为 admin / admin,首次登录成功后会自动跳转至修改密码页面。

脚本安装(推荐)

安装脚本会自动安装 Docker、初始化单节点 Swarm、创建可挂载的 overlay 网络 sdnet,并根据参数启动对应的一体化镜像:

该脚本面向使用 systemd 的 Linux,需以 root 用户执行。

# slim / caddy / apisix 三选一
bash <(curl -sL https://jscdn.rehi.org/gh/rehiy/isrvd/build/script/isrvd.sh) install --docker
bash <(curl -sL https://jscdn.rehi.org/gh/rehiy/isrvd/build/script/isrvd.sh) install --caddy
bash <(curl -sL https://jscdn.rehi.org/gh/rehiy/isrvd/build/script/isrvd.sh) install --apisix

Docker 版统一使用容器名 isrvd,数据保存在 /srv/dataupdate 会按当前镜像类型重建容器,uninstall 删除容器但保留数据目录。

创建网络

使用安装脚本时无需手动操作。手动部署 Docker 版时,推荐先初始化 Swarm,再创建可挂载的 overlay 网络:

docker swarm init
docker network create --driver=overlay --attachable sdnet

slim(默认)

仅含 isrvd 本体,体积最小,适合只需要文件管理、Docker/Swarm/Compose、计划任务等功能的场景。

docker run -d \
  --name isrvd \
  --network sdnet \
  -p 8080:8080 \
  -v /srv/data:/data \
  -v /var/run/docker.sock:/var/run/docker.sock \
  rehiy/isrvd:slim
端口映射服务说明
8080 → 8080isrvdWeb 管理界面

apisix(集成 API 网关)

isrvd + APISIX,适合已使用 APISIX 作为 API 网关的场景。

docker run -d \
  --name isrvd \
  --network sdnet \
  -p 8080:8080 \
  -p 80:9080 \
  -p 443:9443 \
  -v /srv/data:/data \
  -v /var/run/docker.sock:/var/run/docker.sock \
  rehiy/isrvd:apisix
端口映射服务说明
8080 → 8080isrvdWeb 管理界面
80 → 9080APISIXHTTP 代理端口
443 → 9443APISIXHTTPS 代理端口

caddy(集成反向代理)

isrvd + Caddy,适合需要反向代理、自动 HTTPS(ACME)或统一网关管理的场景。

docker run -d \
  --name isrvd \
  --network sdnet \
  -p 8080:8080 \
  -p 80:80 \
  -p 443:443 \
  -v /srv/data:/data \
  -v /var/run/docker.sock:/var/run/docker.sock \
  rehiy/isrvd:caddy
端口映射服务说明
8080 → 8080isrvdWeb 管理界面
80 → 80CaddyHTTP 代理端口
443 → 443CaddyHTTPS 代理端口

Caddy 默认 HTTP 服务监听 :80:443,但禁用了自动 HTTPS 及重定向。如需 HTTPS,可在「Caddy → 服务」中编辑对应服务的 HTTPS 行为,或直接编辑「原始配置」。

Docker Compose

services:
  isrvd:
    image: rehiy/isrvd:slim
    container_name: isrvd
    restart: unless-stopped
    networks:
      - sdnet
    ports:
      - "8080:8080"
    volumes:
      - /srv/data:/data
      - /var/run/docker.sock:/var/run/docker.sock

networks:
  sdnet:
    external: true

注意

  • 请先创建 sdnet 网络(见上方「创建网络」章节),Compose 中通过 external: true 引用已有网络
  • 请始终挂载整个 /data 目录,避免容器重建时数据丢失

二进制部署

  • 目录:/usr/local/isrvd/,包含二进制和配置文件
  • 限制:无法通过容器内网访问其它容器
  • 安装脚本适用于使用 systemd 的 Linux,需以 root 用户执行
# 一键安装(默认自动按 IP 选择 CNB/GitHub 源,可用 --cn / --global 手动指定)
bash <(curl -sL https://jscdn.rehi.org/gh/rehiy/isrvd/build/script/isrvd.sh) install
bash <(curl -sL https://jscdn.rehi.org/gh/rehiy/isrvd/build/script/isrvd.sh) install --cn

# 更新/卸载/仅下载
bash <(curl -sL https://jscdn.rehi.org/gh/rehiy/isrvd/build/script/isrvd.sh) update
bash <(curl -sL https://jscdn.rehi.org/gh/rehiy/isrvd/build/script/isrvd.sh) update --global
bash <(curl -sL https://jscdn.rehi.org/gh/rehiy/isrvd/build/script/isrvd.sh) uninstall
bash <(curl -sL https://jscdn.rehi.org/gh/rehiy/isrvd/build/script/isrvd.sh) download

也可直接运行 ./isrvd,通过 CONFIG_PATH 指定配置位置:

# 默认读取 ./config.yml
./isrvd

# 本地 YAML
CONFIG_PATH=/data/conf/isrvd.yml ./isrvd

# etcd(value 仍为 config.yml 同款 YAML)
etcdctl put /isrvd/config "$(cat /data/conf/isrvd.yml)"
CONFIG_PATH="etcd://user:pass@127.0.0.1:2379/isrvd/config?scheme=http&timeout=5s" ./isrvd

# etcd key 不存在时,用 fallback YAML 初始化并写入 etcd
CONFIG_PATH="etcd://127.0.0.1:2379/isrvd/config?fallback=/data/conf/isrvd.yml" ./isrvd

# etcd 完整配置示例
# etcd://user:pass@host1:2379,host2:2379/key?scheme=http&timeout=5s&fallback=/path/config.yml

etcd 认证可省略,也可用 ETCD_USERNAME / ETCD_PASSWORD 补充或覆盖 URI 中的认证信息。etcd key 发生 PUT 变更时,isrvd 会重载配置、注册中心和业务服务。通过系统配置 API 保存的本地 YAML 也会立即触发重载;若直接在磁盘上修改 YAML,则需发送 SIGHUP 或重启进程。

本地开发

环境要求

  • Go:用于后端服务与命令行构建
  • Node.js / npm:用于 webview 前端开发与构建(持续集成环境使用 Node.js 24)
  • Docker:可选,用于 Docker、Swarm、Compose 相关功能调试

启动开发环境

./develop.sh

开发脚本会自动:

  • 后端:复制 config.yml.local.yml(如不存在),并通过 CONFIG_PATH=.local.yml go run cmd/server/main.go 启动
  • 前端:进入 webview,安装依赖并执行 npm run dev
  • 端口清理:启动前尝试释放 80803000 端口

Windows 环境可使用:

develop.bat

Windows 脚本直接使用根目录的 config.yml 启动后端,并执行 npm run dev;需先在 webview 目录安装前端依赖。

构建与校验

# 完整分发构建
./build.sh

# 后端全包编译检查
go test ./...

# Go 静态检查
go vet ./...

# 前端类型检查
(cd webview && npm run lint)

# 前端格式与 import 排序检查
(cd webview && npm run format:check)

# 前端样式一致性检查
(cd webview && python3 scripts/review-style.py)

# 空白与冲突标记检查(在仓库根目录执行)
git diff --check

贡献代码前请优先阅读 AGENTS.md。该文件是当前仓库的代码规范与协作约定入口,旧版 CODE_STYLE 不再作为规范来源。

配置说明

配置段说明
schema配置结构版本,用于自动迁移
server监听地址、数据根目录、上传限制、CORS、JWT 密钥/有效期、OpenAPI 开关和调试模式
password密码登录开关与最小密码长度
tha代理认证头登录(enabled / headerName / trustedCIDRs)
oidcOIDC 认证(enabled / issuerUrl / clientId / clientSecret / redirectUrl / usernameClaim / scopes / loginLabel)
passkeyWebAuthn/Passkey 认证(enabled / rpName / rpId / rpOrigins / timeout)
copilotAI 助手模型接入(model / baseUrl / apiKey)
apisixAPISIX Admin API 地址和密钥
caddyCaddy Admin API 地址
dockerDocker 守护进程地址、容器数据目录、镜像仓库账号
monitor系统与容器监控的采集间隔(5/15/30/60 秒,其他值禁用自动采集)
marketplace应用市场地址
links自定义快捷链接(名称、URL、图标)
members用户账号、家目录、Founder 标记、路由权限、Passkey 与 TOTP 信息

权限模块

权限基于路由进行细粒度控制。默认的 AccessPerm 路由要求成员持有对应的完整路由权限,Founder 不受此限制;AccessAuth 路由只要登录即可访问,AccessAnon 路由允许匿名访问。

权限格式<METHOD> /api/<模块>/<路由>(如 GET /api/docker/containersPOST /api/compose/docker

前端权限判断:使用 portal.hasPerm('<METHOD> /api/<路由>') 控制按钮/操作的显示

留空 = 无 AccessPerm 路由权限;具体可用路由可在登录后通过 GET /api/account/routes 获取。下表列出主要权限点示例。

模块路由权限点示例说明
overviewGET /api/overview/version系统概览(版本信息)
overviewGET /api/overview/monitor系统概览(监控数据)
overviewPOST /api/overview/upgrade系统概览(在线升级)
systemGET /api/system/config系统设置(获取配置)
systemPUT /api/system/config系统设置(保存配置)
systemGET /api/system/audit/logs系统设置(审计日志)
accountGET /api/account/members成员管理(列出)
accountPOST /api/account/member成员管理(创建)
accountPUT /api/account/member/:username成员管理(更新)
accountDELETE /api/account/member/:username成员管理(删除)
accountPOST /api/account/token成员管理(创建 API 令牌)
accountGET /api/account/2fa/status二次验证(查询状态)
accountPOST /api/account/2fa/totp/begin二次验证(开始绑定 TOTP)
accountPOST /api/account/2fa/totp/enable二次验证(启用 TOTP)
accountPOST /api/account/2fa/totp/disable二次验证(禁用 TOTP)
accountPOST /api/account/passkey/register/beginPasskey(开始绑定)
accountPOST /api/account/passkey/register/finishPasskey(完成绑定)
accountGET /api/account/passkey/credentialsPasskey(查询凭证列表)
accountPUT /api/account/passkey/credential/:idPasskey(重命名凭证)
accountDELETE /api/account/passkey/credential/:idPasskey(删除凭证)
filerGET /api/filer/files文件管理(列出)
filerGET /api/filer/file文件管理(读取)
filerPOST /api/filer/file文件管理(创建文件)
filerPUT /api/filer/file文件管理(修改)
filerDELETE /api/filer/file文件管理(删除)
filerPOST /api/filer/dir文件管理(创建目录)
filerPOST /api/filer/upload文件管理(上传)
filerPOST /api/filer/rename文件管理(重命名/移动,后端校验目标路径边界)
filerPUT /api/filer/chmod文件管理(修改权限)
filerPOST /api/filer/zip文件管理(压缩)
filerPOST /api/filer/unzip文件管理(解压)
shellGET /api/shellWeb 终端
sshGET /api/ssh/hostsSSH 远程管理(列出主机)
sshGET /api/ssh/credentialsSSH 远程管理(列出凭据)
sshPOST /api/ssh/hostSSH 远程管理(添加主机)
sshGET /api/ssh/to/:idSSH 远程管理(连接终端)
sshGET /api/sftp/:id/lsSSH 远程管理(SFTP 列出目录)
copilotPOST /api/copilot/aguiAI 助手(AG-UI 协议对话)
cronGET /api/cron/jobs计划任务(列出)
cronPOST /api/cron/jobs计划任务(创建)
cronPOST /api/cron/jobs/:id/run计划任务(立即执行)
cronGET /api/cron/jobs/:id/logs计划任务(查看日志)
apisixGET /api/apisix/routesAPISIX 管理(路由列出)
apisixGET /api/apisix/consumersAPISIX 管理(消费者列出)
apisixGET /api/apisix/upstreamsAPISIX 管理(上游列出)
apisixGET /api/apisix/sslsAPISIX 管理(证书列出)
apisixGET /api/apisix/plugin-configsAPISIX 管理(插件配置列出)
apisixGET /api/apisix/whitelistAPISIX 管理(访问授权列出)
dockerGET /api/docker/infoDocker 管理(服务信息)
dockerGET /api/docker/containersDocker 管理(容器列出)
dockerGET /api/docker/imagesDocker 管理(镜像列出)
dockerGET /api/docker/networksDocker 管理(网络列出)
dockerGET /api/docker/volumesDocker 管理(卷列出)
dockerGET /api/docker/registriesDocker 管理(镜像仓库列出)
swarmGET /api/swarm/infoSwarm 管理(集群信息)
swarmGET /api/swarm/nodesSwarm 管理(节点列出)
swarmGET /api/swarm/servicesSwarm 管理(服务列出)
swarmGET /api/swarm/tasksSwarm 管理(任务列出)
composeGET /api/compose/docker/:nameCompose 管理(读取配置)
composePOST /api/compose/dockerCompose 管理(部署)
composePUT /api/compose/docker/:nameCompose 管理(重部署)
composeGET /api/compose/swarm/:nameCompose 管理(读取配置)
composePOST /api/compose/swarmCompose 管理(部署)
composePUT /api/compose/swarm/:nameCompose 管理(重部署)
caddyGET /api/caddy/infoCaddy 管理(概览)
caddyGET /api/caddy/configCaddy 管理(读取原始配置)
caddyPOST /api/caddy/configCaddy 管理(整体替换配置)
caddyGET /api/caddy/globalCaddy 管理(读取全局选项)
caddyPUT /api/caddy/globalCaddy 管理(更新全局选项)
caddyGET /api/caddy/serversCaddy 管理(HTTP 服务列出)
caddyGET /api/caddy/routesCaddy 管理(路由列出)
caddyGET /api/caddy/basic-authCaddy 管理(Basic Auth 路由列出)
caddyGET /api/caddy/certsCaddy 管理(证书列出)
caddyPOST /api/caddy/certCaddy 管理(创建证书)
caddyPUT /api/caddy/cert/:keyCaddy 管理(更新证书)
caddyDELETE /api/caddy/cert/:keyCaddy 管理(删除证书)

GPU 监控

支持自动检测 NVIDIA / AMD / Intel / Apple Silicon 独立显卡,显示使用率、显存、温度、功耗、风扇转速。

厂商首选方式回退方式
NVIDIAnvidia-smi
AMDsysfsrocm-smi
Intelsysfs
Apple Siliconioreg

自动过滤虚拟显卡和 Intel 核显(Intel Arc 独显保留);无独立显存的 AMD APU 通常会在采集时自然跳过。

Docker 部署注意事项

NVIDIA

docker run -d --gpus all rehiy/isrvd:slim

AMD / Intel

docker run -d --device /dev/dri:/dev/dri rehiy/isrvd:slim

架构设计

分层架构

cmd/server ────────────→ config + internal/registry + internal/server
config ──────────────────→ pkgs/cstore
internal/registry ───────→ config + pkgs/{apisix,caddy,docker,swarm}
internal/service/* ───────→ config / internal/registry / pkgs/*
internal/server ─────────→ config + internal/registry + internal/service/* + pkgs/* + public
  • cmd/server:按 config.Init → registry.Init → server.StartApp 启动应用
  • config:通过 CONFIG_PATH 加载和保存本地 YAML 或 etcd 配置
  • internal/registry:根据配置初始化 APISIX、Caddy、Docker 和 Swarm 底层实例
  • pkgs:底层客户端、存储适配和 SDK 类型转换,不依赖 internal
  • internal/service:业务组合、参数校验与稳定 API 类型转换
  • internal/server:Gin HTTP/WebSocket 入口、路由、中间件、服务生命周期和响应封装

设计原则

  • 高内聚:同一领域功能聚合在同一包
  • 低耦合:层间通过接口解耦
  • 单一职责:Handler 只管 HTTP,Service 只管业务

开发规范

  • 后端分层pkgs 保持原生客户端能力,service 负责业务组合与类型转换,server 只处理 HTTP 入出口
  • 前端结构webview/src/service/types 按域拆分类型,页面复用统一卡片、表格、移动端双视图和操作按钮语义色
  • 状态与权限:全局状态通过 Pinia usePortal() 聚合访问,权限统一使用 portal.hasPerm(moduleOrRoute) 判断
  • 安全基线:敏感字段不返回明文,文件路径与解压路径必须校验,WebSocket 必须经过认证链路
  • 完整规范:根规范见 AGENTS.md,前端专项规范见 webview/AGENTS.md

安全特性

  • JWT 认证,敏感字段(密钥、密码)不返回前端
  • 文件路径校验,防止目录遍历攻击
  • 解压校验路径,防止 Zip Slip 攻击
  • WebSocket 连接需经过认证中间件
  • 基于路由的细粒度权限控制,路由访问级别支持 0 需权限、1 需登录、-1 匿名
  • 操作审计日志,路由审计级别支持 0 按 Method、-1 忽略、1 强制记录,默认记录非 GET 请求与 WebSocket 连接
  • 支持可限制代理来源 CIDR 的信任 Header 认证(tha.headerName

许可证

本项目基于 Apache License 2.0 发布,详见 LICENSE

第三方组件协议详见 NOTICE