2016-10-27 · FreeBSD

FreeBSD11.0にOwnCloud9.1を入れてプライベートDropboxを作る話

このエントリーをはてなブックマークに追加

前口上

一人で仕事を始めてから数年、試行錯誤を繰り返してこんなフォルダ群を作りました。

これをiMacとWindowsデスクトップ、Macbookで共有したりバージョン管理したいのですが、全部合わせると数10GBほどあるので動作も高速であってほしい。ついでに趣味で作って持て余してる自宅の20TBのファイルサーバを使役したい。

QNAPのQsyncを試してみたんですが同期が遅すぎてダメでした。

インストール

10/10にFreeBSD 11.0-RELEASEがリリースされました。体育の日ですね。

120%絶対ハマる気がしますが折角だからこれを採用します。

各種ソフトウェアはFreeBSDのパッケージマネージャであるpkgでインストールできるらしいので、それを使います。CentOSでいうyum、Debianでいうaptですね。

WebサーバにApache 2.4、DBサーバにはMySQL 5.6、owncloud 9.1.0。全部pkgで入れましょう。pkg最高!

# 以下は全てrootでの作業です。シンタックスの便宜上、プロンプトをroot%とします。
root% pkg install apache24 mysql56-server
root% pkg install owncloud

次に/etc/rc.confにサービスの登録をします。普通にファイル書いても良いのですが、FreeBSD 9.2以降はsysrcが使えます。

root% sysrc apache24_enable=yes
root% sysrc mysql_enable=yes

サービス起動。先にサービスを登録しないと以下のserviceコマンドで文句を言われます。

root% service apache24 start
root% service mysql-server start

MySQLの設定

インストール直後はMySQLのrootにパスワードがかかっていないので、対話形式のコマンドを使って設定しましょう。

root% mysql_secure_installation

OwnCloudで使うデータベースの作成をしましょう。

MySQLのユーザーをowncloud用に作りたい場合などは公式ドキュメントにめっちゃ詳しく載っているので読みましょう。今回はガバガバ運用のためrootを使いました。

root% mysql -u root -p
mysql> CREATE DATABASE owncloud DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)

SSL証明書の作成

オレオレ証明書を作りましょう。

server.key、server.csr、server.crtの3ファイルを生成します。

openssl genrsaコマンドに-des3オプションを渡すとパスワードを付けられますが、再起動時などにいちいちパスフレーズを求められて面倒なので省略します。

root% openssl genrsa -out server.key 2048
root% openssl req -new -key server.key -out server.csr
root% openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
root% mv server.* /usr/local/etc/apache24/
root% chmod 0400 /usr/local/etc/apache24/server.*

Apacheの設定

なおNginxでも普通に動きます。設定サンプルはこちら

SSLの設定

/usr/local/etc/apache24/httpd.confを編集します。

# 以下の行のコメントを外す
LoadModule socache_shmcb_module libexec/apache24/mod_socache_shmcb.so
LoadModule ssl_module libexec/apache24/mod_ssl.so

PHPの設定

mod_php5で十分だと思います。FastCGI派はsysrcでサービス登録しよう。

root% pkg install mod_php56

以下のファイルを追加。

root% touch /usr/local/etc/apache24/Includes/php.conf
<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
    SetHandler application/x-httpd-php-source
</FilesMatch>

次に、巨大なファイルを共有・同期できるようにPHPの設定をしましょう。

root% cp /usr/local/etc/php.ini-production  /usr/local/etc/php.ini

/usr/local/etc/php/php.iniを編集します。

; ここを環境に合わせて編集
upload_max_filesize = 10G

OwnCloudの設定

以下のファイルを追加。

root% touch /usr/local/etc/apache24/Includes/owncloud.conf
Alias /owncloud /usr/local/www/owncloud
AcceptPathInfo On
<Directory /usr/local/www/owncloud>
    AllowOverride All
    Require all granted
    Header set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
</Directory>

Header set〜の行は入れないと後で文句を言われるので、公式ドキュメントを参考に書きましょう。

最後にApacheを再起動。

root% service apache24 restart

動作確認

https://サーバのIPアドレス/owncloud/へブラウザで接続します。

owncloud

やったぜ!

おまけ - Redisで高速化

いきなりですが高速化の話です。公式ドキュメントに沿ってRedisを導入します。

Apacheの再起動も忘れずにしましょう。

root% pkg install redis php56-redis
root% sysrc redis_enable=yes
root% service redis start
root% service apache24 restart

/usr/local/www/owncloud/config/config.php に以下を追記。

$CONFIG = array (

  // (中略)

  'memcache.local' => '\OC\Memcache\Redis',
  'redis' => array(
     'host' => 'localhost',
     'port' => 6379,
  ),
);

おまけ2 - コードの整合性エラー

FreeBSD pkg版のowncloud 9.1.0_1はどうやらソースコードの一部がオリジナル版と違うようです。

調べてみると、どうやらcore/Controller/LoginController.phpがエラーを吐いている様子。えっやだ大丈夫?

とりあえずGithubにあるBranch:stable9.1とdiffを取ってみます。

root% cp /usr/local/www/owncloud/core/Controller/LoginController.php LoginController.pkg.php
root% curl -O https://raw.githubusercontent.com/owncloud/core/stable9.1/core/Controller/LoginControl
root% diff LoginController.pkg.php LoginController.php
109c109
< 			return new RedirectResponse(OC_Util::getDefaultPageUrl());
---
> 			return new RedirectResponse($this->getDefaultUrl());
198a199,201
> 		// User has successfully logged in, now remove the password reset link, when it is available
> 		$this->config->deleteUserValue($loginResult->getUID(), 'owncloud', 'lostpassword');
>
217c220,228
< 		return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index'));
---
>
> 		return new RedirectResponse($this->getDefaultUrl());
> 	}
>
> 	/**
> 	 * @return string
> 	 */
> 	protected function getDefaultUrl() {
> 		return OC_Util::getDefaultPageUrl();

う〜ん大した事なさすぎる変更。

現在のLoginController.phpと入れ替えてみましたが整合性エラーは治らず。

次に、Tag: v9.1.0を試してみます。

root% curl -O https://raw.githubusercontent.com/owncloud/core/v9.1.0/core/Controller/LoginController.php
root% cp LoginController.php /usr/local/www/owncloud/core/Controller/LoginController.php

再度整合性チェック。

やったぜ!

結論

Dropboxのビジネス版を使えばいいと思います。

前の記事: IT オーエン合同会社に入社しました
次の記事: Halloween & Helloween