刚刚升级计划管理软件 Planka 大版本升级 V2 版本,发现升级后无法启动了,日志提示存在数据库迁移记录与当前版本代码不匹配的问题。
查了查资料发现 V2 新版本的 Planka 为了精简代码,删除了早期的数据库迁移文件。但 PostgreSQL 数据库的 knex_migrations 表中仍然保留着这些旧文件的名字。
由于 Planka 使用的数据库管理框架 Knex.js 会在启动时进行严格校验,发现文件丢失后,就会抛出 The migration directory is corrupt(迁移目录已损坏)的错误,并强制阻断系统启动,展现出来的结果是容器不断重启,直到触发重启限制后停止。
官方给出的解决方案是运行专属的数据库升级脚本 npm run db:upgrade,该脚本会自动处理数据结构变更并清理旧的迁移记录。
目前研究了研究,相应的解决方案如下。
1.备份数据
进行任何数据库修正前,务必对当前的 Planka 数据库(PostgreSQL)进行完整备份,以防万一。切记不要无备份升级。
除了数据库备份,还需要进行资源文件备份,跨大版本升级后原有的资源文件链接会全部丢失,所以需要手动备份资源文件。
2.进入 Planka 应用目录
进入终端,切换到docker版本 Planka 的 docker-compose.yml 目录下。
3.执行官方升级脚本
由于当前 Planka 容器因为报错处于崩溃重启的状态,不能直接 docker exec 进入容器。你需要在应用目录下,执行以下命令,这会拉起一个临时的容器专门执行数据库升级任务:
docker compose run --rm planka npm run db:upgrade
如果系统提示找不到
docker compose,尝试使用docker-compose run --rm planka npm run db:upgrade,旧版本docker并没有现代版本的编排插件,这点需要注意。
逐条解释一下这个命令含义:
docker compose:调用容器编排工具,它会自动读取当前目录下的docker-compose.yml文件。
run:告诉 Docker 不要像平时那样启动后台守护进程,而是启动一次性任务。
--rm:任务执行完毕后,无论成功或异常,立即自动删除这个临时容器。
planka:指定继承配置文件中为planka设置的所有环境变量、网络配置和挂载卷,相当于用同样的配置启动了一个独立容器,但没有启动应用本身。
npm run db:upgrade:读取 Node.js 环境下package.json 中配置的db:upgrade脚本。调用 Knex.js 的数据库迁移命令,连上数据库重组数据表结构并清理冗余迁移记录。
4.重启服务
等待终端中的升级脚本执行完毕。所有的数据库迁移信息都会在终端中打印,如果没有任何报错并顺利结束,说明数据库记录已经修复完成。
之后执行命令重启容器,等待应用启动。
docker compose down
docker compose up -d
完成后,Planka 能顺利通过启动校验,历史看板数据也会正常保留。
需要注意的是,修复数据后的 Planka 原有的资源文件会丢失,包括计划板背景、用户头像、计划附件等,我个人是不需要修复直接删了重开,如果需要修复请自行解决数据库链接问题。

Comments NOTHING