ownCloudとS3で無限ストレージであんな動画もこんな動画も保存し放題ヒャッハー...しようと思ったけど重っ！！

この記事は[Wanoグループアドベントカレンダー](https://qiita.com/advent-calendar/2017/wano-group)の1日目です。

というわけで、表題の通り、ちょっと前に無限ストレージが欲しくなってownCloudを導入してみました。
結果、空き時間にサクッと作るつもりが、それなりに時間かかってしまった。
~~でもこれできっと一人のクリスマスも寂しくないんだ。~~

なんというか、最終的にS3との連携でうまく動かない部分があって適当にごまかしたので、このやり方はあまりよくないかもしれません。
ちゃんとした方法を知っている方は教えてください。

というわけで以下顛末。

# やったこと
1. phpと関連モジュールのインストール
1. redisを入れる
1. ownCloudのインストール
1. Nginxの設定
1. Let's Encryptを入れる
1. mysqlの設定
1. S3の設定

# 1. phpと関連モジュールのインストール
<img src="https://qiita-image-store.s3.amazonaws.com/0/69711/851f11e9-41a8-8d43-c3b9-bc793dcb22b4.png" width="150">

ownCloudはphpで動いているのでphpと必要なモジュールをインストールしておく。
php-redisはownCloudのファイル情報をキャッシュする場合に入れる。

```bash
sudo apt-get install -y php7.0 php7.0-fpm php-redis

```

インストールが終わったら、`/etc/php/7.0/fpm`以下のphp-fpm.configとか、`pool.d/www.conf`とかを必要に応じて書いてphpの設定をする。
終わったらphpを再起動する。

# 2. redisを入れる
<img src="https://qiita-image-store.s3.amazonaws.com/0/69711/e98f3ad5-3a32-83d7-8d51-b698663e8afe.png" width="150">

redisにファイル情報のキャッシュをすることでownCloudの表示を早くするらしい。
とりあえず最新のredisをインストール。

```bash
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
tar xzf redis-4.0.1.tar.gz
cd redis-4.0.1/utils
sudo ./install_server.sh
```
なんかapt-getとかでサクッと入れるもんじゃないのね。

なお最新バージョンのredisのリンクは以下。
https://redis.io/download

# 3. ownCloudのインストール
<img src="https://qiita-image-store.s3.amazonaws.com/0/69711/1185ccbc-bf00-862d-3438-8c043d4bb51b.png" width="150">

https://download.owncloud.org/download/repositories/stable/owncloud/
に各OS毎のインストール方法が書いてあるので、手順に従ってインストールする。

# 4. nginxの設定
<img src="https://qiita-image-store.s3.amazonaws.com/0/69711/ba995ee5-86d1-f87d-4df8-c686b5ea753d.jpeg" width="150">

これが地味にわからなかった。
一応下記の記事が参考になるかなと思ったのだが、
https://qiita.com/inductor/items/62b08813dc5cedf4ff34
肝心のnginxの設定のリンクが切れていてわからなかった。

とりあえず色々ググったりもしたんだけど、最終的に普通にownCloudの公式ドキュメントをちゃんと見てみたらあっさりみつかるっていうこの。
https://doc.owncloud.org/server/10.0/admin_manual/installation/nginx_configuration.html

このドキュメントを見ると、設定が2つあるんだけど、

> ownCloud in the webroot of NGINX

っていうのが、ownCloudをwebrootに配置する場合の設定（例: https://drive.hoge.com）で、

> ownCloud in a subdir of NGINX

っていうのが、サブディレクトリを切って配置する場合の設定（例: https://hoge.com/dirve）

適宜環境に応じて必要な箇所を書き換える。
基本的には`server_name`とsslまわり、あとupstreamの設定を書き換えると良いと思われる。

後述するLet's Encryptを使ってSSL鍵を取得する場合は、Let's Encryptでつかうcertbotが自動でssl鍵の場所の指定とか書いてくれるので、`ssl_certificate`と`ssl_certificate_key`の行を消しておく。

この設定ファイルを`/etc/nginx/sites-enabled`あたりにでも設置して、nginxを再起動。

# 5. Let's Encryptを入れる
<img src="https://qiita-image-store.s3.amazonaws.com/0/69711/4c889dfa-9879-1590-9bd5-6f109fd7e1de.png" width="150">

適当にドメインの設定をしてサーバーにアクセスできるようになったら、Let's Encryptでssl鍵の取得と設定をする。
みんな大好きcertbotで入れる。
https://certbot.eff.org/

上記URLにアクセスして、SoftwareとSystemを選んで表示される通りにやるとなんか入る。

ちなみにUbuntu x Nginxの組み合わせでやると、サクッと鍵が作られた上に、nginxの設定を書き換えて自動で`ssl_certificate`と`ssl_certificate_key`の設定をしてくれて、さらにはcronに鍵の自動更新の処理の設定まで追加してくれる。
なんやこれ、いつの間にこんな便利になったんや...。

```
sudo service restart php7.0-fpm
```

# 6. mysqlの設定
<img src="https://qiita-image-store.s3.amazonaws.com/0/69711/b9593c0b-c6b5-5136-7fc0-9930a781442d.png" width="150">

https://qiita.com/seijikohara/items/69c008425fe5dae8b124
ここにあるように適当なDBと適当なユーザーを作る。

# 動かす
https://pig-log.com/owncloud-centos-install/
ここの初期セットアップの項目にあるように、管理者アカウントとDBの設定をする。

すると動く。
<img width="1034" alt="スクリーンショット 2017-12-01 1.44.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/69711/ab028b4f-a9ec-2397-4c3f-0eb51b3506c1.png">

設定からキャッシュの設定もできるのでやっておく。

ちなみに、この画像は左上のアイコンとか色とかちょっとカスタマイズした例。
カスタマイズ方法は後述。

# 7. S3の設定
なんと、実はここまでが前置きで、ここからが本題。（なげぇよ）
ownCloudでのS3との連携でよく使われるのは、ownCloudのExternal storage supportというアプリ。
<img width="394" alt="スクリーンショット 2017-12-01 2.13.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/69711/706da70b-91e7-4a2c-3f7b-026c9b62f6fd.png">

↑これ。

こいつは、S3の権限を与えたユーザーをAWSのIAMで作って、そいつのAccessKeyIdとSecretAccessKeyの情報を追加すれば、S3をディレクトリのように扱ってくれるシロモノ。
めっちゃ便利！かと思いきや、実際に使って見るとわかるのだが、めちゃくそ重い。
これ、自分の環境だけですかね？
なんかキャッシュの設定とか色々やってもとにかく重くて、ファイル一覧を取得するのに数分かかるレベル。
自分の環境では全くもって使い物にならなかった。

で、どうしたか。

S3を直接ディレクトリにマウントすればいいじゃん(^q^)

というわけで登場、みんな大好きgoofys
https://github.com/kahing/goofys

はい。これがこの記事の全てです。

```
goofys -o allow_other --uid 33 --gid 33 --cheap hoge-s3 /var/www/owncloud/data/hoge/files
```

ownCloudのファイルは、`/var/www/owncloud/data`以下にユーザー名毎に作られるので、必要なユーザーのfiles以下を適当なbucketでマウントする。

キモは、-o allow_otherオプションでlinux上の他ユーザーがファイルのアクセスをできるようにしておくのと、--uid/--gidでファイルの所有者と所有者のグループをidで指定することで、ownCloudが自由にファイルを扱うことができるようにするということ。
なので--uid/--gidで指定するユーザーは、ownCloudを動かしているlinuxユーザー。
自分の場合はwww-dataだった。

実はこの設定をした当初、しばらく使っているとたまーにファイルの書き込みが失敗して、なぜかそのタイミングでgoofysのマウントが外れて使えなくなるって問題があったんだけど、最近goofysがバージョンアップしてて最新のv0.0.18にしたらその問題は起きなくなった。
なので、これをやるときはgoofysのバージョンが0.018以上のものを使うと良い。

# 結果
ownCloudをS3連携するときは、goofysを使うと秒速で1億稼げそうなぐらい早くなる。


# 参考記事
* https://qiita.com/ukitiyan/items/481f380502a462a2af69
* https://qiita.com/shibukk/items/430c5fc90c2f93a8cea7

----

# （Tips）ownCloudの見た目のカスタマイズ方法
ownCloudの見た目は、テーマを作ることでカスタマイズすることができる。
https://doc.owncloud.org/server/10.0/developer_manual/core/theming.html
https://thinkit.co.jp/article/9773

`/var/www/owncloud/themes/`以下にテーマファイルを設置して、`/var/www/owncloud/config/config.php`のconfigにテーマ名を記述することで変更することができる。

自分は趣味でバンドをやっていて、バンド間でのファイル共有として作ったので、バンドのロゴとか表示したりしてみた。
<img width="362" alt="スクリーンショット 2017-12-01 3.01.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/69711/680bc755-8ace-2d48-0f44-11d577b0be13.png">

うれしい。