碎碎念:天下苦 Memos 久矣
碎碎念: 之前为了追求轻量,图新鲜部署了 Memos 作为日常的碎片化记录和灵感管理工具。刚开始用着确实还行,但随着记录的东西越来越多,它的短板和 BUG 就彻底暴露出来了。
首当其冲的就是BUG,总会有莫名其妙的中文字符编码错误导致的数据库崩溃
层级管理极弱,稍微成体系一点的知识根本没法组织;其次是各种莫名其妙的小 BUG,着实让人心累。对于一个需要沉淀技术文档、画架构图、写长篇大论的人来说,Memos 真的不太够用了。
痛定思痛,决定换一个真正的“硬核”个人知识库。经过一番对比,我锁定了 Trilium。不过这里有个坑:原作者的 zadam/trilium 已经进入维护状态且原生不支持中文,国内常见的汉化镜像 nriver/trilium-cn 也太老了。所以,这次我直接拥抱了开源社区接力的满血复活版 —— TriliumNext(持续更新,且原生自带完美中文!)。
这篇文章记录了从 Docker 部署、解决 Nginx WebSocket 断连,到使用 Systemd 优雅接管容器的完整过程。
🛠️ 第一步:Docker Compose 极速部署
考虑到国内 Docker Hub 经常抽风报错 EOF,配置文件里我直接加上了 Daocloud 的加速镜像源。
创建工作目录 我们要把数据持久化在宿主机,防止容器重启后数据火葬场。
Bash
sudo mkdir -p /opt/TriliumNotes cd /opt/TriliumNotes编写 docker-compose.yml 创建并编辑配置文件:
YAML
services: triliumnext: # 使用 TriliumNext 社区版,并借道国内加速源 image: docker.m.daocloud.io/triliumnext/trilium:latest container_name: trilium restart: unless-stopped ports: # 左边宿主机端口,右边容器内端口(必须是8080) - "5230:8080" volumes: # 映射数据目录 - /opt/TriliumNotes:/home/node/trilium-data environment: - TRILIUM_DATA_DIR=/home/node/trilium-data【防坑必看】修复目录权限 TriliumNext 镜像内部出于安全考虑,使用了非 root 用户(
node,UID 1000)运行。如果不改宿主机的目录权限,容器启动时会因为无法写入数据库而无限重启!Bash
# 将目录所有权交给 UID 1000 sudo chown -R 1000:1000 /opt/TriliumNotes拉取并启动
Bash
sudo docker compose up -d
🌐 第二步:Nginx 反向代理与 WebSocket 修复
部署完之后,如果你直接用 Nginx 反代,大概率会在笔记界面遇到一个恶心的弹窗:“与服务器连线中断 (Connection Lost)”。
原因在于: Trilium 是一个重度依赖 WebSocket 实现前后端实时同步的现代 Web 应用。默认的 Nginx 配置只会转发普通 HTTP 请求,会把 WebSocket 升级请求无情掐断。
修改你的 Nginx 站点配置(注意 location / 里的核心修复):
Nginx
server {
listen 5231 ssl;
server_name www.yanchang.cc;
ssl_certificate /etc/nginx/ssl/www.yanchang.pem;
ssl_certificate_key /etc/nginx/ssl/www.yanchang.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
client_max_body_size 0; # 解除上传限制
location / {
proxy_pass http://127.0.0.1:5230;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# ========================================================
# 【核心修复】开启 WebSocket 支持,解决“连线中断”问题
# ========================================================
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 性能优化参数
proxy_request_buffering off;
proxy_buffering off;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
# HSTS 配置(防止浏览器强制 HTTPS 端口跳转错乱)
proxy_hide_header Strict-Transport-Security;
add_header Strict-Transport-Security "max-age=0" always;
}
}
保存后执行 sudo systemctl reload nginx,世界瞬间清静了。
⚙️ 第三步:Systemd 优雅接管 (开机自启)
作为一个有追求的运维玩家,怎么能每次都 cd 到目录里敲 docker compose 呢?把容器交给 Linux 底层的 Systemd 管理才是正解,配合 --remove-orphans 还能保持环境洁癖。
创建服务文件
Bash
sudo vim /etc/systemd/system/trilium.service写入配置内容
Ini, TOML
[Unit] Description=TriliumNext Docker Compose Service Requires=docker.service After=docker.service network.target [Service] Type=oneshot RemainAfterExit=yes WorkingDirectory=/opt/TriliumNotes # 启动时自动清理配置文件中已经移除的孤儿容器 ExecStart=/usr/bin/docker compose up -d --remove-orphans ExecStop=/usr/bin/docker compose down TimeoutStartSec=0 [Install] WantedBy=multi-user.target重载守护进程并设置开机自启
Bash
sudo systemctl daemon-reload sudo systemctl enable --now trilium.service
以后管理笔记服务,只需要优雅地敲出: sudo systemctl status/start/stop/restart trilium 即可!
结语
一番折腾下来,看着自带全功能白板、树状层级、且能完美顺滑同步的 TriliumNext 跑在服务器上,之前用 Memos 攒下的怒气值终于清空了。再配上之前折腾的 SSL 自动化证书下发,又是一个能够稳稳运行到天荒地老的 HomeLab 服务。
开始愉快地建构知识库了!