用 Sia 與 Nextcloud 打造你的低成本雲端儲存應用程式
原文由 Michael Lynch 于 發布,訂閱此部落格
在今天這篇文章中,我要示範如何架設你自己的雲端儲存網頁應用程式,功能類似 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 的安裝有點麻煩,因為它需要資料庫、網頁伺服器以及好幾個第三方軟體套件。與其忍受繁瑣的安裝流程,我改用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 儲存磁碟區,讓容器即使被刪除,資料仍能保留。./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 具名磁碟區中。這樣當你重新啟動 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),解壓縮後執行siad,也就是 Sia 的伺服器常駐程式。--modules gctwr這個參數只會載入租用 Sia 儲存空間所需的模組。--sia-directory /mnt/sia-data則確保 Sia 會使用docker-compose.yml中指定的持久化磁碟區。
這個 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 個單字組成的密語,稱為「錢包助記詞」,並顯示在終端機上,如下方範例輸出所示:
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 要求你以「租用合約」的形式預先購買儲存空間。以下指令會建立一筆額度,讓 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作為網頁應用程式的帳號密碼。如果你是在可信任的網路環境(例如家中)部署這套系統,使用這些預設值也沒問題。如果你要將這套系統部署到對外開放的網際網路伺服器上,就應該改用更安全、不同的帳號密碼。
啟用外部儲存提供者
在 Nextcloud 中,Sia 是作為外部儲存提供者運作的,因此請輸入以下指令來啟用 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 的整合已接近完成。
隨機一篇部落格










留言
登入後參與討論