海欧的博客

  • Navidrome
  1. 首页
  2. 服务器
  3. 正文

NAS部署私有笔记服务

2026年2月15日 28点热度 0人点赞 0条评论

NAS部署私有笔记服务

image-20260215002405841

1. 前言

说起笔记服务,本人主要使用过有 有道云笔记、OneNote两款笔记,有道云笔记在读书阶段使用过,后来工作后接触了OneNote就没有再使用了,所以目前非自建的笔记就使用OneNote了,但是OneNote更多是在自己的笔记本电脑上使用,工作的话我喜欢使用自建的joplin笔记,个人笔记与工作笔记分开,隐私保护也很到位。

我为什么要使用自建的笔记服务呢,这主要是数据在自己手上永远也不怕丢失,不喜欢哪些收费和功能繁杂的笔记软件,简简单单的笔记软件可以让人更加专注于做笔记本身。自建笔记的好处就是可以使用哪些开源优秀的笔记软件,做笔记也是工作学习的一部分,要让它变得简单有趣,没有使用负担。

2. 为什么选择Joplin

我的需求很简单:开源的,支持 Markdown、可以自托管(Docker 部署)、带 Windows 客户端且能连接自建服务端同步笔记,手机也有客户端的。

我使用过的就有思源笔记、有道云笔记,但是它们太笨重,而且思源有收费版本,功能太繁重了。有道云笔记耗资源,数据导入导出也不太好用。最后我使用Joplin就感觉挺好用的,用得很顺手。反正其他暂时看不上。

3. 说一说 Joplin的同步方式

  • Joplin 云 :淘汰;收费
  • Dropbox:淘汰;当网盘使用,国外网盘不好用,同步不是最好的
  • OneDrive:淘汰;也是网盘,微软网盘
  • 文件系统:淘汰;太低级错误多,还有另外设置同步文件夹
  • Nextcloud:自建WebDAV,太麻烦重资源,nas已经有WebDAV了
  • WebDAV:不使用,原始人,同步不是最好,容易同步失败丢数据
  • S3:完美备胎;看情况使用
  • Joplin 服务器:终极boss

4. 部署

4.1 部署环境

我们选择群辉部署,不同于其他影音娱乐的服务,笔记服务的资料非常重要,群辉有数据冗余功能,即使其中一个硬盘坏了还有另外一个,可以做到重要资料不丢失。飞牛就跑影音娱乐使用的,当然有些重要资料还是会定时执行飞牛与群辉互相备份的。以防飞牛硬盘挂了,资料就没了。
image-20260215011852814

4.2 部署编排

参考官方compose:https://raw.githubusercontent.com/laurent22/joplin/dev/docker-compose.server.yml

# This is a sample docker-compose file that can be used to run Joplin Server
# along with a PostgreSQL server.
#
# Update the following fields in the stanza below:
#
# POSTGRES_USER
# POSTGRES_PASSWORD
# APP_BASE_URL
#
# APP_BASE_URL: This is the base public URL where the service will be running.
#   - If Joplin Server needs to be accessible over the internet, configure APP_BASE_URL as follows: https://example.com/joplin. 
#   - If Joplin Server does not need to be accessible over the internet, set the APP_BASE_URL to your server's hostname. 
#     For Example: http://[hostname]:22300. The base URL can include the port.
# APP_PORT: The local port on which the Docker container will listen. 
#   - This would typically be mapped to port to 443 (TLS) with a reverse proxy.
#   - If Joplin Server does not need to be accessible over the internet, the port can be mapped to 22300.

networks:
    app-network:
    transcribe-network:
    shared-network:

services:
    db:
        image: postgres:16
        profiles:
            - full
            - server
        volumes:
            - ./data/postgres:/var/lib/postgresql/data
        networks:
            - app-network
        ports:
            - "5432:5432"
        restart: unless-stopped
        environment:
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_DB=${POSTGRES_DATABASE}
    app:
        image: joplin/server:latest
        profiles:
            - full
            - server
        depends_on:
            - db
            - transcribe
        ports:
            - "22300:22300"
        networks:
            - app-network
            - shared-network
        restart: unless-stopped
        environment:
            - APP_PORT=22300
            - APP_BASE_URL=${APP_BASE_URL}
            - DB_CLIENT=pg
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
            - POSTGRES_DATABASE=${POSTGRES_DATABASE}
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_PORT=${POSTGRES_PORT}
            - POSTGRES_HOST=db
            - TRANSCRIBE_API_KEY=${TRANSCRIBE_API_KEY}
            - TRANSCRIBE_BASE_URL=http://transcribe:4567
            - TRANSCRIBE_ENABLED=${TRANSCRIBE_ENABLED}
    transcribe-db:
        image: postgres:16
        profiles:
            - full
        volumes:
            - ./data/transcribe-postgres:/var/lib/postgresql/data
        networks:
            - transcribe-network
        ports:
            - "${QUEUE_DATABASE_PORT}:5432"
        restart: unless-stopped
        environment:
            - POSTGRES_PASSWORD=${QUEUE_DATABASE_PASSWORD}
            - POSTGRES_USER=${QUEUE_DATABASE_USER}
            - POSTGRES_DB=${QUEUE_DATABASE_NAME}
        command: -p ${QUEUE_DATABASE_PORT}
    transcribe:
        image: joplin/transcribe:latest
        profiles:
            - full
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - ${HTR_CLI_IMAGES_FOLDER}:/app/packages/transcribe/images
        depends_on:
            - transcribe-db
        ports:
            - "4567:4567"
        networks:
            - transcribe-network
            - shared-network
        restart: unless-stopped
        environment:
            - APP_PORT=4567
            - DB_CLIENT=pg
            - QUEUE_DATABASE_NAME=${QUEUE_DATABASE_NAME}
            - QUEUE_DATABASE_USER=${QUEUE_DATABASE_USER}
            - QUEUE_DATABASE_PASSWORD=${QUEUE_DATABASE_PASSWORD}
            - QUEUE_DATABASE_PORT=${QUEUE_DATABASE_PORT}
            - QUEUE_DATABASE_HOST=transcribe-db
            - API_KEY=${TRANSCRIBE_API_KEY}
            - HTR_CLI_IMAGES_FOLDER=${HTR_CLI_IMAGES_FOLDER}

