在接触到 Obsidian 这款笔记应用的时候听说了 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 的一些缺点:
这些传统的方法都各自有各自的优缺点,但它们都无法帮助我们将这些笔记或者想法关联起来,反而极有可能让我们忘记这些笔记或者想法的存在,久而久之这些可能产生价值的笔记或者想法就可能被收纳到床底,或者被遗忘到哪个云服务商的服务器里,或者被锁到哪个不知名的文件夹中,从而彻底失去其意义。
流行了数十年的数码笔记本,比如 Evernote 之类,有可能让用户陷入 collector’s fallacy([[收藏家谬误]]),用户在使用这些笔记时,可能收集大量的信息,而从不对这些内容进行整理和提取。如果不对收集的笔记进一步的精读,那么到最后笔记就会一点点被遗忘。
再来思考一下思维导图 (mind maps),概念图 (concept maps),或者大纲 (outlines),它们可能是知识管理的一种解决方案。这些工具将我们记录下的想法以一种形象的图组织起来。但问题在于,这些方法在整理某一些具体领域的笔记的时候非常有效,但如果一旦需要整理上百个各式各样的想法和笔记,就显得力不从心。虽然你可以不会花 40 年的时间整理一副超过 90000 条想法的思维导图,但是这就是 Luhmann 通过他的 Zettelkasten 所做的事情。再回想一下我自己使用 WizNote 的经历,多少年里也积累了快 5000 条笔记。
Zettelkasten 适合的不同的场景,比如阅读一本书,或者随时冒出的想法,但是不同的场景在使用 Zettelkasten 的时候大致要遵循如下几点:
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 的重点,卡片和连接。
在阅读时随时记笔记,但千万不要让笔记打断阅读的重点。在《如何阅读一本书》中,作者将读书分成四个部分
我个人建议在阅读的第一二个阶段可以进行快速的阅读,但是在分析阅读的时候一定要作笔记,并用自己的话将作者的观点进行消化。
每当遇到需要记住的内容,或者可能会在未来引用的内容,立即使用如下的方式记录:
在完成阅读后立即开始记录索引
回顾所有记录的笔记,思考他们如何影响当前的思考,当前的研究方向。
目标不是尽可能多的收集笔记,而是要思考这些笔记对佐证目前自己的观点有没有帮助。
在完成整个读书的过程后,要定期的进行回顾,在不断有新的 Zettel 加入时也要不断的进行关联和思考。
在以前有段时间我曾经犯下过一些错误,就是将不用的笔记人为的分隔在不同的笔记本中,然后渐渐有一些笔记本再也不会打开,后来看到一些文章才恍然大悟,即使不是 Zettelkasten 我也只需要一个笔记本,不断被审阅的笔记,不断被连接的笔记才有价值。
只使用一个 Zettelkasten 的优点:
NAS 上的文件已经有足够多的管理系统 了 12,而电影也有 [[Kodi]], [[Emby]], [[Plex]] 等等工具,图片同样 Chevereto,Lychee,电子书有 Calibre-web,但就是音乐管理工具没有找到一个比较合适的。
我想的应该这个管理系统可以直接通过 Docker 安装,提供一个比较美观的 Web 页面。
于是乎我带着这样的目的在 awesome-selfhosted Audio streaming 专区寻找,从编程语言,到 Demo,一个个看,然后就发现了 Funkwhale 点开项目主页介绍,界面非常漂亮,Demo 这各个功能也都非常贴心,立即看安装说明,Docker 搞起。并且 Funkwhale 还自带 pot,新建立的站点可以和网络上的站点连接起来相互分享,像极了之前的 SNS Mastodon.
Funkwhale 用 Python,Django 编写,遇到 bug 倒时候也能看懂代码了。
使用 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]] 是一个基于网页的音乐媒体播放器。
看文章老有几个 NAS 系统被翻来覆去的提到,这里就一起看看 Wiki,看看有什么区别吧。
开源 NAS 系统中最著名也最强大的一个系统,基于安全和稳定著称的 FreeBSD,集成了 Sun 公司的 ZFS 文件系统,ZFS 拥有很多文件管理的特性,非常适合管理大量可扩展的数据系统。1 目前由 ixsystems 公司维护。
FreeNAS 对硬件有一定的要求(ECC 内存),达到日常可用需要较大内存,如果要安装插件或者启用虚拟机可能需要更多。FreeNAS 的 ZFS 需要一个基本的内存量来维持基本的运行。2
安装教程:
基于 FreeNAS 0.7 开发的一个分支,由原 FreeNAS 系统开发者发起创建。
官网:
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,日常使用起来基本无问题。
准确来讲 [[ESXi]] 不能算作是一个 NAS 系统,更多地可以称其为虚拟机系统,用户可以在 ESXi 上虚拟化出多个系统充分利用硬件性能。
ESXi 由 VMware 公司开发,是VMWare vSphere Hypervisor 套件之下重要组件,这是一套为企业而设计的虚拟机。ESXi 可以方便的安装在服务器中,然后就可以虚拟化安装其他系统。
前身是 ESX,依赖 Linux,后来抛弃 Linux 变成了 ESXi。
界面比较友好,但是硬件兼容性差。
更详细的介绍可以参考这个视频
[[PVE]] 的全称是 Proxmox Virtual Environment,是基于 Debian 的 Linux 系统,虚拟机内核为 KVM,硬件兼容性好。和 ESXi 一样,也算不上 NAS 系统,但是可以将其作为物理机的操作系统,再此基础之上安装,比如 OpenMediaVault这样为 NAS 而设计的系统。我自己配置的 NAS 就是这样一套系统。
[[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 文件系统。
这是一款基于文件的存储系统。
官网: https://www.openfiler.com/
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.
基于 Linux,采用企业级文件系统 BTRFS,提供 SMB/CIFS、NFS 以及 SFTP 常见的共享方式
总结来讲,FreeNAS 有最好的文件系统 – ZFS,但是对 Docker 支持需要借助虚拟机有一定性能损耗,OpenMediaVault 最轻量,但是对虚拟机不支持硬件直通,unRAID 可以非常方便的扩展硬盘池大小,对虚拟机支持也比较完善。
对于我个人而言,目前我并没有支持 ECC 的内存,也没有备用多余的内存条,我目前的数据也不需要做到实时备份,所以目前我不需要 FreeNAS,而 unRaid 又有一些我无法容忍的问题(比如配置丢失的问题,作为个人家用虽然可以 24 小时开机,但我不想每次开机后需要重新配置),综合下来 OpenMediaVault 最符合我的需求:
最后我的方案就是在硬件上安装 Proxmox,然后在 Proxmox 中安装了 OpenMediaVault。
之前总结过一篇 NAS 硬件 介绍了自组 NAS 可能遇到的一些名词和概念,这里再总结一下相关的软件。
首先就是操作系统的选择,这里 也简单总结过 FreeNAS,OpenMediaVault 和 [[unRAID]] 的优缺。
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 官方的教程已经足够清晰:
apt install curl
curl -sSL https://get.docker.com | sh
为了管理方便,可以将自己的用户名加入到 Docker 用户组:
usermod -aG docker your-name
Test Docker:
docker run --rm hello-world
snapRAID 是一个备份应用,他可以在一组硬盘中计算 parity,然后通过 parity 来恢复磁盘故障可能带来的数据丢失。snapRAID 是 ‘snapshot’ RAID 的缩写,它不是和 mdadm, ZFS 或者 uRAID 那样实时备份,它需要定时运行 sync 来同步。
snapRAID 支持不同大小的硬盘,但是 partiy 磁盘必须要大于或等于最大的数据盘的容量。
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 有详尽的文档.
tinyMediaManager (后文简写成 tmm) 可以用来批量处理本地的影视资源,处理后就可以非常漂亮用海报墙的方式展示出来。
tinyMediaManager 是 Java 编写的,所以天然的具有跨平台的属性,三大桌面平台全都支持,并且还是开源的。
Mac 下可以使用:
brew install --cask tinymediamanager
特色功能 1:
使用过程是比较简单的,添加媒体库,然后 tmm 就能通过文件名在左侧边栏展示出来,然后指定元数据从 themoviedb.org 获取,如果媒体文件命名足够清晰的话,可以直接一键自动匹配所有的影片。
绝大部分影片用 bt 下载后可能的文件名是这样的:
利刃出鞘(中英双字幕).Knives.Out.2019.WEB-1080p.X264.AAC.CHS.ENG-UUMp4.mp4
对于这样的文件名本身就已经告诉了我们很多信息,比如中文片名,英文片名,发行日期,文件格式,编码格式,音频编码格式,中英文字幕情况,以及出处,如果想要在 [[Kodi]],Emby,[[Plex]], 或者 Jellyfin 这些媒体播放器中展示出海报,剧情介绍,演员表等等 metadata,还缺少两样东西:
poster.jpg
顾名思义就是电影的海报,而 nfo
文件就是存放该媒体文件 metadata 信息的地方,用 less 或者直接用 vi 查看的话就一目了然了。其中包含着这部电影需要展示的完整的信息,有了这两个文件,不管在那个媒体管理软件中打开存放的目录就能比较漂亮的显示媒体海报墙了。
安装 tinymediamanager 过程中发现 themoviedb 这个非常棒的网站,不仅完美的代替了豆瓣,界面美观,而且还提供了 API 接口,豆瓣恶心的把 API 关闭后,又频繁删贴,早有点看不下去了。
[[stringer]] 是一个可以自行搭建的 RSS Reader,Ruby 编写。Stringer 没有任何社交媒体分享,没有机器学习算法。但有一套快捷键。非常适合构建一个个人的在线阅读体验。
Php 5.6, Postgresql or MySQL
Docker 安装,虽然 ttrss 官方给了自己的解决方案,但似乎刚刚起步,而 linuxserver/tt-rss 的镜像因为拿不到 tt-rss tarball 所以也停止更新了。所以最后折中的方案就是用了 这个镜像
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 所以也就不折腾全文不全文了,不全文输出的也就没有订阅的必要了。不过如果你想要实现全文输出也还是有办法的。
docker run -d --name=mercury-parser-api \
--restart=unless-stopped \
-p 3000:3000 -d wangqiru/mercury-parser-api
FreshRSS 也是 PHP 编写,基本依赖也就是 PHP 和数据库,MySQL 5.5.3+ MariaDb, SQLite, PostgreSQL 9.5+. 界面也比较简洁大方。
用 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
Python, Django, Celery etc
NewsBlur 的在线预览可以点击这里,界面也还是很不错的。
另一款 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 这个数据库用户超级权限,安装好后把权限取消。
insert_updatetime_trigger
和update_updatetime_trigger
, 备份时记得备份,mysqldump --triggers --no-create-info --no-data --no-create-db --skip-opt selfoss > selfoss.trigger
root
@localhost
)mysql selfoss < selfoss.trigger
Go 编写,依赖 PostgreSQL。
Ruby 编写
Php/MySQL
更多自建的 RSS 可以参考这里 大概还有几十种,不同语言,不同实现。
Ruby & Postgres & Redis & Memcached & Elasticsearch
https://selfoss.aditu.de/forum/index.php?mode=thread&id=895 ↩
平时不会想起用 Windows,因为没有要用的场景,但有的时候不得不用到,所以安装一个以防万一。
支持导入的虚拟机格式有:
如果选择新建虚拟机可以用镜像全新安装。
安装后可以设置 VNC 连接,设置端口 5900,然后就可以通过客户端连接了。
Linux 下可以使用 Remmina:
整理一些可以自行搭建邮件服务器的项目。
[[postal]] 是一个使用 Rust 编写的邮件服务器,可以发送和接收邮件。这是一个可以代替 [[SendGrid]]、[[Mailgun]] 或者 Postmark 的开源工具,可以在自己的服务器上假设。
GitHub 地址:https://github.com/postalserver/postal
Mailu.io 是一款免费开源且性能强大、功能丰富的域名邮箱服务。它基于Docker, 具有部署简单,可移植性高,备份方便等多种优势。
搭建介绍:
[[2021-07-30-email-server-mailu]]
Open source email server
mailcow 使用介绍:
搭建视频教程:
Poste 是一个可以自己搭建的邮件服务器程序,提供了后台管理,可以实现邮件收发,容量控制,邮件过滤等等工具。还提供了统计分析,SSL,邮件转发,邮件别名,通过 ClamAV 支持邮件病毒扫描等等功能。
Poste 运行需要 800MB 左右空间,只支持 64 位操作系统。
Poste 可以支持 Docker 安装,但是提供了 Free、Pro 和 Pro+ 版本,都需要按年订阅。
文档不是很全
一个 Python 写的 smtp 服务
Disposable webmail server (similar to Mailinator) with built in SMTP, POP3, RESTful servers; no DB required.
A great tool for email testing.
借助 QNAP(威联通)的 Container Station 功能,可以展开无限想象,之前也已经分享 过很多的使用 Docker 镜像来安装的教程了。所以今天不展开讲,主要就是来分享一下,最近安装的 calibre-web。因为之前七零八落的收集了很多电子书,文件分散在磁盘的各个地方,一直没有好好整理,正好趁着这个机会把所有的文件都放到一个地方了。
主要是用的镜像是 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
在 Calibre 界面中可以快速的导入一个目录,但是在 Web UI 里面暂时不能做到,所以借用 Bash 命令 1:
if [ "$(ls -A /[autoaddfolder])" ]; then
calibredb add -r "/[autoaddfolder]" --library-path="/[calibrelibraryfolder]"
fi
亮点是支持从豆瓣获取数据,不过我使用的 technosoft2000 的镜像也是支持的。
在最早使用 Calibre-web 的时候还自带豆瓣图书的数据源,可以一键将图书的 metadata 信息补充完整,但后来豆瓣把 API 关闭了,所以可以借助如下的项目来将此部份模块替换,使用 Python 爬取豆瓣的数据。
https://github.com/janeczku/calibre-web/issues/412 ↩
折腾一下威联通自带的 Web 服务器。
在界面上修改虚拟主机配置,比如 Create New Virtual Host
:
对应的修改会保存到如下文件:
/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
目录。
在 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
主机名字