CentOS7 + nginx + mariaDBでownCloudインストール ～Dropbox連携まで～

# 概要
VPSにownCloudを導入した際の手順の備忘録。
Dropboxがデバイス数に制限をかけたせいで非常に使いづらくなったため、移行した。（課金してもよいが、別に1TBもいらない）

通常ownCloudではapacheを利用することが多いが、今回はもともと導入済みであったnginxを利用してインストールを行った。
また、ownCloudをwgetでパッケージをダウンロードするのでなく、リポジトリを登録してdnfからインストールした。

# 環境・構成

みかか系の超格安VPS。

```bash
[puri@gbgb ~]$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
```

SSL証明書は以前にLet's Encryptで取得済み。また、ファイアウォールの設定もすでに設定済み。

# 必要なパッケージ
- dnf

yumの後継。ownCloudをインストールするのに必要。

```bash
yum -y install wget
yum -y install epel-release
yum -y install dnf
```
[参考](https://qiita.com/piyojiro/items/58f9a89120808e1c1e84)


- PHP 7.2

ownCloud動作には、PHP5.6以上が必要。
CentOSで普通にyumするとPHP5.4がインストールされるため、remiリポジトリを追加する必要がある。

```
// remiリポジトリ追加
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum --enablerepo=remi-php71 install php \
  php-dom \
  php-fpm \
  php-gd \
  php-mbstring \
  php-mysqlnd \
  php-pdo \
  php-pdo_mysql \
  php-pecl-zip \
  php-intl
```

- mariaDB, nginx

詳細省略

# owncloudインストール

[公式サイト](https://download.owncloud.org/download/repositories/production/owncloud/)を参考にインストールする。

```bash
pm --import https://download.owncloud.org/download/repositories/production/CentOS_7/repodata/repomd.xml.key
dnf config-manager --add-repo http://download.owncloud.org/download/repositories/production/CentOS_7/ce:stable.repo
dnf clean all
dnf install owncloud-files; dnf upgrade owncloud-files
```
以上の手順で、`/var/www/html/owncloud`に諸々のファイルが配置される。


# PHP設定ファイルの編集
以下の2ファイルの書き換えが必要。[こちらのサイト](http://sig9.hatenablog.com/entry/2017/10/21/000000)を参考にした。

- `/etc/php.ini`
- `/etc/php-fpm.d/www.conf`

また、以下のディレクトリの所有グループを`apache`から`nginx`に変更する。

```bash
chown -R root:nginx /var/lib/php/session
```

# nginx設定ファイルの編集

`/etc/nginx/nginx.conf`は、http接続の時にhttps接続にリダイレクトするよう設定している。
なお、Dropboxと連携する際はhttpsが必須。

```/etc/nginx/nginx.conf
[puri@gbgb ~]$ cat /etc/nginx/nginx.conf
# 省略

http {

# 省略

    # 下記設定でリダイレクト
    server {
        server_name www.example.com;
        return 301 https://www.example.com$request_uri;
    }
}
```

`/etc/nginx/conf.d/owncloud.conf`でowncloud関連の設定をする。

```/etc/nginx/conf.d/owncloud.conf
[puri@gbgb ~]$ cat /etc/nginx/conf.d/owncloud.conf
upstream php-handler {
    #server 127.0.0.1:9000;
    # UNIXソケットファイルを指定して、処理をphp-fpmへ転送する
    server unix:/var/run/php-fpm/php-fpm.sock;
}

server {
    listen 443 ssl http2;
    ssl_certificate "/etc/letsencrypt/live/<domain>/fullchain.pem";
    ssl_certificate_key "/etc/letsencrypt/live/<domain>/privkey.pem";
#   ssl_session_cache shared:SSL:1m;
#   ssl_session_timeout  10m;
#   ssl_ciphers HIGH:!aNULL:!MD5;
#   ssl_prefer_server_ciphers on;
    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    # rootに以下のパスを指定することでwww.example.com/owncloudでowncloudにアクセスできる
    root   /var/www/html/;

    client_max_body_size 5G;
    fastcgi_buffers 64 4K;

    rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
    rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
    rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

    index index.php;
    error_page 403 /core/templates/403.php;
    error_page 404 /core/templates/404.php;


    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }


    location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README) {
        deny all;
    }

    location / {
        rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
        rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

        rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
        rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

        rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

        try_files $uri $uri/ index.php;
    }

    location ~ \.php(?:$|/) {
        root           /var/www/html;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_pass php-handler;
        include        fastcgi_params;
    }

    # dataディレクトリにユーザのデータが保存される。リモートからのアクセスを禁止するか、ドキュメントルートの外に配置する。
    location /owncloud/data/ {
        allow 127.0.0.1;
        deny  all;
    }
}
```

# SELinuxの設定
SELinuxが有効になっている場合、ownCloudがディレクトリにアクセスできず正常に動作しない可能性がある。
SELinuxを無効にして運用してもよいが、セキュリティを考慮してSELinuxのコンテキストを変更して運用することも可能。その場合、[RedhatのSELinux](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/managing_confined_services/sect-managing_confined_services-the_apache_http_server-types)を参考にポート、ディレクトリのコンテキストを変更する。
少なくとも、以下のディレクトリには書き込みを許可するコンテキストが必要。

```bash
[puri@gbgb owncloud]$ pwd
/var/www/html/owncloud
chcon -R -t  httpd_sys_rw_content_t config/
chcon -R -t  httpd_sys_rw_content_t apps/
chcon -R -t  httpd_sys_rw_content_t apps-external/
```

# サービスの起動、mariaDBの設定
[先ほどのサイト](http://sig9.hatenablog.com/entry/2017/10/21/000000)と同様に設定する。
~~mariaDBって金森まりあさん感あっていいですよね、かわいい~~


# Dropboxとの連携設定
## Dropbox側の設定
App keyとApp secretを取得する。また、Redirect URIsの設定が必要。

[Dropboxの開発者ページ](https://www.dropbox.com/developers/apps/)に行き、'Create app'をクリック。諸所の設定を行い、appを作成する。
作成し次のページに遷移すると、Redirect URIsの欄があるので、
`https://www.example.com/owncloud/index.php/settings/admin?sectionid=storage`を入力する。

## ownCloud側の設定
左上のMarketをクリックする。
![00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362349/2819bd12-c4e1-d8e5-626a-632bacf73837.png)
ストレージのカテゴリを選択し、その中から'External Storage: Dropbox'を選択し、インストールする（Dropboxのロゴが表示されているもの）。
App keyとApp Secretを入力する欄があるので、先ほどのDropbox開発者ページのそれをコピペする。
最後にDropboxの認証ページに飛ばされ、許可すると連携される。

# まとめ
賢いひとはDropboxのデバイス数制限の関係で何か気づくのではないのでしょうか？ぜひ皆さんもownCloudを立てましょう。