基于开源方案的生产力NAS 篇五:【全栈开源·保姆级】打磨两年的精华——从零开始,教你搭建多端全自动同步的照片管理系统
警告:本教程是本人打磨近两年沉淀下的精华,干货过多,请自行配水食用。
本教程可以让你在一台ubuntu机器上原地搭建一整套照片管理及同步系统,如果你暂时没有折腾的时间(两三小时足够),可以先看末尾整套系统的使用效果,点个收藏,等认真折腾的时候拿出来参考。
需求
在NAS的使用场景中,照片同步及备份可以说是最重要的应用场景之一。在没有NAS的情况下,各个手机厂商会使用自己的XX云服务来为你存储一部分照片,这种服务通常能在一个由“不收费”、“速度快”、“空间大”的不可能三角中找到自己的位置。阿里云盘目前看起来不错,但是我很难相信他会长期保持这种水准。
所以你要么付费享受高质量服务,要么忍受速度或存储空间上的瓶颈。在几年前我曾经想把小米云服务上的图片下载到本地,但那种只支持单张照片操作的反人类设计让我耗费了大量时间,下载下来后才发现,云上存的并不是原图,而是压缩后的图。有时候我会想,这种云服务可能并不是为我服务的,这只是一个好用的工具,让我快速成为大数据的一部分,而且还要找我收钱。这应该也是众多NAS用户使用NAS的原因之一。
成品NAS方案 VS 开源方案
照片同步工具在成品NAS中有很多方案,比如群晖的QuickConnect+DS-photo+DS-file+photos+Moments,QC负责用内网穿透的方式解决网络连接问题,DS photo/file负责将照片从终端设备同步到nas,Photos可以基于文件结构查看图片,是传统的相册,Moments负责使用AI算法归纳照片,是智能相册。成品NAS的方案在使用上很方便,文件同步可以自动进行,而Moments的AI分析能力也有种近似苹果系图片管理的体验。优点说完说说不足,首先QuickConnect服务需要你使用群晖的帐号,并且走群晖服务器的流量,那么群晖服务端如果想把你的数据考下来留一份,就跟从自己兜里拿东西一样简单,费尽心思还花了钱终究没逃过大数据的法网,这不是很不甘心?DS-photo与DS-file两个工具很不错,但是闭源的app装在手机上,并且拥有你的相册权限,总感觉家里进了外人一样。
实际上在开源世界中,其中的上面的每一款软件都有与之对应的优秀项目。使用Syncthing+NextCloud+Rsync+AquarHome+Photoprism可以达到同样的效果。这些开源软件都是社区中质量极高的项目,不仅品质上成,项目本身的更新也非常活跃,而开源本身就消除了所有我们对隐私的顾虑。Syncthing可以不依赖单独的内网穿透服务直接进行远程文件同步,虽然中间要依赖公共的服务节点,但Syncthing公开的源代码证明了它不会偷窥你的信息。NextCloud可以替代群晖的Photos作为传统相册使用。而Photoprism与Moments一样具有强大的图片分析能力。AquarHome作为几个服务的控制台,可以在同一个页面上直观的看到文件同步情况,并集成了rsync,可以按照自己的习惯完成一键备份。这套方案其实对于其他形式的文件同样有效,如果你有文件同步的需求,这套方案也完全适用。
在此声明一下,我是AquarHome开源个人home页项目的开发者,这个项目对标Heimdall,针对DIY NAS场景开发了大量实用的组件,最近更新了搜索引擎的搜索联想功能以及transmission全功能组件,更多功能在快速更新中。项目docker安装,值得一试。
方案部署
下面介绍如何搭建这套系统。由于整套方案涉及很多软件,本来想写一个纲领性的教程,但越写越发现还是应该把完整的搭建过程展现出来,所以写到最后变成了“保姆级”教程。但由于是DIY NAS的教程,所以即使是保姆级,也需要你有基础的linux使用经验,对docker的基本理解,以及对家庭网络有基本概念。这篇教程可以让你在一台ubuntu上原地搭建一整套好用的文件管理及同步系统,如果你觉得教程对你有帮助,可以先收藏,等想认真折腾的时候拿出来参考。
本教程使用docker-compose部署软件。docker-compose是对docker的简单封装,使用命令行进行交互。与它类似的工具还有Portainer,它具有web界面,更加友好一些。但我本人更加习惯基于配置文件与命令行的docker-compose,简洁透明,易于自动化。
搭建基础环境
我搭建这套系统是以ubuntu20为基础的,系统安装就不介绍了。系统安装完以后需要安装一些基础的环境,这套系统需要python3、docker、docker-compose三个基础工具。我写了一个自动化脚本来适配我自己的需要,但是脚本不一定适合所有人,所以我把脚本通用的部分提供出来供参考。你可以根据需要一行一行地执行,这样便于排查问题。
### 使用root身份
sudo -i
### 安装python3及python虚拟环境
apt install curl -y
apt install python3-pip -y
pip3 install virtualenv
pip3 install virtualenvwrapper
### 配置pyhton虚拟环境
cp /root/.bashrc /root/.bashrc.bak
cat >> /root/.bashrc <<EOF
##[aquar config start]##
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
##[aquar config end]##
EOF
source /root/.bashrc
### 生成一个脚本,用来方便地启停整套docker-compose系统使用方式是:aqserv start|stop|restart|pscat > /usr/local/bin/aqserv <<EOF
#!/bin/bash
cmd=$1
if [ "$cmd" != "start" ] && [ "$cmd" != "stop" ] && [ "$cmd" != "restart" ] && [ "$cmd" != "ps" ]; then
echo "error: input parameter only accept 'start','stop','restart' or'ps'"
exit 0
fi
source /root/.bashrc
source /usr/local/bin/virtualenvwrapper.sh
workon aquar
cd /opt/aquar/src/docker-compose/
if [ "$cmd" == "start" ]; then
echo "aquar docker services starting"
docker-compose up -d
elif [ "$cmd" == "stop" ]; then
echo "aquar docker services stoping"
docker-compose stop
elif [ "$cmd" == "restart" ]; then
echo "aquar docker services restarting"
docker-compose restart
else
docker-compose ps
fi
EOF
chmod +x /usr/local/bin/aqserv
### 安装docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs)
stable"apt-get update
apt-get install docker-ce docker-ce-cli containerd.io -y
### 创建一个python虚拟环境aquar并安装docker-compose
source /root/.bashrcsource /usr/local/bin/virtualenvwrapper.sh
cat >> /root/.bashrc <<EOF
source /usr/local/bin/virtualenvwrapper.sh
mkvirtualenv aquar
workon aquar
pip3 install docker-compose
### 设置开机自启动docker-compose********'
cat > /lib/systemd/system/aquar.service <<EOF
[Unit]
Description=Aquar service
After=docker.service
Requires=docker.service
[Service]
Type=simple
User=root
Group=root
TimeoutStartSec=0
ExecStart=/usr/local/bin/aqserv start
SyslogIdentifier=aqserv
[Install]
WantedBy=multi-user.target
EOF
systemctl enable aquar
这个脚本会创建一个命令,你可以在root用户下使用aqserv start | stop | restart | ps来方便的实现整套系统的启动、关闭、重启及查看状态操作。
配置docker-compose
1.搭建完基础环境后,你需要有一个目录来存放docker-compose.yml文件,因为这个组合中Photoprism需要用到数据库,所以我们还需要在这个目录下新建一个mariadb.init.d文件夹,在这个文件夹里面,新建一个init.sql文件用来作为数据库的初始化脚本。目录结构如下:
.
├── docker-compose.yml
└── mariadb.init.d
└── init.sql
2. 在init.sql文件中写入如下内容,意思是新建一个名为"photoprism"的数据库,并新建一个"root"数据库用户,密码是"root",然后给予来自外部连接时的root用户所有权限:
CREATE DATABASE IF NOT EXISTS nextcloud;
CREATE DATABASE IF NOT EXISTS photoprism;
CREATE USER 'root'@'localhost' IDENTIFIED BY 'root';
GRANT ALL PRIVILEGES ON . TO 'root'@'%';
3. 在docker-compose.yml文件中写入如下内容,其中中文标注的部分需要你改成自己的对应路径
version: "3"services:
syncthing:
image: ghcr.io/linuxserver/syncthing
container_name: syncthing
# hostname: syncthing #optional
environment:
- PUID=1000
- PGID=1000
- TZ="Asia/Shanghai"
volumes:
- /你的/docker/应用数据/路径/syncthing/config:/config
- /你的/存储池/路径:/opt/aquarpool
# - /path/to/data1:/data1
ports:
- 8384:8384
- 22000:22000
- 21027:21027/udp
restart: unless-stopped
nextcloud:
image: nextcloud
volumes:
# 挂载配置文件
- /你的/docker/应用数据/路径/nextcloud:/var/www/html
- /你的/docker/应用数据/路径/nextcloud/apps:/var/www/html/custom_apps
- /你的/docker/应用数据/路径/nextcloud/config:/var/www/html/config
- /你的/docker/应用数据/路径/nextcloud/data:/var/www/html/data
- /你的/存储池/路径:/opt/aquarpool
ports:
- "8081:80"
depends_on:
- "mariadb"
restart: unless-stopped
photoprism:
image: photoprism/photoprism:latest
depends_on:
- "mariadb"
# restart: unless-stopped
security_opt:
- seccomp:unconfined
- apparmor:unconfined
ports:
- 8042:2342 # [local port]:[container port]
environment:
PHOTOPRISM_ADMIN_PASSWORD: "用户登录密码"
PHOTOPRISM_HTTP_PORT: 2342
PHOTOPRISM_HTTP_COMPRESSION: "gzip"
PHOTOPRISM_DEBUG: "false"
PHOTOPRISM_PUBLIC: "false"
PHOTOPRISM_READONLY: "false"
PHOTOPRISM_EXPERIMENTAL: "false"
PHOTOPRISM_DISABLE_WEBDAV: "false"
PHOTOPRISM_DISABLE_SETTINGS: "false"
PHOTOPRISM_DISABLE_TENSORFLOW: "false"
PHOTOPRISM_DARKTABLE_PRESETS: "false"
PHOTOPRISM_DETECT_NSFW: "false"
PHOTOPRISM_UPLOAD_NSFW: "true"
PHOTOPRISM_DATABASE_DRIVER: "mysql"
PHOTOPRISM_DATABASE_SERVER: "mariadb:3306"
PHOTOPRISM_DATABASE_NAME: "photoprism"
PHOTOPRISM_DATABASE_USER: "root"
PHOTOPRISM_DATABASE_PASSWORD: "root"
PHOTOPRISM_SITE_URL: "http://公网IP或局域网IP:端口号/"
PHOTOPRISM_SITE_TITLE: "PhotoPrism"
PHOTOPRISM_SITE_CAPTION: "Browse Your Life"
PHOTOPRISM_SITE_DESCRIPTION: ""
PHOTOPRISM_SITE_AUTHOR: ""
volumes:
- "/你/存储池中/存放照片/的路径:/photoprism/originals"
# Multiple folders can be indexed by mounting them as sub-folders of /photoprism/originals:
# - "/mnt/Family:/photoprism/originals/Family" # [folder_1]:/photoprism/originals/[folder_1]
# - "/mnt/Friends:/photoprism/originals/Friends" # [folder_2]:/photoprism/originals/[folder_2]
# Mounting an import folder is optional (see docs):
# - "~/Import:/photoprism/import"
# Permanent storage for settings, index & sidecar files (DON'T REMOVE):
- "/你的/docker/应用数据/路径/photoprism/storage:/photoprism/storage"
mariadb:
image: mariadb:10.4
volumes:
- /你的/docker/应用数据/路径/mariadb:/var/lib/mysql
- 你存放本docker-compose.yml文件的路径/mariadb.init.d:/docker-entrypoint-initdb.d
environment:
MYSQL_DATABASE: nextcloud
MYSQL_ROOT_PASSWORD: root
TZ: "Asia/Shanghai"
command:
[ "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci", "--default-time-zone=+8:00",
] ports:
- "3306:3306"
restart: unless-stopped
aquarhome:
image: finetu/aquarhome:latest
container_name: aquarhome
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- /你的/docker/应用数据/路径/aquarhome/data:/var/aquardata
- /你的/docker/应用数据/路径/aquarpool:/opt/aquarpool
- /你的/docker/应用数据/路径/aquarhome/logs:/root/.pm2/logs
ports:
- 8172:8172
restart: unless-stopped
解释一下上面的配置就是:这套配置部署了五个服务——Syncthing、Photoprism、AquarHome以及Photoprism所依赖的数据库mariadb,每个服务有自己的app数据存储路径以及连接到存储池的用户数据路径。
4. 配置文件写好后,我们cd到配置文件所在的目录下执行docker-compose up -d,如果看到类似下面的输出,就说明服务正常启动了,稍等几分钟,等服务初始化完成,就可以访问各个服务了。
方案整体配置
配置和使用这套方案前,先来设定一个使用场景。假设我要去冰岛旅游,我希望自己用手机拍照后,照片可以自动上传到自己的NAS服务器并直接被相册收录。旅游回来以后我可以把最近几天的照片放在一个“冰岛游记”的文件夹下进行备份(归档)。
Syncthing配置
1.配置服务端Syncthing。Syncthing是一个跨平台的文件同步方案,它可以安装在安卓手机、PC、linux服务器上,Syncthing没有IOS端,但可以通过macOS端迂回达到目的。另外Syncthing是去中心化的,所以每个端对于Syncthing来说并没什么区别。上一节介绍的安装过程就是将Syncthing安装到了我们的Linux服务器上,下一步是对Syncthing进行简单地配置。在浏览器中打开Syncthing的web界面如果你是按照我上面给出的配置进行部署,那么应该打开http://服务器地址:8384,一切正常的话,页面会让你输入用户名密码,输入正确后你会看到Syncthing的管理页面。
在我的服务器上,图片集中在存储池的images文件夹中,其中有来自手机的照片(finetu_phone),有网上收藏的图片(finetu_meme),有老婆iCloud上同步下来的照片(icloud_images)。
.
├── finetu_meme
├── finetu_phone
└── icloud_image
根据我们的使用场景,我们需要让手机中的图同步到finetu_phone文件夹下面,所以我们在Syncthing的服务器端设置finetu_phone文件夹的同步,第一次进来的时候左边的文件夹列表只有一个Default Folder。现在我们点击“+添加文件夹”,在设置中填写如下信息,填写后点击保存。
2.服务器端做好第一阶段配置后,我们需要在手机上也安装一个Syncthing。
Syncthing官网下载页面:https://syncthing.net/downloads/
Syncthing安卓包官方下载地址:https://f-droid.org/packages/com.nutomic.syncthingandroid/
3.下载安装完成后,打开app,可以看到Syncthing的安卓端界面,在界面上建立一个同步任务。
在表单中填入同步的名字,文件夹ID(各个端靠这个名字来识别要同步的文件夹),以及手机上需要同步的照片目录。
4.配置服务器端的连接。打开服务器端的web页面,点击右上角的“操作”按钮,选择“显示ID”,把设备ID拷贝下来,发送到手机上,你也可以直接拿手机端扫码添加,这里介绍最传统的方式。
切换到“设备”标签页,点击右上方的“+”号,添加设备,在表单中填写上一步考过来的设备ID,然后给设备起个名字,点右上方对号确定。
这时候如果网络情况良好,你就已经能在web端上看到一个设备请求连接的提示了,直接接收就可以不用在web端设置对手机端的连接了,在教程里还是费事走一遍流程。
5.对设备指定需要同步的文件夹。在web端点击新添加的设备,点击“选项”,在子页面中进入“共享”标签页,然后点击在第1步里面配置的同步文件夹。
如果你的网络良好,应该就已经能看到有文件开始同步了,如果你没有在wifi下使用,可能会耗费大量的流量,所以你可以先将设备暂停,在wifi下再进行第一次同步。Syncthing的app端可以设置为”在WIFI下运行”甚至在指定wifi下运行。你可以根据自己的需求进行调整,设置位置在“设置”->“运行状况”中。
NextCloud配置
NextCloud是目前功能最强且开发者活跃的开源文件管理器。另一个有竞争力的方案是FileRun,它甚至比NextCloud还要强,但FileRun不开源,所以忍痛舍弃了。下面介绍NextCloud初始化配置步骤。
1.部署好docker-compose的应用后,需要等几分钟才能正常得看到NextCloud的web界面。如果你是按照我给出的配置部署的,那么服务地址是http://你机器所在的内网地址:8081。打开web页面后它会要求你进行初始化设置。不要着急提交,因为我们需要把数据库指定为mariadb。
可能没有软件开发经验的朋友见到数据库就比较反感。在此简单介绍一下mariadb数据库,它是目前IT业界最流行数据库 Mysql被Oracle公司收购后,Mysql开发者创建的新的Mysql开源版本,其用法与接口规范与Mysql完全相同,现在可以说是开源方案中默认的关系性数据库选型,例如如果你在ubuntu上安装mysql,你会发现安装的实际上是mariadb。在本套方案中就有两个项目(NextCloud与Photoprism)依赖这个数据库。为什么数据库这么重要呢?因为对于任何稍微复杂一点的项目来说,使用数据库都是最高效稳定的数据存储方案,虽然会引入一个额外的服务,但它给项目在功能和性能上带来提升相比成本是完全值得的。就好比你做几块钱的小本生意不需要开车,齐个三轮就行,但生意做大了就必需得有辆车了。
2.点击页面上这个“Stroage & database”,可以看到选择数据库的页面,选择第二种“MySQL/MariaDB”,按下图把信息配置好。数据库帐户名("root")及密码("root")都是在“方案部署”那节中的docker-compose.yml配置文件中配置的,如果你改了配置,请注意在这里也修改掉,数据库名称nextcloud同样是在“方案部署”章节中写在init.sql文件中专门为nextcloud创建的数据库。
最下面的数据库地址需要详细解释一下,因为NextCloud与mariadb都部署在docker中,所以他们之间的互相通信需要靠docker-compose创建的虚拟网络来进行,他们同属一个虚拟子网,而docker-compose很贴心的将每个容器的名称与它在虚拟子网中的IP地址进行了关联,所以你在一个容器中只需要直接输入容器名称就等同于输入了这个容器的IP地址。当然你也可以通过docker network命令查询这个容器在内网中的IP地址加端口号,比如说我查到的mariadb IP地址是172.18.0.4,命令如下。
root@aquartest:/opt/aquar/storages/apps# docker network ls
NETWORK ID NAME DRIVER SCOPE
6006ea79c811 bridge bridge local
4ab482238fb7 docker-compose_default bridge local
7ee6aab252bc host host local
7be1d436c680 none null local
root@aquartest:/opt/aquar/storages/apps# docker network inspect 4ab482238fb7
[
{
"Name": "docker-compose_default",
"Id": "4ab482238fb75bb8f0c9e693cbd326c98635c7fd26a1dacdd28fce57e6f495ca",
"Created": "2021-11-12T15:59:42.853686056Z",
...
"Containers": {
...
"d4224b36f58170b6daa6c5a89b0c2358fbe3fdd2f7d53a9d73c644d6bc551b19": {
"Name": "mariadb",
"EndpointID": "e3cbb68aaa763f4672a802d1f264d10fc4501165ff9e79185ff931857daede41",
"MacAddress": "02:42:ac:12:00:04",
"IPv4Address": "172.18.0.4/16",
"IPv6Address": ""
}
...
},
...
}
]
3.按照上面的方式设置好以后,点击“Finish setup”。就会看到NextCloud在一项项安装插件,等待一会儿,就进入了NextCloud的欢迎页面。
4.NextCloud终于完成安装了,但是我们的路还很长,下一步是为NextCloud添加外部目录。首先点击右上角的头像,然后点击+Apps选项,然后在下面的扩展功能列表上找到External storage support,点击Enable把它打开。
5.再点击头像选择Settings,在左侧的菜单中**的AdminiStration下,**选择External stroage。
6.在右侧表单中点击Add Storage下拉框,选择Local挂载本地路径,因为在docker-compose.yml中,我们把自己的存储池映射到了容器的/opt/aquarpool下,所直接写这个路径,点击右侧的对号,我们就把自己的存储池挂载到了NextCloud上,如果一切正常的话,左侧会有一个绿色的对号。
7.在左侧菜单中找到Personal下面的External Stroage,点击进入后,点击右侧对勾。这里nextcloud有bug,点击后会显示一个红叹号,鼠标再点击红叹号就有变成了绿色的对勾。
8.回到文件界面上就可以看到名叫aquarpool的文件夹了,点开以后就是自己的存储池内容。
OK,你终于有了一个自己的网盘系统,并且可以自动把你手机的照片同步到网盘上。然而这还没完,你还需要一个专业的智能相册。
Photoprism配置
Photoprism应该是目前最活跃同时也是功能最强大的相册管理系统。使用高效可靠的go语言编写,内置业界两大AI框架之一的Tensorflow,给人无限的想象空间。开源相册系统其实有很多,比较著名的是Piwigo,这套方案一开始选型的就是Piwigo,但是Piwigo不支持外挂目录,它强制你把图片放置在它指定的目录下,这让人无法接收。而Photoprism的设计哲学就非常友好,它允许你指定多个原始目录,并且Photoprism不会对原始目录进行任何修改这种非侵入式的系统才是真正友好易集成的。
1.如果你按照与我一样的docker-compose.yml内容配置,你的Photoprism端口就是8042,所以在浏览器中输入http://部署机器所在的内网地址:8042就可以看到Photoprism的Web页面了。首先需要登录,初始用户是admin,密码是在docker-compose.yml中配置的。
2.输入正确的帐户信息后就进入了Photoprism的管理页面,点击左侧Library下的Originals就是原始数据目录,查看是否包含了你需要的文件夹,这些文件夹的路径是在docker-compose.yml中配置的,如果你发现这个地方有问题,就需要先执行aqserv stop把整个系统停掉,然后修改docker-compose.yml中的对应的Photoprism路径配置,例如我集中存放照片的目录是/opt/aquar/aquarpool/images,那么我的配置就是"- /opt/aquar/aquarpool/images:/photoprism/originals",修改完正确的地址后再执行aqserv start启动整套系统。
3.Originals目录配置无误后,点击Library本身,然后在右侧的界面中点击START按钮,Photoprism就开始分析你的原始数据并进行自动整理。分析时间会比较长,由你的照片总量及格式大小共同决定,这时候就可以先离开了,等待Photoprism完成分析。
4.等到Photoprism完成分析后,你就可以看到自己所有的照片被Photoprism纳入其中,并且它帮你归纳出很多标签。你可以通过各种维度来查看自己的照片库。
AquarHome配置
到此,你已经拥有了一个强大的图片库管理工具,从照片同步到可靠存储,再到查看与管理的整个功能闭环已经打通了。如果你想尝尝鲜,体验一下,到这一步就可以了,但我们这个系列介绍的系统是要长期运行的,随着时间的流逝,各种意外状况就会出现,比如停电、硬盘损坏、磁盘空间耗尽、某个系统出现bug等等。比意外更可怕的是,由于整套系统是自动化的,也许意外发生后我们无法立刻察觉,等到很久以后才被发现,这时候除了要恢复系统本身,还掉进了恢复数据的深渊,如果意志力不够强大,那这套系统多半就无疾而终了。
为了避免这种情况出现,我们就需要一种手段来方便地监控各个服务的状态,如果出现了问题能及时发现,第一时间进行处理。服务状态监控以及业务指标面板在企业级系统中是常见的功能,Zabbix配合grafana就是这样一套基础方案。但是在需求杂乱又没有利润的家用领域并没有对应的产品可用。所以我自己动手开发了开源项目AquarHome(GitHub地址:https://github.com/firemakergk/aquar-home)个人Home页,这个项目的详细介绍我在之前的文章中介绍过,想要了解项目细节可以看这两篇文章。
Heimdall不合胃口,于是我开源了适合diy nas的AquarHome系统
AquarHome的配置方式也很简单,在官方的说明文档中有细致的介绍,我们需要用到的有NextCloud组件、Docker组件、增量备份组件、Syncthing组件,可以根据官方文档的介绍进行配置。
配置好以后AquarHome的界面是这样的因为我使用了TrueNas和Transmission,所以页面上还有这两个组件。
从上面可以看到,所有系统的核心状态信息都展示在一起,在NextCloud组件中你可以看到与NextCloud页面中完全一样的内容,你甚至可以直接把文件下载到本地,在transmission组件中你可以直接在组件中完成下载任务的添加、启停、删除。AquarHome同样考虑了安全性,使用的数据接口都是经过授权后的token方式,不会直接暴露你的用户名密码。
功能测试
是骡子是马拉出来溜溜,折腾了这么一大堆东西,总得能解决我们的问题才行。
照片同步
首先在保持手机端Syncthing后台运行的状态下,用手机拍照。拍完照以后等待几秒就能看到Syncthing组件的同步状态发生了改变,等待同步完成后,NextCloud组件对应目录中也出现了刚刚拍摄的照片。所以这套系统已经拥有了秒级同步的能力。本来拍了一个30秒的短视频想做成gif传上来,但是体积太大了,只能用录屏代替,录屏提现不了手机的操作,但是也可以作为参考了。
照片归档
由于同步服务既同步新增操作也同步删除操作,对于目录同步的场景而言这是很合理的。但是如果你误删了手机的图片,那么在服务存储端也会把图片删除这还是比较郁闷的,而且很多时候我们需要阶段性的对照片进行归档,比如我们开头提到的场景:从冰岛回来后(并去不起)我想把一路上拍的照片都存在一个叫“冰岛游记”的文件夹中,这应该如何实现呢?
当然你可以直接登录到主机上用命令行完成操作,或者使用其他管理工具完成这些操作,但是都不够方便。所以我为了这个场景开发了“增量备份组件”,它基于Linux最强文件同步工具Rsync,详细用法在官方文档中可以找到。我们只需要在出发前进行一次归档操作,然后在回来后,再进行一次归档操作即可。整个过程直接在组件上完成,算上设置文件夹名称,一共点击5次鼠标。
到了这里,你终于原地搭建出了一套完全由自己控制的照片同步及管理系统。且整个系统是纯正的开源血统,没有plus会员,无需隐私协议,无数活跃的开发者为你带来持续的更新。优秀的开源系统都有开放的API如果你有能力,还可以在这个基础上拥有无限的扩展可能。这就是我理想中的开源NAS方案。
结语
这篇文章的内容是自从我萌生自建开源NAS方案的想法两年多来沉淀下的精华。中间的项目选型、集成调试、脚本开发、项目开发无不需要大量的精力,好在最终的结果令人满,总算没有做无用功。这套系统还会继续升级,未来会探索针对家庭多媒体场景的功能,针对网络摄像头及远程对讲的功能,以及结合智能家居和人工智能的功能。我希望通过一个个优秀的开源项目搭建起一套安全、稳定、易扩展的全方位家庭IT系统。路还很长,希望自己能走得好,走得远。
本来以为写这篇文章需要两天,没想到写了两周,写的时候曾经想拆分成几篇文章来控制篇幅。这样也可以收到更多的赞及热度,但是权衡再三还是选择了保持教程的完整性。如果你看到了这里,觉得教程对你有帮助或者启发,请不要吝啬点赞,希望更多的朋友能从开源方案中收益,希望DIY NAS玩家可以拥有更好的体验。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
lonelyskytaut
校验提示文案
njsfcy
花了这么多功夫,去实现最基础的同步和照片功能,看完全文完美地激发网友们对群晖等系统的喜爱。
这里说一下,qc在有公网地址时,它会直接通过端口转发,而不会浪费群晖自家的带宽。另外你说的拷贝一份数据也是假象,因为qc传输强制加了ssl锁,传输途中是加了密的。像楼主这样配置,小白如果没启用https证书,你的相册反倒是明文传输在网上。
校验提示文案
发条匠
校验提示文案
Camry2018
校验提示文案
小余家的岁岁
数据备份直接docker跑nextcloud,安卓和pc都有客户端,同步没问题。建议用linuxserver/nextcloud这个镜像,比较方便修改nginx配置,弄ssl简单点。嗯,最好一起弄个mysql容器,不然nextcloud用的SQLite,有点拉垮。
然后其他乱七八糟也都是docker搞定:
挂pt用的qbittorrent;
影视方案用jellyfin,顺便还跑了个xjasonlyu/avdc-api,然后jellyfin装avdc插件,刮削大姐姐教学片数据;
自动领Epic免费游戏的luminoleon/epicgames-claimer;
保持镜像为最新的containrrr/watchtower,这玩意有点小门槛,不需要更新的容器要打标签。
顺便还跑了俩游戏服务器,不要一起饿死(饥荒联机版 jamesits/dst-server)和 末日零元购(僵尸毁灭工程 afey/zomboid),后者刚刚更新了41版联机,还不太稳定。
最后还有docker的webui,portainer-ce,这玩意giehub上有汉化,自己搜一下。
校验提示文案
棠溪2022
校验提示文案
czchc
校验提示文案
HugoLuo
校验提示文案
R总你懂的
校验提示文案
Bing哥儿
校验提示文案
随波扬浪过
因此还用着群晖,没换photoprism
校验提示文案
CasparLi
校验提示文案
lulee007
校验提示文案
废柴大叔
校验提示文案
值友7787041464
校验提示文案
心灵史学
校验提示文案
垚土土土土
校验提示文案
Daan
校验提示文案
值友3510951358
校验提示文案
后卫
校验提示文案
[已注销]
校验提示文案
值友2551143521
校验提示文案
值友3646908204
校验提示文案
看得见的风
校验提示文案
买贵了买贵了
校验提示文案
windykyo
校验提示文案
爪爪酱
校验提示文案
冰块与火把的F
校验提示文案
暴力蜗牛
校验提示文案
大志若勇Nodis
校验提示文案
reallygeek
校验提示文案
云想流月
校验提示文案
central
校验提示文案
已签到
校验提示文案
Kevin丿
校验提示文案
star_liu
校验提示文案
灭神屠佛
校验提示文案
ClegeA
校验提示文案
野旷天
校验提示文案
问题不大吧
校验提示文案