SmallGo 框架

全栈 Web 应用框架:Go(Gin + GORM + SQLite)后端 + Vue 3(TypeScript + Pinia + Tailwind CSS)前端,内置登录认证、用户权限、系统配置、备份、审计、匿名统计、实时通道、定时任务与版本检查等公共能力

v0.3.0

框架定位

SmallGo 不只是一个能跑起来的 Demo,而是科技智趣坊全部自建应用的公共底座与脚手架:把每个应用都要用的登录、用户与权限、配置、备份、审计、统计、实时通道等公共能力做成框架模块,业务应用只写自己的业务表与页面。

📌 后续新应用一律从它搭建改造,不要重复造轮子:复制框架仓库、改应用名与端口、写业务模块,公共功能直接复用。目前家族里模块名为 smallgo/server 的应用(bill、reminders、rental、worklog)都基于本框架开发,改动框架层文件会同时影响这些应用。

新增一个应用的完整流程

# 1. 一键生成骨架:后端 app 模块 + 前端 API client + 页面视图
./scripts/new-app.sh todo "待办事项"

# 2. 按脚本提示完成三步接线
#    server/main.go            添加 _ "smallgo/server/todo" 空导入
#    web/src/router/index.ts   在 /admin children 中注册路由
#    web/src/layouts/MainLayout.vue  在 mainNav / adminNav 中加入导航项

脚手架会生成后端 GORM 模型与分页列表 / 创建 / 删除示例路由,以及前端 web/src/api/<name>.tsweb/src/views/<Name>View.vue 页面,接线完成后即可继续开发业务。新应用的端口从端口家族尾部取,当前下一个可用端口是 8911

公共能力

🧩

全栈框架

后端 Go + Gin + GORM + SQLite,前端 Vue 3 + TypeScript + Pinia + Tailwind CSS,前端产物嵌入 Go 二进制,单文件即可分发

🔐

登录认证

用户名密码注册与登录,首个注册用户自动成为管理员;支持 Bearer Token、X-API-Key 与 Cookie 三种认证方式,含忘记密码流程

🐂

飞牛 NAS 登录

支持飞牛 fnOS NAS 账号一键登录(自动绑定或注册),授权在居中弹窗内完成,页面不跳转、不丢输入,支持切换账号

👥

用户与权限

用户管理页面与 authGroup 强制登录中间件,业务数据按用户隔离,可选的管理员专属路由分组

⚙️

系统配置

运行时配置注册表,支持 system / user 两级 scope 与 string、bool、int、select 四种类型,可标记公开键与内部键,在线修改即时生效

💾

数据库备份

基于 SQLite VACUUM INTO 的一致性快照,管理员可立即备份、下载、删除;每日 03:00 自动备份并保留最近若干份

📜

审计日志

关键操作统一记录操作者、动作、对象与备注,管理后台可查询并导出 CSV,出问题能追溯

📊

匿名使用统计

每小时心跳仅上报应用名、版本、部署形态、设备哈希、系统与架构,永不含主机名原文与用户数据;可随时关闭

🔌

实时通道

内置实时通道模块,供各应用向前端推送状态与消息,无需自行搭建长连接基础设施

定时任务

注册周期任务或每日定时任务,带 panic 恢复,服务关闭时自动停止,日志按天轮转并自动清理

⬆️

版本更新检查

查询发布渠道最新版本并做 semver 比较,结果缓存 24 小时;管理员登录后顶部提示新版本,每个版本只提示一次

🧪

新应用脚手架

scripts/new-app.sh 一键生成后端模块、前端 API client 与页面视图,把「新建应用」变成三条接线

🎨

主题与上传

明暗主题切换、文件上传、二维码生成、安全工具等公共组件开箱即用

📦

三种部署形态

飞牛 fnOS 应用包、Docker 镜像、裸机二进制,同一份代码三种分发方式

技术架构

后端技术栈

  • Go - 高性能编译型语言
  • Gin - 轻量级 HTTP 框架
  • GORM - ORM 框架
  • SQLite (WAL) - 单文件数据库

前端技术栈

  • Vue 3 - 现代前端框架
  • TypeScript - 类型安全
  • Pinia - 状态管理
  • Tailwind CSS - 原子化样式
  • Vite - 构建工具

内置模块

  • auth / user / middleware - 认证与鉴权
  • sysconfig / backup / audit - 配置与运维
  • stats / realtime / scheduler - 统计与调度
  • upload / qrcode / security / update

快速开始

