nginx
mariadb
centos7
PHP7
nextcloud

CentOS7にnginxでNextcloudをインストール

More than 1 year has passed since last update.

はじめに

とりあえず無料のクラウドストレージをデータの一元化と家族のストレージ管理をしたい
家族分も結局支払っているので、バラバラに請求がくるよりも管理しやすいってことで
Nextcloudを余ってる古いストレージに構築してあとはメンテで寿命がきたら随時交換できるように準備だけはやっておこうかなと。

構築の流れとしては詰まったり躓いたりと試行錯誤しながら体当たりでやっているので
ダラダラとくだらん文章に仕上がっているけれど、部分的にメモっても忘れそうになるから
基本読み飛ばして、忘れたときに読み返せるような簡易メモ的な何か

構築環境

CentOS7
PHP 7.1
nginx 1.11
MariaDB 10.1
nextcloud 11

PHP

console
EPELリポジトリインストール
$ sudo yum install epel-release
PHPインストール
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ sudo yum install --enablerepo remi-php71 php-fpm php-gd php-json php-mysql php-curl php-mbstring php-intl php-mcrypt php-imagick php-xml php-zip php-apcu

サービス有効化
$ sudo systemctl enable php-fpm
$ sudo systemctl start php-fpm

パスの確認(PHP-fpmのenv[PATH]に使用)
$ printenv PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/testuser/.local/bin:/home/testuser/bin

セッションの設定
$ sudo chown -R nginx:nginx /var/lib/php/session

PHP-fpmの設定
$ sudo vi /etc/php-fpm.d/www.conf
www.conf
user = nginx
group = nginx
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0666

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/testuser/.local/bin:/home/testuser/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
console
サービス有効化
$ sudo systemctl restart php-fpm

MariaDB

console
$ sudo vi /etc/yum.repos.d/MariaDB.repo
MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
console
$ sudo yum install mariadb-server

バージョン確認
$ rpm -qa | grep -i mariadb
MariaDB-server-10.1.21-1.el7.centos.x86_64
MariaDB-common-10.1.21-1.el7.centos.x86_64
MariaDB-client-10.1.21-1.el7.centos.x86_64
MariaDB-shared-10.1.21-1.el7.centos.x86_64

MySQLの4バイトサポートを有効
$ sudo vi /etc/my.cnf.d/server.cnf
server.cnf
[mysqld]
innodb_large_prefix=on
innodb_file_format=barracuda
innodb_file_per_table=true
console
mariadb起動
$ sudo systemctl enable mariadb
$ sudo systemctl start mariadb

mariaDB初期設定
$ sudo mysql_secure_installation
# Enterを押す
Enter current password for root (enter for none):
# rootのパスワード設定するか? [y]を選択
Set root password? [Y/n] y
# rootのパスワード入力
New password:
# rootのパスワード再入力
Re-enter new password:
# 匿名ユーザーを削除するか? [y]を選択
Remove anonymous users? [Y/n] y
# rootユーザーのリモートログインをブロックするか? [y]を選択
Disallow root login remotely? [Y/n] y
# テストDBを削除するか? [y]を選択
Remove test database and access to it? [Y/n] y
# ユーザ権限テーブルをリロードするか? [y]を選択
Reload privilege tables now? [Y/n] y

mariaDBにログイン
$ mysql -u root -p
console
MariaDB [(none)]> CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS nextcloud;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON nextcloud.* TO 'username'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> quit
Bye
-------------------------------------------
CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL ON nextcloud.* TO username@‘%’ IDENTIFIED BY ‘password’;

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
CREATE DATABASE IF NOT EXISTS nextcloud;
GRANT ALL PRIVILEGES ON nextcloud.* TO 'username'@'localhost' IDENTIFIED BY 'password';

SSL

いろいろ参考
とりあえずドメイン取得していないので、自己署名で動作確認

console
自己署名証明書作成(nginxの設定 ssl_certificate / ssl_certificate_key)
ドメイン取得していない為
$ sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -subj /CN=localhost -keyout /etc/ssl/server.key -out /etc/ssl/server.crt

