# Web 端部署与持久化(app/server/data) ## 存储口径 | 形态 | 数据位置 | 说明 | |------|----------|------| | 桌面端 | `%USERPROFILE%\.aps`(Linux/macOS `~/.aps`) | 不变,仍读写本机文件 | | Web 端 | 容器内 `/app/server/data`(PVC 持久卷) | 项目/会话/消息(SQLite `master.db`)、世界状态、知识库、导出等全部落此目录 | 路径解析优先级:`APS_HOME` >(desktop→`~/.aps`;web→`APS_DATA_DIR` 或仓库 `server/data`)。 镜像已内置 `APS_MODE=web`、`APS_DATA_DIR=/app/server/data`(见 Dockerfile)。 ## 常见故障:创建项目失败(写入 500) **根因**:K8s 挂载的 PVC 目录默认属 `root:root`,而容器以非 root 用户 `aps`(uid/gid **10001**)运行,数据目录不可写,所有写入(创建项目、排产、导入)都会失败。 **修复**:Deployment 必须配置 `securityContext`(完整清单见 `packaging/k8s/deployment.yaml`): ```yaml spec: template: spec: securityContext: runAsUser: 10001 runAsGroup: 10001 fsGroup: 10001 fsGroupChangePolicy: OnRootMismatch ``` **自查**:`GET /api/health` 返回 `storage` 字段(`dataDir` / `writable` / `remedy`); `writable=false` 时服务启动日志会输出 `[APS][FATAL] 数据目录不可写 …`。 ## Web 端演示数据 镜像内置 `APS_WEB_DEMO_SEED=1`:某租户首次打开工作区且没有任何项目时, 自动播种一套完整演示项目「演示项目 · 智能控制器装配排产」: - 固定产线层:2 车间 / 3 产线 / 13 工位 / 5 工序,3 款产品 BOM + 工艺路线 + 换型矩阵 - 柔性能力池:4 类共线产品、7 个能力池、可调配压接机与模具 - 业务单据:7 张销售订单(含 VIP 急单)、10 张柔性订单、3 张预测订单、30 天班次日历 - 一段引导式演示对话 + 2 条示例文件记录 特性: - **按租户隔离**:世界数据在 `server/data/tenants/<租户>/projects/<项目>/world.json` - **幂等**:播种后落 `demo-seeded.ok` 标记;用户删光演示项目也不会回填 - **可关闭**:环境变量 `APS_WEB_DEMO_SEED=0`;桌面端与测试默认不播种 手动补播(如线上已有租户想要演示数据): ```bash # 容器内执行 python scripts/seed_web_demo.py --tenant --user-id 1001 # 已有项目时强制再播一套 python scripts/seed_web_demo.py --tenant --force ``` ## 项目文件上传 侧栏「文件」区支持两种记录: - **上传**:`POST /api/projects/{id}/files/upload`(multipart,多文件;单文件 ≤50MB、单次 ≤20 个)。 字节持久化在数据目录 `tenants/<租户>/projects/<项目>/uploads/`(platform 租户为 `projects/<项目>/uploads/`),随 PVC / 本机 `~/.aps` 持久化;同时登记项目文件记录。 - **登记**:仅元数据记录(无字节),下载返回 404。 已上传文件在侧栏可点击下载(`GET /api/project-files/{fileId}/download`); 删除文件记录会联动清理磁盘字节。viewer 角色上传返回 403。