自建家庭服务器(NAS) 方案篇

前言

家庭服务器(NAS),本质上就是私有云。国内条件使然,国外太远也够不着,我选择自己部署家庭NAS服务器。我的需求有两个:

  • 首先是电影下载和存储,并且能够在电视上播放。作为PTer,还有长期保种的任务。
  • 照片的存储和管理。照片来自于早些年作为摄影发烧友拍的照片和手机相片转存需求。另外,也需要能够方便的对照片按时间线、地点、人物就行管理。

部署NAS最方便的方法,自然是使用群晖之类集成完备且有持续开发的产品。这些产品易用性很高。缺点就是自由度底,硬件性能往往比较差,主要成本在软件配套方面。

我的选择比较独特,买的是低功耗工控机(mini PC),无风扇款。低电压版I3搭配16G内存。配置两块硬盘,一块SSD作为系统盘,一块2.5寸机械硬盘用来存储数据。重要数据备份方面,我采用冷备份的方法,即定期将数据同步到移动硬盘上。

这样的配置,运行起来非常安静,只在大量读写操作的时候能听的机械硬盘的声音。散热也不成问题,因为这台只做服务器,没有视频输出的需求。

方案

有了主机,下面就是选择软件平台。

我先是研究了OMV和True NAS。因为具备Linux操作经验(不会就上网搜索),我先尝试了OMV,整体上感觉不错,但是自由度还是不够高(废话,什么都用命令行,还要NAS系统做啥)。再加上安装Docker过程中一波三折,最终弃之不用,选择了直接安装Ubuntu Server。

照片

照片备份

使用Samba建立照片共享目录。手机照片,通过Resilio Sync备份到家庭NAS服务器上的共享目录下。电脑上存储的老照片,也复制一份到共享目录下。

考虑到硬盘可靠性问题,定期使用Rsync将照片目录备份到移动硬盘中(冷备份)。

照片管理

Photoprism对共享目录进行扫描,自动生成时间线,人脸识别和在地图上标记照片位置。

照片展示

Photoprism的Web UI可以很好的按时间、人物和地理位置进行筛选展示照片。

小米电视通过SMB协议访问照片共享文件夹,也可以按文件夹进行幻灯片展示。

影视文件

使用Samba建立影视文件共享目录。

影片的下载,使用Transmission,将下载目录设置到影视文件共享目录中。

PC端,通过Transmission Remote GUI控制服务器端的Transmission,添加种子文件。

小米电视通过SMB协议访问影视文件共享目录,实现播放功能。没使用串流方案,只有是字幕加载的问题,还是比不过小米高清播放器自动下载字幕带来的便利。

体验

上述方案已经满足了我的基本需求。

美中不足,有3点:

  1. Photoprism的人脸识别功能难堪大用。我看了下,官网也提到了由于训练数据的限制,其对亚裔和儿童的识别能力不足。
  2. 用Rsync备份,需要使用SSH连接到服务器,通过命令行来完成,自动化不足。
  3. 硬盘监察,目前使用smartctl,也是手动操作,自动化不足。

这三个,后面还要想办法完善。

安装过程待续:

  • 自建家庭服务器(NAS) 系统及工具篇
  • 自建家庭服务器(NAS) Docker篇
0

简单的时间轴调整工具 Shifter

随着对字幕组的打击,现在网上找字幕也越来越困难。目前,我常用的就是SubHD射手网(伪),但也经常出现找不到或者找到了时间轴存在偏差的问题。

这里要说下时间轴对不上的问题。一般来说,如果压制视频的源文件一致的情况下,时间轴都可以配匹,不同的压制组,不同的格式,不同的字幕组都影响不大。

具体来说,字幕文件 Eerie Mienai Kao EP01 720p HDTV x264 AAC-DoA-chs.srt 中,DoA是压制组,720p x264 AAC是格式,HDTV则是来源。

而我手中的播放文件是 Iari.Mienai.KaoIari.Mienai.Kao.2018.Paravi.WEB-DL.1080p.H264.AAC-HDCTV,格式1080p.H264.AAC不同,压制组HDCTV不同,问题不大,关键是压制的来源WEB-DL不同,字幕时间明显超前。

