* openSUSEでCalDAV * [#t51b3548]
スケジューラーとしてGoogle Calendarを使う人は多いが、セキュリティーの観点から自前のスケジュール管理環境を使いたいという人もいる。
そういう人向けのCalDAVとして、"Baïkal" がある。Baikalはwebサーバー経由でスケジュール管理機能を提供するアプリケーションである。
参考:https://github.com/jeromeschneider/Baikal/blob/master/INSTALL.md

** 必要なパッケージなど ** [#meebb8fa]
まず、Baikalのサービスが乗っかるwebサーバーが必要になるが、今回はwebサーバーとしてnginxを使う。
(手元環境はopenSUSE13.1-64bitなので、これを前提に記述 #はrootコンソール)

Baikalはphpで書かれているので、phpのモジュールが必要

 php5-iconv-5.4.20-4.1.x86_64
 php5-tokenizer-5.4.20-4.1.x86_64
 php5-sqlite-5.4.20-4.1.x86_64
 php5-ctype-5.4.20-4.1.x86_64
 php5-json-5.4.20-4.1.x86_64
 php5-fpm-5.4.20-4.1.x86_64
 php5-fpm-5.4.20-4.1.x86_64 <--これが重要
 php5-5.4.20-4.1.x86_64
 php5-xmlreader-5.4.20-4.1.x86_64
 php5-dom-5.4.20-4.1.x86_64
 php5-xmlwriter-5.4.20-4.1.x86_64
 php5-pdo-5.4.20-4.1.x86_64
 php5-mbstring ※ これが大事 これでハマった

Baikaはデータベースとしてsqliteを使えるので、今回はsqlite3を利用

 libsqlite3-0-32bit-3.7.17-2.1.2.x86_64
 sqlite3-3.7.17-2.1.2.x86_64
 libsqlite3-0-3.7.17-2.1.2.x86_64

** php-fpm の設定 ** [#cb1e0926]
/etc/php5/fpm/php-fpm.conf  を編集

** Baikal 本体のインストール ** [#t4956bef]
 nginxが動かすので稼働ユーザーをnginxに変更
 #user = nobody
 #group = nobody
 user = nginx
 group = nginx

 listenは以下の2つから択一
 稼働条件を指定 9000ポートで稼働
 listen = 127.0.0.1:9000

 unixドメインでやる場合は、必ず/var/run 以下に作らないとダメ
 listen = /var/run/cal.sock <--ソケットファイルの場所※重要
 listen.owner = nginx <-- ソケットファイルのオーナーユーザ
 listen.group = nginx <-- ソケットファイルのオーナーグループ
 listen.mode = 0660


※unixドメインを使う場合、何も考えずに /tmp/cal.sock などとやると永遠に接続できずハマる。
sysvinitからsystemdになって、PrivateTmp という機能が設けられており、nginxにも適用されている。
/usr/lib/systemd/system/nginx.service には PrivateTmp=true の記述がある。
nginxから/tmp に書き込んだとしても、/tmp/systemd-private-Nx4I0K みたいなところに
書き込まれる事になる。
もしphp-fpmの設定に、/tmp/cal.sock と指定した場合、ソケットファイルは /tmp 以下に作成されるが、
nginxからは、永遠に見えない事になる。


** Baikal 本体のインストール ** [#bd3d6a95]
http://baikal-server.com/ からダウンロードするが、Flat packageの方はローカルサーバーしか使えないので、
必ずRegular package の方をダウンロードする。
ダウンロードされたファイルは、baikal-regular-0.2.7.tgz のようなファイルになっている。

 # gunzip baikal-regular-0.2.7.tgz
 ----->baikal-regular-0.2.7.tar 出現
 # tar xvf baikal-regular-0.2.7.tar
 ----->baikal-regula 出現

*** baikal-regulaフォルダ構成 *** [#bb411d00]
 ChangeLog.md
 INSTALL.md
 LICENSE.txt
 README.md
 TROUBLESHOOTING.md
 UPGRADE.md
 +Core
 +html
 +vendor
 +Specific <=== こいつが重要なフォルダになる!
 .htaccess
 config.php
 config.system.php
 +db
 +virtualhosts
 baikal.apache2
 baikal.nginx


Baikalの説明では、解凍したフォルダを、利用したいドメインに変更するように説明されている。(何故だ?)
今回は、cal.example.com というvirtualhostで運用することにして、同名にフォルダを変名する。
また、解凍したフォルダは、webサーバーの管理下に置くために移動させる。

 # mv baikal-regular /srv/www/
 # cd /srv/www
 # mv baikal-regular cal.example.com
 # cd cal.example.com

Specific へは、webサーバーの稼働ユーザーがアクセスできる必要がある。
今回はnginxを使うので、オーナーをnginxへ変更する

 # chown -Rf nginx:nginx Specific

** 最初の起動のために・・・・絶対に忘れないでやること! ** [#v21ba7a3]
Baikalは、Specific 以下に ENABLE_INSTALL というファイルを発見すると
初期設定を行うモードになるので、最初にこれを作成しておく。

 # touch /srv/www/cal.example.com/Specific/ENABLE_INSTALL


** nginxでの設定 ** [#u75a5bf8]
** nginxでの設定 ** [#c8671a12]
Specific/virtualhosts 以下に、baikal.nginx のサンプルがあるので、これを参考にする。
(今回は、cal.example.com という仮想サーバーとして利用する前提)

nginxの設定ファイル /etc/nginx/nginx.conf を編集

 http {
 include mime.types;
 default_type application/octet-stream;
 #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
 # '$status $body_bytes_sent "$http_referer" '
 # '"$http_user_agent" "$http_x_forwarded_for"';
 #access_log /var/log/nginx/access.log main;
 sendfile on;
 #tcp_nopush on;
 #keepalive_timeout 0;
 keepalive_timeout 65;
 #gzip on;
 
 server {
 listen 80 default_server;
 server_name _;
 return 444;
 }
 
 server {
 listen 80;
 #server_name localhost;
 server_name localhost
 host.example.com;
 root /srv/www/htdocs;
 index index.html index.htm;
 #charset koi8-r;
 #access_log /var/log/nginx/host.access.log main;
  
 location /* {
 root /srv/www/htdocs/;
 index index.html index.htm;
 autoindex on;
 allow 127.0.0.1;
 allow 192.168.1.2; <=== 接続許可したい内部クライアントなど指定
 allow 192.168.1.3;
 deny all;
 }
 
 #error_page 404 /404.html;
 # redirect server error pages to the static page /50x.html
 # 
 error_page 500 502 503 504 /50x.html;
 location = /50x.html {
 root /srv/www/htdocs/;
 }
  
 # proxy the PHP scripts to Apache listening on 127.0.0.1:80
 # 
 #location ~ \.php$ {
 # proxy_pass http://127.0.0.1;
 #}
 
 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
 # 
 #location ~ \.php$ {
 # root html;
 # fastcgi_pass 127.0.0.1:9000;
 # fastcgi_index index.php;
 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
 # include fastcgi_params;
 #}
 # deny access to .htaccess files, if Apache's document root
 # concurs with nginx's one
 # 
 location ~ /\.ht {
 deny all;
 }
 }
 
 include vhosts.d/*.conf; <=== これが重要
 }


** /etc/nginx/vhosts.d/baikal.conf というファイルを作成する ** [#m5a75a16]

 server {
 listen 80;
 server_name cal.example.com; <=== 改名したフォルダを指定
 root /srv/www/cal.example.com/html; <=== baikaiパッケージフォルダのhtmlフォルダが、仮想ホストのrootになる
 index index.php;
 rewrite ^/.well-known/caldav /cal.php redirect;
 rewrite ^/.well-known/carddav /card.php redirect;
 charset utf-8;
  
 location ~ /(\.ht|Core|Specific) {
 deny all;
 return 404;
 }
 
 location ~ ^(.+\.php)(.*)$ {
 try_files $fastcgi_script_name =404;
 fastcgi_split_path_info ^(.+\.php)(.*)$;
 fastcgi_pass 127.0.0.1:9000; <=== ここのポートはnginxとbaikalの橋渡しをするポートになる tcpを使うので注意!! unixは使わない
 fastcgi_pass 127.0.0.1:9000; <=== ここのポートはnginxとbaikalの橋渡しをするポートになる tcpを使うので注意!! 
 fastcgi_pass unix:/var/run/cal.sock; <==unixのドメインソケットの場合 (※注意)
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_param PATH_INFO $fastcgi_path_info;
 include /etc/nginx/fastcgi_params;
 }
  
 error_page 500 502 503 504 /50x.html;
 location = /50x.html {
 root /srv/www/htdocs/;
 }
 
 location /* {
 allow 127.0.0.1;
 allow 192.168.1.2; <=== 接続許可したい内部クライアントなど指定
 allow 192.168.1.3;
 deny all;
 }
 
 }


** 稼働させる ** [#lf4a3585]

最初に、nginxを稼働させる

 # systemctl start nginx.service

次に、 php-fpm.service を稼働させる。
(nginxの稼働は忘れることはないが、こいつは忘れやすいので注意!!)

 # systemctl start php-fpm.service

** 初期設定 ** [#rcce6ef3]
ここからは、Baikalの初期設定(管理者や利用ユーザーの作成)を行う。
http://cal.example.com/admin/ へブラウザ経由でアクセス

*** 値入力は、以下を参考にして行う。*** [#w0cd23c5]
 Server Time zone: Asia/Tokyo
 Enable CalDAV : check!
 Enable CardDAV : check!
 Admin password : pasword
 confirmation : password
 Enable Web Interface : check!

*** 次に利用DBの環境構築を聞いてくるが、今回はsqliteを使う *** [#f2a9bde9]
そのまま [Save changes] を押す
画面が切り替わり、[Strt using Baikal] ボタンが出たら 押す

再ログイン後、利用ユーザーの追加とカレンダー作成を行う。(ここでは省略)
設定したユーザー名: user0
※ 以下のクライアント設定では、user0で説明するので置き換え必要

**クライアント設定** [#ge756ffa]

*** Thunderbird lightning *** [#we800818]
Baikalは、Thunderbirのlightningプラグインで使うことができる。
Thunderbirdであれば、WindowsでもopenSUSEでも、MacOSXでも使えた。

 カレンダー名:好きな名前をつけて良いみたいだ
 場所:http://cal.example.com/cal.php/calendars/user0/default
 更新:好きな時間
 アラーム通知:オン
 オフラインサポート:オン(よくわからない)

*** mac カレンダー *** [#qa2d8c4b]
アカウントを新規作成

 説明:好きな名前
 ユーザー:user0
 パスワード:パスワード
 更新:好きな時間

---- サーバー設定 -----
 アドレス:cal.example.com
 パス:/cal.php/principals/user0/
 ポート:80
※macの場合は、calendarsのところがprincipalsになる点と、defaultの指定がいらないことがポイント


*** Android *** [#aec85d1c]
androidの場合、Caldav Sync Free Adapter という無料のアプリがあるので、これを使う
https://play.google.com/store/apps/details?id=org.gege.caldavsyncadapter&hl=ja
https://github.com/gggard/AndroidCaldavSyncAdapater
https://github.com/gggard/AndroidCaldavSyncAdapater/wiki/Installation-and-configuration

カレンダーのメニューから、新規アカウントを作成する
メニュー/システム/アカウント/追加
この時、どのタイプのアカウントを作成するか効かれるので、 CalDav Sync Adapter を選択する。

ユーザー定義では
 user:user0
 pssword: パスワード
 URL http://cal.example.com/cal.php/principals/user0

と、macと同じように、principals/usr0 を使ってセットする。
(もしかしたら、ユーザー名で弾かれるかもしれないので、その時は、user0@example.com とメールアドレス風に設定する)


#hr
カテゴリ: [[サーバ]]