基于开源方案的生产力NAS 篇五:【全栈开源·保姆级】打磨两年的精华——从零开始,教你搭建多端全自动同步的照片管理系统

2021-12-17 11:54:05 292点赞 1952收藏 153评论

【全栈开源·保姆级】打磨两年的精华——从零开始,教你搭建多端全自动同步的照片管理系统

警告:本教程是本人打磨近两年沉淀下的精华,干货过多,请自行配水食用。

本教程可以让你在一台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开源个人主页使用教程

【全栈开源·保姆级】打磨两年的精华——从零开始,教你搭建多端全自动同步的照片管理系统

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玩家可以拥有更好的体验。

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起

UGREEN 绿联 DX4600 Pro 4盘位NAS(奔腾N6005、8GB)

UGREEN 绿联 DX4600 Pro 4盘位NAS(奔腾N6005、8GB)

1849元起

ZSpace 极空间 私有云 Z4Pro 8G版 4盘位NAS存储(N97、8GB)

ZSpace 极空间 私有云 Z4Pro 8G版 4盘位NAS存储(N97、8GB)

2485.01元起

UGREEN 绿联 DX4600 四盘位NAS存储 (赛扬N5105、8GB)

UGREEN 绿联 DX4600 四盘位NAS存储 (赛扬N5105、8GB)

1749元起

ZSpace 极空间 私有云 Z4Pro 性能版 NAS存储(N305、16GB)

ZSpace 极空间 私有云 Z4Pro 性能版 NAS存储(N305、16GB)

3479.01元起

QNAP 威联通 TS-464C2 四盘位 NAS网络存储(赛扬N5095、8GB)黑色

QNAP 威联通 TS-464C2 四盘位 NAS网络存储(赛扬N5095、8GB)黑色

2599元起

UGREEN 绿联 DX4600+ 4盘位NAS(赛扬N5105、8GB)

UGREEN 绿联 DX4600+ 4盘位NAS(赛扬N5105、8GB)

1999元起

Synology 群晖 DS224+ 双盘位NAS(赛扬J4125、2GB)

Synology 群晖 DS224+ 双盘位NAS(赛扬J4125、2GB)

2849元起

ZSpace 极空间 私有云 Z4Pro 16G版 4盘位NAS存储(N97、16GB)

ZSpace 极空间 私有云 Z4Pro 16G版 4盘位NAS存储(N97、16GB)

2799元起

ZSpace 极空间 私有云 Z423 旗舰版 8盘位NAS存储(锐龙R7-5825U、64GB)

ZSpace 极空间 私有云 Z423 旗舰版 8盘位NAS存储(锐龙R7-5825U、64GB)

5899元起

QNAP 威联通 TS-466C 四盘位NAS(奔腾N6005、8GB)

QNAP 威联通 TS-466C 四盘位NAS(奔腾N6005、8GB)

3199元起

TERRAMASTER 铁威马 F4-424 Pro 四盘位NAS(Intel Core i3、32GB)黑色

TERRAMASTER 铁威马 F4-424 Pro 四盘位NAS(Intel Core i3、32GB)黑色

2499元起

Synology 群晖 DS220+ 2盘位NAS (赛扬J4025、2GB)

Synology 群晖 DS220+ 2盘位NAS (赛扬J4025、2GB)

2179元起

UGREEN 绿联 DH2600 双盘位NAS (N5105、4GB)

UGREEN 绿联 DH2600 双盘位NAS (N5105、4GB)

1299元起

ZSpace 极空间 私有云Z2Pro 四核2盘位NAS家庭个人云网络存储服务器手机平板扩容适用iPhone15 水

ZSpace 极空间 私有云Z2Pro 四核2盘位NAS家庭个人云网络存储服务器手机平板扩容适用iPhone15 水

1290.51元起

ZSpace 极空间 私有云 T2 2盘位NAS存储(RK 3568、4GB)

ZSpace 极空间 私有云 T2 2盘位NAS存储(RK 3568、4GB)

1699元起

ASUS 华硕 AS6702T 4盘位NAS存储 黑色(Core2 Quad Q8300、4GB)

ASUS 华硕 AS6702T 4盘位NAS存储 黑色(Core2 Quad Q8300、4GB)

