ownCloud x IDCFクラウドで自分だけの最強オンラインストレージを作成する方法

2017年6月5日

OSS「ownCloud」を「IDCFクラウド」に構築し自分だけの最強オンラインストレージを作成する方法に関する内容

ownCloudって何?

独自のオンラインストレージサービスを簡単に構築することができるオープンソース・ソフトウェアです。

自前のサーバーに簡単なセットアップをするだけで、Dropbox や Googleドライブ のようなパソコン、スマートフォンから使えるオンラインストレージサービスを構築することができる夢のようなソフトウェアで、容量制限や機能制限のない自分だけの専用オンラインストレージを手に入れることができます。

なぜIDCFクラウド?

IDCFクラウドを使うことでownCloudに必要な「高速ネットワーク」と「大容量ストレージ」を備えたオンラインストレージを毎月500円(50GB未満の場合)というリーズナブルな価格で利用することができます。またクラウドを活用するためストレージ容量やスペックを自由に拡張でき、将来性にも優れています。

高速なネットワーク

IDCFクラウドはYahoo! JAPANグループ会社でネットワークに定評のあるIDCフロンティアが提供しており、そのネットワーク回線容量は国内第2位※(1,110Gbps)となっています。

※データセンター完全ガイド 2017年春号より

この極めて恵まれたネットワーク環境により、クラウド利用のネックとなるネットワーク課金が毎月3,240GBまでは追加課金なしで利用することができます。もちろん、日本中をつなぐネットワーク速度も非常に高速でDropboxのような大手サービスに比べても引けを取らないどころか、それ以上の速度が出ることも少なくありません。

大容量のストレージ領域

IDCFクラウドでは「オブジェクトストレージ」という従量課金型のクラウドストレージを提供しているため、ownCloudに最適な容量制限がない極めて壊れにくいストレージ領域を確保することができます。

オブジェクトストレージはデータを「オブジェクト」として扱うなど多少複雑な技術ですが、次のようなメリットがあります。()内はIDCFクラウドの仕様

  • 使った分だけ課金(初期費用、最低利用容量なし)
  • 壊れにくい(堅牢性:99.999999999%)
  • いつでも使える(稼働率:99.9%)
  • ファイル数に制限がない(無制限)
  • 巨大なサイズが扱える(5TBまで※)

※使うサーバーがボトルネックとなるため、GBクラスが実用レベル

50GB未満は無料

IDCFクラウドを使う決め手となるのが「オブジェクトストレージの50GB未満は無料」という点です。

IDCFクラウドのオブジェクトストレージでは「従量プラン」と「定額プラン『10TBパック』」の2つの料金プランから選択することができ、従量プランであれば50GB未満は課金対象となりません。もちろん初期費用や手数料も必要ありません。

つまり、サーバー代金500円(工夫することで200円台も可能)だけでownCloudに最適な次の環境を得ることができます。

  • 3,240GBまで無料の高速ネットワーク
  • 50GB未満無料の大容量ストレージ

サーバーの作成

ownCloudのインストール先となる仮想サーバーを作成します。IDCFクラウドでは公式マニュアルやヘルプが非常に充実しているためそちらを参照してください。アカウント作成から仮想サーバー作成まで画像付きで分かりやすくまとめられています。

なお、今回使用するサーバーは

  • IDCFクラウド Light.S1(1CPU、1GBメモリ)
  • おすすめテンプレート CentOS 7.3 64-bit

で、ネットワーク設定の際にSSHとHTTPに加えてHTTPSも設定してください。

設定値

ファイアーウォール
  • コメント:HTTPS
  • ソースCIDR:ANY
  • タイプ:HTTPS
ポートフォワード
  • コメント:HTTPS
  • プライベートポート:443
  • パブリックポート:443
  • プロトコル:TCP
  • 仮想マシン:仮想マシン名(選択)

 ソフトウェアのセットアップ

ownCloudにはウェブサーバーとデータベースサーバー、PHP実行環境が必要です。今回はそれぞれ次のソフトを使います。

  • ウェブサーバー:nginx
  • データベースサーバー:MiraiDB
  • PHP実行環境:PHP7.1

更に今回は「最強オンラインストレージ」を作成するため次のソフトウェアを使用します。

  • Let’s Encrypt
  • S3QL
  • FastCGI
  • Redis
  • OPcache
  • APCu

ソフトウェアのインストール

yumリポジトリを追加します。


##EPEL
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
##Remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

最新版のnginxをインストールします。


rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum -y install nginx

簡単な準備を行います。


mkdir -p /var/www
mkdir -p /var/lib/nginx/fastcgi
sed -i 's/root   \/usr\/share\/nginx\/html/root \/var\/www/g' /etc/nginx/conf.d/default.conf

nginxの起動と自動起動を有効にします。


systemctl start nginx.service
systemctl enable nginx.service

httpsに対応させるため Let’s Encrypt をインストールします。 hogehoge.compute.idcfcloud.comの部分は独自ドメインかIDCFクラウドのホスト名に変更してください。