这个问题在PC上使用PotPlayer等播放器调整起来还算方便,但是使用电视盒子播放时调整起来很痛苦,调整之后也会出现显示不全的问题。比较好的办法,是先对字幕的时间轴进行调整。

第一步,找出时间轴偏差的时间

我的办法是使用PotPlayer播放,使用”<“、”>”调整字幕偏移(精度0.5s),调整得差不多再手动调整同步,这里得时间单位是毫秒(千分之一秒)。这也就得到偏移值了。

第二步,使用Shifter工具中的Subtitle Shifter

对于压制源不同得字幕时间轴问题,有个好处是,所有文件得时间轴偏差一般来说是一致得,批量调整1次即可。

Subtitle Shifter可以批量上传多个文件,同时进行调整。

如果字幕超前了(即,需要字幕推迟出现)则填入数值为正值。

如果字幕滞后了(即,需要字幕提前出现)则填入数值为负值。

提交处理完毕,下载即可使用(转换后的文件加了前缀,记得修改)。

Shifter是在线工具,不需要下载,也没有插件需要安装,真实业界良心。

会员也不贵,提供了去广告,同时处理的数量更多,速度更快,价格也不贵,但也确实用不上…

10

域名搬家记

站点的域名还有一个月到期,看了下续费要21+刀,遂决定搬家,换个域名托管。

选择

关于域名的转移,有个转移费用,转移后托管期限1年,1年后才需要续费。如果不想折腾,就要考虑转移价格和续费价格两方面。如果想省钱不爱折腾,就每年转移呗,毕竟各个域名托管商都是转移费用低,续费高。

更换之前做了下调查,主流的域名托管商Godaddy、name、namecheap、namesilo。到各个网站差了下转移价格和续费价格,情况见下表。CloudFlare也有域名托管,听说也很便宜,但是我始终操作不了,看不到价格,可能是因为我是用得.me域名为国家域名。

网站namecheapnamesilogodaddyname
转移$14.98$15.99$21.99¥106.63
续费$18.98$16.99$21.99¥133.31

综合考虑下,选择了namesile.com,转移价格不是最低,但是续费价格划算。

转移

域名转移,第一步是从原域名托管网站迁出。

以自己为例,从Godday迁出。

首先,解除锁定(Lock),选择从Godday迁出。

然后,Godday会挽留一下,然并卵。此处有提示,重点是email地址正确性和DNS设置备份好。

确认后,Godday会提供authorization code。这组代码要提交给转入的域名托管商。

第二步,在新域名托管网站转入,以namesile.com为例。

首先,没有账户的先注册。

然后,从 https://www.namesilo.com/domain/transfer-domains 输入域名

接下来选择“是否自动续费”和隐私政策(隐私保护是免费的),输入优惠码(可以自行网上搜索一下)。

最后选择支付方式,可选项比较丰富,从微信、支付宝,到信用卡、比特币,应有尽有。

支付成功后,域名转移开始处理,有可能要等5-7天。实际上是等待原域名托管商处理。这方面,Godaddy提供了立即完成审批的选项 https://dcc.godaddy.com/control/transfers? 

操作完成后,很快就收到域名转移完成的通知。

之后,到namesilo填写下WHOIS信息,配置好DNS就可以使用了。

5

重拾RSS阅读器

为了对抗“信息茧房”,我重新开始使用RSS阅读器。
这样做有两个好处:
1、通过订阅,获得的文章不再取决于个人喜好,能够看到各方面、各角度的新闻与资讯;
2、通过使用第三方聚合服务,可以看到不该看到的一些信息。

RSS阅读器

