SiaとNextcloudで作る低コストな自作クラウドストレージアプリ
今回の記事では、DropboxやGoogle Driveのようなクラウドストレージのウェブアプリを、はるかに低コストで自作する方法をご紹介します。この方法なら、1TBあたり月額約0.60ドルでクラウドストレージを利用できます。比較すると、同じ容量をDropboxでは月額8.25ドル、Google Driveでは月額10ドルで利用することになります。
動画チュートリアル
本ガイドの手順を一通り解説し、最終的な完成形をお見せするスクリーンキャストを作成しました。結果は本記事と同じになりますが、動画ではGUIでの設定を多めに、本記事では可能な限りコマンドラインで操作しています。
動画で学びたい方は、下記の「Docker用のファイルとフォルダを作成する」セクションにあるファイルをダウンロードしてから、動画に沿って進めてください。
必要なもの
本ガイドは中級者向けです。Dockerコンテナや仮想マシンを使った経験がない方や、コマンドラインの操作に不慣れな方には、内容を追うのが難しいかもしれません。
動画デモではWindows 10を使っていますが、本チュートリアルはOSを選びません。ここで紹介する手順は、Dockerに対応した64ビットOSであれば、Windows、macOS、Linux、さらには一部のネットワークストレージ機器でも同様に実行できます。
本ガイドを完了するには、以下が必要です。
- 最低500 Siacoin(SC)
- 6GB以上の空きディスク容量(できればソリッドステートドライブ[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というグラフィカルなユーザーインターフェースがあることをご存知かもしれません。この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というディレクトリを作成します。このフォルダ内でブロックチェーン全体をダウンロードするため、空き容量が6GB以上あるドライブ上に作成してください。- 以下の3つのファイルを
sia-nextcloudディレクトリにダウンロードします。 sia-nextcloudの中に、sia-dataとsia-uploadsという2つのディレクトリを作成します。
これらのファイルをダウンロードし、適切なフォルダを作成すると、ディレクトリ構成は次のようになります。
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に転送します。80は多くのシステムで特権ポートであり、アクセスに特別な権限が必要になるため、ここでは8080を選んでいます。
この設定では、コンテナが破棄されてもデータを保持できるように、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コンテナを再起動しても、最初から再設定する必要がなくなります。
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をベースにDockerコンテナを作成します。そこからSiaの最新リリース(執筆時点では1.3.2)をダウンロードして展開し、Siaのサーバーデーモンであるsiadを実行します。--modules gctwrフラグは、Siaストレージをレンタルするために必要なモジュールのみを読み込みます。--sia-directory /mnt/sia-dataフラグにより、Siaがdocker-compose.ymlで指定した永続ボリュームを使用するようになります。
このDockerfileで分かりにくいのは、socatと--api-addr localhost:8000フラグの存在です。私が最善を尽くしたにもかかわらず、Siaの開発者はDockerの利用を妨げるにもかかわらず、siadがlocalhost以外のポートにバインドすることを許可していません。その回避策として、本チュートリアルではSiaをlocalhost:8000にバインドするよう設定しています。socatがlocalhost以外の9980番ポートにバインドし、トラフィックをlocalhost:8000に転送します。少々不格好ですが、きちんと動作します。
Dockerfile.nextcloud
FROM nextcloud:12.0.0-apache
EXPOSE 80
Nextcloudが公式のDockerfileを公開しているため、このファイルは非常にシンプルです。追加したのはポート80でリッスンするための1行だけです。
コンテナを起動する
Docker用のファイルとフォルダの準備ができたら、コンテナを起動する準備が整いました。コマンドプロンプトで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分程度に短縮するための任意の回避策を以下に用意しました。待って同期する方を好む場合は、この手順をスキップして次のセクションに進んでください。
ブロックチェーン同期の回避策を適用するには、次の手順を実行します。
- 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では、ストレージ容量を「レンター契約」という形で事前に購入する必要があります。以下のコマンドは、12週間分のストレージとして500 SC分の契約を購入するための許容量を作成します。
docker exec -it sianextcloud_sia_1 ./siac renter setallowance 500SC 12w
執筆時点では、500 SCで約2TBのストレージを購入できますので、さらに容量が必要な場合は契約額を増やしてください。Siacoinの価値変動や、レンターとホストの増減によって価格は時間とともに変わりますが、契約期間中はストレージ価格が保証されます。
許容量を作成すると、Siaはストレージ契約の形成を開始します。この処理が完了するまで20〜30分かかります。次のコマンドで、Siaが形成した契約数を確認できます。
docker exec -it sianextcloud_sia_1 ./siac renter contracts
Siaが少なくとも20件の契約を作成したら、次のステップに進んでください。
Nextcloudの設定
Siaがデータの保存を開始できる状態になったので、Nextcloudコンテナを設定します。
NextcloudはコマンドラインでもウェブUIでも設定できます。ここではコマンドラインでの方法を使います。ウェブUIでセットアップしたい場合は、http://localhost:8080にアクセスし、動画チュートリアルの13:44からの手順に従ってください。
Nextcloudをインストールする
NextcloudのDockerコンテナを読み込むと、コンテナ内には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において外部ストレージプロバイダーとして機能するため、次のコマンドを入力して外部プロバイダーのサポートを有効化します。
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のホーム画面で、右上の歯車アイコンをクリックし、「アプリ」をクリックします。
- 左側のメニューで「ツール」カテゴリをクリックします。
- 下へスクロールして「Sia storage report」アプリを見つけ、その下にある「有効にする」ボタンをクリックします。
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の「ファイル」タブを開くと、Siaフォルダが表示されます。Nextcloudは、このフォルダ内のすべてのファイルを自動的にSiaネットワークにバックアップします。
SiaとNextcloudの使い方
ファイルのアップロードとダウンロード
NextcloudのSiaフォルダにファイルをアップロードすると、アプリはそのファイルを本チュートリアルで先ほど作成したsia-uploadsフォルダにコピーします。その後、Nextcloudはバックグラウンドでファイルを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
冗長性(Redundancy)が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連携はほぼ完了しました。
記事をランダムに読む