4299元起
153评论

  • 精彩
  • 最新
  • 看完之后,发现三千块钱的群晖真是物超所值啊……

    校验提示文案

    提交
    折腾最后的归宿就是群晖,这世上就没有花钱的不是 [高兴] [高兴]

    校验提示文案

    提交
    反向思维,我如果挂个装机服务200一次是装这套系统不是有戏 [害羞]

    校验提示文案

    提交
    还有8条回复
    收起所有回复
  • 楼主发这个没啥用啊,compose配置放到什么值得买上每行的缩进都全没了 [尴尬]
    花了这么多功夫,去实现最基础的同步和照片功能,看完全文完美地激发网友们对群晖等系统的喜爱。
    这里说一下,qc在有公网地址时,它会直接通过端口转发,而不会浪费群晖自家的带宽。另外你说的拷贝一份数据也是假象,因为qc传输强制加了ssl锁,传输途中是加了密的。像楼主这样配置,小白如果没启用https证书,你的相册反倒是明文传输在网上。

    校验提示文案

    提交
    如果开源方案实现了与付费产品类似的体验算不上“有用”,那么需要集成到什么程度才能被判定为“有用”呢?
    qc那个,在公网ip的场景下直接走点对点当然非常好,可问题不在于他机制如何,问题在于他有没有能力监听,那么在ssl上就有了另一个关键问题,这个ssl是谁签发的?如果是群晖服务器签发的那不就好比你家的钥匙在别人手里,你觉得非常安全,因为除了这个人其他人都进不来?

    校验提示文案

    提交
    缩进是挺烦的,我调好了发出去,看的时候就又乱了

    校验提示文案

    提交
    还有12条回复
    收起所有回复
  • 看到折腾到这个层面的话,感觉可能选择自己写码定制实现了

    校验提示文案

    提交
    实际上也确实定制代码了,AquarHome嘛

    校验提示文案

    提交
    收起所有回复
  • iPhone的实况图片如何同步?或者有更好的方案?

    校验提示文案

    提交
    因为syncthing有mac版本,所以可以同步mac上的icloud曲线救国

    校验提示文案

    提交
    还要iphone传到mac上?我的天mac半年没打开了

    校验提示文案

    提交
    还有9条回复
    收起所有回复
  • 同ubuntu+docker,本来是用debian的,结果amd的核显驱动在debian下死活折腾不好,就换ubuntu了。
    数据备份直接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上有汉化,自己搜一下。

    校验提示文案

    提交
    次奥,错字,github。

    校验提示文案

    提交
    我的ubuntu跑在esxi上,目前显卡直通有问题,准备换pve试试,你的原型跟我的很接近了

    校验提示文案

    提交
    收起所有回复
  • 技术性太强。给个赞👍打赏了

    校验提示文案

    提交
    多谢支持,写完感觉确实过于硬核

    校验提示文案

    提交
    肯折腾的人,多半不差,放心吧

    校验提示文案

    提交
    收起所有回复
  • syncthing不支持ios,这步拦掉了很多人

    校验提示文案

    提交
    确实,很难受

    校验提示文案

    提交
    收起所有回复
  • 技術大佬,看見代碼就將我攔在門外

    校验提示文案

    提交
    的确需要很多耐心和一些基础

    校验提示文案

    提交
    代码门槛是挺高的

    校验提示文案

    提交
    收起所有回复
  • syncthing可以不同步删除

    校验提示文案

    提交
    确实,我也试过,但是官方很不推荐这种用法,整天挂个警告挺烦的

    校验提示文案

    提交
    收起所有回复
  • 很好,赞一个。但是文章的命令不是我们md+yml编写的么?还是说张大妈不支持,看着很难受 [皱眉] [皱眉]

    校验提示文案

    提交
    平台没有代码的md语法,很难受

    校验提示文案

    提交
    收起所有回复
  • 记得好像是photoprism不能创建账户?还是不能删除照片?另外photo的安卓app貌似不太好用。好久之前了。
    因此还用着群晖,没换photoprism

    校验提示文案

    提交
    按照photoprism的设计哲学,应该是没法彻底删除照片的,他的原则是不影响原始数据

    校验提示文案

    提交
    收起所有回复
  • 直接next cloud啊 搞那么复杂干嘛

    校验提示文案

    提交
    亲,这边建议先看文章呢

    校验提示文案

    提交
    nextcloud数据不是直接存在硬盘里面的,其他设备不能直接smb访问,syncthing比较好一点,不过安卓端做的太差,不是原生,而是前端+后端,不是很好用

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • 我是unraid 里 俩docker nextcloud ➕ photoprism

    校验提示文案

    提交
    那跟这个很接近了

    校验提示文案

    提交
    收起所有回复
  • 支持!开源的项目必须支持!photoprism未来可期,目前还有些不足,比如易用性,识别率等等,另外缺点是UI。不过为了开源,我也忍了

    校验提示文案

    提交
    谢谢支持,为开源做贡献就是为全人类做贡献

    校验提示文案

    提交
    收起所有回复
  • 第一段就错了,群晖的quicconnect机制建议作者好好查查,路由端口开放的情况下哪里需要过裙辉服务器中转。quicconnect是比ddns更强大的ip反馈机制,不存在ddns的一级dns服务器省市dns服务器运营商dns服务器的存活传递变更时间,群晖服务器只记录你的外网ip地址,随时传递到你的客户端。如果这样说你还不明白,你关闭再打开你的路由器,让你的外网ip变化一次,手机不要连wifi,手机任何一个群晖客户端用quicconnect连你的群晖服务器,可以马上连上,退出,换ddns连,从你重新打开路由算起你10分钟能连上算你的宽带运营商更新dns.算快的了。

    校验提示文案

    提交
    那问题来了,不使用类似隧道的nat技术的话,群晖如何实现无公网ip设备的链接呢?我的知识储备想不到其他途径,请赐教

    校验提示文案

    提交
    收起所有回复
  • 这套能部署在windows上吗?考虑到兼容性,想用ntfs格式,同时平台也熟。

    校验提示文案

    提交
    这我还真不清楚,我一直对windows的docker不是很了解

    校验提示文案

    提交
    收起所有回复
  • 马克一下,一周后我考完试,慢慢看,干货满满的。

    校验提示文案

    提交
    祝考研成功

    校验提示文案

    提交
    收起所有回复
  • 这么麻烦,还不如买个成品算了

    校验提示文案

    提交
    反过来想如果一点也不麻烦,那成品的价值何在呢?

    校验提示文案

    提交
    收起所有回复
  • 平时用resiliosync 比较多,不知道是不是必须用syncthing?

    校验提示文案

    提交
    当然不是必需,选Syncthing主要是因为开源且项目活跃,质量也很高。

    校验提示文案

    提交
    收起所有回复
  • 相册有支持视频的么?就是自己拍的小视频

    校验提示文案

    提交
    我也在找这种,目前没发现好的

    校验提示文案

    提交
    收起所有回复
提示信息

取消
确认
评论举报

相关好价推荐
查看更多好价

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
1.9K
扫一下,分享更方便,购买更轻松