Communitygithub.com

timerise-ai/island-mode-server

Agent技能:构建一个本地隔离模式备用服务器——Firestore的双向RxDB实时副本,用于在互联网中断时实现局域网故障转移,支持重连后数据同步与幂等云端摄入、HMAC硬件认证以及systemd/nginx现场运维——基于Node/NestJS的本地服务器和Firestore云存储。

island-mode-server 是什么?

该技能旨在为物理站点提供一个本地Node服务器,该服务器持有Firestore数据子集的实时RxDB副本。当互联网连接正常时,本地服务器透明运行;一旦网络中断,局域网内的自助终端(kiosk)和员工终端会自动故障转移至该服务器,站点仍能继续处理订单、管理库存和操作硬件设备。其核心设计理念是“同步是双系统,而非单一系统”:一方面通过文档级别的RxDB复制同步状态,另一方面在重连时通过HTTP批量推送需云端自行处理的业务事件(如库存增量、审计日志),两者缺一不可。该技能适用于需要现场真实写入(而非仅缓存读取)的场景,支持浏览器终端(PWA/kiosk)的无缝切换,并以Firestore作为云端的唯一数据源。它兼容多种Agent平台,通过NestJS、RxDB和Firestore等技术栈实现,并提供了详细的架构指南、认证策略和部署操作手册。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add timerise-ai/island-mode-server

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

隔离模式服务器 (Island-Mode Server)

一个轻量级的Node服务器运行在物理站点,持有该站点Firestore数据子集的实时RxDB副本。网络正常时,它处于隐身状态;一旦网络中断,局域网内的kiosk/员工终端将自动故障转移至该服务器,站点依然可以继续接单、移动库存和切换硬件设备。重连后,离线期间产生的工作会同步回云端。贯穿一切的核心见解是:同步是双系统,而非单一系统——文档级别的RxDB复制负责状态同步,外加HTTP批量推送由云端自行处理的业务事件(如库存增量、审计摄入),两者缺一不可。

使用场景

  • 站点必须在网络中断期间仍能执行真实的写入操作(预订、库存、硬件控制),而不仅仅是缓存读取。
  • 终端基于浏览器(PWA/kiosk),需要透明地完成故障转移。
  • Firestore是云端唯一的事实来源,并保持这一角色。

不适用场景

  • 纯粹的读取缓存或仅需Firestore内置离线持久化的PWA——Firebase SDK已能实现,无需额外服务器。
  • 使用其他云端数据库(如Supabase/Postgres)——复制层的概念通用,但此处所有模板均为Firestore专属。
  • 站点间的多主同步——本设计严格采用中心辐射模式,云端作为事实来源,采用最后写入获胜的策略。

架构

            Internet
               |
      +--------+---------+
      | 云端 (SSoT)       |  Firestore + 公开API + cron状态标记
      +--------+---------+
        |             |
   RxDB 复制     HTTP批量推送 (重连)
        |             |
      +-+-------------+-+
      | 本地服务器       |  Node/NestJS + RxDB,局域网 :443 通过 nginx TLS
      +--------+--------+
               |
     LAN — kiosk PWA、员工PWA、硬件控制器

关键事实

  1. 每次云端写入一个被复制的集合时,必须打上检查点字段 (serverTimestamp: FieldValue.serverTimestamp()) 和 _deleted: false——RxDB Firestore插件通过 serverTimestamp > checkpoint 拉取数据;未打时间戳的文档永远不会被复制拉取。
  2. 三种复制层级,按集合选择:只拉取(站点消费的配置)、双向(站点变更的操作状态)、只推送(站点产生的日志)。选错集合的层级是主要的设计错误。
  3. 内存型RxDB存储意味着离线重启会丢失所有离线工作。 副本会从Firestore重新填充,但离线期间创建的文档将丢失。请明确决策存储的权衡——参见replication.md。
  4. 批量推送是至少一次语义,因此云端摄入必须幂等——用客户端生成的ID标识每次应用,并跳过已应用的记录。
  5. 推送过滤器防止回环:双向推送仅推送标记为 _offlineCreated / _locallyModified 的文档,从而避免拉取的云端文档被推送回去。
  6. 终端优先使用云端——只有在连续N次健康检查失败后才会启用故障转移,且离线期间必须持续扫描本地服务器,而非仅在切换时扫描一次。

硬性规则

切勿在未授权的情况下暴露云端同步摄入端点。 这些端点会执行库存增量和注入订单。必须使用共享密钥头部作为最低要求。

在线时切勿宽松验证离线员工令牌。 不验证直接解码的回退方案仅可为局域网环境下的安全折衷;它必须仅在服务器真正离线时启用,否则将成为签名验证的旁路。

切勿重置尚未确认同步的事务对应的本地库存增量。 仅在收到确认后按ID重置,否则离线销售要么重复计数,要么从可用库存中消失。

切勿让本地服务器自行发明云端负责的业务规则(如营业时间、定价)。通过复制配置并基于配置计算,否则隔离模式的行为将与网站产生偏差。

快速开始

  1. 将集合划分为层级,并明确分界点——architecture.md。
  2. 搭建RxDB + 复制,使用自定义令牌认证和安全规则——replication.md。
  3. 添加重连时的批量推送和幂等云端摄入——sync-flush.md。
  4. 配置心跳/状态链和客户端故障转移——network-failover.md。
  5. 保护本地API(员工/kiosk/硬件HMAC/静态令牌)——auth.md。
  6. 镜像终端所需的云端端点——local-api.md。
  7. 现场部署:systemd、nginx TLS、mDNS、监控——operations.md。

参考目录

场景触发关键词参考文档
拓扑、层级、分界点、重命名表只拉取、双向、只推送、双路径、locationId、冲突architecture.md
副本搭建、模式、检查点陷阱RxDB、replicateFirestore、serverTimestamp、custom token、storage-memory、firestore.rulesreplication.md
重连批量推送、库存增量、摄入flushAll、幂等、FieldValue.increment、localDelta、syncedIdssync-flush.md
故障检测和API切换heartbeat、lastHeartbeatAt、cron、NetworkManager、apiBaseUrl、failovernetwork-failover.md
本地API认证AuthGuard、HMAC、重放窗口、离线JWT回退、kiosk keyauth.md
离线端点和写入availability、mutex、离线预订、签到、定价库存过滤器local-api.md
现场部署和运维手册systemd、nginx、自签名TLS、mDNS、avahi、journalctl、回滚operations.md
分类账:审计变更、保留、新增的内容provenance、audit、deviations、kept deliberatelyprovenance.md

针对信任关键逻辑(HMAC验证、离线令牌解码、在真实RxDB上的增量展开、故障转移重新扫描)的vitest测试套件通过情况: assets/behavior.test.ts——请将其带入目标项目中作为回归覆盖。

相关技能