早些年,使用RSS阅读器的时候,Google Reader还一统江湖;后来,用过一段时间网易云阅读(有段时间可以自由订阅Feed),再后面似乎就是专注于几个网站。随着社交媒体的发展壮大,新闻的质量却越来越差,一度靠知乎热榜来关注时事,然而知乎也在加速堕落中。
阅读量不足,始终是个问题,另外,频频出现的“信息茧房”几个字,也着实刺激到了我。首先,我尝试使用Innoreader,结果失败了。Innoreader服务也不错,然而网络连接太不稳定,之前使用Feedly缓存还好,然而好景不长,突然有一天彻底无法更新了。
前段时间,又发现了 The Old Reader,网络连接状况不错,使用浏览器阅读也属于可接受的程度(然而手机上的web界面确实欠佳)。后面又安装了几款APP,问题算是彻底解决啦!

The Old Reader

The Old Reader( https://theoldreader.com/ ),与其它在线的 RSS 阅读器功能相似,提供RSS订阅、收藏、分享等功能,有中文界面。
订阅的RSS可以自由导入和导出(OPML文件)。
免费用户最多可订阅100个Feed。
Web页面很简单,美感有限。作为阅读工具,实用性第一,也就不挑剔了。

The Old Reader

APP

手机APP方面(安卓系统),The Old Reader自家的APP没有找到。
我分别试用了FeedME、NewsJet、News+ 和Daily Feed。
大体上来说,登录the Old Reader服务都没有问题,功能上也是大同小异。
但是,Daily Feed速度有点儿慢,News+的屏幕适配有点儿问题。
因此,我推荐安装FeedMe、NewsJet。

APP图标

题外话

对于国内用户,下载这些APP是一道门槛。
目前来说,方法不外乎有3种:
1、采用高科技手段,连接到Google Play Store进行下载;
2、使用APKPure等网站提供的APK文件下载
3、使用第三方网站获取Google Play Store的APK文件
对于第一种方法,考虑人身安全性的问题,我没有为手机开通高科技通信方式;
对于第二种方法,始终担心这些APK文件是否被篡改。
我使用的是第三种方法,在APK Downloader网站下载对应的APK文件进行安装。

3

Mastodon(长毛象)相关的WordPress插件

适用于Mastodon(长毛象)的WordPress插件主要有两类:
第一类,是将站点变成Fediverse中的一个节点,比如ActivityPub、Pterotype。
特点是,有独立的ID(比如 @canglang ),可以跨站关注等,相当于一个独立的实例。优点是,功能丰富,使用站点域名。
第二类,是自动将文章发布到Mastodon,比如Mastodon Autopost, Share on Mastodon。
优点是,完成设置后,文章自动发布到Mastodon。

ActivityPub

活跃安装用户500+
为WordPress增加ActivityPub协议,等于是将博客站点变成Fediverse中的一个节点,提供的功能包括个人资料页、自定义链接、关注、分享、接受评论等功能。
如果站点使用二级域名,需要进行一下适应性修改,见 What if you are running your blog in a subdirectory?

缺点是,站点的ID与个人使用的Mastodon账户不能融合,发布文章需要手动再转发到个人账户上。
安装很简单,在WordPress后台的安装插件界面搜索“ActivityPub”,选择安装,安装完毕再激活即可。
安装后,在WordPress后台的设置中出现ActivityPub页面,可以自定义文章输出的内容(标题、全文或摘要,标签,长链接或短链接),格式,输出类型(文章、页面、媒体),标签设置(替换和链接),HTML标记白名单等。

在WordPress后台的个人资料页面下方,增加“Fediverse”内容,写明了Fediverse ID信息,在长毛象等平台可以通过该ID搜索和关注。

同时,WordPress后台用户选项卡下方也会增加"Followers(Fediverse)"页

Mastodon Autopost

活跃安装用户500+
自动将文章发布到Mastondon,自称“即用即忘”!
这个类型里面,这个插件的安装数量最多,可惜已经3年没有更新过了,与目前版本的WordPress版本兼容性未知。

Mastalab comments

活跃安装用户小于10
显示特定Mastodon链接相关的评论。
功能很有特色,可惜已经两年没有更新了,兼容性未知。

后记

以上插件,我只安装了ActivityPub,其它插件都存在长期为更新或安装数量过少的问题。

5

WordPress真香定律

不出意外,又折腾一番回归WordPress。
文章没写几篇,系统折腾了个遍。
之前买空间的时候,图省事连同域名一起在Godaddy买了,只有1G的内存,即使是使用了低版本的mySQL和PHP也捉襟见肘,后台经常报警。更何况,我买空间目的也不单纯,主要不是为了搭建博客。
然后,经历了WordPress,Halo,WriteFreely……
痛定思痛,重新买了Contabo的空间,再次搭建了Wordpress,应验了Wordpress真香定律!


目前,算是安定了下来。
主题,还是不带满意,有时间再找找简约风格的。
插件目前装了以下几个:

  • Akismet:反垃圾评论,需要注册使用。
  • Pinyin Slugs:将标题转换为拼音,作为文章链接
  • Wordfence安全:安全插件
  • WP Githuber MD:Markdown编辑器
  • WP Statistics:站点统计
  • WP Super Cache:站点静态化
  • Yoast SEO:SEO推广
  • Posts Like Dislike:增加“喜欢/不喜欢”按钮
  • WPS Hide Login:隐藏WordPress的登录页面。Wordfence检测到大量恶意登录尝试,而且站点的登录名也确实比较好猜,用了这个插件之后,终于安宁了!
1

继续折腾:WriteFreely页面调整

前言
仔细读了下官网上面的指南,里面还是有些重要的说明。
另外,通过修改CSS设置字体、颜色等内容,把家徒四壁的界面“刷了个油漆”。
最后,历尽千辛万苦,终于把SSL证书搞定了。

文章写作须知

文章折叠的方法,加入标记 <!--more-->

RSS
WriteFreely自动生成RSS,形式为“域名+/feed/”
例如,http://canglang.me/feed/
对于标签hashtags也有对应的RSS,形式为“域名+/tag:标签+/feed/”
比如, blog.writefreely.org/tag:writefreely/feed/

加标签
文章中,可以通过’#’号的形式,增加标签,比如
系统会自动生成并链接同一标签文章的聚合页面。

提醒功能
可以通过 @canglang 在文章中提醒ActivityPub平台中的用户。

静态页面
通过PIN将文章设置静态页(比如About me)。

优化页面

通过Customize页内的Custom CSS加入。
字体部分,采用这篇文章推荐的方案

font-family: "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;

字号部分,参考这篇文章,设置为30,26,20,18,16,14

配色方面,参考https://flatuicolors.com/palette/cn

整体来说,弄得还是比较业余,很多地方弄不明白为什么无效,抛砖引玉吧。
另外,在Custom CSS中可以加入Javascript语句,多用户版没有试过,不知道会不会有风险。

/* Entire page background */
body {
    background-color: #f1f2f6;
    font-family: "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;
}
body p {
    font-family: "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;
    font-size: 14px;
    line-height: 2em;
    color: #747d8c;
}
body h1 {
    font-family: "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;
    font-size: 26px;
    line-height: 2em;
    color: #57606f;
}
body h2 {
    font-family: "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;
    font-size: 20px;
    line-height: 2em;
    color: #57606f;
}

body h3 {
    font-family: "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;
    font-size: 18px;
    line-height: 2em;
    color: #57606f;
}

/* Blog header on index and post pages */
#blog-title a {
    color: #57606f;
}
#blog-title a:hover {
    color: #a4b0be;
}
/*访问过的链接*/
#blog-title a:visited {
    color: #57606f;
}

