|
|
@@ -0,0 +1,54 @@
|
|
|
+# Docker 与 SQLite 持久化实现计划
|
|
|
+
|
|
|
+> **面向 AI 代理的工作者:** 必需子技能:使用 superpowers:executing-plans 逐任务实现此计划。步骤使用复选框(`- [ ]`)语法来跟踪进度。
|
|
|
+
|
|
|
+**目标:** 构建可升级的 Docker 服务,并保证 SQLite 始终由宿主机 `./data` 持久保存。
|
|
|
+
|
|
|
+**架构:** 多阶段 Dockerfile 生成包含前端静态资源的 Spring Boot JAR;Compose 通过 bind mount 将 `./data` 映射到 `/app/data`。启动脚本只准备目录,由应用现有初始化器区分首次建库和增量升级。
|
|
|
+
|
|
|
+**技术栈:** Docker、Docker Compose、Node 20、Maven 3.9、Eclipse Temurin 17、Spring Boot、SQLite。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+### 任务 1:建立 Docker 配置契约
|
|
|
+
|
|
|
+**文件:**
|
|
|
+- 创建:`scripts/test-docker-config.sh`
|
|
|
+
|
|
|
+- [ ] 编写断言:Dockerfile 多阶段构建、Compose 使用 `./data:/app/data`、数据源及备份目录指向 `/app/data`、`.dockerignore` 排除运行数据。
|
|
|
+- [ ] 运行 `bash scripts/test-docker-config.sh`,确认因文件缺失而失败。
|
|
|
+- [ ] 保留该脚本作为后续 Docker 配置回归测试。
|
|
|
+
|
|
|
+### 任务 2:实现镜像与启动边界
|
|
|
+
|
|
|
+**文件:**
|
|
|
+- 创建:`Dockerfile`
|
|
|
+- 创建:`docker/entrypoint.sh`
|
|
|
+- 创建:`.dockerignore`
|
|
|
+
|
|
|
+- [ ] 使用 Node 阶段执行 `npm ci && npm run build`。
|
|
|
+- [ ] 使用 Maven 阶段复制前端产物并执行 `mvn package -DskipTests`。
|
|
|
+- [ ] 使用 JRE 阶段安装 `gosu`,启动时创建并检查 `/app/data`,再以非 root 用户运行 JAR。
|
|
|
+- [ ] 运行配置契约测试,确认通过。
|
|
|
+
|
|
|
+### 任务 3:提供 Compose 部署配置
|
|
|
+
|
|
|
+**文件:**
|
|
|
+- 创建:`compose.yaml`
|
|
|
+- 创建:`.env.example`
|
|
|
+- 创建:`docs/docker-deployment.md`
|
|
|
+
|
|
|
+- [ ] 将宿主机 `./data` 绑定到 `/app/data`,显式配置 SQLite URL 和备份目录。
|
|
|
+- [ ] 提供 JWT、管理员密码和 CORS 必填环境变量示例。
|
|
|
+- [ ] 记录首次部署、升级、备份和恢复命令,明确禁止删除 `./data`。
|
|
|
+- [ ] 运行 `docker compose config` 验证配置可解析。
|
|
|
+
|
|
|
+### 任务 4:真实验证初始化和升级持久性
|
|
|
+
|
|
|
+**文件:**
|
|
|
+- 创建:`scripts/test-docker-persistence.sh`
|
|
|
+
|
|
|
+- [ ] 在临时宿主机目录启动容器,确认自动生成 SQLite 文件。
|
|
|
+- [ ] 向数据库写入哨兵数据,重建同一镜像的容器。
|
|
|
+- [ ] 确认数据库文件和哨兵数据仍存在,随后清理测试容器和临时目录。
|
|
|
+- [ ] 运行前后端全量测试与 `git diff --check`。
|