Zettelkasten 笔记法

在接触到 Obsidian 这款笔记应用的时候听说了 Zettelkasten 笔记法,这些天陆陆续续地阅读了一些相关的材料,说起来 Zettelkasten 是一个非常简单的方法,但要真正理解其背后的思维方式,以及真正地贯彻到现实中来也需要好好的整理一下。

什么是 Zettelkasten?

Zettelkasten 是一个德语词,这个词语可以拆分成两个部分,”Zettel”,表示的是笔记或者纸条 (slip of paper),而 “Kasten” 表示的是盒子 (box),两者合起来表示的意思是 box of notes,指通过不同盒子来管理的笔记的方法。[^wik] 这个笔记法使用的集大成者是德国的社会学教授 Niklas Luhmann,这位教授除了在学术上的影响力之外,就是他在 40 年的学术生涯里著有超过 70 本书,400 多篇学术论文,并且涉及法律,经济,政治,艺术,宗教,生态等等各行各业。

如果要用简单的话来描述这个方法大致可以分成这样几个步骤:

  • 卡片是用来存储思考、笔记的,并且卡片是原子的
  • 卡片和卡片之间可以形成联系

Zettelkasten 说到底就是利用一组盒子来管理笔记,在现实中 Luhmann 教授使用 6 乘 4 的木质家居抽屉来管理他所有的笔记。

传统笔记方法的缺点

不管是在学习还是在日常中我们都有大量的时间对一些主题的事情做出不同的记录,传统意义上的笔记有可能是记录在白纸上,有可能记录在书页的空白处,也有可能分布在手机或者电脑的电子笔记本中。如果使用电子的方式,通常会使用文字处理软件,或者相关的管理工具,这些工具通常也会提供分类,标签这些常用的功能。

在整理这些内容的时候可能会使用 mind maps 或者 concept map 这类的思维导图工具,大部分情况下也会列出大纲。

传统笔记比如 Evernote,OneNote, WizNote 的一些缺点:

  • 每一个笔记的内容都是隔离的,相互之间只能通过 category, tag 进行关联,通常一篇笔记的内容就是围绕一个特定的主题进行归纳和总结,于是每一篇笔记的内容之间就缺乏了主题的关联
  • 传统的笔记是一个线性的结构,管理记忆时大都通过层级目录进行管理。

这些传统的方法都各自有各自的优缺点,但它们都无法帮助我们将这些笔记或者想法关联起来,反而极有可能让我们忘记这些笔记或者想法的存在,久而久之这些可能产生价值的笔记或者想法就可能被收纳到床底,或者被遗忘到哪个云服务商的服务器里,或者被锁到哪个不知名的文件夹中,从而彻底失去其意义。

流行了数十年的数码笔记本,比如 Evernote 之类,有可能让用户陷入 collector’s fallacy([[收藏家谬误]]),用户在使用这些笔记时,可能收集大量的信息,而从不对这些内容进行整理和提取。如果不对收集的笔记进一步的精读,那么到最后笔记就会一点点被遗忘。

再来思考一下思维导图 (mind maps),概念图 (concept maps),或者大纲 (outlines),它们可能是知识管理的一种解决方案。这些工具将我们记录下的想法以一种形象的图组织起来。但问题在于,这些方法在整理某一些具体领域的笔记的时候非常有效,但如果一旦需要整理上百个各式各样的想法和笔记,就显得力不从心。虽然你可以不会花 40 年的时间整理一副超过 90000 条想法的思维导图,但是这就是 Luhmann 通过他的 Zettelkasten 所做的事情。再回想一下我自己使用 WizNote 的经历,多少年里也积累了快 5000 条笔记。

如何使用 Zettelkasten 来做笔记

Zettelkasten 适合的不同的场景,比如阅读一本书,或者随时冒出的想法,但是不同的场景在使用 Zettelkasten 的时候大致要遵循如下几点:

  • 一般的 Zettelkasten 工具都会自动将当前的日期加时间作为卡片的标题,比如 202002021100-Title
  • 用自己的话重新组织笔记内容,并将中心内容作为卡片最重要的开头,重在理解而非记录,这个核心内容可以核心的改过这则卡片的内容,以便于未来重读或将连接连入
  • 在添加完新笔记后,主动发现和已有笔记的关联,并使用双向链将不同的卡片关联起来(在已有的笔记内容上关联其他已经存在的笔记)

Reading doesn’t magically increase your knowledge. Just because some text has entered your eyeballs and visited your short-term memory, that doesn’t mean you’ve learned from it.

记住 Zettelkasten 的重点,卡片和连接。

  • 卡片要是能理解的,原子的,独立的,简单的
  • 连接,则是创造永久记忆的方式

在读书时实践 Zettelkasten

在阅读时随时记笔记,但千万不要让笔记打断阅读的重点。在《如何阅读一本书》中,作者将读书分成四个部分

  • 基础阅读,这个阶段快速阅读内容,并标记感兴趣的内容
  • 检视阅读,这个阶段你需要回答出这本书的类型,作者再讨论什么内容,以及作者使用什么样的结构来完善他的观点
  • 分析阅读则是全盘的理解作者要表达的意思,并将书中的观点提出自己的想法
  • 主题阅读,这更为复杂系统化,在主题阅读时需要阅读一系列的书籍,并将书中不用的观点进行关联