DH鍵の変更openSSLで作成(nginxの設定 ssl_dhparam)
$ sudo openssl dhparam -out /etc/ssl/dhparam.pem 2048

DNSサーバの確認(nginxの設定 resolver)
$ cat /etc/resolv.conf
search myvps.jp
nameserver 163.44.76.148
nameserver 157.7.180.133

nginx

console
$ sudo vi /etc/yum.repos.d/nginx.repo
nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
console
$ sudo yum install nginx

バージョン確認
$ nginx -v
nginx version: nginx/1.11.10

nginx設定
$ sudo /etc/nginx/conf.d/default.conf

ここはそれぞれなので簡単に流して

default.conf
upstream php-handler {
    /var/run/php-fpm/php-fpm.sock;
}

server {
    listen 80 ;
    listen [::]:80;
    server_name localhost;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name localhost;

    ssl_certificate /etc/ssl/server.crt;  #証明書と中間証明書を結合したファイル
    ssl_certificate_key /etc/ssl/server.key;  #秘密鍵
    #ssl_trusted_certificate ;  #ルートCA証明書と中間証明書を結合したファイル
    resolver 163.44.76.148 157.7.180.133; #OCSP Responderの名前解決に使うDNS。サーバー上位のDNSサーバーを参照
    ssl_dhparam /etc/ssl/dhparam.pem;   #DH鍵の変更openSSLで作成

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    ssl_prefer_server_ciphers on;
    ssl_stapling on;
    ssl_stapling_verify on;
    # verify chain of trust of OCSP response using Root CA and Intermediate certs

    add_header Strict-Transport-Security "max-age=15768000;includeSubDomains; preload;";
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;

    root /usr/share/nginx/html/nextcloud;

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

    location = /.well-known/carddav {
      return 301 $scheme://$host/remote.php/dav;
    }
    location = /.well-known/caldav {
      return 301 $scheme://$host/remote.php/dav;
    }

    client_max_body_size 2000M;
    fastcgi_buffers 64 4K;

    gzip off;

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

    location / {
        rewrite ^ /index.php$uri;
    }

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
        deny all;
    }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
        deny all;
    }

    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
        include fastcgi_params;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTPS on;
        fastcgi_param modHeadersAvailable true;
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }

    location ~ ^/(?:updater|ocs-provider)(?:$|/) {
        try_files $uri/ =404;
        index index.php;
    }

    location ~* \.(?:css|js|woff|svg|gif)$ {
        try_files $uri /index.php$uri$is_args$args;
        add_header Cache-Control "public, max-age=7200";
        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
        access_log off;
    }

    location ~* \.(?:png|html|ttf|ico|jpg|jpeg)$ {
        try_files $uri /index.php$uri$is_args$args;
        access_log off;
    }
}
console
nginx起動
$ sudo systemctl enable nginx
$ sudo systemctl start nginx

nextcloud

console
$ sudo yum install wget
$ sudo wget https://download.nextcloud.com/server/releases/nextcloud-11.0.1.tar.bz2
$ sudo wget https://download.nextcloud.com/server/releases/nextcloud-11.0.1.tar.bz2.sha256
$ sudo wget https://download.nextcloud.com/server/releases/nextcloud-11.0.1.tar.bz2.asc
NextcloudのGPG公開鍵
$ sudo wget https://nextcloud.com/nextcloud.asc

SHA256チェックサム
$ sudo sha256sum -c nextcloud-11.0.1.tar.bz2.sha256 < nextcloud-11.0.1.tar.bz2

GPG Signature
$ sudo gpg --import nextcloud.asc
$ sudo gpg --verify nextcloud-11.0.1.tar.bz2.asc nextcloud-11.0.1.tar.bz2
gpg: 2017年01月16日 01時07分42秒 JSTにRSA鍵ID A724937Aで施された署名
gpg: "Nextcloud Security <security@nextcloud.com>"からの正しい署名
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
主鍵のフィンガー・プリント: 2880 6A87 8AE4 23A2 8372  792E D758 99B9 A724 937A

「Nextcloud Security <security@nextcloud.com>"からの正しい署名」となってるのでOKのような気がする

