警告:本教程是本人打磨近兩年沉淀下的精華,干貨過多,請自行配水食用。
本教程可以讓你在一臺ubuntu機器上原地搭建一整套照片管理及同步系統(tǒng),如果你暫時沒有折騰的時間(兩三小時足夠),可以先看末尾整套系統(tǒng)的使用效果,點個收藏,等認真折騰的時候拿出來參考。
在NAS的使用場景中,照片同步及備份可以說是最重要的應用場景之一。在沒有NAS的情況下,各個手機廠商會使用自己的XX云服務來為你存儲一部分照片,這種服務通常能在一個由“不收費”、“速度快”、“空間大”的不可能三角中找到自己的位置。阿里云盤目前看起來不錯,但是我很難相信他會長期保持這種水準。
所以你要么付費享受高質量服務,要么忍受速度或存儲空間上的瓶頸。在幾年前我曾經想把小米云服務上的圖片下載到本地,但那種只支持單張照片操作的反人類設計讓我耗費了大量時間,下載下來后才發(fā)現(xiàn),云上存的并不是原圖,而是壓縮后的圖。有時候我會想,這種云服務可能并不是為我服務的,這只是一個好用的工具,讓我快速成為大數(shù)據的一部分,而且還要找我收錢。這應該也是眾多NAS用戶使用NAS的原因之一。
照片同步工具在成品NAS中有很多方案,比如群暉的QuickConnect+DS-photo+DS-file+photos+Moments,QC負責用內網穿透的方式解決網絡連接問題,DS photo/file負責將照片從終端設備同步到nas,Photos可以基于文件結構查看圖片,是傳統(tǒng)的相冊,Moments負責使用AI算法歸納照片,是智能相冊。成品NAS的方案在使用上很方便,文件同步可以自動進行,而Moments的AI分析能力也有種近似蘋果系圖片管理的體驗。優(yōu)點說完說說不足,首先QuickConnect服務需要你使用群暉的賬號,并且走群暉服務器的流量,那么群暉服務端如果想把你的數(shù)據考下來留一份,就跟從自己兜里拿東西一樣簡單,費盡心思還花了錢終究沒逃過大數(shù)據的法網,這不是很不甘心?DS-photo與DS-file兩個工具很不錯,但是閉源的app裝在手機上,并且擁有你的相冊權限,總感覺家里進了外人一樣。
實際上在開源世界中,其中的上面的每一款軟件都有與之對應的優(yōu)秀項目。使用Syncthing+NextCloud+Rsync+AquarHome+Photoprism可以達到同樣的效果。這些開源軟件都是社區(qū)中質量極高的項目,不僅品質上成,項目本身的更新也非?;钴S,而開源本身就消除了所有我們對隱私的顧慮。Syncthing可以不依賴單獨的內網穿透服務直接進行遠程文件同步,雖然中間要依賴公共的服務節(jié)點,但Syncthing公開的源代碼證明了它不會偷窺你的信息。NextCloud可以替代群暉的Photos作為傳統(tǒng)相冊使用。而Photoprism與Moments一樣具有強大的圖片分析能力。AquarHome作為幾個服務的控制臺,可以在同一個頁面上直觀的看到文件同步情況,并集成了rsync,可以按照自己的習慣完成一鍵備份。這套方案其實對于其他形式的文件同樣有效,如果你有文件同步的需求,這套方案也完全適用。
在此聲明一下,我是AquarHome開源個人home頁項目的開發(fā)者,這個項目對標Heimdall,針對DIY NAS場景開發(fā)了大量實用的組件,最近更新了搜索引擎的搜索聯(lián)想功能以及transmission全功能組件,更多功能在快速更新中。項目docker安裝,值得一試。
下面介紹如何搭建這套系統(tǒng)。由于整套方案涉及很多軟件,本來想寫一個綱領性的教程,但越寫越發(fā)現(xiàn)還是應該把完整的搭建過程展現(xiàn)出來,所以寫到最后變成了“保姆級”教程。但由于是DIY NAS的教程,所以即使是保姆級,也需要你有基礎的linux使用經驗,對docker的基本理解,以及對家庭網絡有基本概念。這篇教程可以讓你在一臺ubuntu上原地搭建一整套好用的文件管理及同步系統(tǒng),如果你覺得教程對你有幫助,可以先收藏,等想認真折騰的時候拿出來參考。
本教程使用docker-compose部署軟件。docker-compose是對docker的簡單封裝,使用命令行進行交互。與它類似的工具還有Portainer,它具有web界面,更加友好一些。但我本人更加習慣基于配置文件與命令行的docker-compose,簡潔透明,易于自動化。
我搭建這套系統(tǒng)是以ubuntu20為基礎的,系統(tǒng)安裝就不介紹了。系統(tǒng)安裝完以后需要安裝一些基礎的環(huán)境,這套系統(tǒng)需要python3、docker、docker-compose三個基礎工具。我寫了一個自動化腳本來適配我自己的需要,但是腳本不一定適合所有人,所以我把腳本通用的部分提供出來供參考。你可以根據需要一行一行地執(zhí)行,這樣便于排查問題。
### 使用root身份
sudo -i
### 安裝python3及python虛擬環(huán)境
apt install curl -y
apt install python3-pip -y
pip3 install virtualenv
pip3 install virtualenvwrapper
### 配置pyhton虛擬環(huán)境
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系統(tǒng)使用方式是: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
### 創(chuàng)建一個python虛擬環(huán)境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
這個腳本會創(chuàng)建一個命令,你可以在root用戶下使用aqserv start | stop | restart | ps來方便的實現(xiàn)整套系統(tǒng)的啟動、關閉、重啟及查看狀態(tài)操作。
1.搭建完基礎環(huán)境后,你需要有一個目錄來存放docker-compose.yml文件,因為這個組合中Photoprism需要用到數(shù)據庫,所以我們還需要在這個目錄下新建一個mariadb.init.d文件夾,在這個文件夾里面,新建一個init.sql文件用來作為數(shù)據庫的初始化腳本。目錄結構如下:
.
├── docker-compose.yml
└── mariadb.init.d
└── init.sql
2. 在init.sql文件中寫入如下內容,意思是新建一個名為"photoprism"的數(shù)據庫,并新建一個"root"數(shù)據庫用戶,密碼是"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/應用數(shù)據/路徑/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/應用數(shù)據/路徑/nextcloud:/var/www/html
- /你的/docker/應用數(shù)據/路徑/nextcloud/apps:/var/www/html/custom_apps
- /你的/docker/應用數(shù)據/路徑/nextcloud/config:/var/www/html/config
- /你的/docker/應用數(shù)據/路徑/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/應用數(shù)據/路徑/photoprism/storage:/photoprism/storage"
mariadb:
image: mariadb:10.4
volumes:
- /你的/docker/應用數(shù)據/路徑/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/應用數(shù)據/路徑/aquarhome/data:/var/aquardata
- /你的/docker/應用數(shù)據/路徑/aquarpool:/opt/aquarpool
- /你的/docker/應用數(shù)據/路徑/aquarhome/logs:/root/.pm2/logs
ports:
- 8172:8172
restart: unless-stopped
解釋一下上面的配置就是:這套配置部署了五個服務——Syncthing、Photoprism、AquarHome以及Photoprism所依賴的數(shù)據庫mariadb,每個服務有自己的app數(shù)據存儲路徑以及連接到存儲池的用戶數(shù)據路徑。
4. 配置文件寫好后,我們cd到配置文件所在的目錄下執(zhí)行docker-compose up -d,如果看到類似下面的輸出,就說明服務正常啟動了,稍等幾分鐘,等服務初始化完成,就可以訪問各個服務了。
配置和使用這套方案前,先來設定一個使用場景。假設我要去冰島旅游,我希望自己用手機拍照后,照片可以自動上傳到自己的NAS服務器并直接被相冊收錄。旅游回來以后我可以把最近幾天的照片放在一個“冰島游記”的文件夾下進行備份(歸檔)。
1.配置服務端Syncthing。Syncthing是一個跨平臺的文件同步方案,它可以安裝在安卓手機、PC、linux服務器上,Syncthing沒有IOS端,但可以通過macOS端迂回達到目的。另外Syncthing是去中心化的,所以每個端對于Syncthing來說并沒什么區(qū)別。上一節(jié)介紹的安裝過程就是將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?,F(xiàn)在我們點擊“+添加文件夾”,在設置中填寫如下信息,填寫后點擊保存。
2.服務器端做好第一階段配置后,我們需要在手機上也安裝一個Syncthing。
Syncthing官網下載頁面:https://syncthing.net/downloads/
Syncthing安卓包官方下載地址:https://f-droid.org/packages/com.nutomic.syncthingandroid/
3.下載安裝完成后,打開app,可以看到Syncthing的安卓端界面,在界面上建立一個同步任務。
在表單中填入同步的名字,文件夾ID(各個端靠這個名字來識別要同步的文件夾),以及手機上需要同步的照片目錄。
4.配置服務器端的連接。打開服務器端的web頁面,點擊右上角的“操作”按鈕,選擇“顯示ID”,把設備ID拷貝下來,發(fā)送到手機上,你也可以直接拿手機端掃碼添加,這里介紹最傳統(tǒng)的方式。
切換到“設備”標簽頁,點擊右上方的“+”號,添加設備,在表單中填寫上一步考過來的設備ID,然后給設備起個名字,點右上方對號確定。
這時候如果網絡情況良好,你就已經能在web端上看到一個設備請求連接的提示了,直接接收就可以不用在web端設置對手機端的連接了,在教程里還是費事走一遍流程。
5.對設備指定需要同步的文件夾。在web端點擊新添加的設備,點擊“選項”,在子頁面中進入“共享”標簽頁,然后點擊在第1步里面配置的同步文件夾。
如果你的網絡良好,應該就已經能看到有文件開始同步了,如果你沒有在wifi下使用,可能會耗費大量的流量,所以你可以先將設備暫停,在wifi下再進行第一次同步。Syncthing的app端可以設置為”在WIFI下運行”甚至在指定wifi下運行。你可以根據自己的需求進行調整,設置位置在“設置”->“運行狀況”中。
NextCloud是目前功能最強且開發(fā)者活躍的開源文件管理器。另一個有競爭力的方案是FileRun,它甚至比NextCloud還要強,但FileRun不開源,所以忍痛舍棄了。下面介紹NextCloud初始化配置步驟。
1.部署好docker-compose的應用后,需要等幾分鐘才能正常得看到NextCloud的web界面。如果你是按照我給出的配置部署的,那么服務地址是http://你機器所在的內網地址:8081。打開web頁面后它會要求你進行初始化設置。不要著急提交,因為我們需要把數(shù)據庫指定為mariadb。
可能沒有軟件開發(fā)經驗的朋友見到數(shù)據庫就比較反感。在此簡單介紹一下mariadb數(shù)據庫,它是目前IT業(yè)界最流行數(shù)據庫 Mysql被Oracle公司收購后,Mysql開發(fā)者創(chuàng)建的新的Mysql開源版本,其用法與接口規(guī)范與Mysql完全相同,現(xiàn)在可以說是開源方案中默認的關系性數(shù)據庫選型,例如如果你在ubuntu上安裝mysql,你會發(fā)現(xiàn)安裝的實際上是mariadb。在本套方案中就有兩個項目(NextCloud與Photoprism)依賴這個數(shù)據庫。為什么數(shù)據庫這么重要呢?因為對于任何稍微復雜一點的項目來說,使用數(shù)據庫都是最高效穩(wěn)定的數(shù)據存儲方案,雖然會引入一個額外的服務,但它給項目在功能和性能上帶來提升相比成本是完全值得的。就好比你做幾塊錢的小本生意不需要開車,齊個三輪就行,但生意做大了就必需得有輛車了。
2.點擊頁面上這個“Stroage & database”,可以看到選擇數(shù)據庫的頁面,選擇第二種“MySQL/MariaDB”,按下圖把信息配置好。數(shù)據庫帳戶名("root")及密碼("root")都是在“方案部署”那節(jié)中的docker-compose.yml配置文件中配置的,如果你改了配置,請注意在這里也修改掉,數(shù)據庫名稱nextcloud同樣是在“方案部署”章節(jié)中寫在init.sql文件中專門為nextcloud創(chuàng)建的數(shù)據庫。
最下面的數(shù)據庫地址需要詳細解釋一下,因為NextCloud與mariadb都部署在docker中,所以他們之間的互相通信需要靠docker-compose創(chuàng)建的虛擬網絡來進行,他們同屬一個虛擬子網,而docker-compose很貼心的將每個容器的名稱與它在虛擬子網中的IP地址進行了關聯(lián),所以你在一個容器中只需要直接輸入容器名稱就等同于輸入了這個容器的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,你終于有了一個自己的網盤系統(tǒng),并且可以自動把你手機的照片同步到網盤上。然而這還沒完,你還需要一個專業(yè)的智能相冊。
Photoprism應該是目前最活躍同時也是功能最強大的相冊管理系統(tǒng)。使用高效可靠的go語言編寫,內置業(yè)界兩大AI框架之一的Tensorflow,給人無限的想象空間。開源相冊系統(tǒng)其實有很多,比較著名的是Piwigo,這套方案一開始選型的就是Piwigo,但是Piwigo不支持外掛目錄,它強制你把圖片放置在它指定的目錄下,這讓人無法接收。而Photoprism的設計哲學就非常友好,它允許你指定多個原始目錄,并且Photoprism不會對原始目錄進行任何修改這種非侵入式的系統(tǒng)才是真正友好易集成的。
1.如果你按照與我一樣的docker-compose.yml內容配置,你的Photoprism端口就是8042,所以在瀏覽器中輸入http://部署機器所在的內網地址:8042就可以看到Photoprism的Web頁面了。首先需要登錄,初始用戶是admin,密碼是在docker-compose.yml中配置的。
2.輸入正確的帳戶信息后就進入了Photoprism的管理頁面,點擊左側Library下的Originals就是原始數(shù)據目錄,查看是否包含了你需要的文件夾,這些文件夾的路徑是在docker-compose.yml中配置的,如果你發(fā)現(xiàn)這個地方有問題,就需要先執(zhí)行aqserv stop把整個系統(tǒng)停掉,然后修改docker-compose.yml中的對應的Photoprism路徑配置,例如我集中存放照片的目錄是/opt/aquar/aquarpool/images,那么我的配置就是"- /opt/aquar/aquarpool/images:/photoprism/originals",修改完正確的地址后再執(zhí)行aqserv start啟動整套系統(tǒng)。
3.Originals目錄配置無誤后,點擊Library本身,然后在右側的界面中點擊START按鈕,Photoprism就開始分析你的原始數(shù)據并進行自動整理。分析時間會比較長,由你的照片總量及格式大小共同決定,這時候就可以先離開了,等待Photoprism完成分析。
4.等到Photoprism完成分析后,你就可以看到自己所有的照片被Photoprism納入其中,并且它幫你歸納出很多標簽。你可以通過各種維度來查看自己的照片庫。
到此,你已經擁有了一個強大的圖片庫管理工具,從照片同步到可靠存儲,再到查看與管理的整個功能閉環(huán)已經打通了。如果你想嘗嘗鮮,體驗一下,到這一步就可以了,但我們這個系列介紹的系統(tǒng)是要長期運行的,隨著時間的流逝,各種意外狀況就會出現(xiàn),比如停電、硬盤損壞、磁盤空間耗盡、某個系統(tǒng)出現(xiàn)bug等等。比意外更可怕的是,由于整套系統(tǒng)是自動化的,也許意外發(fā)生后我們無法立刻察覺,等到很久以后才被發(fā)現(xiàn),這時候除了要恢復系統(tǒng)本身,還掉進了恢復數(shù)據的深淵,如果意志力不夠強大,那這套系統(tǒng)多半就無疾而終了。
為了避免這種情況出現(xiàn),我們就需要一種手段來方便地監(jiān)控各個服務的狀態(tài),如果出現(xiàn)了問題能及時發(fā)現(xiàn),第一時間進行處理。服務狀態(tài)監(jiān)控以及業(yè)務指標面板在企業(yè)級系統(tǒng)中是常見的功能,Zabbix配合grafana就是這樣一套基礎方案。但是在需求雜亂又沒有利潤的家用領域并沒有對應的產品可用。所以我自己動手開發(fā)了開源項目AquarHome(GitHub地址:https://github.com/firemakergk/aquar-home)個人Home頁,這個項目的詳細介紹我在之前的文章中介紹過,想要了解項目細節(jié)可以看這兩篇文章。
Heimdall不合胃口,于是我開源了適合diy nas的AquarHome系統(tǒng)
AquarHome的配置方式也很簡單,在官方的說明文檔中有細致的介紹,我們需要用到的有NextCloud組件、Docker組件、增量備份組件、Syncthing組件,可以根據官方文檔的介紹進行配置。
配置好以后AquarHome的界面是這樣的因為我使用了TrueNas和Transmission,所以頁面上還有這兩個組件。
從上面可以看到,所有系統(tǒng)的核心狀態(tài)信息都展示在一起,在NextCloud組件中你可以看到與NextCloud頁面中完全一樣的內容,你甚至可以直接把文件下載到本地,在transmission組件中你可以直接在組件中完成下載任務的添加、啟停、刪除。AquarHome同樣考慮了安全性,使用的數(shù)據接口都是經過授權后的token方式,不會直接暴露你的用戶名密碼。
是騾子是馬拉出來溜溜,折騰了這么一大堆東西,總得能解決我們的問題才行。
首先在保持手機端Syncthing后臺運行的狀態(tài)下,用手機拍照。拍完照以后等待幾秒就能看到Syncthing組件的同步狀態(tài)發(fā)生了改變,等待同步完成后,NextCloud組件對應目錄中也出現(xiàn)了剛剛拍攝的照片。所以這套系統(tǒng)已經擁有了秒級同步的能力。本來拍了一個30秒的短視頻想做成gif傳上來,但是體積太大了,只能用錄屏代替,錄屏提現(xiàn)不了手機的操作,但是也可以作為參考了。
由于同步服務既同步新增操作也同步刪除操作,對于目錄同步的場景而言這是很合理的。但是如果你誤刪了手機的圖片,那么在服務存儲端也會把圖片刪除這還是比較郁悶的,而且很多時候我們需要階段性的對照片進行歸檔,比如我們開頭提到的場景:從冰島回來后(并去不起)我想把一路上拍的照片都存在一個叫“冰島游記”的文件夾中,這應該如何實現(xiàn)呢?
當然你可以直接登錄到主機上用命令行完成操作,或者使用其他管理工具完成這些操作,但是都不夠方便。所以我為了這個場景開發(fā)了“增量備份組件”,它基于Linux最強文件同步工具Rsync,詳細用法在官方文檔中可以找到。我們只需要在出發(fā)前進行一次歸檔操作,然后在回來后,再進行一次歸檔操作即可。整個過程直接在組件上完成,算上設置文件夾名稱,一共點擊5次鼠標。
到了這里,你終于原地搭建出了一套完全由自己控制的照片同步及管理系統(tǒng)。且整個系統(tǒng)是純正的開源血統(tǒng),沒有plus會員,無需隱私協(xié)議,無數(shù)活躍的開發(fā)者為你帶來持續(xù)的更新。優(yōu)秀的開源系統(tǒng)都有開放的API如果你有能力,還可以在這個基礎上擁有無限的擴展可能。這就是我理想中的開源NAS方案。
這篇文章的內容是自從我萌生自建開源NAS方案的想法兩年多來沉淀下的精華。中間的項目選型、集成調試、腳本開發(fā)、項目開發(fā)無不需要大量的精力,好在最終的結果令人滿,總算沒有做無用功。這套系統(tǒng)還會繼續(xù)升級,未來會探索針對家庭多媒體場景的功能,針對網絡攝像頭及遠程對講的功能,以及結合智能家居和人工智能的功能。我希望通過一個個優(yōu)秀的開源項目搭建起一套安全、穩(wěn)定、易擴展的全方位家庭IT系統(tǒng)。路還很長,希望自己能走得好,走得遠。
本來以為寫這篇文章需要兩天,沒想到寫了兩周,寫的時候曾經想拆分成幾篇文章來控制篇幅。這樣也可以收到更多的贊及熱度,但是權衡再三還是選擇了保持教程的完整性。如果你看到了這里,覺得教程對你有幫助或者啟發(fā),請不要吝嗇點贊,希望更多的朋友能從開源方案中收益,希望DIY NAS玩家可以擁有更好的體驗。
作者聲明本文無利益相關,歡迎值友理性交流,和諧討論~