我个人建议在阅读的第一二个阶段可以进行快速的阅读,但是在分析阅读的时候一定要作笔记,并用自己的话将作者的观点进行消化。

Take Literature Notes

每当遇到需要记住的内容,或者可能会在未来引用的内容,立即使用如下的方式记录:

  • 保持简洁,不超过 3 句话
  • 用自己的话重新组织,保持注意力在阅读的内容上

Take Reference Notes

在完成阅读后立即开始记录索引

Make Permanent Notes

回顾所有记录的笔记,思考他们如何影响当前的思考,当前的研究方向。

目标不是尽可能多的收集笔记,而是要思考这些笔记对佐证目前自己的观点有没有帮助。

Review and repeat

在完成整个读书的过程后,要定期的进行回顾,在不断有新的 Zettel 加入时也要不断的进行关联和思考。

应该只使用一个 Zettelkasten

在以前有段时间我曾经犯下过一些错误,就是将不用的笔记人为的分隔在不同的笔记本中,然后渐渐有一些笔记本再也不会打开,后来看到一些文章才恍然大悟,即使不是 Zettelkasten 我也只需要一个笔记本,不断被审阅的笔记,不断被连接的笔记才有价值。

只使用一个 Zettelkasten 的优点:

  • 可以通过搜索发现潜在的关联,即使很多年前记录的笔记,也可能与未来的某一天写下的笔记建立联系,这种不断的关联和发现会不断的刷新对[[知识]]的认知
  • 使用 Zettelkasten 做笔记时应该使用日期而非主题对笔记内容进行划分,长远来看,使用单一笔记系统会越来越丰富其内容,而不会因为主题或者多个 Zettelkasten 而产生分隔

reference


2020-02-12 note-taking , zettelkasten , obsidian

NAS 上的音乐管理应用 Funkwhale

NAS 上的文件已经有足够多的管理系统12,而电影也有 [[Kodi]], [[Emby]], [[Plex]] 等等工具,图片同样 Chevereto,Lychee,电子书有 Calibre-web,但就是音乐管理工具没有找到一个比较合适的。

构想

我想的应该这个管理系统可以直接通过 Docker 安装,提供一个比较美观的 Web 页面。

  • Docker
  • 映射本地音乐文件夹
  • Web 管理界面
  • 可以根据文件的 metadata 自动归类,如果可以手工进行编辑就更好了
  • 能在线播放

于是乎我带着这样的目的在 awesome-selfhosted Audio streaming 专区寻找,从编程语言,到 Demo,一个个看,然后就发现了 Funkwhale 点开项目主页介绍,界面非常漂亮,Demo 这各个功能也都非常贴心,立即看安装说明,Docker 搞起。并且 Funkwhale 还自带 pot,新建立的站点可以和网络上的站点连接起来相互分享,像极了之前的 SNS Mastodon.

Funkwhale 用 Python,Django 编写,遇到 bug 倒时候也能看懂代码了。

Install

使用 Docker 安装:

export FUNKWHALE_VERSION="0.20.1"
touch .env
chmod 600 .env  # reduce permissions on the .env file since it contains sensitive data
cat > .env <<EOD
# Replace 'your.funkwhale.example' with your actual domain
FUNKWHALE_HOSTNAME=your.funkwhale.example
# Protocol may also be: http
FUNKWHALE_PROTOCOL=https
# This limits the upload size
NGINX_MAX_BODY_SIZE=100M
# Bind to localhost
FUNKWHALE_API_IP=127.0.0.1
# Container port you want to expose on the host
FUNKWHALE_API_PORT=5000
# Generate and store a secure secret key for your instance
DJANGO_SECRET_KEY=$(openssl rand -hex 45)
# Remove this if you expose the container directly on ports 80/443
NESTED_PROXY=1
EOD

运行:

docker run \
	--name=funkwhale \
	--restart=unless-stopped \
	--env-file=/share/Container/funkwhale/.env \
	-v /share/Container/funkwhale/data:/data \
	-v /share/Music:/music:ro \
	-e PUID=1000 \
	-e PGID=1000 \
	-p 6000:80 \
	-d \
	funkwhale/all-in-one:latest

或者使用 docker-compose:

version: "3"

services:
  funkwhale:
	container_name: funkwhale
	restart: unless-stopped
	# add the version number in your .env file, or hardcode it
	image: funkwhale/all-in-one:0.20.1
	env_file: /share/Container/funkwhale/.env
	environment:
	  # adapt to the pid/gid that own /srv/funkwhale/data
	  - PUID=1000
	  - PGID=1000
	volumes:
	  - /share/Container/funkwhale/data:/data
	  - /share/Music/:/music:ro
	ports:
	  - "6000:80"

导入音乐文件

使用如下命令导入文件:

# For file structures similar to ./Artist/Album/Track.mp3
docker exec -it funkwhale manage import_files $LIBRARY_ID "/music/**/**/*.mp3" --in-place --async

这里的 LIBRARY_ID 需要到界面中找。

外延

koel

[[Koel]] 是一个基于网页的音乐媒体播放器。

官网:https://koel.dev/

Koozic

airsonic

reference


2020-02-12 nas , qnap , music , file-manager , docker

