SiaとNextcloudで自作する低コストなクラウドストレージアプリ
原文は Michael Lynch により に公開されました。 このブログを購読する
今回の記事では、DropboxやGoogle Driveのようなクラウドストレージのウェブアプリを自分で構築する方法を紹介します。ただし、コストは大幅に抑えられます。このソリューションなら、クラウドストレージのコストは約0.60ドル/TB/月で済みます。比較すると、同じ容量をDropboxでは月8.25ドル、Google Driveでは月10ドルで利用することになります。
動画チュートリアル
このガイドの手順を順に解説し、最終的な完成形をデモするスクリーンキャストを作成しました。内容はこのブログ記事とまったく同じですが、動画ではより多くの設定をGUIで行っています。一方、このブログ記事では可能な限りコマンドラインを使用しています。
動画での解説の方が好みであれば、以下の「Docker用のファイルとフォルダを作成する」セクションでファイルをダウンロードしてから、動画に沿って進めることをおすすめします。
要件
このガイドは中級者向けです。Dockerコンテナや仮想マシンを使った経験がなかったり、コマンドラインの操作に慣れていなかったりすると、内容についていくのは難しいでしょう。
動画デモではWindows 10を使用しましたが、このチュートリアルはシステムに依存しません。ここで紹介する手順は、Dockerに対応した64ビットOSであれば、Windows、Mac OS X、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は機能が限られています。最大の弱点はデスクトップアプリであるため、1台のコンピュータからしかファイルにアクセスできないことです。また、メディア表示にも対応していないため、クラウドストレージ内の写真や動画を見たい場合、ファイルをローカルマシンのフォルダにコピーしてから、そのコピーを開く必要があります。
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というディレクトリを作成します。このフォルダ内にブロックチェーン全体をダウンロードするので、少なくとも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
このファイルは、ウェブアプリのハイレベルなアーキテクチャを定義します。SiaコンテナとNextcloudコンテナの読み込み方法や、コンテナ同士が通信するために必要な設定オプションをDockerに指示します。
この設定では、コンテナ内のポートをローカルマシンのポートにマッピングします。たとえば、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です。Linuxの最小構成であるDebian JessieをベースにDockerコンテナを作成します。そこからSiaの最新リリース(執筆時点では1.3.2)をダウンロードして解凍し、Siaサーバーデーモンであるsiadを実行します。--modules gctwrフラグは、Siaストレージをレンタルするために必要なSiaモジュールのみを読み込みます。--sia-directory /mnt/sia-dataフラグは、Siaがdocker-compose.ymlで指定された永続ボリュームを使用するようにします。
このDockerfileでわかりにくいのは、socatと--api-addr localhost:8000フラグが存在する点です。最善を尽くしたにもかかわらず、Siaの開発者はsiadがDockerのシナリオを破綻させるにもかかわらず、非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ディレクトリにcdし、以下のコマンドを入力してください。
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分かかりました。Siaをハードディスクドライブ(HDD)で実行している場合は、数時間かかります。
ブロックチェーンの同期を完了する
次に、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自体はまだインストールされていないため、最初のステップは以下のコマンドで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ネットワークにバックアップします。
NextcloudでSiaを使う
ファイルのアップロードとダウンロード
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アプリはフォルダ作成をサポートしていません。ウェブアプリ上ではそのオプションが表示されますが、フォルダを追加しようとすると「フォルダを作成できませんでした」と表示されるだけです。
アプリ内でのテキスト編集ができない
Nextcloudアプリには、クラウドストレージフォルダ内のプレーンテキストファイルを編集するための簡易テキストエディタが含まれています。残念ながら、これはSiaフォルダ内のファイルでは機能しません。Siaフォルダ内のテキストファイルを編集しようとすると、Nextcloudは大量のエラーメッセージを表示し、編集内容は一切保存されません。
まとめ
このチュートリアルでは、Nextcloudの独自インスタンスをデプロイし、Siaによる低コストなファイルバックアップを追加する方法を紹介しました。
今後数か月のうちに、ますます多くのアプリがSiaと統合されていくと予想しています。数日前、SiaはMinio(分散オブジェクトストレージサーバー)との新たな統合を発表しました。このチュートリアルで使った手法は、他のアプリをデプロイしてSiaと統合する際にも役立つでしょう。
- 更新(2017-09-13):Minioとの統合はほぼ完了しています。
記事をランダムに読む










コメント
ログインしてコメントする