yanchang
yanchang
发布于 2026-02-22 / 12 阅读
0
0

TriliumNext 的完美部署指南 弃用 Memos!

碎碎念:天下苦 Memos 久矣

碎碎念: 之前为了追求轻量,图新鲜部署了 Memos 作为日常的碎片化记录和灵感管理工具。刚开始用着确实还行,但随着记录的东西越来越多,它的短板和 BUG 就彻底暴露出来了。

首当其冲的就是BUG,总会有莫名其妙的中文字符编码错误导致的数据库崩溃
层级管理极弱,稍微成体系一点的知识根本没法组织;其次是各种莫名其妙的小 BUG,着实让人心累。对于一个需要沉淀技术文档、画架构图、写长篇大论的人来说,Memos 真的不太够用了。

痛定思痛,决定换一个真正的“硬核”个人知识库。经过一番对比,我锁定了 Trilium。不过这里有个坑:原作者的 zadam/trilium 已经进入维护状态且原生不支持中文,国内常见的汉化镜像 nriver/trilium-cn 也太老了。所以,这次我直接拥抱了开源社区接力的满血复活版 —— TriliumNext(持续更新,且原生自带完美中文!)。

这篇文章记录了从 Docker 部署、解决 Nginx WebSocket 断连,到使用 Systemd 优雅接管容器的完整过程。


🛠️ 第一步:Docker Compose 极速部署

考虑到国内 Docker Hub 经常抽风报错 EOF,配置文件里我直接加上了 Daocloud 的加速镜像源。

  1. 创建工作目录 我们要把数据持久化在宿主机,防止容器重启后数据火葬场。

    Bash

    sudo mkdir -p /opt/TriliumNotes
    cd /opt/TriliumNotes
    
  2. 编写 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
    
  3. 【防坑必看】修复目录权限 TriliumNext 镜像内部出于安全考虑,使用了非 root 用户(node,UID 1000)运行。如果不改宿主机的目录权限,容器启动时会因为无法写入数据库而无限重启!

    Bash

    # 将目录所有权交给 UID 1000
    sudo chown -R 1000:1000 /opt/TriliumNotes
    
  4. 拉取并启动

    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 还能保持环境洁癖。

  1. 创建服务文件

    Bash

    sudo vim /etc/systemd/system/trilium.service
    
  2. 写入配置内容

    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
    
  3. 重载守护进程并设置开机自启

    Bash

    sudo systemctl daemon-reload
    sudo systemctl enable --now trilium.service
    

以后管理笔记服务,只需要优雅地敲出: sudo systemctl status/start/stop/restart trilium 即可!

结语

一番折腾下来,看着自带全功能白板、树状层级、且能完美顺滑同步的 TriliumNext 跑在服务器上,之前用 Memos 攒下的怒气值终于清空了。再配上之前折腾的 SSL 自动化证书下发,又是一个能够稳稳运行到天荒地老的 HomeLab 服务。

开始愉快地建构知识库了!


评论