Create Your Own Low-Cost Cloud Storage App with Sia and Nextcloud

Michael Lynch

SiaとNextcloudで自作する低コストなクラウドストレージアプリ

原文は Michael Lynch により に公開されました。 このブログを購読する

今回の記事では、DropboxやGoogle Driveのようなクラウドストレージのウェブアプリを自分で構築する方法を紹介します。ただし、コストは大幅に抑えられます。このソリューションなら、クラウドストレージのコストは約0.60ドル/TB/月で済みます。比較すると、同じ容量をDropboxでは月8.25ドル、Google Driveでは月10ドルで利用することになります。

インストールが完了したNextcloud

動画チュートリアル

このガイドの手順を順に解説し、最終的な完成形をデモするスクリーンキャストを作成しました。内容はこのブログ記事とまったく同じですが、動画ではより多くの設定を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に接続して、使っていないディスク容量を貸し出すことで収益を得ることができます。現在、Siaネットワーク上の価格は非常に安く、そのおかげでこれほど低コストでクラウドストレージソリューションを構築できるのです。

Nextcloud

Siaをご存知の方なら、SiaにはSia-UIというグラフィカルユーザーインターフェースがあることをご存知かもしれません。このUIは機能が限られています。最大の弱点はデスクトップアプリであるため、1台のコンピュータからしかファイルにアクセスできないことです。また、メディア表示にも対応していないため、クラウドストレージ内の写真や動画を見たい場合、ファイルをローカルマシンのフォルダにコピーしてから、そのコピーを開く必要があります。

Nextcloudロゴ

Sia-UIの制限を克服するために、このチュートリアルではNextcloudを使用します。Nextcloudはオープンソースのクラウドストレージ用ウェブアプリです。DropboxやGoogle Driveに似たウェブインターフェースを提供します。NextcloudはAmazon S3、Dropbox、OpenStackなど、さまざまなストレージプロバイダーとの互換性を備えるように設計されています。2017年2月、SiaチームはNextcloud用のカスタムプラグインを作成しました。このチュートリアルでは、このプラグインを使ってNextcloudとSiaを連携させます。

先に進む前にNextcloudを試してみたい方は、Nextcloudのウェブサイトで無料のインスタントデモを利用できます。

Docker

Dockerロゴ

Nextcloudはデータベース、ウェブサーバー、そしていくつかのサードパーティ製ソフトウェアライブラリを必要とするため、インストールがややこしいことで知られています。Nextcloudの面倒なインストール手順を踏む代わりに、このセットアップ全体をDockerに任せます。

Dockerを使うと、開発者は「コンテナ」内でアプリを構築できます。Dockerの用語で言うコンテナとは、アプリが必要とするすべてのコンポーネントにアクセスでき、余計なものは何も含まれない隔離された環境のことです。このガイドでは、SiaとNextcloud用のコンテナを作成し、docker-composeという機能を使ってそれらを結合し、相互に通信できるようにします。

Dockerコンテナをセットアップする

Docker用のファイルとフォルダを作成する

まず、このソリューション用のディレクトリを作成し、必要なファイルをすべてダウンロードします。

  1. sia-nextcloudというディレクトリを作成します。このフォルダ内にブロックチェーン全体をダウンロードするので、少なくとも6GBの空き容量があるドライブ上に作成してください。
  2. 以下の3つのファイルをsia-nextcloudディレクトリにダウンロードしてください。
  3. sia-nextcloud内にsia-datasia-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-compose.ymlをダウンロード

このファイルは、ウェブアプリのハイレベルなアーキテクチャを定義します。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

Dockerfile.siaをダウンロード

これは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

Dockerfile.nextcloudをダウンロード

このファイルはシンプルです。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-UIを実行して、DockerコンテナのSiaサーバーが何をしているかをグラフィカルに表示することもできます。Sia-UIは通常、独自のSiaサーバーインスタンスを実行しますが、ポート9980でリッスンしている既存のSiaインスタンスを検出すると、代わりにその既存のサーバーに接続します。Sia-UIを使えばSiaの動作をより視覚的に把握できますが、このチュートリアルでは完全に任意です。

Siaを設定する

任意:ブロックチェーンの同期を高速化する

Siaを使い始める前に、完全なブロックチェーンをダウンロードする必要がありますが、このプロセスには1〜3日かかることがあります。同期時間を30〜60分に短縮するための任意の回避策を以下に用意しました。待つことをいとわない場合は、このステップをスキップして次のセクションに進んでください。

ブロックチェーン同期の回避策を適用するには、次の手順に従ってください。

  1. 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
  1. SiaStatsの最新のスナップショットからSiaのconsensus.dbファイルをダウンロードします。
  2. consensus.dbファイルをsia-nextcloud/sia-data/consensus/consensus.dbにコピーします(既存のファイルを上書きします)。
  3. Dockerコンテナを再起動します。
docker-compose up -d
  1. ログを定期的に確認し、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コンテナ内で同じシードを再利用しないでください。同じシードで2つのウォレットを同時に実行すると、Siaの動作は不定になります。

新しい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の価値の変動や、レンターやホストの増減によって時間とともに変わりますが、契約期間中はストレージ価格が保証されます。

注意:レンタル契約の作成には固定費がかかるため、少額のレンタル契約では、購入するストレージ量に対してコストが線形に比例しません。言い換えれば、契約自体の作成コストが約130 SCかかるため、2TBのコストを単純に10で割って50 SCで200GBを購入することはできません。

アローワンスを作成すると、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アプリをコマンドラインからインストールすることはできないため、これらの手順はウェブブラウザで行う必要があります。

注意:Nextcloudは最近、コマンドラインでのアプリのインストールをサポートしましたが、この機能はバージョン13.0までNextcloudのリリースには含まれないようです。
  1. ブラウザでhttp://localhost:8080を開いて、NextCloudウェブアプリにアクセスします。
  2. 上記の「Nextcloudをインストールする」ステップで選択したNextcloudウェブアプリの認証情報を入力します。デフォルトの認証情報を使用した場合は、admin/adminになります。

    Nextcloudログイン

  3. Nextcloudのホーム画面で、右上の歯車アイコンをクリックし、「アプリ」をクリックします。

    Nextcloudのアプリボタン

  4. 左側のメニューで「ツール」カテゴリをクリックします。

    Nextcloudのアプリボタン

  5. 「Sia storage report」アプリまでスクロールし、その下にある「有効にする」ボタンをクリックします。

    Nextcloudのアプリボタン

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フォルダ

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との統合はほぼ完了しています。

この記事は「muse-spark-1.2-contributor」を使用して翻訳されました。

コメント