aps-agent/docs/development/web-deployment.md

69 lines
3.1 KiB
Markdown
Raw Permalink Normal View History

# 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 <JMS租户uuid> --user-id 1001
# 已有项目时强制再播一套
python scripts/seed_web_demo.py --tenant <JMS租户uuid> --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。