docker-compose是linux安装trilium最稳方式,需挂载/etc/timezone和/etc/localtime确保时间一致,trilium_data_dir与volumes路径严格匹配并用绝对路径,首次启动前创建目录并chown 1001:1001,中文需在ui中手动切换,备份须停服务或用sqlite3导出。

docker-compose 是当前 Linux 上安装 Trilium 最稳、最省心的方式。直接运行二进制或用 systemd 托管容易卡在 libstdc++.so.6 版本过低、时区错乱、数据目录权限不对这三类问题上,修起来费时还反复。
必须挂载 /etc/localtime 和 /etc/timezone
Trilium 的同步时间戳、日历视图、版本对比全依赖容器内系统时间。Docker 默认用 UTC,而你的宿主机大概率是 CST(东八区)。不挂载会导致:笔记修改时间显示比实际晚 8 小时;Git 同步记录时间错乱;日历插件日期偏移。
- 在
docker-compose.yml的volumes下加两行:/etc/timezone:/etc/timezone:ro和/etc/localtime:/etc/localtime:ro - 别信“容器里设 TZ 环境变量就够了”——Trilium 内部调用的是系统
gettimeofday(),不是读环境变量 - 验证方法:进容器执行
date,输出时间必须和宿主机date完全一致
TRILIUM_DATA_DIR 和 volumes 路径必须严格匹配
很多人启动后发现笔记一重启就消失,根本原因是 TRILIUM_DATA_DIR 值和 volumes 映射的目标路径不一致,导致 Trilium 写进了空白目录。
- 比如你写的是
./trilium-data:/root/trilium-data,那environment里就必须是- TRILIUM_DATA_DIR=/root/trilium-data - 非交互式场景(如 systemd 启动
docker-compose)下,./trilium-data会解析失败,务必改用绝对路径,例如/opt/trilium/trilium-data:/root/trilium-data - 首次启动前手动创建目录并赋权:
sudo mkdir -p /opt/trilium/trilium-data && sudo chown -R 1001:1001 /opt/trilium/trilium-data(Trilium 容器默认以 UID 1001 运行)
中文界面不会自动生效,必须手动切换
nriver/trilium-cn 镜像虽带语言包,但不会自动触发 UI 切换。只改 locale 或环境变量没用。
- 首次访问页面(如
http://localhost:8080)弹出管理员密码设置框时,**必须立刻填完并提交**——这个密码无法重置,也不存明文 - 登录后,点右上角头像 → Options → Language → 选
zh-CN→ 页面刷新 - 如果刷新后仍是英文,检查浏览器是否启用了“禁止 JS”的扩展,Trilium 的语言切换依赖前端 JS 加载资源
备份 trilium.sqlite 不能直接 cp
trilium-data/trilium.sqlite 是 SQLite 数据库,写入时被锁住。直接 cp 或 rsync 可能拿到损坏副本,恢复后打不开笔记树。
- 安全做法一:停服务再拷贝:
docker compose down && cp -r /opt/trilium/trilium-data /backup/trilium-$(date +%F) - 安全做法二:用容器内
sqlite3导出:docker exec trilium sqlite3 /root/trilium-data/trilium.sqlite ".dump" > backup.sql(注意替换trilium为你的服务名) - 别用
docker commit备份容器——它只存镜像层,不包含 volume 数据
真正麻烦的从来不是启动命令,而是时间、路径、权限、语言这四个点没对齐。只要 date 对得上、volumes 和 TRILIUM_DATA_DIR 对得上、chown 1001 对得上、Options → Language 点得上,剩下的就是写笔记了。











