无需数据库的笔记flatnotes

本文完成于 10 月底;

什么是 flatnotes?

flatnotes 是一个自托管的、无数据库的笔记 Web 应用程序,它利用文件夹存储 Markdown 文件。

官方演示站点:https://demo.flatnotes.io/

前言

本文介绍的软件很简单,但是有两个关键点,这两个关键的点不搞清楚,你安装的容器就会起不来

  • 关键点1:文件夹权限
  • 关键点2:端口的权限

具体的内容,我们在居然涉及到的地方再展开说,不然感觉很突兀,也不舒畅

安装

不推荐用群晖图形方式安装,因为涉及到文件夹的权限老苏不知道怎么设置,老苏目前只会用命令行,既然都已经用了命令行,不如直接用命令行完成全部的安装

在群晖上以 Docker 方式安装。

在注册表中搜索 flatnotes ,选择第一个 dullage/flatnotes,版本选择 latest

docker 文件夹中,创建一个新文件夹 flatnotes,并在其中建一个子文件夹 data

这里我们遇到了第一个关键点:


【关键点1】

官方原始的描述 please ensure the current directory contains a folder called "data" and that it's writable by user 1000.

老苏觉得比较好的策略是将容器的 UID/GID 与主机的匹配,对于群晖来说,并不需要存在 1000 这个用户,也正因为这个用户不存在,所以老苏不知道怎么用图像界面来设置 data 文件夹的权限,最终用了下面的命令

1
2
3
4
5
# 进入 flatnotes 目录
cd /volume2/docker/flatnotes

# 更新目录权限
chown -R 1000:1000 ./data

这一步是必须的,否则会因为没有写入权限而导致容器启动失败,包括你拷入的文件,也必须更改归属权,否则文件将是只读的,也就是说你可以阅读笔记,但是修改后保存会报错


文件夹 装载路径 说明
docker/flatnotes/data /app/data 存放笔记文件等

端口

本地端口不冲突就行,不确定的话可以用命令查一下

1
2
# 查看端口占用
netstat -tunlp | grep 端口号
本地端口 容器端口
19980 19980

默认打开是没有端口的

其实默认端口是 80,关于端口为什么要从默认的 80 改为 19980,这就是第二个关键点


【关键点2】

如果使用默认的容器端口 80,你会在容器的日志中看到下面的错误

1
2
3
4
5
2022-10-31 08:17:38 [INFO]: Application startup complete.

ERROR: [Errno 13] error while attempting to bind on address ('0.0.0.0', 80): permission denied

2022-10-31 08:17:38 [ERROR]: [Errno 13] error while attempting to bind on address ('0.0.0.0', 80): permission denied

老苏在命令行安装时尝试过:

  • --user 1000:1000
  • --cap-add NET_BIND_SERVICE
  • --privileged

但都没用,直到最后看了官方的 Issue,才找到了最终的解决方案,那就是需要将容器端口改为 1024以上才行,而这可以通过环境变量来实现,所以老苏最终用了 19980 端口,从日志看获得了成功


现在只要设置端口就可以了

环境

可变
FLATNOTES_AUTH_TYPE 认证的方式
FLATNOTES_USERNAME 登录的用户
FLATNOTES_PASSWORD 登录的密码
FLATNOTES_SECRET_KEY 应用程序密码
PORT 默认为 80

关于 FLATNOTES_AUTH_TYPE 简单说一下,其支持三种认证方式

  • none:不需要认证,直接使用 ;
  • password:用账号密码认证;
  • totp:除了账号密码,还需要基于时间的一次性密码,totp 的全称是 Time-based One-time Password,这个在介绍 Authelia 的时候涉及过,有兴趣可以自己研究

更多的参数请看官方的 wikihttps://github.com/Dullage/flatnotes/wiki/Environment-Variables

端口已经有,直接修改

其他四项为新增

命令行安装

如果你熟悉命令行,可能用 docker cli 更快捷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 新建文件夹 flatnotes 和 子目录
mkdir -p /volume2/docker/flatnotes/data

# 进入 flatnotes 目录
cd /volume2/docker/flatnotes

# 更新目录权限
chown -R 1000:1000 ./data

# 运行容器
docker run -d \
--restart unless-stopped \
--name flatnotes \
-p "19980:19980" \
-v "$(pwd)/data:/app/data" \
-e "FLATNOTES_AUTH_TYPE=password" \
-e "FLATNOTES_USERNAME=<登录用户>" \
-e "FLATNOTES_PASSWORD=<登录密码>" \
-e "FLATNOTES_SECRET_KEY=<一串随机字符串>" \
-e "PORT=19980" \
dullage/flatnotes:latest

# 示例
docker run -d \
--restart unless-stopped \
--name flatnotes \
-p "19980:19980" \
-v "$(pwd)/data:/app/data" \
-e "FLATNOTES_AUTH_TYPE=password" \
-e "FLATNOTES_USERNAME=laosu" \
-e "FLATNOTES_PASSWORD=123456" \
-e "FLATNOTES_SECRET_KEY=xPWrN5VUUStVzY4Yktc7ijyG" \
-e "PORT=19980" \
dullage/flatnotes:latest

也可以用 docker-compose 安装,将下面的内容保存为 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3'

services:
flatnotes:
image: dullage/flatnotes:latest
container_name: flatnotes
restart: unless-stopped
ports:
- 19980:19980
volumes:
- ./data:/app/data
environment:
- FLATNOTES_AUTH_TYPE=password
- FLATNOTES_USERNAME=laosu
- FLATNOTES_PASSWORD=123456
- FLATNOTES_SECRET_KEY=xPWrN5VUUStVzY4Yktc7ijyG
- PORT=19980

然后执行下面的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
# 新建文件夹 flatnotes 和 子目录
mkdir -p /volume2/docker/flatnotes/data

# 进入 flatnotes 目录
cd /volume2/docker/flatnotes

# 更新目录权限
chown -R 1000:1000 ./data

# 将 docker-compose.yml 放入当前目录

# 一键启动
docker-compose up -d

运行

在浏览器中输入 http://群晖IP:19980 就能看到登录界面

用我们前面设置的 FLATNOTES_USERNAMEFLATNOTES_PASSWORD登录,登录成功后是一个搜索界面

点右上角的 NEW 新建笔记

复制了一篇,用预览模式查看

返回首界面可以看到刚才写的笔记

笔记就保存在 /data 目录中

/data/.flatnotes 是索引目录

老苏直接拷入了几篇

直接刷新主页,都有了

但是编辑保存的时候会出错误

看日志还是跟文件权限有关系

直接查看文件,所以这实际上还是属于【关键点1】

所以接下来只要执行 chown -R 1000:1000 . 就可以了

注意后面的小点别落下了;

再回到网页就可以正常保存了

所以总结一下就是,从外部拷入的文件还是需要修改所有权,但是系统中新建的文件不存在这样的问题

参考文档

Dullage/flatnotes: A self-hosted, database-less note taking web app that utilises a flat folder of markdown files for storage.
地址:https://github.com/Dullage/flatnotes

Environment Variables · Dullage/flatnotes Wiki
地址:https://github.com/Dullage/flatnotes/wiki/Environment-Variables

Port 80 permission denied on Synology · Issue #28 · Dullage/flatnotes
地址:https://github.com/Dullage/flatnotes/issues/28