sun-panel 源码笔记:Vue + Go 打成单容器的 NAS 导航面板

sun-panel 是放在服务器或 NAS(家里、公司那台常开的网络存储机器)上的导航面板,5300+ star,MIT。它的形态和前两类网址导航不同:不是一页网址列表,而是有账号、有分组、有图标卡片的仪表盘,登录进去能看机器状态,点卡片跳内网服务。README 给自己的定位是「一个服务器、NAS 导航面板、Homepage、浏览器首页」。

是什么

README 的功能清单:界面简洁、资源占用低;可视化操作、零代码;内外网模式一键切换;支持 Docker 部署且兼容 Arm 系统;支持多账号隔离;查看系统状态;支持自定义 JS 和 CSS;不需要连接外部数据库;图标接 Iconify 图标库,风格可自由组合;支持在网页内开小窗。

做到哪一步:卡片(图标 + 标题 + 描述 + 地址)+ 分组 + 排序 + 导入导出 + 用户体系,后端还带验证码、限流、任务队列和运行日志。没做到哪一步:它不是对外建站工具,没有 SEO 输出,页面基本要登录后使用;README 也没提外链存活检测,外链方向它做的是自动抓 favicon(站点小图标)。

有一条现状必须写在前面:README 顶部有个 IMPORTANT 提示,说作者为了维持开发加了 PRO 功能,项目因此暂时进入闭源状态,开源最新版本停在 v1.3.0,等模块化技术把 PRO 和主程序分离后再开源。想读代码,就得按 v1.3.0 这个边界去读。

技术栈与部署

Vue 前端 + Go 后端,仓库里 src 和 service 两个目录并列。README 只给了 Docker 部署教程的文档链接和 Docker Hub 上的镜像名 hslr/sun-panel,没有本地启动命令,Node 和 Go 的版本要求 README 没写,得自己试或翻它的文档站。

是否需要数据库:README 明写「不需要连接外部数据库」;仓库的配置样例 conf.example.ini 里 database_drive 默认 sqlite(数据文件在 ./database/database.db),可切 mysql;缓存和队列默认 memory,可切 redis。

# 摘自仓库里的 docker-compose.yml(README 本身没给命令)
services:
  sun-panel:
    image: 'hslr/sun-panel:latest'
    volumes:
    - ./conf:/app/conf
    - ./uploads:/app/uploads
    - ./database:/app/database
    ports:
    - 3002:3002
    restart: always

值得抄的三点

  • 为什么是 Vue + Go 单容器分发。仓库的 Dockerfile 先用 node 装 pnpm 构建前端,再用 golang:1.21-alpine3.18 编译后端,中间靠 go-bindata 把前端产物打进 Go 程序。省掉 nginx 和一份静态托管,NAS 上只有一个进程、一个端口(3002),升级就是换镜像。自建面板、内网小工具这类东西都可以照这条分发路径抄。
  • 「面板」形态怎么落到字段上。卡片模型一条记录里同时存外网地址和内网地址两个字段,再挂图标 JSON、分组 id、排序值、打开方式;列表按分组拉取,内外网一键切换只是换了取哪个地址字段。比复制两份站点配置干净太多,值得直接搬进自己的数据表。
  • 抓取和兜底放在服务端。后端有个取 favicon 的接口:解析目标页面的图标链接,处理以双斜杠开头和缺协议的情况,下载落盘且限制 1MB;前端再配 Iconify 图标库让用户自己换风格。用户只填一个 URL,剩下的解析、下载、尺寸限制都在 Go 侧完成,这是纯静态导航站做不到的体验。

别踩的坑

  • 数据全在挂载的三个目录里(conf、uploads、database)。compose 里那三行 volume 删掉或路径写错,换一次镜像等于把面板清空。README 没写这点,是从仓库的 docker-compose.yml 和 conf.example.ini 反推出来的。
  • Dockerfile 里有段注释值得记住:alpine 3.19 会让 go-sqlite3 编译失败(作者贴了上游 issue 链接),所以固定用 golang:1.21-alpine3.18。自己升基础镜像前先确认 sqlite 还能编过。
  • 开源版本停在 v1.3.0,README 声明后续版本闭源。按 master 分支读代码、按 release 里的镜像跑,功能口径不一样;PRO 与主程序的能力边界 README 没细写,得自己试。
  • 网页内小窗依赖目标站点不禁止被嵌套,README 自己标注「部分第三方网站会屏蔽此功能」,关键入口别只放在小窗里。
  • 自定义 JS / CSS 是个开放口子,多账号场景下管理员写的脚本会跑在每个用户的页面上,内网面板也别随手粘贴来路不明的片段。

许可证

MIT。允许商用、修改、闭源再分发,条件是保留版权声明和许可证文本。要注意边界:MIT 覆盖的是开源那部分代码(v1.3.0 及以前),README 声明后续版本闭源,闭源部分不适用 MIT,别把「这是个 MIT 项目」当成对整个产品的授权结论。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 共1条

请登录后发表评论

    • 头像容器化小白0