最速でConoHaのCentOS7.4にnextcloud環境を作る

# ゴール
タイトル通り__“最速でConoHaのCentOS7.4にnextcloud環境を作る”__
ついでに__Let’s EncryptでSSL化もしちゃうよ♪__

# インスタンスの作成
コントロールパネルからインスタンスを作成してください。
このあたりは、割愛します。

#root
## 初期のSSH設定
rootで今後リモートログインできないようにsshd_configの修正

```conf:/etc/ssh/sshd_config
PermitRootLogin no
```

sshdの設定をリロードする

```shell:shell
systemctl reload sshd.service
```

## ユーザーの作成

```shell:shell
useradd hoge
passwd hoge
usermod -aG wheel hoge
```

## 一般ユーザーでログイン
rootのターミナルを開いたまま、一般ユーザーでログインしてログインが出来ることを確認してください。
sudoも動作するか確認すること。
以下のコマンドで確認すると、システムのアップデートもできて尚良。

```shell:shell
sudo yum -y update
```

正しく動作するようであれば、rootでログインできないことを確認後、ターミナルを閉じて、一般ユーザーで今後は、設定していきます。


# 一般ユーザー
## firewallの設定

```shell:shell
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
```

__ConoHaのコントロールパネルで接続許可ポートを全てのポートからSSHとWebだけに限定するように下方が良い__

##各種リポジトリを追加
```shell:shell
sudo yum install epel-release
sudo rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

リポジトリが初期のyumとかぶるのは避けたいので、enableを0に設定する。

いろいろなパッケージのためにリポジトリを追加
> nextcloudは、php7.2に対応していないため7.1を使用する

```conf:/etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch/debug
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-debug-7&arch=$b$
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1