几个常见的 NAS 系统整理及选择

看文章老有几个 NAS 系统被翻来覆去的提到,这里就一起看看 Wiki,看看有什么区别吧。

FreeNAS

开源 NAS 系统中最著名也最强大的一个系统,基于安全和稳定著称的 FreeBSD,集成了 Sun 公司的 ZFS 文件系统,ZFS 拥有很多文件管理的特性,非常适合管理大量可扩展的数据系统。1 目前由 ixsystems 公司维护。

硬件依赖

FreeNAS 对硬件有一定的要求(ECC 内存),达到日常可用需要较大内存,如果要安装插件或者启用虚拟机可能需要更多。FreeNAS 的 ZFS 需要一个基本的内存量来维持基本的运行。2

安装

安装教程:

NAS4Free

基于 FreeNAS 0.7 开发的一个分支,由原 FreeNAS 系统开发者发起创建。

官网:

OpenMediaVault

OpenMediaVault 是一款基于 Debian 的 NAS 操作系统,项目领导人是 Volker Theile,于 GUN GPLv3 下开源。OpenMediaVault 和 FreeNAS 有个很深的缘源,他们都基于 FreeNAS,不过在 2009 主要的两位项目负责人产生分歧,所以 Volker Theile 基于 Linux 重写了 FreeNAS 于是成就了 OpenMediaVault,而另一位 FreeNAS 的创始人 Olivier Cochard-Labbé 则基于 FreeBSD 重写了 FreeNAS,于是成就了今天的 FreeNAS。3

OpenMediaVault 主要面向小型办公环境和家庭,所以体积非常小,并且还有树莓派版本。

个人在对比了开源操作系统之后选择了 OpenMediaVault,日常使用起来基本无问题。

优点

  • 内存占用小
  • 可以充分利用 Debian 的软件生态
  • 支持 Docker
  • 可以借助第三方软件([[MergerFS]])组存储池,磁盘冗余备份

其他参考链接

ESXi

准确来讲 [[ESXi]] 不能算作是一个 NAS 系统,更多地可以称其为虚拟机系统,用户可以在 ESXi 上虚拟化出多个系统充分利用硬件性能。

ESXi 由 VMware 公司开发,是VMWare vSphere Hypervisor 套件之下重要组件,这是一套为企业而设计的虚拟机。ESXi 可以方便的安装在服务器中,然后就可以虚拟化安装其他系统。

前身是 ESX,依赖 Linux,后来抛弃 Linux 变成了 ESXi。

界面比较友好,但是硬件兼容性差。

更详细的介绍可以参考这个视频

PVE

[[PVE]] 的全称是 Proxmox Virtual Environment,是基于 Debian 的 Linux 系统,虚拟机内核为 KVM,硬件兼容性好。和 ESXi 一样,也算不上 NAS 系统,但是可以将其作为物理机的操作系统,再此基础之上安装,比如 OpenMediaVault这样为 NAS 而设计的系统。我自己配置的 NAS 就是这样一套系统。

unRAID

[[unRAID]] 是基于 Slackware 这个 Linux 发行版的 NAS 系统 (6.2RC2 基于 14.2)。unRAID (又有人写作 Unraid, 或者 UnRaid) 是另一款 NAS 操作系统,实现的功能都大同小异 4,unRAID 不通过组 RAID 方式来存储数据,但是可以和 RAID 一样做到冗余备份,简单来说 unRAID 就是带有检验盘的磁盘簇 (JBOD)。

unRAID 另外比较亮眼的就是虚拟化技术以及硬件直通,可以在此基础上虚拟化安装各个操作系统以及充分利用硬件接口。

unRAID Server OS is a Network Attached Storage server operating system that boots from a USB Flash device, and is specifically designed for digital media storage.

unRAID 6 默认使用 XFS 文件系统,但如果定义了 Cache poll,那么会使用 BTRFS 文件系统。

unRAID 优点

  • 系统从 U 盘启动,启动后系统在内存中
  • 集成插件支持,集成 Docker 支持,支持虚拟机
  • 支持硬盘无访问自动休眠
  • 只需要一个校验盘(需大于阵列中最大的盘的容量),整个磁盘阵列允许一个磁盘挂掉,只需要用同等大小的磁盘替换即可
  • 扩容方便,只需要往阵列中继续添加磁盘即可,唯一的限制就是新添加的硬盘容量不能大于校验盘大小。如果新加入的盘容量大于校验盘则需要先将校验盘替换成该硬盘,然后将原来的校验盘作为新盘加入

unRAID 缺点

  • 系统配置在重启后可能丢失,并且基于一个非主流的 Linux 发行版,排查问题可能遇到瓶颈
  • unRAID 是需要授权的,但相反这个对于非技术人员反而可能是优势,毕竟可以有一个技术支持。unRAID 的授权价格从最低 $59(6 块硬盘), $89(12 快硬盘),到 Pro $129 (无限硬盘)5

其他

Openfiler

这是一款基于文件的存储系统。

官网: https://www.openfiler.com/

  • CIFS,NFS,HTTP
  • SAN feature,iSCSI,FC
  • High Availability / Failover
  • Block Replication (LAN & WAN)
  • Web-based Management
  • Cost-free Storage Capacity Expansion

NexentaStor

