做软件工具站、手册站、查询系统,还在折腾 LAMP/LNMP + 数据库 + 前后端分离?今天分享一个用 Go 写的「单二进制」站点系统,一个可执行文件搞定 PC 网站 + 微信小程序 + 后台管理 + 支付 + AI 助手,Docker 一键部署,6000 并发 QPS 2000。

一、为什么自己造这个轮子?
做过工具站的朋友都知道,一套像样的站点系统通常需要:
后端框架(Node/Python/Java) 独立数据库服务(MySQL/PostgreSQL) 缓存服务(Redis) 前端项目(Vue/React) 小程序工程 对象存储 SDK 支付 SDK 部署脚本(Nginx + PM2 + 各种配置)
光环境搭建就要一天,迁移服务器又是一天。有没有可能一个文件搞定一切?
答案是:可以。

二、系统长什么样
这套系统包含 PC 网站 + 微信小程序 + 管理后台 三端,核心功能覆盖:



三、技术选型:少即是多

核心哲学:能用一个进程解决的,绝不起两个服务。

四、单二进制是怎么做到的?
关键在 Go 1.16+ 的 embed 特性:
//go:embed all:templatesvar templateFS embed.FS所有 HTML 模板、CSS、JS 静态资源在编译时打包进二进制。运行时只有一个文件,不需要额外的静态资源目录。
配合纯 Go 的 SQLite 驱动(glebarez/sqlite,无 CGO 依赖),交叉编译只需:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o roujingmei一个 7.8MB 左右的文件,扔到任何 Linux 服务器上就能跑。


五、性能:6000 并发 QPS 2000
用自定义压测工具测了 6000 并发请求(3 秒随机分散到达):

关键优化点:
- SQLite WAL 模式
读写不互斥 - 内存计数器
查询计数用 atomic.AddInt64,10 秒批量刷库(消除写锁竞争,QPS 从 51 → 1986) - 页面级 HTML 缓存
30 秒 TTL,命中后跳过模板渲染 + 数据库查询,响应 ~2ms - 单飞机制(singleflight)
防止缓存击穿 - GORM 关闭默认事务
SkipDefaultTransaction: true
优化前查询 API QPS 只有 51,原因就是每次查询都写库更新计数,6000 个并发写请求把 SQLite 写锁打爆了。改成内存计数后直接起飞。


六、AI 助手:DeepSeek 流式输出
集成了 DeepSeek 大模型,两个场景:
前台:手册详情页底部有 AI 问答,用户问"怎么安装",AI 基于手册内容回答。商品详情页有 AI 客服,帮用户了解产品。
后台:编辑手册时,输入主题点"AI 写作",自动生成 HTML 正文插入编辑器。还能一键生成摘要。
技术实现上有几个细节值得说:
SSE 流式输出,用户看到的是逐字蹦出来的效果,不用等完整回答 goroutine + channel + context三重防阻塞,总超时 10 分钟 余额不足(HTTP 402)时前端友好提示"AI 余额不足,请联系管理员" Nginx 配 X-Accel-Buffering: no禁用缓冲


七、查询系统:动态建表 + Excel 导入
这个功能类似在线成绩查询,但更灵活:
- 创建查询项目
(如"期末成绩查询") - 自定义字段
(姓名、学号、成绩、等级...) - Excel 一键导入
上传 Excel → 自动检测表头 → 推断字段类型 → 预览 → 确认导入 - 设置查询密码
(可选) - 发布查询
用户输入条件查询结果
最骚的是从 Excel 快捷创建:上传 Excel 文件,系统自动解析字段,预览数据,确认后一键创建项目 + 建表 + 导入数据。全程不用手动配字段。
安全方面:表名和列名正则校验防 SQL 注入,LIKE 通配符转义防通配符注入。


八、小程序审核模式:过审利器
小程序审核最怕什么?内容太多被拒。
这套系统设计了审核模式:后台开个开关,小程序立即变成只有"查询功能"的极简界面——隐藏 TabBar,不显示商品和手册,只留查询入口。审核通过后关掉开关,正式用户看到完整功能。
两种触发方式:
- 开关模式
(推荐):后台一键开关,所有版本进入审核模式 - 版本号模式
:只让特定版本进入审核模式,不影响已发布版本
配置加载失败时默认进入审核模式,确保审核安全。


九、文件管理:前端直传 COS
后台图片/文件管理做了类似公众号编辑器的体验:
- 图片图库
:网格展示已上传图片 + 文件名 + 上传时间,支持搜索、删除、多选 - 文件管理
:列表展示非图片文件 + 类型图标 + 大小,点击即选 - 前端直传
:大文件通过 COS 预签名 URL 直接 PUT 到对象存储,跳过服务器中转,支持 5GB 文件 + 实时进度条
后端只负责签发 URL 和登记记录,不碰文件流,部署在低带宽服务器也不怕。


十、部署:Docker 一键起
services: app: build: . ports: - "1533:1533" volumes: - ./data:/app/data - ./config.yaml:/app/config.yaml restart: alwaysdocker compose up -d 就跑起来了。数据持久化只需挂载 data 目录(SQLite 文件)和 config.yaml。
没有数据库要起,没有 Redis 要起,没有前端要 build。迁移服务器?拷贝二进制 + data 目录 + config.yaml,完事。
十一、SEO 做了什么

PC 端用 SSR(服务端渲染),首屏直出 HTML,搜索引擎爬虫直接拿到完整内容。
写在最后
这套系统跑了几个真实业务场景:软件手册发布、源码商品销售、成绩查询、证书查询。核心体会:
- SQLite 被严重低估
WAL 模式 + 合理的连接池配置,6000 并发毫无压力。绝大多数中小站点根本不需要 MySQL。 - 单二进制部署是真香
没有依赖地狱,没有环境冲突, scp上去就能跑。 - SSR + 缓存比 SPA 快得多
页面缓存命中后 2ms 响应,前端 0 渲染时间。 - AI 集成没那么难
DeepSeek API + SSE 流式,几百行代码搞定,体验却很好。 - 审核模式是刚需
做小程序的都懂,内容多了审核必拒。一个开关解决。
如果你也在做工具站、手册站、查询系统,或者想学 Go 全栈开发,这套代码值得参考。全部开源,注释齐全,文档详细。
本文介绍的系统基于 Go + Gin + SQLite + 原生小程序,单二进制部署,Docker 一键启动。关注我们获取更多实战开发经验。
夜雨聆风