[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
#baseurl=http://download.fedoraproject.org/pub/epel/7/SRPMS
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-source-7&arch=$$
failovermethod=priority
enable=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=1
```

MariaDBのリポジトリを追加

```conf:/etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
enable=0
```

## ApacheとphpとMariaDBのインストール
> nextcloudは、php7.2に対応していないため7.1を使用します。

今回は、OPcacheとmemcachedも使用するため、同時にインストールします。

```shell:shell
sudo yum install -y --enablerepo=epel,remi,remi-php71,mariadb httpd mariadb mariadb-server mariadb-client php php-mbstring php-mysql php-xml php-gd php-xml php-zip php-opcache php-pecl-apcu php-process memcached memcached-devel php-pecl-memcache
```

## 各種バージョンをチェック
__この項目はスキップしても問題ありません__

2017/12/08現在

```shell:shell
httpd -v
```

> Server version: Apache/2.4.6 (CentOS)
> Server built:   Oct 19 2017 20:39:16


```shell:shell
rpm -qa | grep -i mariadb
```

> MariaDB-compat-10.2.11-1.el7.centos.x86_64
> MariaDB-common-10.2.11-1.el7.centos.x86_64
> MariaDB-server-10.2.11-1.el7.centos.x86_64
> MariaDB-client-10.2.11-1.el7.centos.x86_64

```shell:shell
php -v
```

> PHP 7.1.12 (cli) (built: Dec  1 2017 13:53:12) ( NTS )
> Copyright (c) 1997-2017 The PHP Group
> Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
>     with Zend OPcache v7.1.12, Copyright (c) 1999-2017, by Zend Technologies
>
> __ここでのポイントはwith Zend OPcache v7.1.12が入っていること__

```shell:shell
memcached -h
```
__helpの1行目にバージョンが記載されています__
> memcached 1.5.3


## nextcloudのソースコード配置
今回は、/var/wwwに設置します。
最新版のソースコードを[こちら](https://nextcloud.com/install/#instructions-server)からダウンロードします。

2017/12/08現在は、12.0.4が最新版です。

```shell:shell
cd /var/www
sudo wget https://download.nextcloud.com/server/releases/nextcloud-12.0.4.zip
sudo unzip nextcloud-12.0.4.zip
sudo rm nextcloud-12.0.4.zip
sudo chown -R apache:apache nextcloud
```

## Apacheの設定
storage.example.comは、各自のドメインに置き換えてください。

```conf:/etc/httpd/conf.d/storage.example.com.conf
<VirtualHost *:80>
    ServerAdmin administrator@example.com
    ServerName storage.example.com

    DirectoryIndex index.html index.htm index.php
    DocumentRoot "/var/www/nextcloud"

    <Directory "/var/www/nextcloud">
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog /var/log/httpd/nextcloud.error.log
    CustomLog /var/log/httpd/nextcloud.access.log combined
</VirtualHost>

```

ApacheのConfigテスト

```shell:shell
sudo apachectl configtest
```

> Syntax OK

## OPcacheの設定
設定を以下のように書き換える
__どうやら同じ設定にしないと正しく認識されない__
__コメントも残さないとどうやら正しく動かない。このあたりが謎__

```conf:/etc/php.d/10-opcache.ini
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1
```

## 各種デーモンの起動

```shell:shell
sudo systemctl enable httpd.service
sudo systemctl enable mariadb.service
sudo systemctl enable memcached.service
sudo systemctl start httpd.service
sudo systemctl start mariadb.service
sudo systemctl start memcached.service
```

## MariaDBの初期設定
```shell:shell
sudo mysql_secure_installation
```

|表示|説明|
|:---:|:---:|
|Enter current password for root (enter for none):|MariaDBの現在のrootユーザパスワード入力(初期設定時は何も設定されていない)|
|Set root password? [Y/n]|rootユーザのパスワードを設定するかどうか|
|Remove anonymous users? [Y/n]|初期設定で作成されている「anonymous」ユーザを削除するか|
|Disallow root login remotely? [Y/n]|MariaDBの「root」ユーザのリモートログインを禁止するか|
|Remove test database and access to it? [Y/n]|初期設定で作成されている「test」データベースを削除するか|
|Reload privilege tables now? [Y/n]|今設定したユーザ設定をすぐに反映させるか|

## MariaDBにデータベースを作成
nextcloudとnextcloud_adminとpasswordは、おこに見に応じて変更してください。
__passwordは確実に変更してください__

```shell:shell
mysql -u root -p
```

```sql:sql
create database nextcloud;
grant all on nextcloud.* to 'nextcloud_admin'@'localhost' identified by 'password';
exit;
```

## アクセステスト
http://storage.example.com/にアクセスしてみる。
“管理者アカウントを設定してください”と出ていれば、インストール成功

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71588/2b9122b4-e5d8-65d8-b275-5190ef179c70.png)

# nextcloudの設定
## 初期設定
管理者アカウント名を程よく設定し、“データベースを設定してください”で“MariaDBにデータベースを作成”で作成したデータベースを指定してください。

## Memcache有効化とindex.phpを隠す設定
以下を追加する

```conf:/var/www/nextcloud/config/config.php
  'memcache.local' => '\OC\Memcache\APCu',
  'htaccess.RewriteBase' => '/',
```

設定を反映させるために以下のコマンドを実行する。

```shell:shell
sudo su -s /bin/bash apache -c "/var/www/nextcloud/occ maintenance:update:htaccess"
```

パーミッションの問題で実行できない場合は、以下のコマンドを実行する。

```shell:shell
sudo sudo chmod +x /var/www/nextcloud/occ
```

# SSL化

## パッケージのインストール
```shell:shell
sudo yum install -y --enablerepo=epel certbot certbot-apache mod_ssl
sudo certbot run --apache -d storage.example.com
```

途中で、以下のようにリダイレクトするかと聞かれるので“__2__”を選択してRedirectさせる。

> 1: No redirect - Make no further changes to the webserver configuration.
> 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for

## ファイル名の変更
今まで任意の名前でconfを作っていたが、certbotがご丁寧にstorage.example.com.confという名前に書き直してくれているので、example.comの部分を元に戻す。

## セキュリティー向上のため
ssl.confファイルの末尾に以下を追加します。

```conf:/etc/httpd/conf.d/ssl.conf
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES:!RC4:!DH
SSLHonorCipherOrder On
Header set Strict-Transport-Security "max-age=315360000;"
```

## Apacheの設定を反映
```shell:shell
sudo systemctl reload httpd.service
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/71588/58c77c8d-d76d-3b62-6322-0bade2bcfbeb.png)

## Cronへ証明書の自動更新

```Cron:Cron
0 0 * * * /bin/certbot renew && /bin/systemctl reload httpd.service
```

## セキュリテイーチェック
[SSL Server Test (Powered by Qualys SSL Labs)](https://www.ssllabs.com/ssltest/)
__Do not show the results on the boardsにチェックを入れるのを忘れるとランキングに掲載されますのでご注意ください__

# 最後に
Apacheだとこうも簡単に設定できてしまう…
いつもNginxを使っていたので拍子抜けしてしまった。