nextcloud展開
$ sudo yum install bzip2
$ sudo tar -xjf nextcloud-11.0.1.tar.bz2

ドキュメントルートにコピー
$ sudo cp -r nextcloud /usr/share/nginx/html/

所有権の変更
$ sudo chown -R nginx:nginx /usr/share/nginx/html/nextcloud
シェル作成
$ vi nextcloud.sh
nextcloud.sh
#!/bin/bash
ocpath='/usr/share/nginx/html/nextcloud'
htuser='nginx'
htgroup='nginx'
rootuser='root'

printf "Creating possible missing Directories\n"
mkdir -p $ocpath/data
mkdir -p $ocpath/updater

printf "chmod Files and Directories\n"
find ${ocpath}/ -type f -print0 | xargs -0 chmod 0640
find ${ocpath}/ -type d -print0 | xargs -0 chmod 0750

printf "chown Directories\n"
chown -R ${rootuser}:${htgroup} ${ocpath}/
chown -R ${htuser}:${htgroup} ${ocpath}/apps/
chown -R ${htuser}:${htgroup} ${ocpath}/config/
chown -R ${htuser}:${htgroup} ${ocpath}/data/
chown -R ${htuser}:${htgroup} ${ocpath}/themes/
chown -R ${htuser}:${htgroup} ${ocpath}/updater/

chmod +x ${ocpath}/occ
console
強力なディレクトリアクセス許可
sudo sh nextcloud.sh

firewallの設定

console
使用中のfirewall確認
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

httpの穴あけ
$ sudo firewall-cmd --permanent --zone=public --add-service=http
success

httpsの穴あけ
$ sudo firewall-cmd --permanent --zone=public --add-service=https
success

$ sudo firewall-cmd --reload
success

変更の確認
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client http https ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

再起動
$ sudo systemctl restart firewalld

SELinuxの設定

いままで触ったことないのでよく知らないけど公式通りに手探りで

console
semanageコマンドを使用するため
$ sudo yum install policycoreutils-python

$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/nginx/html/nextcloud/data'
$ sudo restorecon '/usr/share/nginx/html/nextcloud/data'
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/nginx/html/nextcloud/config'
$ sudo restorecon '/usr/share/nginx/html/nextcloud/config'
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/usr/share/nginx/html/nextcloud/apps'
$ sudo restorecon '/usr/share/nginx/html/nextcloud/apps'

WEBへアクセス

ここらでWEBページにアクセスできるようになったので、WEB上でユーザーとデータベースの設定をおこない初期設定を完了する
問題がなければあとは拡張関係の調整

ClamAV(アンチウイルス)

とりあえず公式通りに

console
$ sudo yum install clamav clamav-scanner clamav-scanner-systemd clamav-serve clamav-server-systemd clamav-update

$ sudo vi /etc/freshclam.conf

$ sudo freshclam
$ sudo vi /etc/clamd.d/scan.conf
freshclam.conf
#Example            #Exampleのコメント化
UpdateLogFile /var/log/freshclam.log #ログファイル設定
LogFileMaxSize 2M   #ログファイルサイズ設定
LogTime yes         #ログに時間を表示
LogRotate yes       #ログローテーション設定
DatabaseMirror db.jp.clamav.net     #ミラーデータベース設定
NotifyClamd /etc/clamd.d/scan.conf  #clamd@scanへの更新通知
console
ウイルス定義ファイル最新化
$ sudo freshclam
$ sudo vi /etc/clamd.d/scan.conf
freshclam.conf
#Example            #Exampleのコメント化
LogFile /var/log/clamd.scan  #ログファイル設定
LogFileMaxSize 2M   #ログファイルサイズ設定
LogTime yes         #ログに時間を表示
LogRotate yes       #ログローテーション設定
LocalSocket /var/run/clamd.scan/clamd.sock #ローカルソケット使用設定
FixStaleSocket yes  #異常終了時にソケットを削除
ExcludePath ^/proc/ #スキャン除外ディレクトリ設定
ExcludePath ^/sys/
User root           #実行ユーザ設定
console
起動
$ sudo systemctl enable clamd@scan.service
$ sudo systemctl start clamd@scan

