我在写一个 Linux 服务器管理面板:Go + Vue3 单二进制的技术选型与开发笔记
记录一个正在开发中的 Linux 服务器管理面板项目:Go + Vue3 编译为单个二进制、零运行时依赖,涵盖内置调度引擎、安全入口、SSL 自动续期、多节点 Agent、宝塔式运行时版本管理器等模块的设计与踩坑。
本文目录
最近几个月的业余时间都投在了一个自己的项目上:一个 Linux 服务器管理面板,目前还在密集开发中,功能主干已经基本成型。这篇文章先不聊下载安装(还没到发布阶段),主要记录为什么做、技术选型怎么定、以及开发过程中几个我觉得值得写下来的设计点。
一、为什么自己写一个面板
市面上已经有宝塔、1Panel 这些成熟产品,我为什么还要造这个轮子?原因大概三层:
- 想要一个"干净"的面板:很多面板装完之后系统里多出一堆常驻进程、定时脚本和全局修改,卸载也卸不干净。我想要的是一个二进制文件,删掉就等于没装过
- 想要完全掌控安全边界:面板是 root 进程,安全机制必须自己看得懂、改得动
- 学习动机:从 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-fpmsystemd 服务
安装即多版本共存、一键设默认(软链到 /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)、对象存储备份归档
五、接下来的计划
项目仍在活跃开发中,后面想做的方向:
- 发布与分发:一键安装脚本打磨、Release 打包流水线
- 网站监控:站点可用性拨测接入告警
- 更多运行时:容器镜像管理增强、更多语言运行时发行版接入(架构上已按发行版扩展预留)
- 体验打磨:移动端适配、暗色主题
写面板的这几个月最大的感受是:运维工具的难度不在功能列表,而在边角——dpkg 锁、软链绝对路径、镜像站目录格式、fancy-index 排序参数,每一个都是只在真实服务器上才会撞见的坑。等打磨到可以拿出来的程度,再写一篇正式的发布文章。
项目还在开发中,暂不提供下载与演示地址,敬请期待。