NexentaStor is an OpenSolaris or more recently Illumos distribution optimized for virtualization, storage area networks, network-attached storage, and iSCSI or Fibre Channel applications employing the ZFS file system. Like OpenSolaris, NexentaStor is a Unix-like operating system.

RockStor

基于 Linux,采用企业级文件系统 BTRFS,提供 SMB/CIFS、NFS 以及 SFTP 常见的共享方式

EasyNAS

Conclusion

总结来讲,FreeNAS 有最好的文件系统 – ZFS,但是对 Docker 支持需要借助虚拟机有一定性能损耗,OpenMediaVault 最轻量,但是对虚拟机不支持硬件直通,unRAID 可以非常方便的扩展硬盘池大小,对虚拟机支持也比较完善。

对于我个人而言,目前我并没有支持 ECC 的内存,也没有备用多余的内存条,我目前的数据也不需要做到实时备份,所以目前我不需要 FreeNAS,而 unRaid 又有一些我无法容忍的问题(比如配置丢失的问题,作为个人家用虽然可以 24 小时开机,但我不想每次开机后需要重新配置),综合下来 OpenMediaVault 最符合我的需求:

  • 一个稳定的系统,Debian 上的扩展也非常多
  • Docker 也支持
  • 配合 mergerfs 可以实现多物理盘组合,实现 UnRaid 中随时添加磁盘的特性
  • 配合 SnapRAID 可以实现冗余备份
  • 配合 [[Prometheus]] 和 Grafana 可以对 NAS 进行全面的监控,弥补起管理后台监控的不足
  • 最重要的就是 OpenMediaVault开放源代码的

最后我的方案就是在硬件上安装 Proxmox,然后在 Proxmox 中安装了 OpenMediaVault。

reference


2020-02-11 freenas , unraid , esxi , docker , linux , freebsd , openmediavault , nas , operating-system

从零搭建一台 NAS:软件篇

之前总结过一篇 NAS 硬件 介绍了自组 NAS 可能遇到的一些名词和概念,这里再总结一下相关的软件。

Operating System

首先就是操作系统的选择,这里 也简单总结过 FreeNAS,OpenMediaVault 和 [[unRAID]] 的优缺。

软件的选择

MergerFS

MergerFS 提供了一种简单的,类似于存储池的概念,可以让我们通过简单的方式来访问多块硬盘,和 unRAID, Synology, Qnap 提供的方式类似。总结一下就是 MergerFS 允许我们混合合并多个数据卷到一个挂载点下。

mergerfs is a union filesystem geared towards simplifying storage and management of files across numerous commodity storage devices. It is similar to mhddfs, unionfs, and aufs.

特性:

  • 组合多块磁盘成存储池
  • 支持多块不同格式,不同大小的硬盘
  • 支持增量升级硬盘,可以不用一下子购入一组硬盘来扩充容量
  • 将多个硬盘驱动器组合在一个挂载点进行读取和写入
  • 为每个驱动器提供一个单独可读的文件系统,所以假如想要拆下一块硬盘,那么这块硬盘也可以挂载到其他系统中使用
  • 只运行当前有读写任务的硬盘

官网:

安装

直接从源安装:

apt install mergerfs fuse

或者用 deb 安装:

wget https://github.com/trapexit/mergerfs/releases/download/*/mergerfs_*.debian-stretch_amd64.deb && dpkg -i mergerfs*.deb

Docker

Docker 官方的教程已经足够清晰:

apt install curl
curl -sSL https://get.docker.com | sh

为了管理方便,可以将自己的用户名加入到 Docker 用户组:

usermod -aG docker your-name

Test Docker:

docker run --rm hello-world

snapRAID

snapRAID 是一个备份应用,他可以在一组硬盘中计算 parity,然后通过 parity 来恢复磁盘故障可能带来的数据丢失。snapRAID 是 ‘snapshot’ RAID 的缩写,它不是和 mdadm, ZFS 或者 uRAID 那样实时备份,它需要定时运行 sync 来同步。

snapRAID 支持不同大小的硬盘,但是 partiy 磁盘必须要大于或等于最大的数据盘的容量。

  • snapRAID 支持最多 6 块 parity 磁盘(基于奇偶校验保护),这就使得 snapRAID 可以提供远超过 ZFS 和 BTRFS RAID 的错误容忍。
  • snapRAID 的数据完整性校验使用 128 bit 校验和,类似于 ZFS 的 256bit 校验和,snapRAID 可以自动修复这些错误。
  • 此外,上次同步以后更改的任何文件都可以逐个文件还原,从而在文件级别提供了非常完善的备份解决方案。要知道 RAID 并不是备份。
  • snapRAID 还可以在已经有数据的磁盘中使用,这想比如传统的 RAID,又是一个巨大的进步。
  • 再者,它只会让正在使用的磁盘运转,不像 RAID 即使获取一个文件,也需要所有磁盘运转。

SnapRAID is a backup program for disk arrays. It stores parity information of your data and it recovers from up to six disk failures.

SnapRAID 是为一组不经常修改的文件而设计的,一个常见的用例就是媒体或家用服务器。假设你拥有 2TB 的影片,2TB 的剧集,你多长时间更改他们一次?并不是很经常吧。那么你需要对这些文件进行实时的奇偶校验计算,还是在每天固定时间安静地执行一次?我的想法就是每天一次同步就已经足够保证数据的安全。

