Loading... # 使用 PhotoPrism, Pho, Alist 在自组NAS实现多地加密备份  ## 概述 前段时间我升级了自己的电脑,升级后剩下的B450m迫击炮配了块5600g,作为家庭服务器使用。由于不是成品NAS,且使用的是Windows + Hyper-v的配置,没有任何成品套件,所有服务都得自己整,不过这也大大增加了玩机的自由度。 家庭nas对于我而言,最主要的功能就是流媒体和备份手机里的文件。前者方案有很多Emby/Plex/Jellyfin。后者的要求就比较高了,我对方案的选择如下 1. 安全性:这个是我优先考虑的,因为我家的照片存着2002年到现在的照片。家庭组raid1是最保险的方法,raid5和raid10不用考虑,重建失败率太高不划算。但是raid1的硬件成本很高,所以我的nas上所有硬盘都是Single,安全性靠**冷盘备份**和**多地备份**。 2. 相册整理和访问:我的需求是每次出游,将**相机**和**手机**的照片全部整合。这个各家nas都有各自的方案,比如群晖的Moments,威联通的QuMagie,但是这都需要各自的系统。那么有没有一款软件可以全平台部署呢,当然有,这就是Photoprism,docker安装,ai可以用cpu跑,反正是nas,跑多久都无所谓。 3. 同步:这个很好理解,就是将照片传到nas上,然后nas同步备份到各个网盘 - 手机同步照片:使用Pho + PhotoPrism的Webdav服务,将手机的相册同步到NAS上 - NAS同步网盘:Alist + Rclone 实现加密同步 这套方案配置完成后,手机里仅需两个应用,Pho和PhotoPrism(PWA安装,实际上装一个Pho就Ok了) ## 设备和软件 那么整理一下用到的软件 - 平台:Windows Server 2022 DataCenter 21H2 - 软件: - Alist: 开源,按需付费(付费版本`RMB¥50`,所有功能免费,付费版本增加挂载和GUI,可以手动实现) - WinSW: 开源,免费。用于创建自定义服务,实现alist开机自启 - Docker Desktop: Windows版本的Docker,基于WSL2 - Pho: 开源按需付费(基础功能够用,付费版本`JP¥1050`) - Rclone Browser: Rclone Gui版本,配置更加方便 - PhotoPrism: 开源按需付费(可以付费捐助) - 宝塔Windows面板: 免费,付费功能用不到。用于配置Nginx和定时任务(可以替换) - 所有上传服务都是通过WebDav,所以你可以自由搭配组合,下面开始配置 ## 软件配置 ### 配置宝塔Windows面板 下载页:https://www.bt.cn/new/download.html 其他系统可以使用平替,但是在Windows上,方便好用的貌似只有宝塔   安装过程中会提示不推荐安装在C盘,所以给宝塔单独分区  安装完成后根据提示访问地址即可  ### 配置Docker Desktop 安装前需要启用Hyper-V和WSL #### Windows Server版本操作 1. 打开服务器管理器 2. 点击添加角色和功能,下一步  3. 找到Hyper-V并添加,下一步  4. 找到WSL并添加  #### Windows 非Server版本操作 1. 按下`Win`+`S`,输入功能,打开`启用或关闭Windows功能`  2. 选择 - Hyper-v - Windows虚拟机监控程序平台 - 适用于Linux的Windows子系统 - 虚拟机平台  #### 配置WSL2 到这一步,wsl已经启用,我们打开终端进行测试 ```shell wsl ```  我们需要把wsl切换到wsl2 1. 下载wsl2[内核更新包](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi)并进行安装  2. 切换版本 ```shell wsl --set-default-version 2 ```  3. 更新 ```shell wsl --update ```  到这里wsl2配置完成 #### Docker Desktop 访问官网并下载:https://www.docker.com/products/docker-desktop/  打开安装包进行安装,这里勾选使用wsl2而不是hyper-v(老版本是用的hyper-v,体验非常差),等待安装完即可  安装完成启动,正常启动我们可以看到如下的wsl发行版  启动后根据要求登录,看到界面就说明安装完成了  > 注意: > > 1. wsl一定要安装wsl2内核,并切换到wsl2 > 2. docker desktop可能会卡启动阶段,一般都是wsl的问题,但是docker desktop给的信息非常笼统,只有一个`Unexpected WSL error`。我个人建议使用`wsl --install Ubuntu-22.04`进行排查,在启动ubuntu的过程中会有详细的报错代码,把报错代码丢到Google上搜一下就有结果了,当Ubuntu子系统能正常启动时,再去启动docker即可 ### 配置PhotoPrism  [PhotoPrism官方安装文档](https://docs.photoprism.app/getting-started/) 官方文档有这么段描述 > #### Databases[¶](https://docs.photoprism.app/getting-started/#databases) > > PhotoPrism is compatible with [SQLite 3](https://www.sqlite.org/) and [MariaDB 10.5.12+](https://mariadb.org/).[2](https://docs.photoprism.app/getting-started/#fn:2) Note that [SQLite is generally not a good choice](https://docs.photoprism.app/getting-started/troubleshooting/sqlite/) for users who require scalability and high performance, and that support for [MySQL 8 has been discontinued](https://github.com/photoprism/photoprism/issues/1764) due to low demand and missing features.[3](https://docs.photoprism.app/getting-started/#fn:3) SQLite并不适用于生产环境,在数据库大了后会有性能问题,所以我们使用Mariadb数据库(由于缺乏新功能所以官方弃用了MySQL8) #### 数据库 你可以选择直接前往[Mariadb官网](https://mariadb.org/)下载,但是我为了方便全部使用Docker,考虑到其他服务也需要使用到数据库,我们单独起一个Mariadb + myphpadmin 若你只想给PhotoPrism独立的数据库,那么你可以跳过这一小节,并使用PhotoPrism[官方的配置文件](https://dl.photoprism.app/docker/windows/docker-compose.yml) 我个人的习惯是使用docker-compose,每个服务一个文件夹  创建文件夹`mariadb`,并创建`docker-compose.yml`文件  ```yaml version: '3' # 创建Mariadb使用的卷 volumes: mariadb: driver: local # 创建网络,这里注意命名,docker创建的网络命名为 <文件夹名>_jammy_net # 我这里就是 mariadb_jammy_net networks: jammy_net: driver: bridge services: mariadb: container_name: mariadb # 容器名称 image: mariadb:lts-jammy # 这里使用lts-jammy,注意photoprism需要MariaDB 10.5.12+ restart: always environment: MYSQL_ROOT_PASSWORD: password # 数据库root密码 MYSQL_USER: username # 创建的用户名 MYSQL_PASSWORD: password # 创建的用户密码 expose: - "3309" # 暴露端口,这里因为我还有其他数据库,3306占用了,所以使用3309,你挑一个自己喜欢的端口就行,但是下面映射端口也需要改 ports: - "3309:3306" # 端口映射,方便我们使用外部工具管理里 volumes: - mariadb:/var/lib/mysql # 映射数据库文件 networks: - jammy_net # 指定容器使用的网络 phpmyadmin: container_name: phpmyadmin # 方便我们管理数据库 image: phpmyadmin restart: always expose: - "13005" # 暴露的端口,随便选 ports: - "13005:80" # 端口映射 environment: - PMA_HOST=mariadb # 指定数据库 - PMA_PORT=3306 # 指定数据库端口,因为走的容器间通信,所以这里不是映射后的端口 networks: - jammy_net # 指定网络 ``` 根据自己需求配置后,启动容器  常用命令 ```shell # 后台启动容器 docker-compose up -d # 停止容器 docker-compose stop # 销毁容器 docker-compose down # 启动停止的容器 docker-compose start ``` 接下来我们为PhotoPrism创建数据库,访问刚刚配置的phpmyadmin,http://localhost:13005/,输入用户名密码  点击账户  点击新增用户  输入用户名,并**勾选**创建同名数据库,记住这边的密码,等会配置Photoprism需要用到  #### PhotoPrism 终于到主角出场了,下面开始配置,您可以使用[官方的配置文件](https://dl.photoprism.app/docker/windows/docker-compose.yml),并根据[官方指南](https://docs.photoprism.app/getting-started/docker-compose/#__tabbed_1_5)进行配置,这里我就不按官方的来了 创建如下的文件夹结构  配置文件,这些功能默认即可,若需要修改,软件启动后也是能修改的 ```yaml version: '3.8' # 重要: 请使用刚刚配置的网络名称 networks: mariadb_jammy_net: external: true # 外部网络 # Example Docker Compose config file for PhotoPrism (Windows / AMD64) services: photoprism: image: photoprism/photoprism:latest container_name: photoprism # restart: unless-stopped 在配置测试正确之前请勿使用 stop_grace_period: 10s security_opt: - seccomp:unconfined - apparmor:unconfined ports: - "13004:2342" # HTTP port (host:container) environment: PHOTOPRISM_ADMIN_USER: "zerolouis" # 管理员用户名 PHOTOPRISM_ADMIN_PASSWORD: "password" # 管理员初始密码 (8-72 字符) PHOTOPRISM_AUTH_MODE: "password" # 认证方式 (public, password) PHOTOPRISM_SITE_URL: "http://localhost:2342/" # 服务地址,这里不修改公网解析di'zhi "http(s)://domain.name(:port)/(path)" PHOTOPRISM_DISABLE_TLS: "false" # 禁用 HTTPS/TLS,即使站点 URL 以 https:// 开头且证书可用 PHOTOPRISM_DEFAULT_TLS: "true" # 如果没有其他证书可用,则默认为自签名 HTTPS/TLS 证书 PHOTOPRISM_ORIGINALS_LIMIT: 5000 # 文件大小限制,单位为MB,若需要传输大文件请适当增加 PHOTOPRISM_HTTP_COMPRESSION: "gzip" # 改善传输速度和带宽利用率的方式 (none or gzip) PHOTOPRISM_DEBUG: "false" # 是否在调试模式下运行,显示其他日志消息 PHOTOPRISM_READONLY: "false" # 禁止修改原件文件夹;禁用导入、上传和删除 PHOTOPRISM_EXPERIMENTAL: "false" # 启用实验特性 PHOTOPRISM_DISABLE_CHOWN: "false" # 禁止在启动时通过 chmod 和 chown 更新存储权限 PHOTOPRISM_DISABLE_WEBDAV: "false" # 禁用内置 WebDAV 服务器 PHOTOPRISM_DISABLE_SETTINGS: "false" # 禁用设置 UI 和 API PHOTOPRISM_DISABLE_TENSORFLOW: "false" # 禁用依赖TensorFlow的功能 PHOTOPRISM_DISABLE_FACES: "false" # 禁用人脸检测和识别(需要 TensorFlow) PHOTOPRISM_DISABLE_CLASSIFICATION: "false" # 禁用图像分类(需要 TensorFlow) PHOTOPRISM_DISABLE_VECTORS: "false" # 禁用矢量图形支持 PHOTOPRISM_DISABLE_RAW: "false" # 禁止RAW图像的引索和转换 PHOTOPRISM_RAW_PRESETS: "false" # 允许在转换 RAW 图像时应用用户预设(降低性能) PHOTOPRISM_JPEG_QUALITY: 90 # 较高的值会增加 JPEG 图像和缩略图的质量和文件大小 (25-100) PHOTOPRISM_DETECT_NSFW: "false" # 自动将可能令人反感的私密照片标记为私密照片(需要 TensorFlow) PHOTOPRISM_UPLOAD_NSFW: "true" # 允许上传可能令人反感的内容(如果没有 TensorFlow,则无效) PHOTOPRISM_DATABASE_DRIVER: "mysql" # 数据库驱动 PHOTOPRISM_DATABASE_SERVER: "mariadb:3306" # 数据库地址,在同一个网络就可以使用容器名称访问了,注意这里是3306,而不是映射后的地址 PHOTOPRISM_DATABASE_NAME: "photoprism" # 数据库名称 PHOTOPRISM_DATABASE_USER: "photoprism" # 数据用户 PHOTOPRISM_DATABASE_PASSWORD: "password" # 刚刚创建的数据库的密码 PHOTOPRISM_SITE_CAPTION: "PHOTOPRISM AI驱动的相册应用" # 网站标题 PHOTOPRISM_SITE_DESCRIPTION: "Zerolouis的家庭相册" # 网站meta信息 PHOTOPRISM_SITE_AUTHOR: "Zerolouis" # 网站meta信息 ## 视频转码设置 (https://docs.photoprism.app/getting-started/advanced/transcoding/): # PHOTOPRISM_FFMPEG_ENCODER: "software" # H.264/AVC encoder (software, intel, nvidia, apple, raspberry, or vaapi) # PHOTOPRISM_FFMPEG_SIZE: "1920" # video size limit in pixels (720-7680) (default: 3840) # PHOTOPRISM_FFMPEG_BITRATE: "32" # video bitrate limit in Mbit/s (default: 50) working_dir: "/photoprism" # 请勿修改 ## 存储文件: 使用 "/" 而不是 "\" 作为分隔符, "~" 是一个 C:/user/{username} 的快捷方式, "." 表示当前目录 volumes: # 根据你自己的相册位置配置,将文件夹映射到/photoprism/originals/<文件夹> # "C:/user/username/folder:/photoprism/folder" # 一个例子 - "F:/Picture:/photoprism/originals/share1" # 我这里就影射了两个文件夹 - "E:/Pictures:/photoprism/originals/share2" - "./storage:/photoprism/storage" # PhotoPrism的数据,确保文件夹可写入 networks: - mariadb_jammy_net # 刚刚配置的网络,确保和数据库在同一个网络中 ``` 接下来我们启动  访问我们映射的端口,http://localhost:13004/,正常情况下应该就可以看到了photoprism的登录界面了  进来以后找到设置,就可以切换成中文了  在资料库中,点击引索,PhotoPrism就会开始引索你的相册了  > 注意: > > 1. 这个过程十分耗时,因为所有ai都是用CPU在跑,我的上一台J3455的Nas,跑两万多张图片用了近半周的时间 > 2. PhotoPrism会监视文件夹变化,所以不需要每次传照片都去手动引索,一切都是自动的 #### 反向代理 这部分以宝塔为例,你也可以使用[nginxproxymanager](https://nginxproxymanager.com/)之类的工具或直接手写配置文件,我使用宝塔是因为他真的挺方便的。 点击添加站点后,输入你的域名,由于家宽封锁常用端口,所以这里以非标准端口为例子  创建完成后,进入设置-反向代理-添加反向代理  根据你的需求添加SSL证书,根据需要修改为非标准端口,并在**网站配置文件**中添加如下内容 ```nginx # 如果没有Upgrade头,则$connection_upgrade为close,否则为upgrade map $http_upgrade $connection_upgrade { default upgrade; '' close; } ```  在**反向代理的配置文件**中添加如下内容 ```nginx # websocket代理 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; # 调整上传大小 client_max_body_size 20000m; ``` 这样你就可以使用域名访问PhotoPrism了,其他服务也是这样操作 ### 配置alist  Alist官方文档:https://alist.nn.ci/zh/ 下载页:https://github.com/alist-org/alist/releases 找到windows版本并下载   将下载下来的`alist.exe`放入一个空文件夹,`shift+鼠标右键`打开powershell ```shell .\alist.exe server ``` 等待配置文件的生成,然后`ctrl+c`终止,接下来配置密码 ```shell # 获得管理员信息 以下两个不同版本,新版本也有随机生成和手动设置 # 低于v3.25.0版本 .\alist.exe admin # 高于v3.25.0版本 # 随机生成一个密码 .\alist.exe admin random # 手动设置一个密码 `NEW_PASSWORD`是指你需要设置的密码 .\alist.exe admin set NEW_PASSWORD # 配置完成后启动 .\alist.exe server ``` 启动后我们就能看到如下界面,输入用户名: `admin`,和你刚刚配置的密码`NEW_PASSWORD`  恭喜你,Alist搭建就完成了,进入后点击下方的管理  根据文档配置你需要的网盘,[官方文档](https://alist.nn.ci/zh/guide/)写的很清楚了,这边就不赘述了(选夸克是因为88vip)。这边说下加密盘的配置  #### 加密配置 官方文档在这:https://alist.nn.ci/zh/guide/drivers/Crypt.html 我个人的需求是仅将我上传的照片和视频加密,文件夹不加密,这样我就根据目录结构知道这个文件是什么,且不让网盘去扫我的图片和视频 主要更改的地方   这样设置我们就可以在挂载的网盘中加密存储了 我们在新创建的路径中上传文件试一下   这样配置就成功了 #### 开机自启动 在桌面版alist中集成了原生的开机自启,阔绰的朋友可以购买,图个方便。开发者也给了自启动[配置指南](https://alist.nn.ci/zh/guide/install/manual.html),可以参考。 本质上都是把软件配置成Windows服务,实现自启动,我这里习惯使用WinSW了,下面进行配置 1. 下载WinSW:https://github.com/winsw/winsw/releases  2. 将下载的`WinSW-x64.exe`复制到alist的目录下,重命名成任意名字,这里使用`alist-sevice.exe`  3. 创建**同名**配置文件`alist-service.xml`,添加如下内容 ```xml <service> <id>alist-service</id> <name>alist-service</name> <description>alist服务</description> <executable>./alist.exe</executable> <arguments>server</arguments> </service> ``` 4. 打开终端,将alist注册成Windows服务并启动 ```shell # 安装服务 .\alist-service.exe install # 启动服务 .\alist-service.exe start ``` 5. 打开服务页面我们就能看到我们创建的服务了,点击属性设置成自动即可  6. 启动后会在目录下生成几个文件  下面贴一下WinSW的常用命令 > Your renamed *WinSW.exe* binary also accepts the following commands: > > > | Command | Description | > | -------------------------------------------------------------------------------------------- | ------------------ | > | [install](https://github.com/winsw/winsw/blob/v3/docs/cli-commands.md#install-command) | 安装服务 | > | [uninstall](https://github.com/winsw/winsw/blob/v3/docs/cli-commands.md#uninstall-command) | 卸载服务 | > | [start](https://github.com/winsw/winsw/blob/v3/docs/cli-commands.md#start-command) | 启动服务 | > | [stop](https://github.com/winsw/winsw/blob/v3/docs/cli-commands.md#stop-command) | 停止服务 | > | [restart](https://github.com/winsw/winsw/blob/v3/docs/cli-commands.md#restart-command) | 重启服务 | > | [status](https://github.com/winsw/winsw/blob/v3/docs/cli-commands.md#status-command) | 查看服务状态 | > | [refresh](https://github.com/winsw/winsw/blob/v3/docs/cli-commands.md#refresh-command) | 刷新配置 | > | [customize](https://github.com/winsw/winsw/blob/v3/docs/cli-commands.md#customize-command) | 自定义可执行文件 | ## 同步配置 注意,为保证数据安全,切记使用**单向同步**,双向同步可能会导致意外发生 ### 手机->PhotoPrism相册同步 使用到的软件:https://github.com/fregie/pho 网站:https://pho.tools/  非常好用的一个相册同步软件,我们可以链接到PhotoPrism的Webdav服务进行同步。高级设置需要购买,但是免费版本已经够用了,可以根据自己的需要购买软件。 打开软件,选择一个相册,作为需要同步的相册,这里我选择相机  然后进行webdav的配置,还记得我们刚刚映射的目录吗,我在我映射的文件夹内创建了一个手机专用的文件夹 ```plain volumes: - "F:/Picture:/photoprism/originals/share1" - "E:/Pictures:/photoprism/originals/share2" ```  PhotoPrism的WebDav访问路径和网站同名,例如我们刚刚反向代理后的网址是: `https://test.website.com:10080` 那么这里的**URL**就是这个网址 **用户名**和**密码**就是我们设置的PhotoPrism的密码 存储根目录,根据你自己创建的文件夹填写,例如我刚刚创建的文件夹映射目录如下 `F:/Picture/Xiaomi13U:/photoprism/originals/share1/Xiaomi13U` 配置完成后返回,点击右下角的同步就可以把照片传入硬盘中了 另外,软件还支持SMB/NFS/百度网盘,若你不需要PhotoPrism,直接使用Pho将文件同步到硬盘中即可  ### NAS->网盘加密同步 #### 安装Rclone和Rclone Browser 下载: - Rclone下载页:https://rclone.org/downloads/ - Rclone Browser下载页:https://github.com/kapitainsky/RcloneBrowser/releases Rclone下载后是一个压缩文件,解压备用,并在文件夹下创建一个文件`rclone.conf` Rclone Browser是一个安装包,根据指引安装即可 打开软件,填写以下两项,然后点击OK  点击Config,这时候会跳出终端,我们进行alist加密盘的挂载  1. 输入n,添加新的远程  2. 为远程起名  3. 输入52,选择webdav  4. 输入alist的地址( `http[s]://domain:port/dav/`,这里可以填写反向代理后的地址) 根目录:`http://localhost:5244/dav/` 这里我输入了根地址,也就是挂载了整个alist,你可以根据需要来挂载  5. 选择webdav类型,输入7  6. 下面输入alist用户名,y,密码  7. token直接空着,回车,不需要高级配置  8. 按y确认保存  9. 配置完成后就能看到,双击打开,    你也可以使用rclone将alist挂载为硬盘使用 #### 配置同步 1. 选择目标文件,点击上方的`Upload`按钮  2. 创建上传任务,点击`run`直接运行,这里建议使用`save task`保存当前任务  3. 保存任务后,在Task一栏中找到任务,点击`Run`执行任务  4. 这样我们就能看到任务详情了,点击右上角的按钮,复制当前任务的命令  可以看到我们刚刚执行的任务如下 ```shell D:\Software\rclone-v1.65.0-windows-amd64\rclone.exe --config D:/Software/rclone-v1.65.0-windows-amd64/rclone.conf copy --ignore-existing --verbose --transfers 4 --checkers 8 --contimeout 60s --timeout 300s --retries 3 --low-level-retries 10 --stats 1s --stats-file-name-length 0 --fast-list D:\Book\[SPY×FAMILY_color_CN][Vol_01] alist:Picture(加密)/test/[SPY×FAMILY_color_CN][Vol_01] ``` #### 定时执行 这一步就非常简单了,使用宝塔的计划任务  ## 总结 那么整个流程到这里就结束了,多盘同步只需要在alist挂载多个硬盘,并定时执行多个rclone任务,就可以保证数据的多地备份了,个人认为已经是一个极低成本的多地备份方案,对于我们这些家庭用户已经完全够用了。 所有服务通过webdav服务通信,大大增加了灵活性,你可以根据需要去掉中间任意一个环节,例如: - 如果你不需要整理相册,那么去掉photoprism,直接将pho的上传地址改为alist地址,后面继续上面的备份操作 - 如果你只需要备份本地文件,那么只需要保留rclone和alist,继续上面的备份操作 最后修改:2023 年 12 月 25 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏
5 条评论
作者对主题的挖掘深入骨髓,展现了非凡的洞察力和理解力。
?总结与建议类?
建议引入反面案例,增强辩证性。
对生命本质的追问充满哲学思辨。
这是一篇佳作,无论是从内容、语言还是结构上,都堪称完美。