完全無料でクラウドストレージを構築する【NextCloud】

# 完全無料でクラウドストレージを構築する【NextCloud】

## まえがき
この記事では完全無料でプライベートクラウドストレージサーバを構築することを目標とします。また、この記事でなるべく全てを完結できるように最低限の操作だけを書いています。ご了承ください。

構築目安：2時間（※アップデートやダウンロードで時間がかかるので）

__この記事を読んでできること__

- NextCloud（ストレージサーバ）の構築
- 固定ドメインの取得（Serveo）

__この記事でしないこと__

- SSL化（近日更新予定）

## 環境
構築した環境、準備したものは以下の通りです。VirtualBoxがあればWindowsでも大丈夫（なはず）です。

- macOS Mojave 10.14.6
- [VirtualBox 6.0.12](https://www.virtualbox.org/wiki/Downloads)
- [CentOS7 minimal iso](http://isoredirect.centos.org/centos/7/isos/x86_64/)（仮想マシンディスクイメージ）

## 仮想マシンを構築する
まず、VirtualBoxで仮想マシンを構築します。ここはあまりややこしいところは無いと思いますので簡単に要点だけ書いておきます。
1. 「新規(N)」をクリック。名前は適当につけてタイプは「Linux」、バージョンは「Red Hat(64-bit)」を選択します。
2. RAMですが[NextCloudの公式](https://docs.nextcloud.com/server/15/admin_manual/installation/system_requirements.html)には最低128MB、推奨は512MBと書いているので1024MBあれば十分でしょう。
3. ハードディスクはデフォルトの「仮想ハードディスクを作成する」、ファイルタイプもデフォルトの「VDI」にしておきます。
4. 物理ハードディスクにあるストレージは「固定サイズ」にします。（次で容量を設定しますが、後からでも変更可能です）
5. ファイルの場所とサイズはこの時点ではなんでもいいです。特に触る必要はありません。ここまでで一旦仮想マシンを「作成」します。
〜数分待機〜
6. 出来た仮想マシンを起動します。ダウンロードしたCentOS7 minimalをディスクイメージに選択し、「Start」します。
7. 「Install CentOS7」を選択。GUIが起動するので、言語を日本語にし「続行」します。
8. インストールの概要は特に触らなくていいでしょう。「インストール先」だけ一度中身を確認しないと次に進めないのでクリックし「インストールを開始(B)」します。
9. rootユーザのパスワードを設定します。
〜数分待機〜
10. 「再起動(R)」し、rootユーザでログインします。

## 初期設定
この時点では、ネットワーク設定が初期設定のままで繋がらないのでネットワーク設定を変更します。今回はもっとも簡単なブリッジネットワークにしておきます。（VirtualBoxのネットワーク設定まとめは[こちら](https://qiita.com/taopi/items/0f9475e4c0e230911eb7)）

```diff
# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
///ONBOOTをyesに変更

- ONBOOT=no
+ ONBOOT=yes

# shutdown -h now
```
シャットダウンしたらVirtualBoxで「設定(S)」→「ネットワーク」→「ブリッジネットワーク」に変更し、再び起動します。これで外部ネットワークにも繋がるはずです。ちなみにここから長いコマンドをたくさん打つ必要があります。VirtualBoxのウィンドウではコピペができないので、SSH（パスワード認証）を有効にしてターミナルから操作すると楽でしょう。

```diff

# vi /etc/ssh/sshd_config

//インストールが全て終わったらまたコメントアウトしておきましょう
- #PermitRootLogin
+ PermitRootLogin

# systemctl enable sshd.service
# systemctl start sshd.service
# ip a (IPアドレスを確認しておきましょう)

//ターミナルなどからアクセス
# ssh root@192.0.2.10
```

## NextCloudインストール
ここからが本題です。インストール途中で何かミスると嫌なので一度ここで（この後も適宜）スナップショットを取っておきましょう。
基本的に[公式の手順](https://docs.nextcloud.com/server/15/admin_manual/installation/source_installation.html#example-installation-on-centos-7-server)に沿っていきます。

```
# yum install -y epel-release yum-utils unzip curl wget bash-completion policycoreutils-python mlocate bzip2
# yum update -y
〜数分待機〜
// Apacheインストール
# yum install -y httpd

//ファイルを新規作成
# vi /etc/httpd/conf.d/nextcloud.conf
<VirtualHost *:80>
  DocumentRoot /var/www/html/
  ServerName  example.serveo.net（exampleの部分は自由）

<Directory "/var/www/html/">
  Require all granted
  AllowOverride All
  Options FollowSymLinks MultiViews
</Directory>
</VirtualHost>

# systemctl enable httpd.service
# systemctl start httpd.service

# yum install -y centos-release-scl
# yum install -y rh-php72 rh-php72-php rh-php72-php-gd rh-php72-php-mbstring rh-php72-php-intl rh-php72-php-pecl-apcu rh-php72-php-mysqlnd rh-php72-php-pecl-redis rh-php72-php-opcache rh-php72-php-imagick
〜数分待機〜

# ln -s /opt/rh/httpd24/root/etc/httpd/conf.d/rh-php72-php.conf /etc/httpd/conf.d/
# ln -s /opt/rh/httpd24/root/etc/httpd/conf.modules.d/15-rh-php72-php.conf /etc/httpd/conf.modules.d/
# ln -s /opt/rh/httpd24/root/etc/httpd/modules/librh-php72-php7.so /etc/httpd/modules/
# ln -s /opt/rh/rh-php72/root/bin/php /usr/bin/php

// MariaDBインストール
# yum install -y mariadb mariadb-server

# systemctl enable mariadb.service
# systemctl start mariadb.service
```

__MariaDB初期設定__

```
# /usr/bin/mysql_secure_installation
Enter current password for root (enter for none): （空欄でEnter）
Set root password? [Y/n] Y
New password: （MariaDBのrootパスワード入力）
Re-enter new password: （再度入力）
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

# mysql -uroot -p
Enter password:（MariaDBのrootパスワード）
MariaDB [(none)]> CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS nextcloud;
MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES ON nextcloud.* TO 'username'@'localhost' IDENTIFIED BY 'password';
MariaDB [(none)]> FLUSH privileges;
MariaDB [(none)]> quit
```

__NextCloudダウンロード__

```
# wget https://download.nextcloud.com/server/releases/nextcloud-15.0.0.tar.bz2
〜数分待機〜
# wget https://download.nextcloud.com/server/releases/nextcloud-15.0.0.tar.bz2.md5

# tar xf nextcloud-15.0.0.tar.bz2
# cp -R nextcloud/ /var/www/html/

# mkdir /var/www/html/nextcloud/data
# chown -R apache:apache /var/www/html/nextcloud

# systemctl restart httpd.service

# firewall-cmd --zone=public --add-service=http --permanent
# firewall-cmd --reload

# yum install -y redis
# systemctl enable redis.service
# systemctl start redis.service

# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/data(/.*)?'
# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/config(/.*)?'
# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/apps(/.*)?'
# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/.htaccess'
# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/.user.ini'
# semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/nextcloud/3rdparty/aws/aws-sdk-php/src/data/logs(/.*)?'

# restorecon -R '/var/www/html/nextcloud/'
# setsebool -P httpd_can_network_connect on
```

ここで、ブラウザからhttp://(サーバのIPアドレス)/nextcloud/にアクセスすると初期設定画面が表示されます。管理者アカウントのユーザ名とパスワードを設定し、セットアップを完了します。これでNextCloudの完成です！

## 固定ドメインの取得
次は家の外からでもアクセスできるように固定ドメインを取得します。無料で取得できるドメインサービスはたくさんありますが、特に簡単にできると思った[Serveo](http://serveo.net/)を使いたいと思います。これは特定のURLにSSHを行うだけです。さらにサブドメインも指定できるのでちょっとうれしいです。普通のSSHだと定期的な更新が必要そうなのでautosshコマンドをバックグラウンドで使いましょう。

```diff
# vi /var/www/html/nextcloud/config/config.php
- 0 => '192.0.2.10',
+ 0 => '192.0.2.10','example.serveo.net'

# ssh -R example（自由なサブドメイン）:80:localhost:80 serveo.net
//初回接続をして、ブラウザでhttp:/example.serveo.net/nextcloud/にアクセスできることを確認

Ctrl+C

# yum install -y autossh
# autossh -f -M 0 -R example（自由なサブドメイン）:80:localhost:80 serveo.net
```
これで固定ドメインでのプライベートクラウドストレージの完成です！！お疲れ様でした〜

## Tips
関連して使いそうなことをまとめておきます。
### 仮想マシンのバックグラウンド起動(Headless)
```
# VBoxManage startvm 仮想マシン名 --type headless
```
### 仮想マシンの容量変更
```
//ホストマシンで
VBoxManage modifyhd vdiファイル --resize 変更するサイズ(MB)
```
### autosshの切断
```
# pkill -9 autossh
```

## あとがき
あくまで私の環境での構築手順です。訂正、補足、こんなところでエラーが出たなどあればコメントいただけると幸いです。（ちなみに実際に使ってみると激遅なので実用的ではないかもしれません。ちょっと考えます...）

## 参考URL
- [NextCloud: インストールマニュアル](https://docs.nextcloud.com/server/15/admin_manual/installation/source_installation.html#example-installation-on-centos-7-server)
- [NextCloud: MariaDB設定](https://docs.nextcloud.com/server/15/admin_manual/configuration_database/linux_database_configuration.html)
- [Memo: MariaDBのインストール/初期設定](https://qiita.com/akito1986/items/98a8430d936b293cb354)
- [CentOS7にNextcloudインストール](https://www.server-memo.net/server-setting/nextcloud/nextcloud_install.html)
- [Nextcloud15.0.0をCentOS7にインストールしてお手軽に体験してみる](https://qiita.com/S_Katz/items/9402ae8e104b8ac5702b)
- [仮想マシンのリサイズ](https://pc-karuma.net/virtualbox-resize-vm-disk/)