使用 Sia 與 Nextcloud 打造專屬的低成本雲端儲存應用程式
在今天的文章中,我將示範如何架設屬於你自己的雲端儲存網頁應用程式,類似 Dropbox 或 Google Drive,但成本大幅降低。這個解決方案提供的雲端儲存費用約為每 TB 每月 0.60 美元。相比之下,同樣的儲存空間在 Dropbox 上每月要花 8.25 美元,在 Google Drive 上則要 10 美元。
影片教學
我製作了一段螢幕錄影,逐步解說本指南的操作步驟並展示最終成果。它的成果與這篇部落格文章完全相同,只不過較多設定是在圖形介面中完成,而這篇文章則盡可能使用命令列。
如果你偏好影片教學,建議你先下載下方「為 Docker 建立檔案與資料夾」一節中的檔案,然後跟著影片一起操作。
需求條件
本指南的對象是進階使用者。如果你沒有 Docker 容器或虛擬機器的使用經驗,或是不習慣使用命令列,可能會難以跟上本指南。
我在影片示範中使用的是 Windows 10,但本教學完全不受系統限制。以下步驟適用於任何支援 Docker 的 64 位元作業系統,包含 Windows、Mac OS X、Linux,甚至部分網路儲存裝置。
要完成本指南,你將需要:
- 至少 500 枚 Siacoin(SC)
- 6 GB 的可用磁碟空間,建議使用固態硬碟(SSD)
- 已在系統上安裝Docker Community Edition(免費)
所需時間
本指南的操作步驟約需20 分鐘的主動操作時間。不過,安裝過程中有幾個階段必須等待 Sia 完成處理,需時數分鐘到數小時,因此總耗時約為 3 至 4 小時。
- 建立 Docker 容器:5 分鐘
- 設定 Sia:主動操作 10 分鐘,總耗時 3 至 4 小時
- 設定 Nextcloud:5 分鐘
解決方案的組成元件
Sia
在這個解決方案中,我使用 Sia 作為網頁應用程式的後端儲存。我先前曾寫過幾篇文章介紹 Sia,因為它是我最喜愛的新技術之一。Sia 是一個去中心化的檔案儲存網路。使用者可以連上 Sia 並出租未使用的磁碟空間來賺取報酬。目前 Sia 網路上的價格非常低,因此你才能以極低的磁碟空間成本打造雲端儲存解決方案。
Nextcloud
如果你對 Sia 有所了解,可能知道 Sia 有自己的圖形使用者介面,稱為Sia-UI。這個介面的功能相當有限。主要缺點在於它是桌面應用程式,因此你只能從單一電腦存取檔案。它也不支援任何媒體預覽,所以若想在雲端儲存空間中檢視照片或影片,必須先將檔案複製到本機資料夾才能開啟。
為了克服 Sia-UI 的限制,本教學採用了 Nextcloud。Nextcloud 是一款開放原始碼的雲端儲存網頁應用程式,提供類似 Dropbox 或 Google Drive 的網頁介面。Nextcloud 設計上可與多種不同的儲存服務供應商相容,包含 Amazon S3、Dropbox 和 OpenStack。在 2017 年 2 月,Sia 團隊為 Nextcloud 撰寫了專屬外掛,我將使用它來連接 Nextcloud 與 Sia。
如果你想在繼續操作前先試用 Nextcloud,可以到 Nextcloud 網站上體驗免費的即時試用。
Docker
Nextcloud 的安裝較為繁瑣,因為它需要資料庫、網頁伺服器以及數個第三方軟體套件。與其經歷繁瑣的 Nextcloud 安裝流程,我使用 Docker 來處理整個設定。
Docker 讓開發者能夠在「容器」中建構應用程式。以 Docker 的術語來說,容器是一個隔離的環境,應用程式在其中可取得執行所需的所有元件,不多也不少。在本指南中,你將為 Sia 與 Nextcloud 建立容器,並使用名為 docker-compose 的功能將它們串連起來,使其能夠彼此通訊。
設定 Docker 容器
為 Docker 建立檔案與資料夾
首先,你將為此解決方案建立一個目錄並下載所有必要的檔案:
- 建立一個名為
sia-nextcloud的目錄。你將在此資料夾內下載完整的區塊鏈,因此請確保所在的磁碟機至少有 6 GB 的可用空間。 - 將下方的三個檔案下載至
sia-nextcloud目錄中: - 在
sia-nextcloud內建立兩個目錄:sia-data與sia-uploads。
下載這些檔案並建立對應的資料夾後,你的目錄結構應如下所示:
sia-nextcloud/
sia-data/
sia-uploads/
docker-compose.yml
Dockerfile.nextcloud
Dockerfile.sia
下方我已附上每個檔案的完整內容,並簡要說明其作用。
docker-compose.yml
version: "3"
volumes:
nextcloud-data:
services:
sia:
build:
context: .
dockerfile: Dockerfile.sia
restart: on-failure
ports:
- "9980:9980"
volumes:
- ./sia-data:/mnt/sia-data
- ./sia-uploads:/mnt/sia-uploads
nextcloud:
build:
context: .
dockerfile: Dockerfile.nextcloud
ports:
- "8080:80"
links:
- sia:siad_container
volumes:
- ./sia-uploads:/mnt/sia-uploads
- nextcloud-data:/var/www/html
這個檔案定義了網頁應用程式的高層架構。它告訴 Docker 如何載入 Sia 與 Nextcloud 容器,並指定容器彼此通訊所需的設定選項。
此設定會將容器內的通訊埠對應至本機的通訊埠,因此 9980:9980 這一行會將本機的 9980 通訊埠轉送至 Sia 容器內的 9980。這讓 Sia 容器外的應用程式能夠與容器內的 Sia 伺服器通訊。同樣地,8080:80 會將本機的 8080 通訊埠轉送至容器內網頁伺服器的 80 通訊埠。我選擇 8080 是因為在大多數系統上,80 是需要特殊權限才能存取的特權通訊埠。
此設定也會建立 Docker 儲存 volume,讓容器即使被刪除,仍能保存資料。./sia-data:/mnt/sia-data 會讓 Sia 容器存取你先前建立的 sia-data/ 資料夾。在容器內,該路徑會顯示為 /mnt/sia-data。./sia-uploads:/mnt/sia-uploads 這一行也有類似的效果。
Sia 與 Nextcloud 預期會在同一個系統上、共用單一檔案系統中執行。在本教學的架構中,它們位於不同系統、擁有各自獨立的檔案系統,但透過在兩個容器的設定中加入 sia-uploads 相關設定,讓它們得以共用上傳用的路徑,這樣就已足夠。
最後,nextcloud-data:/var/www/html 讓 Nextcloud 能將其設定資訊保存在名為 nextcloud-data 的具名 Docker volume 中。這可確保當你重新啟動 Nextcloud 容器時,不需要從頭重新設定 Nextcloud。
Dockerfile.sia
FROM debian:jessie-slim
ENV SIA_VERSION 1.3.2
ENV SIA_PACKAGE Sia-v$SIA_VERSION-linux-amd64
ENV SIA_ZIP ${SIA_PACKAGE}.zip
# Choose a binary release of Sia.
ENV SIA_RELEASE https://github.com/NebulousLabs/Sia/releases/download/v$SIA_VERSION/$SIA_ZIP
# Choose the directory within the container where Docker will place Sia.
ENV SIA_DIR /opt/$SIA_PACKAGE
RUN apt-get update && apt-get install -y \
socat \
wget \
unzip
# Download and install Sia.
RUN wget $SIA_RELEASE
RUN unzip $SIA_ZIP -d /opt
# Make the Sia ports available to the Docker container's host.
EXPOSE 9980 9981
# Configure the Sia daemon to run when the container starts.
# Specify the Sia directory as /mnt/sia so that you can view these files outside
# of Docker.
WORKDIR $SIA_DIR
ENTRYPOINT socat tcp-listen:9980,reuseaddr,fork tcp:localhost:8000 & ./siad --modules gctwr --sia-directory /mnt/sia-data --api-addr localhost:8000
這是 Sia 的 Dockerfile。它以精簡版的 Debian Jessie Linux 為基底建立 Docker 容器,接著下載最新版本的 Sia(撰寫本文時為 1.3.2),解壓縮後執行 Sia 伺服器常駐程式 siad。--modules gctwr 旗標僅載入租用 Sia 儲存空間所需的 Sia 模組。--sia-directory /mnt/sia-data 旗標則確保 Sia 使用在 docker-compose.yml 中指定的永續性 volume。
這個 Dockerfile 中令人困惑的部分是 socat 與 --api-addr localhost:8000 旗標的存在。儘管我已盡力嘗試,Sia 開發者仍拒絕讓 siad 綁定至非 localhost 的通訊埠,即使這會破壞 Docker 使用情境。作為因應之道,本教學將 Sia 設定為綁定至 localhost:8000,再由 socat 綁定至非 localhost 的 9980 通訊埠,並將流量轉送至 localhost:8000。做法有點笨拙,但確實可行。
Dockerfile.nextcloud
FROM nextcloud:12.0.0-apache
EXPOSE 80
這個檔案相當單純,因為 Nextcloud 本身就有發布官方的 Dockerfile。我唯一加入的只有一行用來監聽 80 通訊埠的設定。
啟動容器
Docker 檔案與資料夾就緒後,就可以啟動容器了。在命令提示字元中 cd 進入你的 sia-nextcloud 目錄,然後輸入以下指令:
docker-compose up -d
若要檢查容器的狀態,請使用 logs 指令:
docker-compose logs
當 Sia 載入完成後,你會在日誌中看到如下的序列:
sia_1 | Loading...
sia_1 | (0/5) Loading siad...
sia_1 | (1/5) Loading gateway...
sia_1 | (2/5) Loading consensus...
sia_1 | (3/5) Loading transaction pool...
sia_1 | (4/5) Loading wallet...
sia_1 | (5/5) Loading renter...
sia_1 | Finished loading in 0.7577895 seconds
如果你在容器內執行 siac,會看到 Sia 已開始與 Sia 網路同步其區塊鏈:
docker exec -it sianextcloud_sia_1 ./siac consensus
Synced: No
Height: 730
Progress (estimated): 0.6%
設定 Sia
選用:加速區塊鏈同步
在開始使用 Sia 之前,必須先下載完整的區塊鏈,但這個過程可能需要 1 至 3 天才能完成。下方我提供了一個選用的因應方法,可將同步時間縮短至 30 至 60 分鐘。如果你願意等待 Sia 自行同步,可以跳過此步驟,直接前往下一節。
若要套用區塊鏈同步的因應方法:
- 關閉 Docker 容器。
# Tell Sia to shut down gracefully.
docker exec -it sianextcloud_sia_1 ./siac stop
# Give Sia a few seconds to shut down gracefully.
sleep 5
# Stop the Docker containers.
docker-compose down
- 從最新的 SiaStats 快照下載 Sia 的consensus.db 檔案。
- 將
consensus.db檔案複製到sia-nextcloud/sia-data/consensus/consensus.db(覆蓋原有檔案)。 - 重新啟動 Docker 容器。
docker-compose up -d
- 定期檢查容器日誌,直到 Sia 處理完新的區塊鏈並完成載入:
docker-compose logs
當 Sia 完成載入後,你會在日誌中看到類似以下的訊息:
sia_1 | Finished loading in 0.7577895 seconds
在我的測試中,這個過程在 SSD 上花了 50 分鐘。若你在傳統硬碟(HDD)上執行 Sia,則需要數小時。
完成區塊鏈同步
現在,你需要等待 Sia 完成區塊鏈同步。你可以定期執行以下指令來檢查狀態:
docker exec -it sianextcloud_sia_1 ./siac consensus
當 Sia 同步完成後,你會在輸出中看到 Synced: Yes,如下所示:
Synced: Yes
Block: 000000000000000fdd4d3b48b096e048ad78f8f4fb88d21a025cd5411950e57e
Height: 117094
Target: [0 0 0 0 0 0 0 80 208 66 215 153 200 154 90 98 77 172 145 117 174 173 42 79 94 33 89 166 121 200 173 209]
Difficulty: 228263093718558163
為錢包載入 Siacoin
接下來,你需要在 Docker 容器內建立一個 Siacoin 錢包,並向其轉入至少 500 SC。
若要建立新的 Sia 錢包,請輸入以下指令:
docker exec -it sianextcloud_sia_1 ./siac wallet init
Sia 會產生一組由 29 個單字組成的通行詞組,稱為「wallet seed(錢包種子)」,並顯示於主控台中,如下方範例輸出所示:
guru delayed kidneys viewpoint rover request negative september number yodel aggravate
reheat soapy incur update later bimonthly bacon unusual godfather usher tiers pencil
ultimate vivid unsafe farming costume agile
Wallet encrypted with password:
guru delayed kidneys viewpoint rover request negative september number yodel aggravate
reheat soapy incur update later bimonthly bacon unusual godfather usher tiers pencil
ultimate vivid unsafe farming costume agile
這組種子掌控著你 Siacoin 餘額的存取權,因此請將其複製到安全的地方,並切勿在網路上公開。Sia 會令人困惑地先顯示一組種子,接著再顯示一組完全相同的密碼。這讓許多使用者感到意外,但這是 Sia 預期的行為。
建立錢包後,你需要使用種子通行詞組來解鎖錢包。請輸入以下指令,然後貼上你剛才產生的種子。
docker exec -it sianextcloud_sia_1 ./siac wallet unlock
最後,產生一個新的 Siacoin 錢包位址:
docker exec -it sianextcloud_sia_1 ./siac wallet address
請向你剛產生的錢包轉入至少 500 SC。如果你手邊沒有 Siacoin,可以購買或挖礦取得。
建立租用者合約
Sia 要求你以「renter contracts(租用者合約)」的形式預先購買儲存空間。下方的指令會建立一筆額度,讓 Sia 以 500 SC 購買為期 12 週的儲存合約。
docker exec -it sianextcloud_sia_1 ./siac renter setallowance 500SC 12w
撰寫本文時,500 SC 約可購買 2 TB 的儲存空間,因此若需要更多空間,可以提高合約金額。隨著 Siacoin 幣值波動以及更多租用者與主機提供者進入市場,價格會隨時間變動,但在合約期間內,你的儲存價格是固定的。
建立額度後,Sia 便會開始建立儲存合約。這個過程約需 20 至 30 分鐘才能完成。你可以執行以下指令來檢查 Sia 已建立的合約數量:
docker exec -it sianextcloud_sia_1 ./siac renter contracts
當 Sia 已建立至少 20 份合約後,即可前往下一步。
設定 Nextcloud
Sia 現已準備好開始儲存資料,接下來要設定你的 Nextcloud 容器。
你可以透過命令列或網頁介面來設定 Nextcloud。本教學採用命令列方式。如果你偏好透過網頁介面設定 Nextcloud,可以前往http://localhost:8080 並依照我的影片教學中從 13:44 開始的步驟操作。
安裝 Nextcloud
當你載入 Nextcloud Docker 容器時,Nextcloud 的檔案已存在於容器內,但 Nextcloud 尚未安裝,因此第一步是使用下方指令來安裝 Nextcloud。
docker exec --user www-data -it sianextcloud_nextcloud_1 ./occ maintenance:install --database "sqlite" --database-name "nextcloud" --database-user "root" --database-pass "root" --admin-user "admin" --admin-pass "admin"
你應該會看到以下內容:
Nextcloud is not installed - only a limited number of commands are available
creating sqlite db
Nextcloud was successfully installed
上方範例指令使用 root/root 作為資料庫憑證,並使用 admin/admin 作為網頁應用程式的憑證。若你是在可信任的網路(例如家中)部署此系統,使用這些預設值並無問題。若你是部署在面向網際網路的伺服器上,則應選擇不同且安全的憑證。
啟用外部儲存供應商
Sia 在 Nextcloud 中作為外部儲存供應商運作,因此請輸入以下指令以啟用 Nextcloud 對外部供應商的支援。
docker exec --user www-data -it sianextcloud_nextcloud_1 php occ app:enable files_external
安裝 Sia Nextcloud 應用程式
現在要安裝 Nextcloud 的 Sia 應用程式。遺憾的是,目前無法透過命令列安裝 Nextcloud 應用程式,因此你需要在網頁瀏覽器中執行以下步驟。
- 在瀏覽器中開啟http://localhost:8080 以存取 Nextcloud 網頁應用程式。
- 輸入你在上方「安裝 Nextcloud」步驟中設定的 Nextcloud 網頁應用程式憑證。若你使用預設憑證,則為
admin/admin。 - 在 Nextcloud 首頁中,點選右上角的齒輪圖示,然後點選「Apps」。
- 在左側選單中點選「Tools」分類。
- 向下捲動至「Sia storage report」應用程式,並點選下方的「Enable」按鈕。
設定 Sia 支援
此流程的最後一步是將 Sia Nextcloud 應用程式連接至你的 Sia 伺服器實例。請輸入以下指令:
docker exec --user www-data -it sianextcloud_nextcloud_1 php occ files_external:create Sia sia null::null
docker exec --user www-data -it sianextcloud_nextcloud_1 php occ files_external:config 1 apiaddr siad_container:9980
docker exec --user www-data -it sianextcloud_nextcloud_1 php occ files_external:config 1 datadir /mnt/sia-uploads
你的 Sia Nextcloud 整合已完成!
如果你在瀏覽器中開啟 Nextcloud 的「Files」分頁,會看到一個 Sia 資料夾。Nextcloud 會自動將此資料夾中的所有檔案備份至 Sia 網路。
在 Nextcloud 中使用 Sia
上傳與下載檔案
當你將檔案上傳至 Nextcloud 中的 Sia 資料夾時,應用程式會將其複製到你在教學先前建立的 sia-uploads 資料夾。接著 Nextcloud 會在背景將檔案上傳至 Sia 網路以建立備份。
為了節省本機空間,你可以刪除已完整上傳至 Sia 的檔案。你可以使用以下指令檢查哪些檔案已完整備份至 Sia:
docker exec -it sianextcloud_sia_1 ./siac renter -v
Renter info:
Storage Spending: 1.449 SC
Upload Spending: 48.65 mS
Download Spending: 3.887 mS
Unspent Funds: 217.7 SC
Total Allocated: 219.2 SC
Tracking 8 files:
File size Available Progress Redundancy Renewing Sia path
5.60 MB Yes 86.67% 2.60 Yes 08 Hospital Beds.mp3
143.12 MB Yes 101.67% 3.00 Yes Futurama - s01e08 - A Big Piece Of Garbage.mp4
175.37 MB Yes 100.67% 3.00 Yes Futurama - s01e09 - Hell Is Other Robots.mp4
3.72 MB Yes 56.67% 1.70 Yes IMG_20170725_204611.jpg
3.37 MB Yes 100.00% 3.00 Yes IMG_20170725_204704.jpg
3.39 MB Yes 100.00% 3.00 Yes IMG_20170725_204727.jpg
3.64 MB Yes 96.67% 2.90 Yes IMG_20170725_204928.jpg
3.25 MB Yes 63.33% 1.90 Yes IMG_20170725_204944.jpg
任何備援係數達到 3.0 或以上的檔案,都可以安全地從 sia-uploads 中刪除。
如果你嘗試下載或檢視已從 sia-uploads 刪除的檔案,Sia Nextcloud 應用程式會自動重新下載該檔案以供你在本機使用,不過這可能需要數秒到數分鐘,取決於檔案大小與你的網路速度。
限制
不支援子資料夾
雖然 Sia 原生允許使用者建立資料夾來整理上傳的檔案,但 Sia Nextcloud 應用程式不支援建立資料夾。網頁應用程式雖然顯示了該選項,但若嘗試新增資料夾,只會顯示「Could not create folder」。
不支援應用程式內文字編輯
Nextcloud 應用程式內建了一個簡易的文字編輯器,可用於編輯雲端儲存資料夾內的純文字檔。遺憾的是,這項功能在 Sia 資料夾內的檔案上無法使用。若嘗試編輯 Sia 資料夾中的文字檔,Nextcloud 會顯示一連串的錯誤訊息,且不會儲存任何編輯內容。
結論
本教學示範了如何部署你自己的 Nextcloud 實例,並透過 Sia 加入低成本的檔案備份功能。
我預期未來幾個月會有越來越多應用程式與 Sia 整合。幾天前,Sia 宣布與Minio(一套分散式物件儲存伺服器)展開新的整合。本教學中使用到的技術將有助於你部署其他應用程式並將其與 Sia 整合。
- 更新(2017-09-13):Minio 整合已接近完成。
隨機一篇部落格