files_antivirusアプリ取得
$ sudo yum install unzip
$ wget https://github.com/nextcloud/files_antivirus/archive/master.zip
$ unzip master.zip
appディレクトリに移動
$ sudo cp -r files_antivirus-master /usr/share/nginx/htm
l/nextcloud/apps
強力なディレクトリアクセス許可
sudo sh nextcloud.sh

あとは公式のページにあるようにログイン後、AppsページにてAntivirusを有効にするとできるらしい
まぁできなかったんだけど、ClamAV単体で定期的にスキャンさせておけばいっか。

暗号化

管理ページ内の暗号化ページでチェックを入れてから
AppsページにてDefault encryption moduleを有効にする
※一回実行したら後戻りはできないので注意

メモリキャッシュ

console
$ sudo vi /usr/share/nginx/html/nextcloud/config/config.php
config.php
arrayの最後に追加
'memcache.local' => '\OC\Memcache\APCu',

アップロードサイズ変更

console
$ sudo vi /etc/php.ini
php.ini
memory_limit = 512M
upload_max_filesize = 2000M
post_max_size = 2000M

強力なディレクトリアクセス許可をしているとWEB上から変更できないので.user.iniを変更

console
$ sudo vi /usr/share/nginx/html/nextcloud/.user.ini
.user.ini
upload_max_filesize=2000M
post_max_size2000M
memory_limit = 512M

androidアプリとの連携

version1.4.1
使いこなせてないだけだと思うが、一応使い勝手について云々
そのうち便利な使い方を発見することを期待しつつ

  • 新規の写真・動画の自動アップロード可(但し過去に撮影したものについては手動)
  • スクリーンショットの自動アップロード不可(手動は可)
  • 手動アップロードは自動アップロードのように年・月・日のフォルダを作成しない
  • 重複ファイルをアップロードするとファイル名を(2)を追加して転送しようとするがエラーとなる
  • タグの設定不可(PCからは可)
  • タグでの検索不可(PCからは可)
  • ギャラリー表示ができない(PCは可)

クラウド比較

余ってる機材があったから活用しようとしたけれど、実際に運用する際の費用を考えるとどうなのか考えどころです。
シスアドであるような故障率とか稼働率とか無視して
故障した時ようにざっくり最大費用を計算

3TB(そんなに使わないけど、余ってたので)のHDDが今4年保証で1.3万前後だったので
RAID6で4本(保証期間内の故障はHDDを送るのでRAIDの方が復元リスク安心?)
13,000円/48カ月*4本≒ 1,083円
あとは筐体台(マザー・電源・CPU.etc)に電気代云々で月1.5千~2千円ぐらいかな?

そのぐらいで他のクラウドサービスを検討すると
さくらVPS 200G 複数ユーザー/¥1,706/月
さくらVPS 100G 複数ユーザー/¥972/月
box 容量無制限 1ユーザー/¥1,800/月
Dropbox 1 TB  1ユーザー/¥1,000/月
google 1 TB  1ユーザー/¥1,300/月
google 100 GB  1ユーザー/¥250/月

古い写真とか豊富で個人的な画像だけでも200G超え
家族分は容量どのくらいでいつまで使うかわからないけど、
クラウドサービスに頼るとすれば下記の感じで¥1,500/月となる
自身 Dropbox 1 TB 
家族1家族2 google 100 GB

他はNASの筐体が「DiskStation DS216j」保証期間2年で19,600円なので
19,600円/24カ月≒816円
上と同じHDD2台で
13,000円/48カ月*2本≒ 541円
計1,357円/月

保証期間が切れたら壊れるとの前提でちゃんとした計算じゃないからなんとも言えないけど
家族が3人以上使用するとなれば機材が長持ちしてくれるかもしれない自作した方がいいのかもしれない
容量の問題が解決できるとなったら次はお金の問題が気になるとか、なんて現金なことでしょうね。

まとめ

だらだらと長く書いたけど、とりあえず動いているのでまぁ良しとしましょう。
Nextcloudで構築すると追加モジュールが多くあって、携帯端末の連携は微妙だけど
他にも自由度が高いので、制約に囚われずメンテに自信があればいいんじゃないかな