FreeNAS 9.3 jail + h2o + PHP に ownCloud をインストール

[FreeNAS 9.3 jail + h2o](http://qiita.com/katz_engineer/items/bc61ac926107d2118de2) [+ PHP](http://qiita.com/katz_engineer/items/c951ee9dfc01feac271a) の環境に ownCloud をインストールし、[ドメイン](http://qiita.com/katz_engineer/items/26c4718b3c3fc0164130)を与えて[オレオレ認証局](http://qiita.com/katz_engineer/items/9895f0f56c0976f382eb)で電子証明書を署名しました。

FreeNAS でプラグインも用意されていますが、今回は使いません。httpサーバがApacheらしいのと、色々な細かい設定がお仕着せで調整しづらいのと、他に何か突っ込みたい時に足枷になりそうなのと、理由は色々あります。そして独自に構築しようとしてもがいた結果が上記環境です。こんな性格だから要らぬ苦労を背負い込む事が多いんですよね…:sweat:

なお、NL54L というお世辞にもパワフルとは言えない環境に ownCloud みたいなファイル共有サーバを詰め込もうとするなら、パフォーマンスを問題にしてベンチマークテストなどきっちりやった方が良いのでしょう。けど、まあ、ほとんど自分しか使わない環境です。多少の遅さは気合で待つ！という手が使えますし、仮に遅くても代替手段がありません。PHPとFreeNASのパフォーマンスチューニングとか、幼子抱える私用時間に出来る話ではありませんしね:sweat_smile:

というわけで、インストールして動かして、外部からのアクセスも可能にする、というだけの手順です。

# インストール
pkg があります。FreeNAS プラグインは使いませんが、FreeBSD pkg は活用させていただきます。

```
# pkg install owncloud
```

普通にパッケージをインストールするだけです。悩む点は何もありません。そして最後のメッセージが下記。これを読めば分かる通り、ownCloud 関係の全ファイルは ```/usr/local/www/owncloud``` に置かれたようです。

```
Message from owncloud-8.2.1:
***********************************************************************
*                         POST INSTALL CONFIGURATION                  *
***********************************************************************

Please note that everything has been installed in /usr/local/www/owncloud.

You will probably want to add an alias to your httpd.conf file, something
like this:

        Alias /owncloud /usr/local/www/owncloud
        AcceptPathInfo On
        <Directory /usr/local/www/owncloud>
            AllowOverride All
            Require all granted
        </Directory>

And restart Apache.
```

# PHP設定

```/usr/local/etc/php.ini``` を修正します。 ```doc_root =``` として = の右辺を削除し、何も設定しないようにします。

実はこれは非推奨のようです。が、こうしないとどうしようもありません。VirtualHost 毎に doc_root を変える事は出来ないようですので、こういう自宅サーバのように大量のサイトを同時運用する場合には不向きです。特に、私のように ```/usr/local``` 以下のpkgと ```/media/www``` 以下の自作サイトとを混在させようなんて事まで考えますとね…:sweat:

※私の勉強不足で、実は上手な設定方法があるのかも知れません。
※ご存知の方がいらっしゃいましたら、是非教えてください。

# ドメイン設定

[我が家のDNSサーバ bind](http://qiita.com/katz_engineer/items/26c4718b3c3fc0164130) に、ownCloud 用のドメインを設定します。名前は仮に owncloud.example.com としておきます。

なお余計なお世話ですが、こういう時の例示用に example.com というドメインが予約されています(RFC2606)。たまに hoge.jp などと書いている方を見かけますが、 hoge.jp も hoge.com も hoge.org も hoge.net も取得されているようですので念の為。hoge.org は確か、私の先輩が取得してなかったかなぁ…。実際に設定する場合、下記設定中の example.com については家庭内なら何でも良いワケですが、コダワリを持ってカッコいいドメインを選んで置き換えてください。

※httpサーバやらPHPやらを立てているマシンは別途 jail で用意しており、ここに今回の ownCloud もインストールしています。
※このマシンには jiro.machine.example.com という名前を与えています。

```/etc/namedb/named.conf
《色々省略》
view "internal" {
  zone "example.com" {
    type master;
    file "/etc/namedb/master/example.com"; 
  };
《諸々省略》
};
```

```/etc/namedb/master/example.com
《とっても省略》
owncloud CNAME jiro.machine
```

設定ファイルに追記が終わったら読み込みます。

```
# /etc/rc.d/named reload
rndc: connection to remote host closed
This may indicate that
* the remote server is using an older version of the command protocol,
* this host is not authorized to connect,
* the clocks are not synchronized, or
* the key is invalid.
# /etc/rc.d/named restart
```

reload で成功すればいいんですが、なぜか失敗する事が良くあります。原因不明。そんな時は上記のように restart しましょう。原因と対策がおわかりの方はご教示いただけると助かります。

# 電子証明書

[通常の手順](http://qiita.com/katz_engineer/items/9895f0f56c0976f382eb)の通りです。我が家では電子証明書などは ```/media/www/ssl``` 以下にFQDNと同じ名前のディレクトリを掘っておく事にしています。

```
# mkdir /media/www/ssl/owncloud.example.com
# cd /media/www/ssl/owncloud.example.com
# /usr/local/openssl/misc/CA.sh -newreq
Generating a 2048 bit RSA private key
...........................................................................................................................+++
.........+++
writing new private key to 'newkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:owncloud.example.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Request is in newreq.pem, private key is in newkey.pem
# /usr/local/openssl/misc/CA.sh -sign
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for /media/www/ssl/ca/private/cakey.pem:《認証局のパスフレーズ》
《証明書内容の表示》

Certificate is to be certified until Dec  6 05:37:36 2115 GMT (36500 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
《内容表示》
Signed certificate is in newcert.pem
# /usr/local/bin/openssl rsa -in newkey.pem -out newkey-withoutpass.pem
WARNING: can't open config file: /usr/local/openssl/openssl.cnf
Enter pass phrase for newkey.pem:《署名要求書を作成した時のパスフレーズ》

writing RSA key
```

# httpサーバの設定

うちのhttpサーバは h2o です。

```/usr/local/etc/h2o/h2o.conf
《がんがん省略》
hosts:
  《どんどん省略》
  owncloud.example.com:80:
    listen:
      port: 80
    paths:
      "/":
        redirect:
          status: 301
          url: "https://owncloud.example.com/"
  owncloud.example.com:443:
    listen:
      port: 443
      ssl:
        certificate-file: /media/www/ssl/owncloud.example.com/newcert.pem
        key-file: /media/www/ssl/owncloud.example.com/newkey-withoutpass.pem
    paths:
      "/":
        file.dir: "/usr/local/www/owncloud"
```

追記できたら再起動。

```
# /usr/local/etc/rc.d/h2o restart
```

# ブラウザで確認

ブラウザで http://owncloud.example.com/ にアクセスすると、自動的に https://owncloud.example.com/index.php に飛ばされて、ownCloud の初期画面が表示されます。やった！:+1:

さぁこれで ownCloud の設定…と思ったんですが、SQLite はやめた方がいいらしいですね。

[ownCloud をスピードアップするTips](http://qiita.com/ynott/items/10c50a21c33d4df2b574)

NL54L にメモリも4GBしか積んでないんで、できれば MySQL は避けたかったんですが…仕方がありません。次は MySQL をインストールする事にします。いつになったら ownCloud を使えるんだ…:disappointed: