前言

我在 2022 年年中心血来潮买了一台群晖 DS220+,于是开启了折腾之旅,到现在也有两年半了,现在写这篇文章分享下我都在上边搭建了什么服务,供大家参考。

NAS 及配套设施

  • 内存:DS220+ 默认的 2GB 内存自然是不够用的,加装一条 8GB 内存
  • 硬盘:两块希捷 8TB 硬盘,不组建 NAT 使用(关键文件备份后边会讲到)
  • UPS:APC BK650M2-CH 四插孔 UPS,可以单独给 NAS 供电 60 分钟,四插孔也方便把猫、路由器一起供上

内网穿透

内网穿透详解

照片管理

使用 Synology Photos 服务端配合 Photos Mobile 自动同步 iOS 上的照片到群晖,在服务端通过手动将照片移动到文件夹 -> 创建基于文件夹的条件相册来使照片源文件井井有条,同时不失相册能力。

假设 2022 年 1 月去杭州旅游,则首先在 Synology Photos 中创建 出游/2022.1 杭州 文件夹并将相关照片都挪入此文件夹,然后创建基于该文件目录的条件相册。这样一方面我们可以在 Photos Mobile 上以相册形式看到照片,另一方面在真实的文件系统中这些文件也都组织在 出游/2022.1 杭州 文件夹下,备份起来也十分方便。

音乐管理

使用 Navidrome 服务端配合 Amperfy(iOS),Navidrome 可以同步播放记录到 last.fm,Amperfy 支持 iOS 快捷指令,可以快速播放你喜爱的歌单。

不推荐音流,音流在 DDNS 情况下经常加载失败,一旦加载失败离线缓存歌单和在线歌单就完全割裂了,非常难受,Amperfy 没有这方面的问题。

影视动画管理

因为我本人不看电视剧和电影,只看动画,所以这里只讲动画相关的方案。使用 ani-rss + qbittorrent + jellyfin 打造媒体库:

  • ani-rss: 新一代追番工具,基于 mikanani.me 数据,从订阅到下载再到文件目录整理,一个 ani-rss 就足够了
  • qbittorrent:下载工具,打开做种并配合 PBH 使用
  • jellyfin:媒体库管理,ani-rss 会将下载目录组织为 emby/jellyfin 更便于刮削的形式,我使用 jellyfin 配合 TMDB 插件刮削媒体库(注意,TMDB 需要配合代理使用)。

这样一旦有新番更新,ani-rss 就会自动通过 qbittorrent 下载并由 jellyfin 呈现,同时 jellyfin 也方便记录我们的追番进度。

重要文件备份

重要文件我采取异盘、异地(公有云)备份,没有极端到冷热备份,这些备份我们通过群晖就可以搞定。

异盘备份

前文硬盘部分我们两块硬盘没有组建 raid,一方面是为了有更大的空间挥霍,另一方面也是可以做异盘备份(虽然说同时买的硬盘大概率是同一批出厂,也有可能同时坏,不过毕竟是概率事件)。借助群晖的 Cloud Sync -> WebDav 可以很方便的做异盘备份:

Cloud Sync
Cloud Sync

如上图所示,我做了如下备份:

  1. 将 Obsidian 笔记从专用目录 /webdav-sync/Obsidian Vault 备份到了 /important/Obsidian Vault
  2. 将 OneDrive 文件从 /akiakise/OneDrive 备份到了 /important/OneDrive
  3. 将照片从 /photo 备份到了 /important/Photo
  4. /important 备份到了 /important-backup,其中这两个目录分别处于两个硬盘上

如上,我们通过 Cloud Sync 收集需要备份的文件,并实现了重要文件的异盘备份。

需要注意的是,Cloud Sync 同步配置时需要将同步方向设置为「仅下载远程更改」,不然可能会有文件来回同步的问题。

异地备份

在上边的本地备份时我们已经将文件都收集在 /important-backup 里了,接下来我们将其打包、加密、压缩后备份到公有云。

首先我们通过 Cloud Sync 将本地目录与公有云关联起来:

Baidu Sync
Baidu Sync

这样百度网盘中 我的应用数据/Cloud Sync 目录就与本地的 /akiakise/BaiduNetDisk 建立了联系,两个目录之间的文件自动被 Cloud Sync 双向同步。

我们通过 Python 脚本完成本地文件的备份:

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
from datetime import datetime, timedelta
import os

def now():
return f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}]"

filename = datetime.today().strftime('%Y%m%d')
expire_filename = (datetime.now() - timedelta(30)).strftime('%Y%m%d')
password = "YOURPASSWORD"
compress_dir = "/volume2/important-backup"
target_dir = "/volume1/akiakise/BaiduNetDisk/backup"

# directory check
os.makedirs(target_dir, exist_ok=True)
# cleanup today backup files if exist
for file in os.listdir(target_dir):
if file.startswith(filename):
file_path = os.path.join(target_dir, file)
print(f"{now()} exist today's backup files, delete: {file_path}")
os.remove(file_path)
# compress
res = os.system(f"7z a -v2G -m0=Copy -mhe=on -p{password} {target_dir}/{filename}.7z {compress_dir}")
if res != 0:
print(f"{now()} 7zip compress failed")
# cleanup history files
for file in os.listdir(target_dir):
if file < expire_filename:
file_path = os.path.join(target_dir, file)
print(f"{now()} detected expire files, delete: {file_path}")
os.remove(file_path)
print(f"{now()} done")

替换脚本中的 YOURPASSWORD 为你自己的密码,并替换 compress_dirtarget_dir 里的目录即可,注意保留 /volume1/volume2 前缀,它是群晖共享文件夹在文件系统中的真实路径。

这个脚本会将 compress_dir 中的文件打包、隐藏文件名、切分为 2GB 大小的分卷(不压缩,压缩太消耗 CPU 而且在照片场景效率不佳),然后移动到 target_dir 中,并删除 target_dir 中 30 天以前的备份文件(避免占用太大空间)。

如脚本所示,我们将文件备份到了 /akiakise/BaiduNetDisk/backup 目录下,它会被 Cloud Sync 自动上传到百度网盘 我的应用数据/Cloud Sync/backup 目录里,完美。

结语

回头看,NAS 实打实的改变了我的生活,它无时无刻不在提升着我的幸福度,建议爱折腾的同学都入手一个。其实我的场景一个支持 Docker 的主机就能满足了,但是群晖系统的易用性也确实让我非常满意,后续升级硬件的话我还是会选择群晖。


本站由 Aki Akise 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。