git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto certonly --webroot -w /var/www -d hogehoge.compute.idcfcloud.com
Enter email address: ← メールアドレス入力
(A)gree/(C)ancel: ← A
(Y)es/(N)o:: ← Y

黄色でIMPORTANT NOTES:と表示されればOKです。2048bitのDH鍵を生成して強度を高めます。


openssl dhparam 2048 -out /etc/nginx/dhparam.pem

Let’s Encryptの証明書は有効期限が3ヶ月と短いため、cronで自動更新を設定します。(毎月10の午前5時に設定)


crontab -e
0 05 10 * * /root/letsencrypt/letsencrypt-auto renew && systemctl restart nginx.service

PHP7.1.xをインストールします。


yum -y install --enablerepo=epel,remi-php71 php php-opcache php-devel php-fpm php-gd php-pdo php-dom php-mbstring php-mcrypt php-mysqlnd php-mssql php-pecl-xdebug php-openssl php-json php-pecl-apcu php-pdo_sqlite php-pdo_mysql php-pecl-memcached php-bcmath php-msgpack php-ldap php-pecl-imagick php-pgsql php-pecl-pthreads php-pecl-msgpack php-posix php-pecl-zip php-pecl-redis

設定を最適化します。


sed -i 's/apache/nginx/g' /etc/php-fpm.d/www.conf
sed -i 's/listen = 127.0.0.1:9000/listen = \/var\/run\/php-fpm\/php-fpm.sock/g' /etc/php-fpm.d/www.conf
sed -i 's/listen.mode = 0660/listen.mode = 0660\nlisten.owner = nginx\nlisten.group = nginx/g' /etc/php-fpm.d/www.conf
sed -i 's/;clear_env = no/clear_env = no/g' /etc/php-fpm.d/www.conf
chown -R nginx:nginx /var/lib/php/

データベース(MariaDB)とPHP間の設定を最適化します。


vi /etc/php.d/30-mysqli.ini
##次の行を追加
mysqli.allow_local_infile=On
mysqli.allow_persistent=On
mysqli.cache_size=2000
mysqli.max_persistent=-1
mysqli.max_links=-1
mysqli.connect_timeout=60
mysqli.trace_mode=Off

OPcacheの設定を最適化します。


vi /etc/php.d/10-opcache.ini
##次の項目を修正
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 4000
opcache.revalidate_freq=600
opcache.fast_shutdown=1

APCuの設定を最適化します。


vi /etc/php.d/40-apcu.ini
##次の項目を修正
apc.enabled = 1
apc.enable_cli = 1
apc.shm_size = 64M
apc.ttl=7200

PHPの起動と自動起動を有効にします。


systemctl start php-fpm.service
systemctl enable php-fpm.service

Redisをセットアップします。


yum -y install redis
sed -i.bak -e s'/^save/#save/' /etc/redis.conf

Redisの起動と自動起動を有効にします。


systemctl start redis.service
systemctl enable redis.service

RedisとPHP間の設定を最適化します。


vi /etc/php-fpm.d/www.conf
##次の項目を修正
php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://127.0.0.1:6379"

MariaDBをインストールします。


yum -y install mariadb mariadb-server

MariaDBの起動と自動起動を有効にします。


systemctl start mariadb.service
systemctl enable mariadb.service

MariaDBをセットアップします。


mysql_secure_installation
Enter current password for root (enter for none): ← 空エンター
Set root password? [Y/n] ← Y
New password: ← DBの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

設定ファイルを最適化します。


vi /etc/my.cnf
##次の項目を修正
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
character-set-server=utf8
symbolic-links=0
user=mysql
[client]
default-character-set=utf8
[mysqldump]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

分離モードをownCloud推奨のREAD-COMMITTEDに設定します。


vi /etc/my.cnf.d/server.cnf
##次の行を追加
[server]
transaction-isolation=READ-COMMITTED

MariaDBを再起動して、データベースを作成します。

  • データベース名:owncloud_db
  • ユーザ名:owncloud_user

systemctl restart mariadb.service
mysql -u root -p
Enter password: ← DBのrootパスワードを入力
create database owncloud_db;
GRANT ALL PRIVILEGES ON owncloud_db.* TO owncloud_user@localhost IDENTIFIED BY 'ユーザに設定するパスワード';
FLUSH PRIVILEGES;
exit

オブジェクトストレージのセットアップ

仮想サーバー同様、公式マニュアルやヘルプが非常に充実しているためそちらを参照してください。画像付きで分かりやすくまとめられています。

サーバーとオブジェクトストレージをつなく S3QL をセットアップします。

参考:S3QLでさくらのオブジェクトストレージサービスをローカルマウントしてみよう(CentOS7版) – さくらのナレッジ


