ArchLinuxにownCloudを構築した

ArchLinuxにownCloudを構築したのでメモ

ファイル共有をするのにRedmine上でのファイル共有だと何かと不便なのでownCloudを構築してみた

ownCloudを選択した理由はプラギンでRedmineと連携でユーザ管理が出来るっぽかったので
肝心の連携云々はまだやってないです(そのうちやります&書きます)

ということでRedmineを構築してあるサーバと同じサーバに構築します
一応本番環境鯖なので、作業は一度ローカルのコンテナでシミュレートしてから本番環境を構築しました

環境とか

  • ArchLinux
  • ownCloud 8.1.0-1
  • Apache 2.4.16-1
  • postgresql 9.4.4-2 最近Postgresqlに乗り換えました(Redmineの方もMySQLからPostgresqlにマイグレーションしたい...)

phpの設定

まず、phpのインストール

$ sudo pacman -S php php-apache

mpmの変更。これをしないとphpが上手く動作してくれない。

LoadModule mpm_event_module modules/mod_mpm_event.so #コメントアウト
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so #アンコメント or 追加

以下の2行を追加する

LoadModule php5_module modules/libphp5.so #Loadmoduleリストの最後に追加
Include conf/extra/php5_module.conf #Includeリストの最後に追加

そしてapacheを再起動

$ sudo systemctl restart httpd

owncloudのインストールと設定

owncloudのインストール

$ sudo pacman -S owncloud
phpのエクステンションを入れる
$ sudo pacman -S php-intl php-mcrypt
DB用のパッケージもインストール

今回はPostgresqlを使用するので、php-pgsqlをインストールする。
MySQLの場合は違うパッケージなので注意

$ sudo pacman -S php-pgsql

/etc/php/php.iniの編集

以下をアンコメント

gd.so
iconv.so
xmlrpc.so
zip.so
bz2.so
curl.so
intl.so
mcrypt.so
openssl.so
# 以下DBにpostgresを使用する場合
pdo_pgsql.so
pgsql.so

Apacheにowncloudの設定を記入

owncloudの設定をApacheのextraディレクトリにcp

$ sudo cp /etc/webapps/owncloud/apache.example.conf /etc/httpd/conf/extra/owncloud.conf

httpd.confのファイルの最後に以下の1行を追加

Include conf/extra/owncloud.conf

このままではRedmineと競合してしまうのでownCloudをサブディレクトリで動くように変更しておく。 VirtualHostの部分をコメントアウト

$ sudo vim /etc/httpd/conf/extra/owncloud.conf
#<VirtualHost *:80>
#    ServerAdmin foo@foofarm.com
#    DocumentRoot /usr/share/webapps/owncloud
#    ServerName owncloud.foo.com
#    ErrorLog /var/log/httpd/owncloud.foo.info-error_log
#    CustomLog /var/log/httpd/owncloud.foo.info-access_log common
#</VirtualHost>

また、httpd.confで、mod_dav と mod_dav_fs がLoadされている場合、コメントアウトしておかないとownCloudの実装と衝突する可能性があるらしい。

owncloudディレクトリの所有者の変更

$ sudo chown -R http:http /usr/share/webapps/owncloud/

postgresqlのインストールと設定

postgresqlのインストール
$ sudo pacman -S postgresql
Postgresqlの初期設定

まず、

$ sudo su - postgres

でpostgresユーザにsuして、

postgres$ initdb --locale en_US.UTF-8 -E UTF8 -D '/var/lib/postgres/data'

を実行。postgresqlをstart&enable。

$ sudo systemctl start postgresql.service
$ sudo systemctl enable postgresql.service
/etc/php/php.ini

一応/etc/php/php.iniの確認

# さっきアンコメントした
extension=pdo_pgsql.so
extension=pgsql.so