再举一个简单的例子,假如你下载了一个文件,并保存为 “WorstMovieEver.mkv”,这个文件立即可以访问到,但直到下一次奇偶校验(或者奇偶校验快照)执行,这个文件都是没有被保护的。这就意味着在下载完成后到执行奇偶校验这个过程中,如果你遇到了磁盘故障,那么这个文件就无法恢复了。值得注意的是,如果文件足够重要,那么手工执行一次 snapraid sync 也是非常简单的。

snapRAID 在 GPL v3 开源许可下开源,snapRAID 支持大量的操作系统,包括但不限于 Linux, OS X, Windows, BSD, Solaris 等等。

官网:

经过上面的一大番解释,相信你已经了解 snapRAID 的运作方式了,在使用 snapRAID 之前请先审视一下自己的使用场景。snapRAID 非常不适用于频繁修改的应用程序,例如数据库或其他类似的应用程序,如果你的使用场景是类似这种,那么请优先考虑实时奇偶校验的解决方案。如果你能够容忍可能造成数据丢失的时间窗口,并且有一批静态的大文件,SnapRAID 就是为你准备的。

安装

@IronicBadger 提供了一键编译脚本:

apt install git
git clone https://github.com/IronicBadger/docker-snapraid.git
cd docker-snapraid/
chmod +x build.sh
./build.sh
cd build/
dpkg -i snapraid*.deb

snapraid -V
# snapraid v11.1 by Andrea Mazzoleni, http://www.snapraid.it

使用

SnapRAID 有详尽的文档.

reference


2020-02-11 nas , software , server , operating-system

使用 tinyMediaManager 整理影视资源

tinyMediaManager (后文简写成 tmm) 可以用来批量处理本地的影视资源,处理后就可以非常漂亮用海报墙的方式展示出来。

下载安装

tinyMediaManager 是 Java 编写的,所以天然的具有跨平台的属性,三大桌面平台全都支持,并且还是开源的。

Mac 下可以使用:

brew install --cask tinymediamanager

功能

特色功能 1

  • 支持从 themoviedb.org, imdb.com, ofdb.de, moviemeter.nl 等等站点抓取电影元信息,海报,图片等等
  • 支持从 opensubtitles.org 自动获取字幕,当然这个站中文的比较少
  • 支持批量重命名

使用

使用过程是比较简单的,添加媒体库,然后 tmm 就能通过文件名在左侧边栏展示出来,然后指定元数据从 themoviedb.org 获取,如果媒体文件命名足够清晰的话,可以直接一键自动匹配所有的影片。

媒体文件的管理

绝大部分影片用 bt 下载后可能的文件名是这样的:

利刃出鞘(中英双字幕).Knives.Out.2019.WEB-1080p.X264.AAC.CHS.ENG-UUMp4.mp4

对于这样的文件名本身就已经告诉了我们很多信息,比如中文片名,英文片名,发行日期,文件格式,编码格式,音频编码格式,中英文字幕情况,以及出处,如果想要在 [[Kodi]],Emby,[[Plex]], 或者 Jellyfin 这些媒体播放器中展示出海报,剧情介绍,演员表等等 metadata,还缺少两样东西:

  • xxx-poster.jpg
  • xxx.nfo

poster.jpg 顾名思义就是电影的海报,而 nfo 文件就是存放该媒体文件 metadata 信息的地方,用 less 或者直接用 vi 查看的话就一目了然了。其中包含着这部电影需要展示的完整的信息,有了这两个文件,不管在那个媒体管理软件中打开存放的目录就能比较漂亮的显示媒体海报墙了。

Extended

安装 tinymediamanager 过程中发现 themoviedb 这个非常棒的网站,不仅完美的代替了豆瓣,界面美观,而且还提供了 API 接口,豆瓣恶心的把 API 关闭后,又频繁删贴,早有点看不下去了。

等那天有空,把我的豆瓣评分同步 过去。2


2020-02-10 media , movie , poster , emby , qnap , tv-serial

自建 RSS Reader

Stringer

[[stringer]] 是一个可以自行搭建的 RSS Reader,Ruby 编写。Stringer 没有任何社交媒体分享,没有机器学习算法。但有一套快捷键。非常适合构建一个个人的在线阅读体验。

Tiny Tiny RSS

Php 5.6, Postgresql or MySQL

Docker 安装,虽然 ttrss 官方给了自己的解决方案,但似乎刚刚起步,而 linuxserver/tt-rss 的镜像因为拿不到 tt-rss tarball 所以也停止更新了。所以最后折中的方案就是用了 这个镜像

QNAP 下的 PostgreSQL

App store 中可以直接安装,但实际上 QNAP 只是帮用户默认用 docker-compose 安装好了,不过也还行了,连 phpPgAdmin 也安装了。

查看下文件内容:

version: '3'