参考(启用邮箱服务):
image-20260215012701706
文件结构:
image-20260215012810480
环境变量:
image-20260215012852097
编排:

image-20260215013031623

容器:

image-20260215013345609

4.3 部署检查

image-20260215013751627

5. 访问

5.1 隧道访问

选择隧道的原因:因为是家庭宽带没有80/443端口,所以使用了隧道服务。其实也是可以使用Nginx管理非80/443端口流量,只是访问的时候带端口号不好用。

如何反代:目前群辉与istore路由器是在同一局域网,istore目前运行nginx与隧道服务,nginx配置为管理8443端口的ipv6公网入口流量,来自互联网的8443流量映射为nginx的443端口流量,然后做常用的反向代理,但是所有二级域名访问的时候都会带8443的端口号,当然这些都是一些个人私有服务的,毕竟带端口号的链接太恶心了。
image-20260215014459983

5.2 配置隧道

配置隧道服务,设置路由:

image-20260215014629554

5.3 登录访问

登录服务端,第一个注册邮箱账号为管理员
image-20260215014838618
注意事项:

访问地址是配置文件的URL,不能同时满足域名登录和IP登录。电子邮箱建议填写真实的,joplin带邮件服务。
image-20260215015006832
image-20260215015148223

6. 客户端访问

客户端登录,填写自建服务的地址与账号密码:
image-20260215015333715
image-20260215015423048
导出文件:

我很喜欢joplin的原因之一是,支持导出md文件的同时也导出资源文件,可以方便文章图片上传到图床。
image-20260215015741556
image-20260215015750070

7. 使用S3存储

我们又来薅羊毛了,互联网大善人cf有免费的对象存储服务,10G的容量,不用白不用,当然看情况使用,如果访问家里的NAS速度很慢,我就推介使用cloudflare的R2存储桶服务,但是R2存储桶还是看网络环境,有时候同步还是比不上家里的NAS, 毕竟它们的同步方式是不一样的,一个是写数据库一个是写文件,效率还是joplin server好很多。

个人不建议使用阿里云等国内厂商的对象存储,因为他们会收取流量费,R2对于个人开发者来说,10G免费额度已经很良心了,R2的流量是免费的,cloudflare R2需要绑定信用卡。

存储桶创建时候,地区选择自动,存储类型为标准:

image-20260215020857936

image-20260215020845852

7.1 配置

配置步骤,复制存储桶/访问密钥/密钥/URL到客户端:

image-20260215021004139
image-20260215021012203

8. 最后

对于R2存储桶的10G还是省着用,不要用于搭建网盘比较好,网盘还是使用家里的NAS比较好;

优缺点:S3同步要记忆填写的密钥,这个很容易就忘记,需要找一个地方记录下来;joplin服务器就完全是自己的域名加账号密码,这个不会忘记;

在新的环境下,登录域名加账号密码,笔记就能呱啦啦下载回来了,还能使用多个账号管理。但是S3存储就麻烦很多,兼容性不友好。

PS:

数据库建议定期备份,写个定时脚本,进行本地备份:

image-20260215021611929

R2还可以当做图床使用,通过配置图片上传工具,填入R2自定义域名:
image-20260215021832173

标签: NAS服务器 容器 笔记 隧道
最后更新:2026年2月15日

haiou

理工男极客工程师

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

归档

  • 2026 年 3 月
  • 2026 年 2 月

分类

  • 嵌入式
  • 服务器

00:00
目录
  • NAS部署私有笔记服务
    • 1. 前言
    • 2. 为什么选择Joplin
    • 3. 说一说 Joplin的同步方式
    • 4. 部署
      • 4.1 部署环境
      • 4.2 部署编排
      • 4.3 部署检查
    • 5. 访问
      • 5.1 隧道访问
      • 5.2 配置隧道
      • 5.3 登录访问
    • 6. 客户端访问
    • 7. 使用S3存储
      • 7.1 配置
    • 8. 最后

COPYRIGHT © 2026 海欧的博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang