CloudGarageを使って長く使えるオンラインストレージ環境を作る（Nextcloud）


この記事は、[CloudGarage Advent Calendar 23日目](https://adventar.org/calendars/2264)の記事です。
今回は表題の通りCloudGarageを使ってオブジェクトストレージをデータ保存先としたオンラインストレージを構築しています。

# ownCloudは使えない
まずは使用するソフトについて
オンラインストレージ構築であればownCloudが有名です。
ownCloudを使えばかんたんにオンラインストレージが構築できます。

ですが今回ownCloudは使用しません（できません？）
理由は今回の目玉（？）であるオブジェクトストレージを扱うには力不足なためです。

一応ownCloudでもオブジェクトストレージは使えます。
しかし、ownCloudでは専用フォルダが作成されるだけで、データ保存先としては設定できません。
[無制限ストレージ with 新しいConoHa Object Storage and ownCloud](https://qiita.com/ukitiyan/items/aaa1a2f3fe6e820007c0)

ownCloud Enterpriseであれば保存先に設定できるようですが有料です。
[ownCloud Enterpriseライセンス(有償ライセンス）](https://owncloud.jp/solutions/enterprise)

S3QLなどを使ってデータ保存先をマウントしておく方法もありますが、保存領域にはアップロードされたファイルだけではなくメタ情報やログも記録されるため使い物にならないレベルでパフォーマンスが落ちます。（公式も非推奨とアナウンス）
[Configuring S3 and OpenStack Swift Objects as Primary Storage ? ownCloud 10.0.4 Server Administration Manual 10.0.4 documentation](https://doc.owncloud.org/server/latest/admin_manual/enterprise/external_storage/s3_swift_as_primary_object_store_configuration.html)

**そのためNextcloudを使います**
[https://nextcloud.com/](https://nextcloud.com/)
![alt](https://qiita-image.cloudremix.net/Nextcloud.jpg)

NextcloudはownCloud創設者の派生プロジェクトで、ownCloud Enterpriseでしか使えない機能を無料で使用できます。
もちろんこの中には、オブジェクトストレージを保存先に設定する機能も含まれています。

よって特に理由がないのであればownCloudよりNextcloudがおすすめです。
参考：[Nextcloud を使うべきか？](https://qiita.com/ynott/items/4d54b1210981cd292123)

今回はこのNextcloudを使ってオブジェクトストレージを活用した（容量不足を心配しないで良い）長く使えるオンラインストレージを作ろうというお話です。

# 目次

 - インスタンスをつくる
 - ミドルウェアのセットアップ
 - アプリケーションのセットアップ

# インスタンスをつくる
まずはインストール先となるサーバを用意をします。
ApacheとPHP、MySQLが動作すれば良いので、WordPress可のサーバであれば問題ありません。
ただしオンラインストレージという性質からレンタルサーバは避けましょう。
（公式ヘルプが提供されている場合でも容赦なくBANされます）

今回はCloudGarageの[ミドルウェアテンプレート](https://cloudgarage.jp/plan/)「LAMP（Apache2.4/PHP7/MySQL5.7）」を使用します。
必ず使うので80番と443番は開放しておいてください。（SSHを使う場合は22番も）
![alt](https://qiita-image.cloudremix.net/CloudGarage-Instance.jpg)
~~Ubuntuなんてわからないよ。apt-getだっけ？~~

# ミドルウェアのセットアップ
インスタントができたら、実際にセットアップをしていきます。
特別難しいことはありませんのでタイプミスにだけ気をつけましょう。

## お約束
お約束のアップデート

```
apt-get update
apt-get -y upgrade
apt-get -y dist-upgrade
```

### モジュールのインストール
拡張モジュールが不足しているため追加

```
apt-get -y install php-dev php-gd php-mbstring php-zip php-curl php-zip
```

## HTTPSのセットアップ
必須ではありませんが、あとあと面倒なことになるためSSL証明書を用意

```
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto certonly --webroot -w /var/www/html/ -d 【ドメイン】
Enter email address：　←　メールアドレス入力
(A)gree/(C)ancel：　←　A
(Y)es/(N)o:：　←　Y
```

Apacheの設定変更

```
vi /etc/apache2/sites-available/default-ssl.conf

SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile   /etc/ssl/private/ssl-cert-snakeoil.key
         ↓
SSLCertificateFile      /etc/letsencrypt/live/【ドメイン】/cert.pem
SSLCertificateKeyFile   /etc/letsencrypt/live/【ドメイン】/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/【ドメイン】/chain.pem
```

起動

```
a2enmod ssl
a2ensite default-ssl
service apache2 restart
```

## データベースの用意
`Nextcloud`のデータベースはSQLiteも使えますが、せっかくあるのでMySQLを使用
またパフォーマンス・将来性の観点からもMySQL（MariaDB）が推奨です。

```:
mysql_secure_installation
Press y|Y for Yes, any other key for No:　←　空エンター
New password:　←　DBのrootパスワードを入力
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) :　←　Y
Remove anonymous users? (Press y|Y for Yes, any other key for No) :　←　Y
Disallow root login remotely? (Press y|Y for Yes, any other key for No) :　←　Y
Remove test database and access to it? (Press y|Y for Yes, any other key for No) :　←　Y
Reload privilege tables now? (Press y|Y for Yes, any other key for No) :　←　Y

```

### データベースの作成

```
mysql -u root -p
Enter password:　←　DBのrootパスワードを入力
create database owncloud_db;
GRANT ALL PRIVILEGES ON owncloud_db.* TO owncloud_user@localhost IDENTIFIED BY 'パスワード';
FLUSH PRIVILEGES;
exit
```
# アプリケーションのセットアップ
ミドルウェアが用意できたら、いよいよNextcloudをインストールします。
といっても特に面倒なことはなく、指示に従うだけです。

### Nextcloudのセットアップ
インストールにはアーカイブとウェブインストーラーが選択できます。
アーカイブをダウンロードしても構いませんが、ウェブインストーラーのほうが簡単です。（多分）
[https://nextcloud.com/install/#instructions-server](https://nextcloud.com/install/#instructions-server)

```
cd /var/www/html/
wget https://download.nextcloud.com/server/installer/setup-nextcloud.php
```

## Nextcloudのインストール
ここからはブラウザに移ります。

設置したファイルを開いてインストールプロセスを進めます（英語？）
![alt](https://qiita-image.cloudremix.net/Nextcloud-Setup-Wizard.jpg)

設置するディレクトリを入力（`.`だけで直下）して次にいきます
![alt](https://qiita-image.cloudremix.net/Nextcloud-Setup-Dependency-Check.jpg)

終わりです。
![alt](https://qiita-image.cloudremix.net/Nextcloud-Setup-Success.jpg)

### Nextcloudの初期セットアップ
インストールが終わったら、初期セットアップをします。
ブラウザを更新して、管理者アカウントと保存先等を設定します。
（`データフォルダー`はこの後設定するため初期値でかまいません）
![alt](https://qiita-image.cloudremix.net/Nextcloud-Create-Admin.jpg)

ここでブラウザ操作は終わりです。
![alt](https://qiita-image.cloudremix.net/Nextcloud-Created-Admin.jpg)

### オブジェクトストレージのセットアップ
いよいよ今回の最重要ポイント、オブジェクトストレージの設定です。
オブジェクトストレージ自体の設定は省略しますが、手持ちがない場合はMinioをつかってください。CloudGarageであればいろいろお得に使えます。
参考：[CloudGarageでオブジェクトストレージが使いたいならMinioが良いかも](https://qiita.com/CloudRemix/items/27671e1aacb5c6c19bfb)

設定は[公式ドキュメント](https://docs.nextcloud.com/server/11/admin_manual/configuration_files/primary_storage.html)を参考に`config.php`に追記します。

`Openstack Swift`と`Amazon S3`（互換含む）が使用可

```
vi /var/www/html/config/config.php

  #S3の例
  'objectstore' => array(
        'class' => 'OC\\Files\\ObjectStore\\S3',
        'arguments' => array(
                'bucket' => 'nextcloud',
                'autocreate' => true,
                'key'    => 'XXXXXXXXXXXXXXXXXXXX',
                'secret' => 'YYYYYYYYYYYYYYYYYYYY',
                'hostname' => '192.168.0.1',
                'port' => 9000,
                'use_ssl' => false,
                'region' => 'optional',
                'use_path_style'=>true
        ),
  ),

```

もう一度、ブラウザを開きます。

**ファイルがありません**

と表示されているのが確認できれば保存先がオブジェクトストレージに設定されています。
**お疲れ様でした**
![alt](https://qiita-image.cloudremix.net/Nextcloud-End.jpg)

# おまけ
Azure「アクセスキーは2つ用意してるよ！切り替えが楽になるね。」
・・・secretは？
![alt](https://qiita-image.cloudremix.net/Azure-Blob.jpg)

さくら「ごめんね！新しいオブジェクトストレージは作れないんだ！」
![alt](https://qiita-image.cloudremix.net/SakuraCloud-Object-Storage.jpg)