NAS部署私有笔记服务

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

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}
参考(启用邮箱服务):

文件结构:

环境变量:

编排:

容器:

4.3 部署检查

5. 访问
5.1 隧道访问
选择隧道的原因:因为是家庭宽带没有80/443端口,所以使用了隧道服务。其实也是可以使用Nginx管理非80/443端口流量,只是访问的时候带端口号不好用。
如何反代:目前群辉与istore路由器是在同一局域网,istore目前运行nginx与隧道服务,nginx配置为管理8443端口的ipv6公网入口流量,来自互联网的8443流量映射为nginx的443端口流量,然后做常用的反向代理,但是所有二级域名访问的时候都会带8443的端口号,当然这些都是一些个人私有服务的,毕竟带端口号的链接太恶心了。

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

5.3 登录访问
登录服务端,第一个注册邮箱账号为管理员

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


6. 客户端访问
客户端登录,填写自建服务的地址与账号密码:


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


7. 使用S3存储
我们又来薅羊毛了,互联网大善人cf有免费的对象存储服务,10G的容量,不用白不用,当然看情况使用,如果访问家里的NAS速度很慢,我就推介使用cloudflare的R2存储桶服务,但是R2存储桶还是看网络环境,有时候同步还是比不上家里的NAS, 毕竟它们的同步方式是不一样的,一个是写数据库一个是写文件,效率还是joplin server好很多。
个人不建议使用阿里云等国内厂商的对象存储,因为他们会收取流量费,R2对于个人开发者来说,10G免费额度已经很良心了,R2的流量是免费的,cloudflare R2需要绑定信用卡。
存储桶创建时候,地区选择自动,存储类型为标准:


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


8. 最后
对于R2存储桶的10G还是省着用,不要用于搭建网盘比较好,网盘还是使用家里的NAS比较好;
优缺点:S3同步要记忆填写的密钥,这个很容易就忘记,需要找一个地方记录下来;joplin服务器就完全是自己的域名加账号密码,这个不会忘记;
在新的环境下,登录域名加账号密码,笔记就能呱啦啦下载回来了,还能使用多个账号管理。但是S3存储就麻烦很多,兼容性不友好。
PS:
数据库建议定期备份,写个定时脚本,进行本地备份:

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

文章评论