飞牛 NAS 安装

  1. 下载对应架构的 techfunway-smallgo 安装包(.fpk,支持 amd64 / arm64)
  2. 打开飞牛 NAS 桌面 → 应用中心
  3. 点击右上角 手动安装,选择下载的 .fpk 文件
  4. 在安装向导中设置应用端口(默认 8900),点击完成
  5. 安装完成后打开应用,首次没有用户时直接创建管理员账号;也可以使用飞牛 NAS 账号一键登录

Docker 运行

docker run -d \
  --name techfunway-smallgo \
  -p 8900:8900 \
  -v smallgo-data:/app/data \
  -e TZ=Asia/Shanghai \
  --restart unless-stopped \
  techfunways/smallgo:latest

docker-compose.yaml

services:
  smallgo:
    image: techfunways/smallgo:latest
    container_name: techfunway-smallgo
    restart: unless-stopped
    ports:
      - "8900:8900"
    volumes:
      - smallgo-data:/app/data
    environment:
      - TZ=Asia/Shanghai

volumes:
  smallgo-data:

数据持久化到 Docker 数据卷 smallgo-data(容器内 /app/data),服务端口映射到宿主机 8900。

二进制直接运行

构建前端 + 后端(前端产物嵌入 Go 二进制),产物为 server/smallgo

make build

# 运行(默认端口 8900)
./server/smallgo -data-dir=/var/data/smallgo -port 8900

# 开发模式:构建并模拟生产目录结构运行
make dev

启动后浏览器访问 http://localhost:8900,首次注册的账号自动成为管理员。数据库文件位于 {data-dir}/db/smallgo.db,备份快照位于 {data-dir}/backups/

💡 提示:端口与数据目录可通过命令行参数或同名环境变量覆盖:-port / PORT(默认 8900)、-data-dir / DATA_DIR(默认 ./data)、-rate-limit / RATE_LIMIT-cors-origin / CORS_ORIGIN-log-retention-days / LOG_RETENTION_DAYS;设置 DISABLE_STATS=1 可完全关闭匿名统计上报。

端口与仓库信息

默认端口 8900(HTTP,安装向导、-port 参数或 PORT 环境变量均可修改)
容器名 techfunway-smallgo
数据卷 smallgo-data → 容器内 /app/data(数据库、备份、上传文件、日志)
Docker 镜像 techfunways/smallgo(多平台,端口 8900)
fnOS 包名 techfunway-smallgo(桌面显示名「SmallGo」)
源码仓库 TechFunWay/smallgo(Go + Gin + GORM + SQLite / Vue 3 + TypeScript)
运行数据 {data-dir}/db/smallgo.db(SQLite WAL),快照位于 {data-dir}/backups/
脚手架 ./scripts/new-app.sh <name> "<显示名>",新应用端口从 8911 起顺延
同步检查 ./scripts/check-sync.sh 比对框架与实例仓库之间的框架层文件差异

常见问题

如何修改端口?

飞牛 NAS 安装时可在向导中设置端口(默认 8900)。Docker 方式通过 -p 参数映射端口。二进制方式通过 -port 参数或 PORT 环境变量指定端口。

怎么用它开发一个新应用?

先克隆或复制 SmallGo 框架仓库,改掉应用名(app.json 的 appname、fnpack/manifest、Makefile、桌面入口等)与默认端口,再执行 ./scripts/new-app.sh <name> "<显示名>" 生成业务模块骨架,按脚本提示完成后端空导入、前端路由与侧边栏导航三步接线即可开始写业务。公共的登录、权限、配置、备份、审计、统计等能力直接复用,不要重复实现。

系统配置能在线改吗?

可以。框架内置运行时配置注册表,配置项分 system 与 user 两级 scope,类型支持字符串、开关、整数与下拉选择;模块可以在自己的 init() 中注册配置项。管理员在「系统配置」页面修改,保存后运行时生效,标记为 public 的配置项未登录也能读取。

匿名统计会上报什么,怎么关闭?

心跳每 60 分钟一次(启动即报一次),仅上报应用名、版本、部署形态(fnos / docker)、设备哈希(机器标识或数据目录持久化 ID 的 32 位 md5)、系统与架构,永不包含主机名原文与任何用户数据。可以通过启动参数 -disable-stats、环境变量 DISABLE_STATS=1,或管理员在系统配置中关闭统计开关。

数据怎么备份和恢复?

框架提供 SQLite 一致性快照能力:管理员可以在「备份管理」中立即备份、下载或删除快照,也可开启每日 03:00 自动备份并设置保留份数(默认 7 份),超出后自动清理最旧的快照。快照文件存放在数据目录的 backups/ 下;恢复时用快照替换 {data-dir}/db/smallgo.db 即可。备份数据目录也能保留全部配置与上传文件。