无需数据库的笔记flatnotes

news2024/12/23 14:26:47

在这里插入图片描述

本文完成于 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 文件夹的权限,最终用了下面的命令

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

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

在这里插入图片描述

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


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

端口

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

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

默认打开是没有端口的

在这里插入图片描述

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


【关键点2】

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

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 的时候涉及过,有兴趣可以自己研究

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

端口已经有,直接修改

在这里插入图片描述

其他四项为新增

在这里插入图片描述

命令行安装

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

# 新建文件夹 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 文件

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

然后执行下面的命令

# 新建文件夹 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115806.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

保姆级教学——Python+Pygame怎么实现吃豆豆游戏

耽搁十几天的时间&#xff0c;我顺利的从阳转阴啦&#xff0c; 以后的日子一切恢复正常&#xff0c;好好工作&#xff0c;积极分享。希望在座的小伙伴阳了的全部健康转阴&#xff0c;没阳的全部不会变阳&#xff0c;新的一年&#xff0c;一切顺顺利利。 不知道最近大家学习得怎…

前端大屏常用的几种适配方案

方 案实现方式优点缺点vm vh1.按照设计稿的尺寸&#xff0c;将px按比例计算转为vw和vh1.可以动态计算图表的宽高&#xff0c;字体等&#xff0c;灵活性较高 2.当屏幕比例跟 ui 稿不一致时&#xff0c;不会出现两边留白情况1.每个图表都需要单独做字体、间距、位移的适配&#x…

磨金石教育摄影技能干货分享|看看大师们如何把“树”拍成艺术品

树&#xff0c;可以说是我们生活中最为常见的物种了。 在不同的地域&#xff0c;不同的气候环境下&#xff0c;生长着不同的树种。 北方的白桦树、杨树、梅花&#xff1b;南方的凤凰花、榕树、梧桐等等。 无论哪个地方的树&#xff0c;都有别样的姿态。 1、相机作画 白雪没有覆…

python实验实践【2】深度学习的python包

python包的管理是使用python进行实验过程中最为重要的一环&#xff0c;很多时候运行他人代码失败的原因是没能按照对方的要求配置python包库。本篇博客重点介绍深度学习场景中python包的管理。 目录python包版本选择python包安装python包版本选择 使用pytorch进行深度学习训练…

AndroidRN的混合集成 下载不了RN的依赖可以看看 好使

一、混合开发 App 混合开发&#xff0c;指的是一个 App 部分功能用 Native 构建&#xff0c;其他功能使用跨端框架进行构建&#xff0c;最常见的场景是&#xff0c;Native 作为一个可工程&#xff0c;其实业务开发使用垮端框架进行开发。目前&#xff0c;比较流行的跨端框架有…

ORB-SLAM3算法学习—双目和单目初始化

0总述 ORB-SLAM3算法中视觉的初始化依旧放在tracking线程中&#xff0c;因此在tracking中没有为imu模式设置单独的初始化函数&#xff0c;而IMU的初始化是在localMapping中实现的。 很有用的参考链接&#xff1a;https://cloud.tencent.com/developer/article/1761043 1双目…

Python 基础教程(1)

1.翻转字符串 def reverseWords(input):# 通过空格将字符串分隔符&#xff0c;把各个单词分隔为列表inputWords input.split(" ")# 翻转字符串# 假设列表 list [1,2,3,4], # list[0]1, list[1]2 &#xff0c;而 -1 表示最后一个元素 list[-1]4 ( 与 list[3]4 一样…

C++ 使用CLion + LibTorch 调用Python训练的PyTorch模型-MNIST

C++ 使用CLion + LibTorch 调用Python训练的PyTorch模型-MNIST 安装LibTorch 进入pytorch官网地址,选则LibTorch版本将LibTorch安装包解压到libtorch-path目录中,libtorch-path是自定义的LibTorch安装目录。

【SpringCloud Alibaba】Sentinel持久化结合Nacos

在前面学习完Sentinel的流控规则以及Nacos时&#xff0c;就是最后的Sentinel持久化了。需要持久化的原因是因为每次启动Sentinel都会使之前配置的规则就清空了&#xff0c;这样每次都要再去设定规则显得非常的麻烦。 思路就是&#xff1a;将流控规则配置进Nacos服务注册中心中&…

【实时数仓】DWS层之关键词主题表(FlinkSQL)、数据可视化接口、Sugar数据大屏、总成交金额接口实现