# 以下のように変更。Archはデフォルトでこの設定になっているはず。
[PostgresSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
ownCloud用のユーザとDBの作成

postgresqlに接続

$ psql -hlocalhost -Upostgres

以下のSQLを実行

CREATE USER username WITH PASSWORD 'password';
CREATE DATABASE owncloud TEMPLATE template0 ENCODING 'UNICODE';
ALTER DATABASE owncloud OWNER TO username;
GRANT ALL PRIVILEGES ON DATABASE owncloud TO username;
\q

ここで作成するユーザは、ownCloudがDBに接続するために使用するユーザ。
ユーザ名は何でもおk。ユーザ名やデータベース名はこの次にブラウザ上で設定する。

apacheを再起動して接続出来るか確認
$ sudo systemctl restart httpd.service

アクセスしてみる

http(s)://example.org/owncloud/
もしくは
http(s)://example.org/owncloud/index.php

...org/owncloud/ ← ここの「/」をつけないと開けないので注意

セットアップ画面が表示されたらさっき作成したユーザ名とDB名を入力して完了!

ログのtimezoneを変更する

デフォルトだとログに記録される時間がUTCになっている
ので、変更。

/etc/webapps/owncloud/config/config.php

'logtimezone' => 'UTC',
を
'logtimezone' => 'Asia/Tokyo',

に変更

セキュリティ&セットアップ警告

ログインに成功したら、右上のプルダウンから設定を開く。
設定画面の一番上に「セキュリティ&セットアップ警告」という項目があるのでその部分を解決していく。

「/dev/urandom は PHP から読み取ることができず、この状態はセキュリティの観点からおすすめできません。より詳しい情報については、documentation を参照ください。」

英語版のArchWikiのowncloudのページにphp.iniファイルのopen_basedir:/dev/urandomを追加しろと書いてあったので

open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/dev/urandom

こんな感じに変更してみたはいいけど警告が消えない。
四苦八苦しているとgithubに似たような警告メッセージが出ている人がいた。

https://github.com/owncloud/core/issues/17465

The addition of /dev/urandom needed to be in php_admin_value open_basedir within the vhost file, and not within /etc/php/php.ini

どうやら/etc/php/php.iniではなく、/etc/httpd/conf/extra/owncloud.confの方に書いてあげなきゃいけなかったみたい

確かに /etc/httpd/conf/extra/owncloud.conf を見てみると

<Directory /usr/share/webapps/owncloud/>
    Options FollowSymlinks
    AllowOverride all
    Require all granted

    # ↓これ
    php_admin_value open_basedir "/srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/owncloud/:/etc/webapps/owncloud"
</Directory>

確かにこっちにもopen_basedirがある
ので、ここを

    php_admin_value open_basedir "/srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/owncloud/:/etc/webapps/owncloud:/dev/urandom"

に変更してapacheを再起動すると警告が消えているはず
/etc/php/php.iniの方には追加しなくてもおk。

「The "Strict-Transport-Security" HTTP header is not configured to least "15768000" seconds. For enhanced security we recommend enabling HSTS as described in our security tips.」

The "Strict-Transport-Security" HTTP header is not configured to least "15768000" seconds. For enhanced security we recommend enabling HSTS as described in our security tips.

って怒られる場合は公式ドキュメントを参考に、

<VirtualHost *:443>
    ServerName cloud.owncloud.com
    Header always add Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
</VirtualHost>

こんな感じで変更。
自分の環境だと、/etc/httpd/conf/extra/httpd-ssl.conf

<VirtualHost _default_:443>
    Header always add Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
</VirtualHost>

というような感じで変更。
もしRedmineとownCloudでVirtualhostを分けるなら

<VirtualHost redmine.mydomain.net:443>
    ...
    Header always add Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
</VirtualHost>
<VirtualHost owncloud.mydomain.net:443>
    ...
    Header always add Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
</VirtualHost>

みたいにすれば行けると思う

このStrict-Transport-Securityは、httpでアクセスしてきたら強制的にhttps通信にするものらしい

Archだとmod_headersがデフォルトでLoadされているけどそれ以外の環境だったらLoadmoduleされているか確認

「メモリキャッシュが設定されていません。パフォーマンスを向上するために、可能であれば memcache を設定してください。 より詳しい情報については、documentation を参照してください。」

そのうち書きます

その他logとかエラーなど

ログの Array 関連

「Array to string conversion at /usr/share/webapps/owncloud/lib/private/template/functions.php#36」

設定画面のログを見ると、

Array to string conversion at /usr/share/webapps/owncloud/lib/private/template/functions.php#36

と表示されていて、ググってたらgithubで見つけた
https://github.com/owncloud/core/issues/17468
https://github.com/owncloud/core/issues/17782

ownCloudの8.1でのバグっぽい?

「array_key_exists() expects parameter 2 to be array, null given at /usr/share/webapps/owncloud/settings/controller/appsettingscontroller.php#192 」

こっちは8.1のバグみたい
https://github.com/owncloud/core/issues/17433
https://github.com/owncloud/core/pull/17606
github上では修正されているみたいだから、Archのパッケージが更新されるまで待つしか無いっぽいかな

ログの is_file()... 関連

こんな感じのエラーが何個か出るかも

is_file(): open_basedir restriction in effect. File(/usr/share/webapps/owncloud/apps/build.xml/appinfo/info.xml) is not within the allowed path(s): (/srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/owncloud/:/etc/webapps/owncloud:/dev/urandom) at /usr/share/webapps/owncloud/lib/private/app.php#782

https://github.com/owncloud/core/issues/17400
https://github.com/owncloud/core/pull/17472
github見たら修正されていたのでこっちもArchのパッケージが更新されるまで待つ

TODO

そのうちやりますor書きます

  • メモリキャッシュ(memcache)の設定
  • RedmineのPostgresへのマイグレーション
  • ownCloudとRedmineの連携(ユーザ)
  • 現在はSSL証明書的な問題でRedmineのサーバのサブディレクトリ内にownCloudがある状態なので、ワイルドカード署名的なのを取得してvirtualhost、もしくは別サーバで運用したい

参考

php関連
ownCloudの設定
Postgreの設定
Log
トラブル関連