把 V4.0 骨架以来的全部功能开发固化为主干基线,内容包括:
· client/ 全量 Android/macOS 客户端(Flutter + Rust 核心)
· server/ 网关、业务服务、仓储层
· deploy/ compose、Dockerfile、init.sql + migrate.sql(幂等迁移)
· shared/ tests/ 协议、编解码、指标清单与全部测试套件
· docs/ README 架构方案与运维手册
本轮之前修复的主要缺陷(详见各文件注释与 client/README.md):
· 首次部署路径(init.sql 的 device_tokens 建表顺序)
· 每 20 分钟硬切以外的设备身份漂移与**设备归并**(shared/device-identity.js)
· 配置无版本号、无校验导致的病态残留(host/config_migration.dart)
· 数据库迁移从不执行(deploy/migrate.sql + compose 的 migrate 服务)
验证:客户端 282/282、全量回归 20 套件 0 失败。
⚠️ 水墨屏专属实现(看板、水墨屏令牌、einkMode、常亮)**不在本分支**,
由 feature/eink 承载,主干不受其影响。
47 lines
1.8 KiB
Docker
47 lines
1.8 KiB
Docker
# ---------- 阶段 1:builder ----------
|
||
# 构建上下文为**仓库根**(见 docker-compose.yml 的 build.context: ..)
|
||
FROM node:22-alpine AS builder
|
||
WORKDIR /app
|
||
# 与 gateway 保持一致的目录分工:
|
||
# shared/ —— 跨端共享层(protocol/codec)
|
||
# server/shared/ —— 仅服务端(repository,依赖 pg)
|
||
COPY shared/package*.json ./shared/
|
||
COPY server/package*.json ./server/
|
||
COPY server/business/package*.json ./server/business/
|
||
RUN cd shared && npm ci --no-audit --no-fund
|
||
RUN cd server && npm ci --no-audit --no-fund
|
||
RUN cd server/business && npm ci --no-audit --no-fund
|
||
|
||
# ---------- 阶段 2:runtime ----------
|
||
FROM node:22-alpine AS runtime
|
||
|
||
ENV NODE_ENV=production
|
||
ENV PORT=4000
|
||
|
||
# 目录布局与源码严格一致,保证
|
||
# require('../shared/repository') 与 require('../../shared/codec') 正确解析。
|
||
WORKDIR /app
|
||
|
||
COPY --from=builder /app/shared/node_modules ./shared/node_modules
|
||
COPY shared/package*.json ./shared/
|
||
COPY --from=builder /app/server/node_modules ./server/node_modules
|
||
COPY server/package*.json ./server/
|
||
COPY --from=builder /app/server/business/node_modules ./server/business/node_modules
|
||
COPY server/business/package*.json ./server/business/
|
||
|
||
# 源码 —— 通配拷贝,理由同 Dockerfile.gateway:
|
||
# 逐个点名会导致"新增模块忘了加进 COPY",镜像能构建但容器启动即 require 失败。
|
||
COPY shared/*.js ./shared/
|
||
COPY server/shared/*.js ./server/shared/
|
||
COPY server/business/*.js ./server/business/
|
||
|
||
WORKDIR /app/server/business
|
||
|
||
USER node
|
||
EXPOSE 4000
|
||
|
||
HEALTHCHECK --interval=20s --timeout=5s --start-period=10s --retries=3 \
|
||
CMD node -e "fetch('http://127.0.0.1:'+(process.env.PORT||4000)+'/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
|
||
|
||
CMD ["node", "index.js"]
|