Karakeep 自托管故障排查完全指南:SqliteError、AI 打标失效、爬虫异常与 Meilisearch 迁移修复
【免费下载链接】hoarderA self-hostable bookmark-everything app (links, notes and images) with AI-based automatic tagging and full text search项目地址: https://gitcode.com/GitHub_Trending/ho/hoarder
本文以 Karakeep(Hoarder 的后续迭代项目)官方 Troubleshooting 文档为主线,系统性梳理自托管部署中最常见的五类故障——SQLite 数据库未初始化、Chrome 容器日志告警、OpenAI/Ollama AI 打标不工作、爬虫抓取失效、Meilisearch 版本升级引发的索引不兼容——并给出可复现的排查步骤与修复命令。读完本文,你将能够独立定位自托管实例的日志线索,正确配置DATA_DIR、BROWSER_WEB_URL、推理服务相关环境变量,并安全地完成 Meilisearch 数据目录重建与全量重建索引。
原始故障排查文档位于 docs/versioned_docs/version-v0.30.0/06-administration/05-troubleshooting.md(当前分支版本见 docs/docs/06-administration/05-troubleshooting.md),文中涉及的配置项均可对照 docs/docs/03-configuration/01-environment-variables.md 查阅。
一、排查总原则:一切先从容器日志入手
Karakeep 由多个容器协同工作(web、chrome、meilisearch,见 docker/docker-compose.yml),绝大多数故障都会在对应容器日志中留下明确线索。官方文档反复强调一句话:"Check the logs of the container and this will usually tell you what's wrong"。
- 查看所有服务日志:
docker compose logs -f - 只看某个服务:
docker compose logs -f web、docker compose logs -f chrome、docker compose logs -f meilisearch - 日志级别由
LOG_LEVEL控制,默认debug(源码见 packages/shared/config.ts),生产环境建议调高为notice或warning以降低日志噪音。
下面每个故障小节都会先给出"日志里应该找什么",再给出修复动作。
二、SqliteError: no such table: user(数据库未初始化)
2.1 错误含义
SqliteError: no such table: user这个错误几乎总是意味着数据库没有正确初始化——SQLite 文件虽然存在(或路径错误),但其中还没有 Karakeep 所需的表结构。它通常由两类配置问题引发:
2.2 原因一:DATA_DIR被清空或存储目录被更换
DATA_DIR是 Karakeep 的持久化数据目录,SQLite 数据库就存放在这里。如果该目录被清空(或挂载的存储卷发生了更换),数据库自然"不存在"。
修复:如果是有意清空(例如全新部署),直接重启容器即可,Karakeep 会自动重新初始化数据库。初始化逻辑在 packages/db/migrate.ts 中:启动时通过 drizzle 的 migrator 将./drizzle目录下的迁移 SQL 全部应用到数据库(迁移文件见 packages/db/drizzle),随后建表完成。
2.3 原因二:未配置DATA_DIR(自定义 compose 文件场景)
如果你没有使用仓库自带的 docker/docker-compose.yml,而是自己编写了 compose 文件,很容易忘记配置DATA_DIR环境变量。此时数据库会被初始化到与 web 服务实际使用的目录不一致的位置,导致服务读不到表。
官方 compose 中的关键注释值得注意(见 docker/docker-compose.yml):
# You almost never want to change the value of the DATA_DIR variable. # If you want to mount a custom directory, change the volume mapping above instead. DATA_DIR: /data # DON'T CHANGE THIS修复要点:
- 不要修改 compose 里的
DATA_DIR值,它固定指向容器内的/data; - 要换存储位置,请修改 volume 映射,例如把
- data:/data换成- /path/to/your/directory:/data; - 自定义 compose 时务必显式传入
DATA_DIR,并且与卷映射保持一致。
DATA_DIR同时决定了资源的默认存放位置:当ASSETS_DIR未设置时,资源默认存在${DATA_DIR}/assets下(见 packages/shared/config.ts 的assetsDir计算逻辑)。
2.4 源码侧补充:数据库打开与初始化细节
- 数据库连接由 packages/db/sqlite.ts 的
openSqliteDatabase建立,会设置foreign_keys = ON、temp_store = MEMORY等 pragma; - 若开启
DB_WAL_MODE=true,则启用journal_mode = WAL并配合synchronous = NORMAL提升并发性能;默认false时使用journal_mode = DELETE(见 packages/shared/config.ts)。文档建议:除非数据库跑在网络挂载盘上,否则没有理由不开启 WAL; degradedMode下会跳过迁移(见 packages/db/migrate.ts),排查时注意不要误开该模式。
三、Chrome Failed to Read DnsConfig(良性告警,可忽略)
如果你在chrome 容器的日志中看到类似下面的报错:
Chrome Failed to Read DnsConfig这是无害的良性错误,可以放心忽略。官方文档明确说明:"Whatever problems you're having, is unrelated to this error."——即你遇到的其他任何问题都与它无关,不要被这条日志误导去排查 DNS 配置。
该错误来源于 Karakeep 使用的独立 Chrome 容器(镜像ghcr.io/karakeep-app/karakeep-chrome,见 docker/docker-compose.yml)在启动时尝试读取宿主机 DNS 配置失败,但不影响其作为无头浏览器提供页面抓取能力。
四、AI 打标不工作(OpenAI 场景)
Karakeep 的自动打标依赖推理配置,其判定逻辑在 packages/shared/config.ts:
inference: { isConfigured: !!val.OPENAI_API_KEY || !!val.OLLAMA_BASE_URL, ... }只要OPENAI_API_KEY与OLLAMA_BASE_URL都未设置,推理就会被判定为未配置,日志中会出现类似 "skipping inference as it's not configured" 的提示。常见原因按出现频率排列:
- 环境变量名拼写错误:把
OPENAI_API_KEY写错(例如OPENAI_KEY、OPENAI_APIKEY)。由于配置项通过 zod schema 解析(见 packages/shared/config.ts),拼写错误的变量会被静默忽略,最终表现为"推理未配置"日志。 - 配置后忘记重启:修改
.env后没有执行docker compose up(或docker compose restart web),新环境变量未生效。 - OpenAI 账户余额不足:OpenAI 要求先充值才能调用 API,否则会得到类似 "insufficient funds" 的错误。
修复:
- 检查
.env中变量名是否与官方一致(完整列表见 docs/docs/03-configuration/01-environment-variables.md); - 重新加载配置:
docker compose up -d; - 登录 OpenAI 平台确认账户有可用额度;
- 之后到"用户设置 → AI 设置"中检查自动打标开关(
INFERENCE_ENABLE_AUTO_TAGGING默认true,见 packages/shared/config.ts)。
进阶调优参数(详见环境变量文档):
INFERENCE_TEXT_MODEL:文本打标模型,默认gpt-5.6-luna(v0.30.0 版本快照中为gpt-4.1-mini);INFERENCE_IMAGE_MODEL:图片打标模型,默认gpt-4o-mini;INFERENCE_CONTEXT_LENGTH:传给模型的 token 上限,默认 2048。文档特别提醒默认值偏小,调大可提升打标质量,但会同时增加 OpenAI 费用与 Ollama 资源开销;INFERENCE_JOB_TIMEOUT_SEC:推理任务超时,默认 30 秒;OPENAI_BASE_URL:使用 Azure OpenAI 等兼容接口时指定;OPENAI_PROXY_URL:OpenAI 请求走 HTTP 代理时指定。
五、AI 打标不工作(Ollama 本地推理场景)
Ollama 场景的排查思路与 OpenAI 类似,但多了几个本地部署特有的坑:
环境变量名拼写错误:
OLLAMA_BASE_URL写错同样会导致 "skipping inference as it's not configured"。忘记重新
docker compose up:配置后未重启容器。未修改
INFERENCE_TEXT_MODEL:这是最容易忽略的一点。默认推理模型是 GPT 系列(gpt-5.6-luna/gpt-4.1-mini),Ollama 无法加载这些模型。必须显式改为 Ollama 已拉取的模型名,例如:INFERENCE_TEXT_MODEL=llama3.1 INFERENCE_IMAGE_MODEL=llava # 图片打标需支持视觉 API 的模型 OLLAMA_BASE_URL=http://host.docker.internal:11434Ollama 服务不可达,通常是以下子原因:
- 网络隔离:Ollama 与 Karakeep 容器不在同一个 Docker 网络。把两者加入同一自定义网络,或在 compose 中为 web 服务显式加入 Ollama 所在网络;
- 误用
localhost:容器内的localhost指向容器自身,而非宿主机。要访问宿主机上的 Ollama,应使用http://host.docker.internal:11434(Linux 下需在 compose 中为容器添加extra_hosts: - "host.docker.internal:host-gateway"),或直接使用宿主机的局域网 IP。
其他可调参数:
OLLAMA_KEEP_ALIVE:控制模型在推理请求后驻留内存的时间(如"5m"驻留 5 分钟、"-1m"长期驻留、"0"立即卸载);INFERENCE_FETCH_TIMEOUT_SEC:请求 Ollama 的抓取超时,默认 300 秒,慢速无 GPU 机器可调大;INFERENCE_OUTPUT_SCHEMA:默认structured,若模型不支持结构化输出可降级为json或plain(见 packages/shared/config.ts)。
调试技巧:先在宿主机执行curl http://localhost:11434/api/tags确认 Ollama 正常;再进入 web 容器执行docker compose exec web sh后用wget/curl测试容器到 Ollama 的连通性,即可定位是网络问题还是变量问题。
六、爬虫不工作(Crawling not working)
Karakeep 的爬虫通过 Chrome 容器的调试端口执行 JavaScript 与截图。官方文档指出的最常见原因只有一个:
你改了 Chrome 容器的名称,却没有同步修改
BROWSER_WEB_URL环境变量。
官方 compose 中的对应配置(见 docker/docker-compose.yml):
environment: BROWSER_WEB_URL: http://chrome:9222 # "chrome" 即 chrome 服务的名称BROWSER_WEB_URL是 Chrome 调试端口的 HTTP 地址,爬虫 worker 通过它解析出调试协议的 WebSocket 地址。如果你把chrome服务改名为browser、headless-chrome等,必须同步把BROWSER_WEB_URL改为http://<新名称>:9222,否则爬虫连不上浏览器。
相关参数补充:
BROWSER_WEBSOCKET_URL:若你已直接拿到调试 WebSocket 地址(例如使用 browserless 等按需浏览器服务),可直接指定它,此时优先于BROWSER_WEB_URL;BROWSER_CONNECT_ONDEMAND:默认false(常驻连接);使用按需提供浏览器实例的服务时设为true;- 若
BROWSER_WEB_URL与BROWSER_WEBSOCKET_URL都未设置,爬虫会退化为纯 HTTP 请求,跳过截图与 JavaScript 执行(见 docs/docs/03-configuration/01-environment-variables.md 的 Crawler Configs 一节); CRAWLER_NUM_WORKERS:并发抓取数,默认 1,避免资源占用过高。
验证步骤:
- 确认 chrome 容器健康:
docker compose ps; - 确认 web 容器内能访问
http://chrome:9222:docker compose exec web wget -qO- http://chrome:9222/json/version; - 对比
BROWSER_WEB_URL中的服务名与 compose 中 chrome 服务的实际名称是否一致。
七、升级 Meilisearch:迁移搜索引擎数据库版本
7.1 背景与典型报错
Meilisearch 是 Karakeep 的书签全文搜索引擎。不同版本的 Meilisearch 数据目录(data.ms)互不兼容,升级后可能出现:
Your database version (x.x.x) is incompatible with your current engine version (y.y.y). To migrate data between Meilisearch versions, please follow our guide on ...官方文档明确建议:不要在没有充分理由的情况下升级 Meilisearch。仓库当前在 docker/docker-compose.yml 中固定镜像版本为getmeili/meilisearch:v1.41.0;值得注意的是,v0.30.0 版本快照文档中记录的是1.13.3,可见版本随迭代不断更新——因此以你实际部署的 compose 文件锁定的版本为准,不要盲目跟随镜像 tag 漂移。
7.2 官方推荐的变通修复步骤
Meilisearch 官方不提供数据库自动迁移,Karakeep 给出的变通方案是清空索引数据并全量重建:
- 停止 Meilisearch 容器:
docker compose stop meilisearch - 清空数据目录:在挂载到
/meili_data的卷中,删除或重命名data.ms文件夹。例如:# 先找到卷的实际路径 docker volume inspect <project>_meilisearch # 然后重命名(保留备份)而非直接删除 mv <volume_path>/data.ms <volume_path>/data.ms.bak注意官方原文是 "erase/rename"——重命名比删除更稳妥,万一需要回滚还能恢复。
- 重新启动 Meilisearch:
docker compose up -d meilisearch - 全量重建索引:以管理员身份登录 Karakeep Web 界面,进入
Admin Settings > Background Jobs,点击"Reindex All Bookmarks"。 - 等待重建任务完成后,搜索功能即恢复正常。
7.3 源码侧验证:重建索引的完整调用链
"Reindex All Bookmarks" 按钮在后台实际调用的是管理员 APIreindexAllBookmarks,其完整调用链可从源码确认:
- tRPC 路由:packages/trpc/routers/admin.ts 定义了
reindexAllBookmarks管理员过程; - Web 管理界面:apps/web/components/admin/BackgroundJobs.tsx 中通过
api.admin.reindexAllBookmarks.mutationOptions(...)触发该操作; - CLI 备用入口:若 Web 界面不方便操作,也可通过官方 CLI 触发:apps/cli/src/commands/admin.ts 中的
api.admin.reindexAllBookmarks.mutate(...); - API 层:packages/api/routes/admin.ts 也暴露了同名 HTTP 端点供外部调用;
- 对应测试见 packages/trpc/routers/admin.test.ts。
也就是说,重建索引的三种途径(Web 后台 / CLI / HTTP API)底层都指向同一逻辑,任选其一即可。
7.4 预防性建议
- 升级 Meilisearch 前先备份卷:
docker run --rm -v <project>_meilisearch:/data -v $(pwd):/backup alpine tar czf /backup/meili_data_backup.tar.gz -C /data .; - 尽量保持镜像版本与官方 compose 锁定版本一致,避免
:latest漂移; - 升级后若遇到问题,官方 Meilisearch 升级文档提供了更完整的迁移指南,可按需查阅。
八、综合预防:让自托管实例少出故障
把本文涉及的故障归纳成几条可落地的运维习惯:
| 预防动作 | 对应故障 |
|---|---|
不要修改 compose 中的DATA_DIR=/data,改卷映射来换存储位置 | SqliteError: no such table |
自定义 compose 必须显式配置DATA_DIR并与卷一致 | SqliteError: no such table |
修改.env后务必执行docker compose up -d使其生效 | AI 打标 / 爬虫不工作 |
环境变量名严格对照官方文档,尤其OPENAI_API_KEY、OLLAMA_BASE_URL | AI 打标不工作 |
Ollama 场景必须修改INFERENCE_TEXT_MODEL为本地模型,并使用host.docker.internal而非localhost | AI 打标不工作(Ollama) |
修改 chrome 容器名称时同步修改BROWSER_WEB_URL | 爬虫不工作 |
锁定 Meilisearch 镜像版本,升级前备份/meili_data卷 | 搜索报版本不兼容错误 |
备份DATA_DIR(SQLite 与资源文件所在目录) | 数据丢失 / 误清空 |
所有环境变量的权威清单与默认值,均可对照 docs/docs/03-configuration/01-environment-variables.md 及 packages/shared/config.ts 中的 zod schema 逐一核对。掌握"先看日志 → 对照配置 → 按链条验证"的方法论后,绝大多数自托管问题都能在十分钟内定位并修复。
【免费下载链接】hoarderA self-hostable bookmark-everything app (links, notes and images) with AI-based automatic tagging and full text search项目地址: https://gitcode.com/GitHub_Trending/ho/hoarder
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考