最可靠方式是 docker compose 部署,因其预装兼容运行时规避 abi 冲突;须修改 ports、volumes(用绝对路径)、environment(trilium_data_dir 与 volume 目标一致);首次访问设密码并手动切语言为 zh-cn;备份需停容器或用 sqlite3 .dump,禁用 nfs 挂载。

Linux 上部署 Trilium 最可靠、最可控的方式是 Docker Compose,不是直接运行二进制或 systemd 服务 —— 后者容易因 glibc 版本、libstdc++.so.6 缺失或路径硬编码失败。
为什么别用 trilium-cn-linux-x64-server.zip 直接运行
这个包本质是 Electron 封装的桌面版服务端,依赖宿主机的 C++ 运行时。Ubuntu 22.04+ 或 CentOS 8+ 常见报错:error while loading shared libraries: libstdc++.so.6: cannot open shared object file。手动替换 libstdc++.so.6 风险高,且每次系统更新可能回退。Docker 镜像已预装兼容版本,规避所有底层 ABI 冲突。
docker-compose.yml 必须改的三处配置
官方文档里给的示例常忽略实际环境差异,以下字段必须按需调整:
-
ports:不要写8080:8080。如果服务器已有 Nginx 或其他服务占用了 8080,直接改前段端口,比如- "9088:8080"; -
volumes:映射路径必须是绝对路径,./trilium-data在非交互式 shell(如 systemd 启动)下会失效,应写成/opt/trilium/trilium-data:/root/trilium-data; -
environment:TRILIUM_DATA_DIR必须与 volume 映射的目标路径一致,否则容器启动后数据写入空白目录,重启即丢失。
首次启动后必须做的两件事
容器跑起来只是开始,不执行以下操作,后续很可能无法登录或中文失效:
- 浏览器访问
http://<your-server-ip>:9088</your-server-ip>(端口按你配的来),**必须在首次页面弹出密码设置框时完成设置** —— 这个密码没有找回机制,trilium-data目录里也查不到明文; - 登录后立刻点右上角头像 →
Options→Language→ 选zh-CN,然后刷新页面。仅靠镜像带的 locale 环境变量无法自动触发界面语言切换。
数据安全和备份的实际做法
很多人以为挂载了 volume 就万事大吉,但 trilium-data 目录里包含 SQLite 数据库文件 trilium.sqlite,它在写入过程中被锁住,直接 cp 或 rsync 可能拿到损坏副本:
- 停掉容器再备份:
docker compose down && cp -r /opt/trilium/trilium-data /backup/trilium-$(date +%F); - 或者用容器内命令导出:
docker exec trilium-notes sqlite3 /root/trilium-data/trilium.sqlite ".dump" > backup.sql(注意容器名要和docker-compose.yml里container_name一致); - 别把
trilium-data挂到 NFS 或低延迟要求高的网络存储上 —— SQLite 对 fsync 延迟敏感,可能导致编辑卡顿或提交失败。
Trilium 的核心价值不在安装多快,而在于数据长期可读、可迁移。用 Docker 部署只是起点,真正关键的是理解 trilium-data 目录里每个文件的作用,以及哪些操作会破坏它的原子性。备份不验证、密码不记录、路径不绝对,这三件事做错任何一件,都可能让几百天的知识沉淀瞬间不可恢复。











