Busabase

升级

怎么升到新版本、迁移失败会怎样、以及为什么回滚意味着恢复备份而不是降级。

开始之前

先备份。不是走流程——它就是你唯一的回滚方案,下面会说明为什么没有别的。

Compose

./backup.sh /var/backups/busabase
docker compose pull
docker compose up -d

migrate 会先跑、跑完,然后 app 才启动。如果它失败,会以非零码退出,app 根本不会起来——condition: service_completed_successfully 保证了这一点。你得到的是一套停着的部署和日志里清楚的原因,而不是一套跑在半迁移 schema 上的部署。

docker compose logs migrate

输出里会给出失败的 SQL 语句和数据库报错,但不会给出它来自哪个迁移文件。要定位文件,拿那条语句去迁移目录里搜:

docker compose run --rm --entrypoint sh migrate -c \
  "grep -rl 'this_table_does_not_exist' apps/busabase-cloud/src/db/migrations"

请把那个文件连同支持包一起发给我们,不要自己手改 schema——「迁移只跑了一半」这个状态我们能从文件层面修复,但「有人直接改过表」之后就难修得多了。

一体机

docker pull busabase/busabase-premium-allinone:trial
docker rm -f busabase
docker run -d --name busabase \
  -p 3000:3000 \
  -v busabase-data:/data \
  --restart unless-stopped \
  busabase/busabase-premium-allinone:trial

-v busabase-data:/data 才是「这是升级而不是全新安装」的关键。同一个卷名,同一份数据。漏掉它你会得到一个全新的空实例,看起来就像数据被删了。

这里迁移同样在启动时执行,失败同样是致命的:容器会停掉,而不是拿一个它读不懂的 schema 去对外服务。

回滚

没有向下迁移的路径。一个已经加了列的迁移,不存在一个「知道该拿新写入的行怎么办」的逆操作。

所以回滚意味着:跑上一个镜像 tag,并恢复你升级前做的那份备份。整个流程就这些——这也是为什么备份那一步不是可选的。

BUSABASE_IMAGE=busabase/busabase-premium:<上一个-tag> docker compose up -d
# 然后按 /docs/self-hosted/backup-restore 恢复

确认升级生效

curl -s http://localhost:3000/api/health

返回里的 version 字段告诉你实际在对外服务的是哪个构建——值得确认一下而不是想当然,尤其是在本地缓存过旧镜像的机器上。

On this page