# Docker 部署与升级 默认镜像名称为 `emoon-okr:latest`。 ## 数据持久化约定 SQLite 数据库不进入镜像,始终保存在宿主机: ```text 宿主机 ./data/okr-performance.db ↕ bind mount 容器 /app/data/okr-performance.db ``` 容器内 `/app/data/backups` 同样对应宿主机 `./data/backups`。删除镜像、重建容器不会删除数据库;删除宿主机 `./data` 会永久删除业务数据。 ## 首次启动 ```bash cp .env.example .env # 修改 .env 中的 JWT 密钥、管理员密码和访问域名 mkdir -p data docker compose up -d --build docker compose logs -f okr-performance ``` 启动脚本会确认 `/app/data` 存在且可写。`okr-performance.db` 不存在时,Spring Boot 自动创建表结构、执行数据库迁移并初始化基础数据。 ## 版本升级 建议升级前先备份,再重建镜像和容器: ```bash mkdir -p data/backups sqlite3 data/okr-performance.db ".backup 'data/backups/manual-before-upgrade.db'" docker compose build --pull docker compose up -d --force-recreate --remove-orphans docker compose logs -f okr-performance ``` 升级过程只替换镜像和容器,`./data` 继续挂载到新容器。应用启动后会在原数据库上执行尚未执行的增量迁移。 不要在升级脚本中加入 `rm -rf data`,也不要把数据库复制到 Dockerfile 或镜像中。 > `docker compose down -v` 不会删除这里的宿主机 `./data` 绑定目录,但仍建议生产环境只执行上面的升级命令,避免误操作其他 Docker 资源。 ## 恢复备份 恢复前先停止服务,避免 SQLite 仍有写入: ```bash docker compose stop okr-performance cp data/backups/manual-before-upgrade.db data/okr-performance.db rm -f data/okr-performance.db-wal data/okr-performance.db-shm docker compose up -d ``` ## 常用检查 ```bash docker compose ps docker compose logs --tail=200 okr-performance sqlite3 data/okr-performance.db "PRAGMA integrity_check;" ``` ## 启动时报 JWT `WeakKeyException` 这表示容器收到的 `APP_JWT_SECRET` 为空或不足 32 字符,和 SQLite 数据无关。先确认项目根目录存在 `.env`: ```bash cp .env.example .env # 将全部 CHANGE_ME 替换为真实值 docker compose config docker compose up -d --build ``` 新版 Compose 配置会在 `.env` 缺失或关键变量为空时直接终止,并指出需要配置的变量;不会再把空密钥传给 Spring Boot 后才抛出深层 JWT 异常。