最近几个月的业余时间都投在了一个自己的项目上:一个 Linux 服务器管理面板,目前还在密集开发中,功能主干已经基本成型。这篇文章先不聊下载安装(还没到发布阶段),主要记录为什么做、技术选型怎么定、以及开发过程中几个我觉得值得写下来的设计点。

一、为什么自己写一个面板

市面上已经有宝塔、1Panel 这些成熟产品,我为什么还要造这个轮子?原因大概三层:

  1. 想要一个"干净"的面板:很多面板装完之后系统里多出一堆常驻进程、定时脚本和全局修改,卸载也卸不干净。我想要的是一个二进制文件,删掉就等于没装过
  2. 想要完全掌控安全边界:面板是 root 进程,安全机制必须自己看得懂、改得动
  3. 学习动机:从 Web 终端的 PTY、cron 调度引擎到 WebSocket 反连,每个模块都是很好的工程练习题

二、技术选型:为什么是 Go + Vue3 单二进制

决策 选择 理由
后端语言 Go 交叉编译无障碍、标准库覆盖 HTTP/加密/压缩、部署零依赖
前端框架 Vue3 + Element Plus 生态成熟、组件全,后台面板不需要花活
数据库 纯 Go SQLite 驱动 不引 CGO,CGO_ENABLED=0 直接交叉编译,数据就是一个 panel.db 文件
前端嵌入 go:embed Vue 构建产物直接嵌进二进制,分发就是一个文件
终端 xterm.js + PTY 浏览器内 Web 终端,多会话、自适应尺寸

最终形态:make linux 一条命令产出 单个 amd64 二进制(arm64 同理),放到服务器上就能跑,不依赖 Docker、不依赖任何运行时。

三、几个值得写下来的设计点

1. 安全入口:不带入口串一律 404

面板以 root 运行,暴露面必须压到最小。做法借鉴了宝塔:

  • 首次启动生成随机安全入口(如 /s/a84e491e)和随机端口(10000–30000 里挑空闲的,重启不漂移、持久化回 config.yaml)
  • 任何不带入口串的请求一律返回 404,扫描器根本探测不到面板存在
  • 登录防爆破:15 分钟内错 5 次锁定;会话用 HttpOnly Cookie;支持自签或自定义 HTTPS 证书

2. 计划任务:内置调度引擎,不碰系统 crontab

没有偷懒用系统 crontab,而是内置了 robfig/cron 调度引擎,支持六类任务:Shell 脚本、目录备份、URL 健康检查、数据库备份、日志切割、系统更新。配套了执行历史、手动执行、终止运行实例、连续失败告警和 90 天历史自动清理。好处是任务状态完全在面板掌控中,卸载面板不会留下一堆孤儿 crontab。

3. 多节点 Agent:WebSocket 反连,穿透 NAT

面板可以管多台服务器:独立的 webmblx-agent 二进制从被控机主动反连面板(token 鉴权),NAT 后面的机器不需要开放任何端口。Agent 每 15 秒上报 CPU/内存/网络/负载,支持远程命令执行(operator 及以上角色、全程审计),断线自动重连(指数退避 3s→30s)。指标进 SQLite,3 天保留自动清理。

4. 运行时版本管理器:宝塔式多版本共存

这是最近刚做完的大块头:Node.js / Golang / Python / OpenJDK / PHP 全版本安装与管理。有意思的细节是版本清单全部来自真实镜像站,而不是硬编码:

  • Node.js 走官方/阿里云/腾讯/清华/中科大的 index.json
  • Go 走镜像站目录解析
  • Python 走 python-build-standalone(npmmirror 镜像)
  • OpenJDK 走清华 Adoptium 目录(TUNA 的 fancy-index 需要 ?C=N;O=A 参数,这个坑实测才发现)
  • PHP 多版本走 Debian/Ubuntu 的 sury 仓库与 RHEL 系的 Remi 仓库,各分支独立 phpX.Y-fpm systemd 服务

安装即多版本共存、一键设默认(软链到 /usr/local/bin)、卸载干净。rc/beta 预发布自动过滤,Node.js 标注 LTS。这块写完顺带补了 5 组解析器单测——镜像站目录格式各不相同,纯函数化的解析器是唯一能安心改的形态。

5. 国内网络友好的下载链路

面板里所有"从网上下载东西"的场景都考虑了国内环境:Docker Compose 部署自动把镜像改写为代理仓库(正确区分 registry 与 library 命名空间)、GitHub Release 下载可走加速前缀、软件商店源可选阿里云/腾讯云/清华/中科大镜像站、Python 可一键切换 pypi 源。连 apt 都加了 DPkg::Lock::Timeout 并在安装前临时停用 unattended-upgrades——这是真实服务器上被锁卡了两分钟换来的教训。

四、目前的功能版图

主干模块已经全部落地:

  • 基础:仪表盘实时监控、文件管理(在线编辑/压缩解压/回收站)、Web 终端、进程与 systemd 服务管理
  • 建站:Nginx 静态/PHP/反代站点(写入前 nginx -t 校验失败自动回滚)、MySQL/PostgreSQL 建库授权、防火墙(ufw/firewalld 统一抽象)
  • 证书:Let's Encrypt 自动签发与到期前 30 天自动续期、手动上传配对校验
  • 商店:软件商店(原生二进制 + 系统包两种形态,Caddy/MinIO/Nginx/MySQL/Redis 等)、Docker 容器管理(13+ 模板,WordPress/Grafana/Vaultwarden 等)、远程应用源(管理员配置 JSON 目录,声明式模板)
  • 协同:多用户 RBAC(admin/operator/viewer 三角色,防自锁保护)、全量写操作审计、告警策略(阈值 + 冷却去重)、通知渠道(邮件/钉钉/企微/飞书/Webhook)、对象存储备份归档

五、接下来的计划

项目仍在活跃开发中,后面想做的方向:

  1. 发布与分发:一键安装脚本打磨、Release 打包流水线
  2. 网站监控:站点可用性拨测接入告警
  3. 更多运行时:容器镜像管理增强、更多语言运行时发行版接入(架构上已按发行版扩展预留)
  4. 体验打磨:移动端适配、暗色主题

写面板的这几个月最大的感受是:运维工具的难度不在功能列表,而在边角——dpkg 锁、软链绝对路径、镜像站目录格式、fancy-index 排序参数,每一个都是只在真实服务器上才会撞见的坑。等打磨到可以拿出来的程度,再写一篇正式的发布文章。

项目还在开发中,暂不提供下载与演示地址,敬请期待。