/* Post titles on blog index */
.post-title {
    color: #57606f;
    font-size: 20px;
}
.post-title a.u-url:link, .post-title a.u-url:visited .post-title a.u-url:hover {
    color: #57606f;
    text-decoration: none;
}

/* "Read more..." links */
a{
    font-family: "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;
}
#read-more a:hover{
    color: #57606f;
    text-decoration: none;
}
#read-more a:visited{
    color: #747d8c;
}

/* Links inside blog posts */
article p a {
    font-family: "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;
    color:#5352ed;
    text-decoration: none;
}
article p a:hover {
    color: #70a1ff;
    text-decoration: none;
}
article p a:visited {
    color:#5352ed;
    text-decoration: none;
}
article code {
    font-family: "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;
}
time {
    font-family: "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif;
    font-size: 14px;
    line-height: 1.5em;
    color: #747d8c;
}

后记

野生选手,CSS改起来真的是糊里糊涂。
最坑的是给站点加SSL,certbot加完就出现“重定向次数过多”,怎么都搞不定。最终,收到到cloadflare生成免费证书,再收到添加到nginx上面,终于……

4

折腾记: WriteFreely 搭建

前言
买了空间之后,已经先后使用过wordpress和Halo,这次又耐不住寂寞,使用#WriteFreely 建立这个博客,主要参考 Salt《去中心化博客 WriteFreely 搭建指南
不同之处,建立的是单用户版本,数据库使用SQLite。