yum -y --enablerepo=epel install python34-devel python34-setuptools python34-crypto python34-apsw systemd-devel libattr-devel sqlite-devel fuse-devel psmisc bzip2
easy_install-3.4 pip
pip3 install defusedxml requests dugong llfuse pytest pytest-catchlog git+https://github.com/systemd/python-systemd.git#egg=systemd
cd /usr/local/src/
wget https://bitbucket.org/nikratio/s3ql/downloads/s3ql-2.21.tar.bz2
tar jxf s3ql-2.21.tar.bz2
cd s3ql-2.21
python3 setup.py build_ext --inplace
python3 setup.py install
mkdir /root/.s3ql/
vi /root/.s3ql/authinfo2
##次の行を追加
[s3c]
storage-url: s3c://ds.jp-east.idcfcloud.com/xxx ← エンドポイント + バケット名
backend-login: xxxxxxxxxxxxxxxxxxx ← API Key
backend-password: xxxxxxxxxxxxxxxxxxxx ← Secret Key

chmod 600 /root/.s3ql/authinfo2
mkdir /var/idcf_objectstorage
mkdir /var/cache/s3ql
chmod 700 /var/cache/s3ql
mkfs.s3ql --plain --cachedir /var/cache/s3ql --authfile /root/.s3ql/authinfo2 s3c://ds.jp-east.idcfcloud.com/xxx
mount.s3ql --cachedir /var/cache/s3ql --authfile /root/.s3ql/authinfo2 --compress none --cachesize 5242880 --allow-other s3c://ds.jp-east.idcfcloud.com/xxx /var/idcf_objectstorage
chown nginx:nginx /var/idcf_objectstorage/

nginx.confをownCloudに最適化します。


cd /etc/nginx/
rm -f nginx.conf
vi nginx.conf

次のコードを丸ごと貼り付けます。


user              nginx;
worker_processes auto;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
events {
worker_connections  2048;
multi_accept on;
use epoll;
}
http {
include       /etc/nginx/mime.types;
default_type  application/octet-stream;
access_log  /var/log/nginx/access.log;
#高速化
sendfile          on;
tcp_nopush        on;
tcp_nodelay       on;
keepalive_timeout 5;
connection_pool_size 1024;
request_pool_size 8k;
#静的ファイル高速化
open_file_cache max=100000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
#通信
client_max_body_size    100m;
client_body_buffer_size 256k;
server_tokens     off;
server_name_in_redirect off;
include /etc/nginx/conf.d/owncloud.conf;
}

owncloud用の設定ファイルを作成、設定します。


cd conf.d
vi owncloud.conf

次のコードを丸ごと貼り付けます。


server {
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name hogehoge.compute.idcfcloud.com;
root        /var/www;
index       index.php;
charset     utf-8;
access_log  /var/log/nginx/hogehoge.compute.idcfcloud.com.access.log;
error_log   /var/log/nginx/hogehoge.compute.idcfcloud.com.error.log;
#SSL
ssl_certificate /etc/letsencrypt/live/hogehoge.compute.idcfcloud.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/hogehoge.compute.idcfcloud.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security max-age=15768000;
ssl_stapling on;
ssl_stapling_verify on;
#セキュリティ
add_header X-XSS-Protection "1; mode=block";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
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;
}
location ^~ /.well-known/acme-challenge { }
# set max upload size
client_max_body_size 512M;
fastcgi_buffers 64 4K;
# Disable gzip to avoid the removal of the ETag header
gzip off;
# Uncomment if your server is build with the ngx_pagespeed module
# This module is currently not supported.
#pagespeed 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)/ {
return 404;
}
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
return 404;
}
location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
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_param HTTPS on;
fastcgi_param modHeadersAvailable true; #Avoid sending the security headers twice
fastcgi_param front_controller_active true;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_intercept_errors on;
fastcgi_request_buffering off; #Available since NGINX 1.7.11
}
location ~ ^/(?:updater|ocs-provider)(?:$|/) {
try_files $uri $uri/ =404;
index index.php;
}
# Adding the cache control header for js and css files
# Make sure it is BELOW the PHP block
location ~* \.(?:css|js)$ {
try_files $uri /index.php$uri$is_args$args;
add_header Cache-Control "max-age=15778463";
# Add headers to serve security related headers (It is intended to have those duplicated to the ones above)
# Before enabling Strict-Transport-Security headers please read into this topic first.
#add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";
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;
# Optional: Don't log access to assets
access_log off;
}
location ~* \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$ {
try_files $uri /index.php$uri$is_args$args;
# Optional: Don't log access to other assets
access_log off;
}
}

タイプミスがないか確認して、再起動します。


/usr/sbin/nginx -t
systemctl restart nginx.service

ownCloudのインストール

ownCloud公式サイトからzipをダウンロードして、セットアップします。


wget https://download.owncloud.org/download/community/owncloud-latest.zip
unzip owncloud-latest.zip
cp -r owncloud/* /var/www
chown -R nginx:nginx /var/www
vi /var/www/config/config.php
##次の行を ");" の前に追加
'filelocking.enabled' => true,
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'memcache.local' => '\OC\Memcache\APCu',
'redis' => array(
'host' => '127.0.0.1',
'port' => 6379,
),

crontab -u nginx -e
*/15 * * * * php -f /var/www/cron.php
sudo -u nginx /var/www/occ background:cron

ownCloudのセットアップ

https://ドメイン名/にアクセスして、指示に従ってインストールを進めていくだけです。

参考

  • データベース名:owncloud_db
  • ユーザ名:owncloud_user