Nextcloud21.0.1+Apache+PHP+MariaDB+RedisをUbuntu 20.04にセットアップ

# はじめに
Nextcloudは、自前のサーバを使って手軽にセキュアなファイル共有環境を実現できるオンラインストレージです。
これまで、CentOS での Nextcloud 環境の構築手順をいくつかご紹介しておりました。
今回は、Ubuntu Server 20.04 に Nextcloud 環境を構築する手順をご紹介します。
Ubuntu Server であれば、 snap パッケージを利用して手軽に Nextcloud 環境を試せるのは [過去の記事](https://qiita.com/S_Katz/items/819feddb62de839f3c49) でご紹介しておりますが、今回は、構成のアレンジがしやすいように、必要なパッケージを手動でインストールし、データベース、インメモリキャッシュサーバも追加する手順となります。

\# Ubuntu Server は普段あまり触る機会がないので、手順に変なところがありましたら、やさしくツッコミをお願いします。

# 今回構築する環境
## 構成イメージ
こんな感じで、いたってシンプルです。イントラネット環境のイメージですが、Amazon EC2等のクラウドサーバー上でも構築できます。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/a48bd68c-4346-aa12-0ec4-5255ff5007ea.png)

## 利用するOS、ミドルウェア
### サーバOS(Ubuntu Server)
今回は Ubuntu Server 20.04 LTS を利用します。VirtualBox や Vagrant、Hyper-V などで準備いただいても問題ありません。
ここで展開している手順の環境は以下のとおりです。

```
$ cat /etc/os-release | grep VERSION  
VERSION="20.04.2 LTS (Focal Fossa)"
VERSION_ID="20.04"
VERSION_CODENAME=focal
$ uname -a
Linux ip-10-0-2-232 5.4.0-1045-aws #47-Ubuntu SMP Tue Apr 13 07:02:25 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
```
### Nextcloud本体
もちろんこれがないと Nextcloud が使えません。
Nextcloud のバージョンはいろいろありますが、2021/4/18 時点の最新版である 21.0.1 を使います。

### Webサーバ(Apache)
NextcloudはWebベースで動作しますので、Webサーバが動作する環境が必要です。今回はApacheを使います。
ここで展開している手順でのApacheのバージョンは以下のとおりです。

```
$ apache2 -v
Server version: Apache/2.4.41 (Ubuntu)
Server built:   2020-08-12T19:46:17
```
### PHP
NextcloudはPHPで動作します。
ここで展開している手順でのPHPのバージョンは以下のとおりです。

```
$ php -v
PHP 7.4.16 (cli) (built: Mar  5 2021 07:54:38) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.16, Copyright (c), by Zend Technologies
```
### データベース(MariaDB)
Nextcloudではデータベースを利用します。本格的な運用ではMariaDB/MySQLといったデータベースを利用することが推奨されます。今回はMariaDBを利用します。
ここで展開している手順でのMariaDBのバージョンは以下のとおりです。

```
$ mariadb --version
mariadb  Ver 15.1 Distrib 10.5.9-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
```
### インメモリキャッシュサーバ(Redis)
Nextcloudではファイルのロック管理をしておりますが、このデータ管理にインメモリキャッシュサーバを使うことによりパフォーマンス向上が期待できます。今回はRedisを利用します。
今回は、PHPのセッション管理もRedisで行うことができるようにします。
ここで展開している手順でのRedisのバージョンは以下のとおりです。

```
$ redis-server --version
Redis server v=6.2.1 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=9e28c64fd48469e
```