services:
  db:
	image: postgres:11.4
	restart: on-failure
	ports:
	  - 5432:5432
	volumes:
	  - ./data:/var/lib/postgresql/data
	environment:
	  - POSTGRES_PASSWORD=postgres

  web:
	image: edhongcy/phppgadmin:latest
	restart: on-failure
	ports:
	  - 7070:80
	  - 7443:443
	depends_on:
	  - db
	environment:
	  - PHP_PG_ADMIN_SERVER_DESC=PostgreSQL
	  - PHP_PG_ADMIN_SERVER_HOST=db
	  - PHP_PG_ADMIN_SERVER_PORT=5432
	  - PHP_PG_ADMIN_SERVER_SSL_MODE=allow
	  - PHP_PG_ADMIN_SERVER_DEFAULT_DB=template1
	  - PHP_PG_ADMIN_SERVER_PG_DUMP_PATH=/usr/bin/pg_dump
	  - PHP_PG_ADMIN_SERVER_PG_DUMPALL_PATH=/usr/bin/pg_dumpall

	  - PHP_PG_ADMIN_DEFAULT_LANG=auto
	  - PHP_PG_ADMIN_AUTO_COMPLETE=default on
	  - PHP_PG_ADMIN_EXTRA_LOGIN_SECURITY=false
	  - PHP_PG_ADMIN_OWNED_ONLY=false
	  - PHP_PG_ADMIN_SHOW_COMMENTS=true
	  - PHP_PG_ADMIN_SHOW_ADVANCED=false
	  - PHP_PG_ADMIN_SHOW_SYSTEM=false
	  - PHP_PG_ADMIN_MIN_PASSWORD_LENGTH=1
	  - PHP_PG_ADMIN_LEFT_WIDTH=200
	  - PHP_PG_ADMIN_THEME=default
	  - PHP_PG_ADMIN_SHOW_OIDS=false
	  - PHP_PG_ADMIN_MAX_ROWS=30
	  - PHP_PG_ADMIN_MAX_CHARS=50
	  - PHP_PG_ADMIN_USE_XHTML_STRICT=false
	  - PHP_PG_ADMIN_HELP_BASE=http://www.postgresql.org/docs/%s/interactive/
	  - PHP_PG_ADMIN_AJAX_REFRESH=3

看到了默认密码了吧,QNAP 官方的页面都不写一下,让别人一键安装的去哪里找,还不如直接贴这个让用户自己到 Container 里面自己建呢。

如果安装后发现用默认的用户名:postgres 和默认密码:postgres 登录不了,尝试重启一下服务,然后 netstat -tupln 看看服务 5432 端口有没有启动。

/etc/init.d/postgresql.sh restart

然后就开始安装 ttrss:

docker run -d --name ttrss --restart=unless-stopped \
-e SELF_URL_PATH=http://<your-nas-ip>:181 \
-e DB_HOST=<your-nas-postgresql-host> \
-e DB_PORT=5432 \
-e DB_NAME=ttrss \
-p 181:80 \
wangqiru/ttrss

安装的时候有个坑,启用时遇到如下错误:

PHP Fatal error: Uncaught PDOException: SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "ttrss_version" does not exist LINE 1

我一般习惯 MySQL 的做法,先到数据库中新建了一个 DB,新建一个用户,然后再用 -e DB_USER=user -e DB_PASS=password 来创建 Docker 容器,没想到遇到了 Bug,首次初始化的时候脚本里有着判断,如果 db 已经存在了就不初始化 sql 了,所以到数据库中把新建的数据库删掉,然后再来一次就好了。

其他说明:

  • --restart 参数可以换成 --restart=always,这样系统重启容器也能重启
  • SELF_URL_PATH 这里需要和启动时的 URL 配置完全一致,否则 ttrss 启动时会出错

其他插件安装可以参考这里,比如全文输出,主题之类,我只想用 ttrss 来订阅几个我日常关注的博主,其他的订阅源还是 InoReader 所以也就不折腾全文不全文了,不全文输出的也就没有订阅的必要了。不过如果你想要实现全文输出也还是有办法的。

Mercury Parser api

docker run -d --name=mercury-parser-api \
--restart=unless-stopped \
-p 3000:3000 -d wangqiru/mercury-parser-api

FreshRSS

FreshRSS 也是 PHP 编写,基本依赖也就是 PHP 和数据库,MySQL 5.5.3+ MariaDb, SQLite, PostgreSQL 9.5+. 界面也比较简洁大方。

在线预览:https://freshrss.org/

用 Docker 安装也比较方便,可以参考这里

安装

docker run -d \
  --name=freshrss \
  -e PUID=1000 \
  -e PGID=100 \
  -e TZ=Asia/Shanghai \
  -p 6080:80 \
  -v /share/Container/freshrss:/config \
  --restart unless-stopped \
  linuxserver/freshrss

NewsBlur

Python, Django, Celery etc

NewsBlur 的在线预览可以点击这里,界面也还是很不错的。

Selfoss

另一款 PHP 编写的 RSS 阅读器,Selfoss 比较简单,依赖也比较简单,PHP,WebServer,Database(sqlite, mysql, PostgreSQL) 就可以,所以安装起来也比较简单,甚至有环境的基础下,下载 zip, 解压,然后修改一下配置即可。

需要注意的是,config.ini 配置文件中的 password 字段,需要访问 http://ip-selfoss-service/password,然后输入密码生成一个 hashcode,然后将该密码 hash 配置到 config.ini 文件中。

然后访问 http://ip-selfoss-service/opml,可以导入 opml 文件。

Android Reader

总结

