news 2026/10/27 10:14:26

Koffan备份与升级指南:数据库迁移陷阱与降级问题的完整说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Koffan备份与升级指南:数据库迁移陷阱与降级问题的完整说明

【免费下载链接】Koffan

Free selfhosted groceries list for families and shared households

项目地址:https://gitcode.com/gh_mirrors/ko/Koffan
点击查看免费下载

Koffan 是一款免费的自托管(self-hosted)购物清单应用,适合家庭和合租住户共享使用。升级 Koffan 时最大的"陷阱"藏在数据库里:升级到 2.16.0 后数据库会被自动迁移,旧版本无法再读写迁移后的历史记录,也不存在降级路径——想回滚只能靠升级前备份的数据库文件。本文面向新手,完整讲清 Koffan 备份怎么做、升级时数据库迁移改了什么、以及降级问题该如何规避。

一、先找到数据库文件:备份的对象是它

Koffan 的所有数据(购物清单、分组、模板、自动补全历史、账户与工作区)都保存在一个 SQLite 文件里。找到它,备份就有了着落:

部署方式数据库文件位置
Docker(推荐)容器内/data/shopping.db,映射到宿主机卷(默认卷名shopping-data或 Quick Start 中的koffan-data)
Docker Compose同样挂载到/data,见 docker-compose.yaml
源码直接运行(go run .)当前目录下的shopping.db,可用环境变量DB_PATH修改
  • 数据库路径由环境变量DB_PATH决定,默认为./shopping.db,读取逻辑见 db/db.go;Docker 镜像在构建时已固定为/data/shopping.db(见 Dockerfile)。

一键备份步骤(Docker 卷)

# 1. 停掉 Koffan,避免写入到一半 docker stop <koffan容器名> # 2. 从数据卷复制出带时间戳的备份 docker run --rm -v shopping-data:/data alpine \ sh -c 'cp /data/shopping.db /data/shopping.db.bak-$(date +%Y%m%d)' # 3. 重新启动 docker start <koffan容器名>

⚠️ 先停服务再复制文件,是最稳妥的做法。备份完成后确认文件不是 0 字节,有条件的话可以多备一份到 NAS 或异地。

二、逻辑备份:JSON / CSV 导出(跨版本的"兜底")

数据库文件备份是恢复的首选,但还有一层更"人类可读"的备份:Koffan 内置数据管理功能,可以导出整个工作区的 JSON(含模板和历史)或 CSV。

入口:打开 Koffan 首页右上角的 ⚙️ 设置 →Data选项卡(入口代码在 templates/home.html)。

  • Export JSON:下载koffan-export-日期.json,包含所有清单、模板和自动补全历史,文件名与格式定义见 handlers/export.go
  • Export CSV:便于用 Excel 查看或做二次分析
  • Import:支持把之前导出的 JSON/CSV 导入回来

注意两点:

  1. 启用多用户(MULTI_USER=true)后,导出/导入只作用于当前工作区,不是整个数据库;
  2. JSON 导出是"逻辑备份",适合做保险丝,但账户、会话等信息不在其中——所以升级前请务必先做数据库文件备份。

三、2.16.0 的数据库迁移陷阱详解

3.1 升级时自动发生什么

2.16.0 首次启动会执行迁移,无论你是否开启多用户账户(迁移入口 db/db.go 中的runMigrations(),核心逻辑在 db/workspaces.go):

  • 新建users、workspaces、workspace_members三张表,并预置默认工作区 "Home";
  • 给lists、templates、sessions等表追加workspace_id列,让历史数据自动归入 "Home";
  • 重建item_history表:自动补全历史从"全局唯一"变为"每个工作区各自独立"(SQLite 无法原地修改唯一约束,只能建新表、搬数据、删旧表)。

迁移是幂等的,正常重启不会重复执行;日志中能看到Migration completed字样,看到它们说明迁移成功了。

3.2 为什么说"没有降级路径"

官方文档(README.md 的 Upgrading 一节)说得很直接:

旧版本无法在已迁移的数据库上保存商品历史,并且会忽略工作区概念——开着共享密码的实例里,任何人登录后将看到所有工作区的清单。

翻译成大白话:

  • 把 2.16.0 跑过之后的数据库换回旧版本程序,轻则历史记录悄悄丢失,重则隐私问题(跨工作区数据全部可见);
  • 所以回滚唯一正确姿势 = 停服务 + 用备份文件还原数据库,还原之后,升级期间产生的新数据会丢失。