# 構築手順
ほぼほぼ[Nextcloud公式ドキュメント](https://docs.nextcloud.com/server/21/admin_manual/installation/source_installation.html)に基づいて進めていきます。

## 前準備

①パッケージの最新化をします。

```
sudo apt update;sudo apt upgrade -y
```
②インストール作業に必要なパッケージをインストールします。

```
sudo apt install build-essential pkg-config tcl -y 
```

## Webサーバー(Apache)のインストール

①Apacheをインストールします。

```
sudo apt install apache2 -y
```
②`.htaccess`を使うため、`mod_rewrite`を有効にします。

```
cd /etc/apache2/mods-available
sudo a2enmod rewrite
```
③設定ファイルを追加します。

```
sudo vi /etc/apache2/sites-available/nextcloud.conf
```
【設定内容】

```
<VirtualHost *:80>
  DocumentRoot /var/www/html/nextcloud/
  ServerName  【サーバーのIPアドレス】
  
  <Directory "/var/www/html/nextcloud/">
    Require all granted
    AllowOverride All
    Options FollowSymLinks MultiViews
  </Directory>
</VirtualHost>
```
④追加した設定ファイルを有効にします。あわせてデフォルトの設定ファイルを無効にします。

```
cd /etc/apache2/sites-available/
sudo a2ensite nextcloud
sudo a2dissite 000-default
```
⑤Apacheを自動起動するように設定し、Apacheを起動します。

```
sudo systemctl enable apache2.service
sudo systemctl start apache2.service
```

## PHPのインストール

①今回はPHP 7.4を使います。最新のPHPバージョンを取得できるようにリポジトリを追加します。

```
sudo add-apt-repository ppa:ondrej/php
sudo add-apt-repository ppa:ondrej/apache2
```
②PHPならびに関連モジュールをインストールします。

```
sudo apt install php7.4 php7.4-curl php7.4-dom php7.4-gd php7.4-mbstring php7.4-zip php7.4-mysql php7.4-bz2 php7.4-intl php7.4-apcu php7.4-redis php7.4-imagick php7.4-bcmath php7.4-gmp -y
```
③PHPの設定を一部修正します。

```
sudo sed -i "s/^max_execution_time = 30/max_execution_time = 60/" /etc/php/7.4/apache2/php.ini
sudo sed -i "s/^memory_limit = 128M/memory_limit = 512M/" /etc/php/7.4/apache2/php.ini
sudo sed -i "s/^session.save_handler = files/session.save_handler = redis/" /etc/php/7.4/apache2/php.ini
sudo sed -i "s@^;session.save_path = \"/var/lib/php/sessions\"@session.save_path = \"tcp://localhost:6379\"@" /etc/php/7.4/apache2/php.ini
```

## MariaDBのインストール

①今回はMariaDB 10.5を使います。最新のMariaDBバージョンを取得できるようにリポジトリを追加します。

```
sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
sudo add-apt-repository 'deb [arch=amd64] http://mariadb.mirror.globo.tech/repo/10.5/ubuntu focal main'
```
②MariaDBをインストールします。

```
sudo apt install mariadb-server mariadb-client -y
```
③MariaDBを自動起動するように設定し、MariaDBを起動します。

```
sudo systemctl enable mariadb.service
sudo systemctl start mariadb.service
```

④MariaDBの基本セットアップを行います。いくつか質問されますが `New password: `、`Re-enter new password:`で MariaDBのrootユーザのパスワードを設定する以外は全て[Enter]キーを押しておきます。

```
sudo mysql_secure_installation
```
⑤MariaDBコンソールを使い、引き続きNextcloudで使用するユーザ、データベース、権限の追加をします。ここではそれぞれ以下のとおり設定します。

- ユーザ: nextcloud
- データベース名: nextcloud

```
sudo mysql -uroot

CREATE DATABASE nextcloud DEFAULT CHARACTER SET utf8mb4;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY '[nextcloudユーザに対して設定したいパスワード]';
GRANT ALL ON nextcloud.* TO "nextcloud"@"localhost";
SHOW GRANTS FOR 'nextcloud'@'localhost';
quit;
```
【SHOW GRANTS ～の実行結果例】

```
MariaDB [(none)]> SHOW GRANTS FOR 'nextcloud'@'localhost';
+------------------------------------------------------------------------------------------------------------------+
| Grants for nextcloud@localhost                                                                                   |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `nextcloud`@`localhost` IDENTIFIED BY PASSWORD '*********'                                 |
| GRANT ALL PRIVILEGES ON `nextcloud`.* TO `nextcloud`@`localhost`                                                 |
+------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.002 sec)
```

## Redisのインストール

①今回は2021/4/18現在でstableの最新版であるRedis 6.2を使います。普通にパッケージインストールするとバージョンが古くなってしまうため、ソースからコンパイルしてインストールします。Redisのソースファイル群を取得します。

```
cd /tmp
wget http://download.redis.io/redis-stable.tar.gz
tar xf redis-stable.tar.gz
```
②makeし、インストールします。

```
cd redis-stable
make
sudo make install
```
③必要なユーザー、ディレクトリを準備します。

```
sudo adduser --system --group --no-create-home redis
sudo mkdir /etc/redis
sudo mkdir /var/log/redis
sudo mkdir /var/lib/redis
sudo chown redis:redis /etc/redis
sudo chown redis:redis /var/log/redis
sudo chown redis:redis /var/lib/redis
sudo chmod 770 /var/lib/redis
```
④Redisの設定ファイルのテンプレートをコピー、編集して設定ファイルを作成します。

```
sudo cp redis.conf /etc/redis
sudo su -c "sed -e 's/^logfile .*$/logfile \"\/var\/log\/redis\/redis.log\"/' -e 's/^dir .*$/dir \/var\/lib\/redis\//' ./redis.conf > /etc/redis/redis.conf"
```
⑤自動起動設定ファイルを作成します。

```
sudo vi /etc/systemd/system/redis.service
```
【redis.serviceの内容】

```
[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target
```
⑥Redisを自動起動するように設定し、Redisを起動します。

```
sudo systemctl enable redis.service
sudo systemctl start redis.service
```

## Nextcloudのインストール

①Nextcloudパッケージ本体とチェックサムファイル(Nextcloudパッケージ本体が正しくダウンロードされているかをチェックするためのファイル)をダウンロードします。

```
cd /tmp
wget https://download.nextcloud.com/server/releases/nextcloud-21.0.1.tar.bz2
wget https://download.nextcloud.com/server/releases/nextcloud-21.0.1.tar.bz2.md5
```
②チェックサムファイルを利用してNextcloudパッケージが正しくダウンロードされているか確認します。

```
md5sum -c nextcloud-21.0.1.tar.bz2.md5 < nextcloud-21.0.1.tar.bz2
```
※`nextcloud-21.0.1.tar.bz2: OK` または `nextcloud-21.0.1.tar.bz2: 完了` と表示されれば OK です

③ダウンロードしたNextcloudパッケージを展開します。

```
tar xf nextcloud-21.0.1.tar.bz2
```
④展開したNextcloudをWebサーバをインストールします。

```
sudo mv nextcloud/ /var/www/html/
```
⑤Nextcloudのデータディレクトリを作成します。

```
sudo mkdir /var/www/html/nextcloud/data
```
⑥Nextcloudのディレクトリ全体で読み書きができるように所有者情報を変更します。

```
sudo chown -R www-data:www-data /var/www/html/nextcloud
```

⑦Apacheを再起動します。

```
sudo systemctl restart apache2.service
```

## Nextcloudの初期設定

①ブラウザで http://(サーバのIPアドレス)/ にアクセスします。下のような画面が出ればOKです。この画面で以下のとおり入力し、「セットアップを完了します」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/9c26b69a-22ae-a4d9-7a07-cf9608ed22d4.png)


|項目|入力値|
|-|-|
|ユーザー名|初期の管理者ユーザー名|
|パスワード|このユーザーのパスワード|
|データベースのユーザー名|nextcloud|
|データベースのパスワード|nextcloudユーザーに設定したパスワード|
|データベース名|nextcloud|
|データベースのホスト名|localhost:3306|
|推奨アプリをインストール|チェックを外す|

②データベースに必要なテーブルなどが自動作成され、このような画面が表示され、Nextcloudが動作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/442ba1a9-1a8a-b5e2-8da8-42ebd54509e0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/d19fac75-fcc7-3b16-0819-fe70f08e5842.png)