Selfoss 相对比较简单,定时抓取也要手工 crontab 来触发,但功能一点也不弱,日常用完全没有问题,并且依赖非常少。

排错

在我配置使用 SQLite 作为数据库时,Selfoss 没出现问题,但是当我配置 MySQL 作为数据库时,在日志中给我报了:

[2020-02-10 16:04:21] selfoss.ERROR: PDOStatement: You do not have the SUPER privilege and binary logging
 is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

网上一查似乎是 MySQL 权限问题,但想想我已经给了 Selfoss 的用户整个 selfoss 数据库的权限了,后来一查看到有人和我相同的情况 1,定位到应该就是 MySQL 中创建 Tigger 的权限不足导致。

[2020-02-10 16:09:03] selfoss.ERROR: PDOStatement: Trigger does not exist

结合这个错误,所以我的解决方法就是在安装时临时给 selfoss 这个数据库用户超级权限,安装好后把权限取消。

  • Selfoss 安装好后会在 phpMyAdmin 中能看到 Selfoss 创建了两个 Trigger,insert_updatetime_triggerupdate_updatetime_trigger, 备份时记得备份,mysqldump --triggers --no-create-info --no-data --no-create-db --skip-opt selfoss > selfoss.trigger
  • 删除 triggers from the selfoss database: drop trigger insert_updatetime_trigger; and drop trigger update_updatetime_trigger;
  • replaced the selfoss user in the exported selfoss.trigger file with root (DEFINER=root@localhost)
  • 导入 mysql selfoss < selfoss.trigger

miniflux

Go 编写,依赖 PostgreSQL。

stringer

Ruby 编写

Leed

Php/MySQL

更多自建的 RSS 可以参考这里 大概还有几十种,不同语言,不同实现。

Feedbin

Ruby & Postgres & Redis & Memcached & Elasticsearch

reference

  1. https://selfoss.aditu.de/forum/index.php?mode=thread&id=895 


2020-02-09 rss , reader , self-hosted , linux , docker , qnap , qnap-tutorial , 威联通

威联通折腾篇二十一:Virtualiztion Station 安装 Windows10

平时不会想起用 Windows,因为没有要用的场景,但有的时候不得不用到,所以安装一个以防万一。

导入虚拟机

支持导入的虚拟机格式有:

  • ova
  • ovf
  • vmx
  • qvm

全新安装虚拟机

如果选择新建虚拟机可以用镜像全新安装。

VNC 链接

安装后可以设置 VNC 连接,设置端口 5900,然后就可以通过客户端连接了。

Linux 下可以使用 Remmina:


2020-02-09 qnap , windows , qnap-tutorial

自建邮件服务器可选项

整理一些可以自行搭建邮件服务器的项目。

Postal

[[postal]] 是一个使用 Rust 编写的邮件服务器,可以发送和接收邮件。这是一个可以代替 [[SendGrid]]、[[Mailgun]] 或者 Postmark 的开源工具,可以在自己的服务器上假设。

GitHub 地址:https://github.com/postalserver/postal

Mail-in-a-Box

mailu

Mailu.io 是一款免费开源且性能强大、功能丰富的域名邮箱服务。它基于Docker, 具有部署简单,可移植性高,备份方便等多种优势。

搭建介绍:

mailcow

Open source email server

mailcow 使用介绍:

搭建视频教程:

Poste

Poste 是一个可以自己搭建的邮件服务器程序,提供了后台管理,可以实现邮件收发,容量控制,邮件过滤等等工具。还提供了统计分析,SSL,邮件转发,邮件别名,通过 ClamAV 支持邮件病毒扫描等等功能。

Poste 运行需要 800MB 左右空间,只支持 64 位操作系统。

Poste 可以支持 Docker 安装,但是提供了 Free、Pro 和 Pro+ 版本,都需要按年订阅。

docker-mailserver

文档不是很全

salmon

一个 Python 写的 smtp 服务

inbucket

Disposable webmail server (similar to Mailinator) with built in SMTP, POP3, RESTful servers; no DB required.

A great tool for email testing.

reference


2020-02-08 mail , linux , docker , smtp , mail-server , self-hosted

威联通折腾篇十九:Calibre-web

借助 QNAP(威联通)的 Container Station 功能,可以展开无限想象,之前也已经分享 过很多的使用 Docker 镜像来安装的教程了。所以今天不展开讲,主要就是来分享一下,最近安装的 calibre-web。因为之前七零八落的收集了很多电子书,文件分散在磁盘的各个地方,一直没有好好整理,正好趁着这个机会把所有的文件都放到一个地方了。

docker

主要是用的镜像是 technosoft2000 制作的 calibre-web:

我尝试了 linuxserver 发布的 calibre-web,也不错,不过缺少了在线预览功能。然后还看到有几个中文的镜像,还没来得及尝试。

源码主要在 https://github.com/janeczku/calibre-web 这里。