这就是"迁移陷阱"的全部:不是数据被删了,而是新旧格式互不兼容,且只能单向升级。

3.3 安全的升级清单 ✅

  1. 在设置 → Data 中先导出 JSON(逻辑备份兜底);
  2. 停止 Koffan;
  3. 复制数据库文件做时间戳备份(见上一节的命令);
  4. 拉取新镜像 / 更新源码并启动,例如 Docker Quick Start 使用ghcr.io/pansalut/koffan:latest;
  5. 打开应用确认真清单、模板正常,日志无Migration failed;
  6. 观察一两周稳定后再删除旧备份。

四、从 2.9.x 升级?记得端口变了

另一个常见的升级"坑"与数据库无关:2.10.0 起容器默认端口从80改为8080(镜像改为非 root 用户运行,80 属于特权端口)。如果你从 2.9.x 直接升级,需要同步修改端口映射和反向代理:

原来改为
docker run -p 80:80docker run -p 80:8080
docker run -p 3000:80docker run -p 3000:8080
反向代理(nginx/Caddy/Traefik)upstream 指向80指向8080

如果你之前是靠覆盖PORT环境变量绕过特权端口问题,现在可以直接去掉该覆盖。读取镜像EXPOSE的自动部署平台(如 Coolify)会在重新部署时自动使用新端口。

五、常见问题速查

场景建议
只升小版本,未跨 2.16.0正常升级即可,迁移是幂等的,可不动数据
跨 2.16.0 升级必须:先备份数据库文件 + 导出 JSON,再升级
升级后想回旧版本停止服务 → 用备份文件覆盖数据库 → 启动。升级期间的新数据会丢
开启MULTI_USER之前同样先备份数据库(README"Turning accounts on" 第 1 步即要求备份)
忘记密码想清账户备份后按 README "Forgotten administrator password" 一节操作

六、总结与相关文件

  • 升级前永远先备份:一个 SQLite 文件 + 一份 JSON 导出,双保险;
  • 2.16.0 的迁移单向不可逆,降级 = 还原备份文件,没有"自动回滚"这回事;
  • 从 2.9.x 升上来时,别忘端口80 → 8080。
文件说明
README.md官方升级注意事项(Upgrading / Docker 一节)
db/db.go数据库初始化与迁移调度runMigrations()
db/workspaces.go2.16.0 工作区与历史表重建迁移
handlers/export.goJSON/CSV 导出实现
docker-compose.yaml / docker-compose.local.yaml数据卷/data与DB_PATH配置
VERSION当前版本号

按照这份清单操作,升级 Koffan 就能做到"随时敢升、随时能退"。

【免费下载链接】Koffan

Free selfhosted groceries list for families and shared households

项目地址:https://gitcode.com/gh_mirrors/ko/Koffan
点击查看免费下载

相关推荐

上一篇:OpenPencil copywriting 技能拆解:AI 生成界面中的文案压缩规则与工程调度
下一篇:5 分钟上手 MCP Adapter:从零安装到暴露你的第一个 WordPress 能力

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 10:13:56

链表的相关介绍

1.链表常用技巧和操作总结 一、常用技巧&#xff1a;1.画图--->直观形象&#xff0c;便于我们理解。2.引入虚拟头结点--->便于处理边界情况&#xff0c;方便我们对链表操作。3.不要吝啬空间&#xff0c;大胆去定义变量。比如&#xff1a; 来一个变量一定义就不用考虑连接…

作者头像 李华
网站建设 2026/10/27 10:13:13

营销技能实战拆解:从用户洞察到转化率优化的完整能力指南

写一篇内容扎实的营销技能拆解并不容易&#xff0c;市面上讲“营销思维”的文章很多&#xff0c;但落到具体能学、能练、能上手的能力项&#xff0c;反而没几个人讲透。这篇内容不是一个“营销大纲”&#xff0c;而是基于我这么多年从执行到带项目的实操经验&#xff0c;把营销…

作者头像 李华
网站建设 2026/10/27 10:11:51

Windows+Mac 双平台 Codex 免配置安装保姆教程

前言 做开发的朋友应该都有体会&#xff0c;想要本地部署 Codex&#xff0c;最麻烦的不是软件本身&#xff0c;而是前期环境准备。手动安装 Node.js、处理依赖版本冲突&#xff0c;还要打开终端输入多条命令&#xff0c;稍有不慎就会报错&#xff0c;很多新手卡在这一步直接放…

作者头像 李华