⑤データベースにテーブルができていることを確認します。これでデータベース周りの設定は終わりです。

```
sudo mysql -u root nextcloud
SHOW TABLES;
quit;
```
【`SHOW TABLES;` の実行結果】

```
+-----------------------------+
| Tables_in_nextcloud         |
+-----------------------------+
| oc_accounts                 |
| oc_accounts_data            |
| oc_activity                 |

～～～ (中略) ～～～

| oc_vcategory_to_object      |
| oc_webauthn                 |
| oc_whats_new                |
+-----------------------------+
```

⑥Nextcloudの設定ファイルに設定を追加します。

```
sudo vi /var/www/html/nextcloud/config/config.php
```
【一番下の `}` の上に以下の行を追加】

```
  'default_phone_region' => 'JP',
  'memcache.distributed' => '\\OC\\Memcache\\Redis',
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'memcache.local' => '\\OC\\Memcache\\APCu',
  'redis' =>
  array (
    'host' => 'localhost',
    'port' => 6379,
  ),
  'htaccess.RewriteBase' => '/',
```

⑦.htaccessファイルを更新します。

```
sudo -u www-data php /var/www/nextcloud/occ maintenance:update:htaccess
```
⑧Nextcloud セットアップ警告対応のためにパッケージを追加インストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/e24678c9-6629-b583-0e71-3bf066120f17.png)

```
sudo apt install libmagickcore-6.q16-6-extra -y
```
⑨変更した設定を反映させるためにApacheを再起動します。

```
sudo systemctl restart apache2
```

# あとがき
Nextcloudはサーバー１つあれば気軽に試せますので、使い勝手とかいろいろ試してみてください。
次回は、WebサーバーとしてNginxを使う場合の手順を展開する予定です。

# 更新履歴
* 2021/4/18: 初版。