docker create --name=calibre-web --restart=always \
-v <your Calibre books folder>:/books \
[-v <your Calibre Web application folder>:/calibre-web/app] \
[-v <your Calibre Web kindlegen folder>:/calibre-web/kindlegen`]
[-v <your Calibre Web config folder>:/calibre-web/config \]
[-e USE_CONFIG_DIR=true \]
[-e APP_REPO=https://github.com/janeczku/calibre-web.git \]
[-e APP_BRANCH=master \]
[-e SET_CONTAINER_TIMEZONE=true \]
[-e CONTAINER_TIMEZONE=<container timezone value> \]
[-e PGID=<group ID (gid)> -e PUID=<user ID (uid)> \]
-p <HTTP PORT>:8083 \
technosoft2000/calibre-web

批量导入书籍

注意下方命令中的 --library-path 需要指定 Calibre 库的位置。

calibredb add --library-path=/books -r /path/to/your/book_dir_you_want_to_add

使用该方法添加的书籍会在原始位置,而 metainfo 则会添加到 Calibre 库中,也就是上面一行的 /books 目录中。

更多关于 calibredb 命令的使用可以参考官网

Goodreads API

获取 Goodreads API

批量导入 Calibre

在 Calibre 界面中可以快速的导入一个目录,但是在 Web UI 里面暂时不能做到,所以借用 Bash 命令 1

if [ "$(ls -A /[autoaddfolder])" ]; then
	 calibredb add -r "/[autoaddfolder]" --library-path="/[calibrelibraryfolder]"
fi

Others

talebook

亮点是支持从豆瓣获取数据,不过我使用的 technosoft2000 的镜像也是支持的。

talebook-calibre-web

gshang2017

豆瓣 API

在最早使用 Calibre-web 的时候还自带豆瓣图书的数据源,可以一键将图书的 metadata 信息补充完整,但后来豆瓣把 API 关闭了,所以可以借助如下的项目来将此部份模块替换,使用 Python 爬取豆瓣的数据。

延伸

  • Komga 另一个可以自行搭建的图书管理
  1. https://github.com/janeczku/calibre-web/issues/412 


2020-02-08 qnap , calibre , calibre-web , linux , docker , qnap-tutorial

威联通折腾篇二十:自带 Apache Web 服务器及 SSL 配置

折腾一下威联通自带的 Web 服务器。

vhost

在界面上修改虚拟主机配置,比如 Create New Virtual Host:

  • Host name: blog.nas.com
  • folder: /share/Web/wp
  • protocol: HTTP
  • port number: 80

对应的修改会保存到如下文件:

/etc/config/apache/extra/httpd-vhosts-user.conf

点击应用,QNAP 会应用修改,然后因为我是局域网用,所以修改了我本地 /etc/hosts,把域名 blog.nas.com 指到 QNAP 的局域网地址。

/etc/init.d/Qthttpd.sh reload

然后在自己机器上就能通过域名 (blog.nas.com) 访问 NAS 中 /share/Web/wp 目录。

vhost 配置解析

在 QNAP 上查看 vhost 配置文件 /etc/config/apache/extra/httpd-vhosts-user.conf,可以看到:

NameVirtualHost *:80
<VirtualHost _default_:80>
		DocumentRoot "/share/Web"
</VirtualHost>
<VirtualHost *:80>
<Directory "/share/Web/wp">
		Options FollowSymLinks MultiViews
		AllowOverride All
		Require all granted
</Directory>
		ServerName blog.nas.com
		DocumentRoot "/share/Web/wp"
</VirtualHost>

解释:

  • DocumentRoot 配置了服务器根目录
  • Options MultiViews 使用”MultiViews”搜索,即服务器执行一个隐含的文件名模式匹配,并在其结果中选择。
  • ServerName 主机名字

SSL 配置

reference


2020-02-08 qnap , qnap-tutorial , linux , apache , web-server

电子书

本站提供服务

最近文章

  • Glance 个人自定义 Dashboard Glance 是一个可以自行架设的个人 Dashboard 以及 RSS 订阅信息面板。
  • Fileball 一款 iOS tvOS 上的媒体播放器及文件管理器 Fileball 是一款 iOS,tvOS 上的本地文件管理器,本地音乐播放器,本地视频播放器,以及文本编辑器,Fileball 可以在 iPhone,iPad,Apple TV 上使用。Fileball 可以连接网络共享,支持 SMB,FTP,SFTP,Synology,NFS,WebDAV 等,支持 Emby,Jellyfin 等,还可以连接百度网盘,Box,Dropbox,Google Drive,OneDrive,pCloud 等,可以作为 [[Infuse]] ,[[VidHub]] 等播放器的平替,高级版本价格也比较合适。Fileball 也支持 [[IPTV]]。
  • 在日本申请入台证材料及在线提交注意事项 本文记录入台证办理的材料及提交手续,以及在使用线上提交系统的时候需要注意的点。入台证是中华民国台湾地区出入境许可证的俗称,所有进入台湾的人都需要申请此许可证。
  • 从 Buffer 消费图学习 CCPM 项目管理方法 CCPM(Critical Chain Project Management)中文叫做关键链项目管理方法,是 Eliyahu M. Goldratt 在其著作 Critical Chain 中踢出来的项目管理方法,它侧重于项目执行所需要的资源,通过识别和管理项目关键链的方法来有效的监控项目工期,以及提高项目交付率。
  • AI Shell 让 AI 在命令行下提供 Shell 命令 AI Shell 是一款在命令行下的 AI 自动补全工具,当你想要实现一个功能,敲一大段命令又记不住的时候,使用自然语言让 AI 给你生成一个可执行的命令,然后确认之后执行。