环境

CentOS 7
磁盘空间20G
内存1G
writefreely_0.12.0_linux_amd64.tar.gz

安装WriteFreely

下载到主机

wget https://github.com/writeas/writefreely/releases/download/v0.12.0/writefreely_0.12.0_linux_amd64.tar.gz

解压到/home目录下,解压的位置如果修改,后面配置过程中需要一并调整

tar xvzf writefreely_0.12.0_linux_amd64.tar.gz -C /home

安装Ngnix

添加 Nginx 源

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安装 Nginx
sudo yum install -y nginx
启动 Nginx
sudo systemctl start nginx.service
设置开机自启 Nginx
sudo systemctl enable nginx.service

配置WriteFreely

在解压后文件在/home/writefreely下,进入该目录,执行命令进行配置
./writefreely --config

Server setup

选择Production, behind reverse proxy模式,后面需要安装Nginx;
Local port: 8080 这个端口后面配置Nginx需要用到;

Database setup

数据库选择SQLite
Filename: xxx.db 数据库名字建议改一下

App setup

选择 Single user blog 即单用户版本
Admin usename: 用户名
Admin password: 密码
Blog name: 博客名词
Public URL: http://canglang.me 你的域名写在这里
federation 是否通过ActivityPub接入联邦宇宙,接入的话选择Enabled
stats 是否通过NodeInfo公开展示用户情况,不公开选择Private
meta 没弄明白,选择了Public

初始化

./writefreely --init-db
./writefreely --gen-keys

配置服务

sudo nano /etc/systemd/system/writefreely.service

写入内容

[Unit]
Description=Write Freely Instance
After=syslog.target network.target

[Service]
Type=simple
StandardOutput=syslog
StandardError=syslog
WorkingDirectory=/home/writefreely
ExecStart=/home/writefreely/writefreely
Restart=always

[Install]
WantedBy=multi-user.target

其中,WorkingDirectory和ExecStart需要根据实际解压的位置进行修改

设置开机启动

systemctl daemon-reload #执行需要root授权
sudo systemctl start writefreely
sudo systemctl enable writefreely

配置Nginx

sudo nano /etc/nginx/conf.d/writefreely.conf

写入内容

server {
    listen 80;
    listen [::]:80;

    server_name canglang.me;

    gzip on;
    gzip_types
      application/javascript
      application/x-javascript
      application/json
      application/rss+xml
      application/xml
      image/svg+xml
      image/x-icon
      application/vnd.ms-fontobject
      application/font-sfnt
      text/css
      text/plain;
    gzip_min_length 256;
    gzip_comp_level 5;
    gzip_http_version 1.1;
    gzip_vary on;

    location ~ ^/.well-known/(webfinger|nodeinfo|host-meta) {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://127.0.0.1:8080;
        proxy_redirect off;
    }

    location ~ ^/(css|img|js|fonts)/ {
        root /home/writefreely/static;
        # Optionally cache these files in the browser:
        # expires 12M;
    }

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://127.0.0.1:8080;
        proxy_redirect off;
    }
}

其中 server_name和root /home/writefreely/static需要根据实际进行修改。

然后,配置 SSL 证书,就不写了,攻略很多,自行搜索吧。

检查配置是否有误
sudo nginx -t

重载 Nginx 配置
sudo nginx -s reload


至此配置完成,如果一切顺利,打开域名就能见到主页了。
现在又改回wordpress(捂脸

1