TechShop 是一套为飞牛 fnOS 与 Docker 环境开发的自托管商城系统, 由个人开发者维护。目标不复杂:让需要在自己设备上卖东西的人, 不必为了一个商城去搭一整套服务端基础设施。
市面上多数商城系统假定你有独立的服务器、数据库与运维能力。 自托管的场景往往不是这样:设备是家里或办公室的一台机器, 管理员同时是店主、客服和技术支持。
因此 TechShop 在取舍上偏向「减少需要照看的东西」: 去掉数据库,去掉缓存服务,把初始化收进向导, 把安全设置默认打开。代价是数据规模的上限相对有限, 这也是我们在产品定位上接受的部分。
| 适合 | 不太适合 |
|---|---|
| 个人或小团队经营的服务类商品、虚拟商品 | 需要多仓、多门店、复杂 ERP 对接的大型零售 |
| 希望数据留在自己设备上的场景 | 需要跨区域部署与弹性扩容的高并发场景 |
| 设备上已有 fnOS 或 Docker 环境 | 没有可长期运行的设备,只能依赖云主机 |
| 商品数量在数百到数千量级 | 需要数据仓库与实时报表分析的规模 |
原则不是口号,它们决定了遇到分歧时产品往哪边走。
业务数据以可读文件保存在本机,不用厂商工具就能备份、查看和搬走。不设置导出门槛,也不做云端绑定。
没有数据库、缓存和消息队列,就没有连接池、队列堆积与版本兼容这些额外问题。少一个组件,少一类故障。
口令一律哈希存储,后台入口与对外前台分离,敏感操作强制校验。安全不是可选项,也不该让用户自己去开。
安装走向导,后台操作有明确反馈,报错写成能看懂的中文,而不是直接抛堆栈信息。
价格、抵扣与退款数额全部在服务端重新计算。这条在实现上更麻烦,但在交易类产品里没有商量余地。
升级后自动确认新代码已经生效,避免出现「看起来升级了、实际还在跑旧版本」这类难以察觉的问题。
后端与前端都使用原生能力,不引入重型框架。 这样做的好处是依赖树很浅:升级 Node.js 版本时不会牵动一大片间接依赖, 也让安装包维持在 2 MB 左右。
数据层选择本地结构化文件而非嵌入式数据库,主要是为了让数据始终处于 「用记事本也能打开」的状态,便于排查与手工迁移。
| 层次 | 选型 |
|---|---|
| 运行时 | Node.js 22 |
| 后端服务 | 原生 HTTP 服务,无 Web 框架 |
| 前端 | 原生 HTML / CSS / JavaScript |
| 数据存储 | 本地结构化文件 |
| 出站邮件 | nodemailer |
| 收件箱读取 | imapflow |
| 环境配置 | dotenv |
| 分发形式 | fnOS 应用包(.fpk) / Docker 镜像 |
| 支持架构 | x86_64 / arm64 |
这个项目不是「每一版都上架」。内部按小步快跑连续迭代,每项改动先在本地跑完 端到端验证,攒够一批再合并成一次对外发布 —— 所以版本号走得多、真正上架的少。
到目前为止只发布过三次:1.0.019(首次)、1.0.023(第 2 次)与 1.0.030(第 3 次)。 应用中心当前可安装的就是 1.0.030。 下表把「已上架」与「内部迭代」分开标注,避免把「已开发」读成「已上架」。
| 版本 | 状态 | 主要内容 |
|---|---|---|
| 1.0.030 | 已上架 · 第 3 次 | 管理员密码可在 fnOS 安装向导中直接设置;修复前台在统一网关前缀下接口全部失效;口令哈希改异步、登录不再阻塞其它请求;优惠券按下单与支付分三态流转,未付款不再作废;首装不再预置收款码 |
| 1.0.029 | 内部迭代 | 新增可调工作线程数(1–16,默认 4),文件读写、加密与压缩改为在线程池内并行;数据落盘改为原子替换,异常中断不再留下半截文件 |
| 1.0.028 | 内部迭代 | 管理后台入口加强鉴权,系统域名下的后台地址默认封堵;技术支持会话权限隔离 |
| 1.0.027 | 内部迭代 | 访问码改为全局唯一、永久可见、可开关 |
| 1.0.026 | 内部迭代 | 修复网关前缀下新页面一律 Not Found;修复升级后未重启、仍在运行旧代码;新增快速技术支持与通知横幅 |
| 1.0.025 | 内部迭代 | 安全修复版本:收紧统一网关身份判定、移除内置默认账号、堵住安装向导的命令注入与越权 |
| 1.0.024 | 内部迭代 | 修复登录限流误报;密码恢复收敛为 fnOS 统一网关登录态校验,归属账号自动登记 |
| 1.0.023 | 已上架 · 第 2 次 | 相对上次发布的 1.0.019 累计的改动:静态资源严格白名单、清除兜底默认口令、版本号统一为单一来源、密码恢复改走 fnOS 统一网关、人机验证收敛为滑动拼图,并修复滑动验证的多处缺陷 |
| 1.0.022 | 内部迭代 | 修复滑动验证无法触发(服务端与滑轨坐标系未换算);商品分类改为可自定义与删除 |
| 1.0.021 | 内部迭代 | 密码恢复改用 fnOS 统一网关;人机验证只保留滑动拼图;最低系统版本提升到 1.1.3100 |
| 1.0.020 | 内部迭代 | 静态资源改为严格白名单;清除兜底默认口令;版本号统一为单一来源;赞赏码;人机验证逻辑抽成共享模块 |
| 1.0.019 | 已上架 · 首次 | 首个上架版本,修复安装向导中修改密码无效的问题 |
表中标注「内部迭代」的版本号只在本机使用,未提交上架;1.0.013 – 1.0.018 同样是发布前的内部编号。