NextCloudとS3を連携させた話

# 前書き
今年も[ConoHa Advent Calendar 2020](https://qiita.com/advent-calendar/2020/conoha)の季節となりました。
今年一番驚いたことはカーネルパニックでしょうか。あれはまじでビビりました。
Qiitaで記事にしたので宜しければそちらも是非。同じConoHaVPSでのお話です。

今回のお話は NextCloudでS3を連携させた話です。
(「ConoHaのオブジェクトストレージ使えよ」っていうのはなしの方向でお願いします......!!)

**apacheなどのconf設定、SSL化は解説しません。**
phpさえ入っていれば、特に設定しなくても使うことができますが、SSLにさせるには記述が必要だった気がします。
SSL化は[Let’s Encrypt](https://letsencrypt.org/ja/)が無料でできるのでおすすめです。

<font color=red>**本記事により何かしらの障害や問題が発生しても筆者は責任を負いかねますので、自己責任で行ってください。**</font>
あと、実際に使うのであればSSLで暗号化しておくことをおすすめします。

# 準備する。
1から始めます。
ConoHaのコンパネからVPSを契約します。
今回は小規模かつQiita記事用ということで一番安いプランのメモリ512Mのものを選びました。

```
CentOS Linux release 7.8.2003 (Core)
```

で話を進めていきます。

この時点でドメインにIPを向けてあります。

## 日本語化する。
今のままでは全部英語で読みづらいので日本語化します。

```
$ yum -y install ibus-kkc vlgothic-*
$ localectl set-locale LANG=ja_JP.UTF-8
$ source /etc/locale.conf
$ test # 適当に実行する
-bash: test: コマンドが見つかりません
```

これで日本語化完了です。

## apacheをインストールする
```
$ yum -y install httpd

$ firewall-cmd --add-service=http --zone=public --permanent #http(80)ポートの解放
$ firewall-cmd --add-service=httpa --zone=public --permanent #https(443)ポートの解放

$ systemctl start httpd  #httpdを起動
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201995/d9d30876-8f74-1493-4f33-1b5c96c3d80f.png)

これでテストページが表示されていれば成功です。

## php7.4をインストールする

```
$ yum install epel-release #Remiリポジトリを入れるのに必要なもの
$ rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-7.rpm Remiリポジトリをインストール

$ yum install -y --enablerepo=remi-php74 php php-cli php-common php-curl php-gd php-mbstring php-mysqlnd php-process php-xml php-opcache php-pecl-apcu php-intl php-pecl-redis php-pecl-zip php-pear php-bcmath php-gmp php-imagick

$ php -v
PHP 7.4.12 (cli) (built: Oct 27 2020 15:01:52) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.12, Copyright (c), by Zend Technologies

```

これでphp7.4のインストール完了です。

apacheを再起動しておいてください。
(そうしないとphpファイルがテキストとして表示されます。)

## MySQLをインストールする

```
$ yum remove mariadb-libs #初期で入っているMariaDBをアンイストール
$ rm -rf /var/lib/mysql

$ yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
$ yum -y install mysql-community-server

$  mysql --version
mysql  Ver 8.0.22 for Linux on x86_64 (MySQL Community Server - GPL)

$ systemctl start mysqld.service

$ mysql -u root -p # rootのパスワードを入力するも...
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
```

MySQLの初期のパスワードを探します。

```
$ cat /var/log/mysqld.log | grep 'temporary password'
2020-11-21T05:31:11.656631Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: 5-GXWmmG66hw
```

でrootのパスワードが **5-GXWmmG66hw** となりました。

一応パスワードをわかりやすいものに変えておきましょう。

```
$ mysql -u root -p 
#さっきのパスワードでログイン
mysql> SET PASSWORD = 'Test1234@1234';
#パスワードポリシーなどで設定できない場合があります。
Query OK, 0 rows affected (0.05 sec) # OKと出れば変更成功です。
```

PHPMyAdminをWebを表示するディレクトリ(/var/www/html/)に配置しました。
コマンドでするよりこちらのほうが楽だと思います。

## NextCloudをインストールする

```
$ wget https://download.nextcloud.com/server/releases/nextcloud-20.0.2.tar.bz2
$ wget https://download.nextcloud.com/server/releases/nextcloud-20.0.2.tar.bz2.md5
$ md5sum -c nextcloud-20.0.2.tar.bz2.md5 < nextcloud-20.0.2.tar.bz2 #サムチェックで正しくダウンロードできているか確認する
nextcloud-20.0.2.tar.bz2: 完了
$ tar xf nextcloud-20.0.2.tar.bz2 #zip展開的な感じなことをする
$ cp -R nextcloud/ /var/www/html/ # /var/www/html に nextcloud をコピーする
$ mkdir /var/www/html/nextcloud/data
$ chown -R apache:apache /var/www/html/nextcloud #nextcloudの所有者をapacheにする
#nginxの場合は nginx にする。これがないと多分動かないので注意。
```

これでwebからアクセスできるようになります。
http://ipアドレス<かドメイン>/nextcloud にアクセスします。

画面に従ってインストール作業を進めます。

#S3を連携する
使うには少し手間がかかります。
確か無料枠があった気がするので、そちらを使ってもいいかもですね。

## aws IAMでユーザーを設定する
IAMのページに行き、左にあるユーザーからユーザーの追加をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201995/5b0b6f3d-3b70-702b-7339-f4a5b435eaeb.png)

ユーザー名は適当に入力し、プログラムからアクセスにチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201995/63f66846-835d-1f55-299c-fadebee21525.png)

アクセス許可のところでは、一番右の「既存のポリシーを直セスアタッチ」からAmazonS3FullAccessを選びます。

次に進みタグ設定などは各位お好みで行い、アクセスキーIDとシークレットアクセスキーをメモします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201995/2f7dcfd5-2198-3dc5-ce00-9f7e775f828f.png)

## S3のバスケット作成
Amazon S3のページに行き、バスケットを作成をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201995/a2e84a93-4fdd-548d-2886-ea4a377c98f2.png)

適当なバスケット名をつけます。
※命名規則があるようなので、注意が必要です。
今回はパスワード生成器で適当に生成したものを使いました。

アクセス権限(ブロックパブリックアクセスのバケット設定)は初期のままパブリックアクセスをすべて ブロックで大丈夫です。

これでS3の設定は完了です。

# config.phpをいじる
config.phpをいじる方法ともう一つ別の方法を紹介しますが、こちらは前者の方です。

config/config.phpをSFTPなどでダウンロードします。
ダウンロードしたconfig.phpをテキストエディタで開きます。

```
'objectstore' => array(
        'class' => 'OC\\Files\\ObjectStore\\S3',
        'arguments' => array(
                'bucket' => '<バケット名>',
                'autocreate' => true,
                'region' => '<S3のリージョン>',
                'key'    => '<20文字の大文字英数字のアクセスキー>',
                'secret' => '<40文字の英数字記号のシークレットキー>',
                'use_ssl' => false,
                'use_path_style'=> false,
        ),
    ),
```

をテンプレートに書き換えていきます。

これで設定は完了ですが、nextcloudのバージョンが古いと、config書き換えでエラーが出る場合があります。

## 動作確認
ブラウザでアクセスすると、もとあった初期のものが表示されませんが、configを戻せば治ります。
S3側では、urn:oid:<数字>のような形でファイルが格納されているみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201995/9335d4ec-0c80-40ee-7cd8-c77133e39778.png)

# configを書き換えない方法
NextCloudのアプリから「External storage support」をインストールします。

インストールしたら、設定から(管理の方にある)外部ストレージを開きます。

フォルダ名は適当でAmazonS3を選びます。
バスケット名はS3のもの、リージョンはS3のあるリージョンを選びます。
東京リージョンなら ap-northeast-1 だと思います。
コピーしたアクセスキーとシークレットキーを入力します。

右にあるチェックマークをクリックして設定完了です。
左のところに緑のチェックが出れば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201995/af6a5bb2-2bc2-8e3e-f132-11106d95fb4a.png)

どこかが間違ってると
左に赤いマークが出ているとどこかが間違っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201995/225d9fa3-ea1e-a187-5e35-4795842823f3.png)

S3の外部ストレージで共有リンクを発行する場合は、...を開いて「共有の有効化」にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201995/78b07c3f-6554-67a1-968c-73f66606fcd4.png)

# おまけ
## アカウントのパスワードのリセット
パスワードを忘れてしまったので、occを使ってパスワードを変更しました。

```
$ sudo -u apache php occ user:resetpassword ユーザー名
```

## PHPのメモリを上げる
セキュリティ&セットアップ警告に「PHPのメモリ制限が推奨値の512MB以下です。」と出る場合は、php.iniのmemory_limitの値を512Mに書き換えてApacheを再起動します。


# あとがき
ネタかぶりまじですみませんでした。
編集後記というかあとがきです。
2017年から参加させていただいているConoHa Advent Calendarですが、今年も性懲りもなく役に立ちそうにない記事でお茶を濁しております。

実はオブジェクトストレージも記事にしようとしていたんですが、トークンの取得とかそういうので面倒になったのでなかったことに...

来年こそはなにか役立つ記事を書きたいです。
毎年言ってる気がしますが...

# Thanks
- 他の曜日で記事を書いてる皆様
- AWS
- ｺﾉﾊﾁｬﾝｶﾜｲｲﾔｯﾀｰ!!!!
- ｺﾉﾊﾁｬﾝ3Dｵﾒﾃﾞﾄｰ!!
- と見てくれた人