文章目录一 DWS层-关键词主题表(FlinkSQL)1 过滤数据2 利用UDTF进行拆分&#xff08;1&#xff09;拆分结果&#xff08;2&#xff09;Join 表函数 (UDTF)&#xff08;3&#xff09;代码3 分组、开窗、聚合计算4 转换为流并写入ClickHouse&#xff08;1&#xff09;在ClickHous…

大数据网站攻击实时项目架构

随着互联网的流行&#xff0c;网站安全问题就日益突出&#xff0c;但绝大多数的网站开发与建设公司只考虑正常用户的稳定使用&#xff0c;而对于网站安全方面了解甚少&#xff0c;发现网站安全存在问题和漏洞&#xff0c;其修补方式只能停留在页面代码的删除或者是恢复网站备份…

SpringBoot系列之SpringBoot启动流程详解

文章目录前言一、SpringBoot流程分析-初始化二、SpringBoot流程分析-run总结前言 SpringBoot的启动流程在我们面试的时候会经常被问&#xff0c;接下来我们根据源码来分析了解下SpringBoot是怎么启动的 一、SpringBoot流程分析-初始化 首先对SpringBoot主启动类进行debug&…

通用企业智能制造ERP源码 制造业通用ERP系统源码 工厂ERP源码C# web ASP.NET 源码

管理控制台 一&#xff0c;基础档案 客户档案、 供应商档案 、外协档案 、 物料档案、 产品档案 产品BOM 、 模具档案、 工价档案 、 人员档案 二&#xff0c;样品开发 产品开发 样品登记 产品开发&#xff1a;开发编号、设计来源、系列号、中英文设计名称、最后期限、…

Nginx由浅入深

一、Nginx简介 1、Nginx 概述 Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力确实在同类型的网页服务器中表现较好&#xff0c;中国大陆使用nginx网站用户有&#xff1a;百度、京东、新…

医院医疗信息管理系统源码 成熟EMR电子病历系统源码

医院医疗信息管理系统源码 成熟EMR电子病历系统源码 多家二甲医院在用&#xff0c;功能模块如下所示&#xff1a; 1.住院医生站 2.住院护士站 3.病案浏览工作站 4.质量控制工作站 5.系统维护工作站 开发环境 &#xff1a;VS2010 C# ORACLE 系统简介&#xff1a; 1各种记…

漏洞发现之操作系统

漏洞发现之操作系统1.系统漏洞1.1.系统漏洞介绍1.2.系统漏洞危害1.3.系统漏洞防范2.名词介绍2.1.CVSS2.2.CVE2.3.POC/EXP3.探针3.1.探针介绍3.2.探针工具介绍3.3.Goby3.3.1.Goby介绍3.3.2.下载地址3.3.3.Goby使用3.3.3.1.切换中英文3.3.3.2.建立扫描任务3.3.3.3.资产内容3.3.3.…

深入理解 FilterChainProxy【源码篇】

目录FilterChainProxy源码分析FilterChainProxy 源码-全局属性doFilter 方法doFilterInternal 方法VirtualFilterChain最后RequestRejectedHandler引用FilterChainProxy 在一个 Web 项目中&#xff0c;请求流程大概如下图所示&#xff1a; 请求从客户端发起&#xff08;例如浏…

TechG年度科技行业盛会来袭,深兰科技展台亮点抢先看!

2022年12月29日——31日&#xff0c;科技行业盛会「上海国际消费电子技术展(TechG)将在南京举办&#xff0c;深兰科技机器人产业集团将携人工智能机器人产品“家族”亮相展会&#xff0c;全面展示先进的人工智能机器人技术&#xff0c;呈现安全、高效、新潮的机器人应用场景。 …

D. Lucky Chains edu139 div2

Problem - D - Codeforces 题意是给你a和b&#xff0c;要求__gcd(ak,bk)1的k最多可以增加多少个1 分析&#xff1a; 遇到这种的最大公约数的问题&#xff0c;有很大概率都是推公式&#xff0c;以及使用筛法去把所有的质数筛出来利用质因子去缩短时间 这题就是一个推公式的题…

【UE4 第一人称射击游戏】11-武器跟随鼠标移动并添加开火音效

上一篇&#xff1a; 【UE4 第一人称射击游戏】10-添加冲刺功能 本篇效果&#xff1a; 步骤&#xff1a; 1.打开“SWAT_AnimBP”&#xff0c;添加3个“变换&#xff08;修改&#xff09;骨骼”节点 选中第一个“变换&#xff08;修改&#xff09;骨骼”节点&#xff0c;在细节…