バックアップの完了イベントとかBuildの完了イベントとかを通知する汎用的な手段が欲しいなあ、と思っていて、普通に考えるとIRCということで会社で採用しようとしたのですが、思いの他IRC文化がなく、なかなか浸透させれずにいました。
それで別の手段を考えたわけですが、まあWebならみんなさすがに使えるでしょ、ということでTwitterクローンに通知する作戦に変更。
Twitterクローンで結構良さげなStatusNetというのを構築してみました。
その辺のメモ。
うちはユーザデータベースをLDAPで持っていて、そちらで認証させたかったのですが、思いのほか情報が少なかったのでまとめてみました。
Ubuntu へのインストールケースで書きますが、他のディストリビューションでもほとんど苦労しないと思います。
まず、関連パッケージのインストール。
# sudo apt-get install mysql-server mysql-client
# sudo apt-get install apache2
# sudo apt-get install php5 libapache2-mod-php5 php5-cli \
php5-common php5-curl php5-gd php5-ldap php5-tidy \
php5-xmlrpc php5-suhosin php5-memcache php5-mysql \
php5-dbg php-apc php-mail-mime php-mail-mimedecode
# sudo apt-get install prosody
# sudo apt-get install memcached
次に、StatusNetのアーカイヴをApacheで公開可能なディレクトリに解凍します。
ここでは、/var/www/statusnet に解凍したとします。
オーナは、Apacheユーザにしておきましょう。
解凍したアーカイヴの直下に、config.php.sample というのがあると思います。
これが設定ファイルのサンプルですが、ごちゃごちゃしてるので使いません。
同じ直下に config.php というファイルを作成し、以下のように設定します。
<?php
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
$config['site']['name'] = 'サイトの名前(necotter)';
$config['site']['server'] = 'サイトを運営するサーバ(example.com)';
$config['site']['path'] = 'サイトのパス(necotter)';
$config['site']['fancy'] = true;
$config['db']['database'] = 'mysqli://statusnet:パスワード(necopass)@localhost/statusnet';
$config['db']['type'] = 'mysql';
$config['mail']['check_domain'] = false;
$config['mail']['notifyfrom'] = '通知メールのFrom(Necoadmin <[email protected]>)';
$config['mail']['domain'] = 'メールアドレス生成に使うドメイン(example.com)';
$config['mail']['backend'] = 'sendmail';
$config['mail']['params'] = array(
'sendmail_path' => '/usr/sbin/sendmail',
);
addPlugin('apacheAuthentication',
array('provider_name'=>'LDAPの名前、なんでもいい(necodap)',
'authoritative'=>'ture',
'autoregistration'=>'false',
'domain'=>'ドメイン(example.com)',
'email_changeable'=>'false',
'password_changeable'=>'false',
'password_encoding'=>'ssha',
'host'=>'LDAPサーバホスト(localhost)',
'port'=>'LDAPサーバのポート(389)',
'starttls'=>'false',
'binddn'=>'管理者ユーザのDN(cn=admin,dc=example,dc=com)',
'bindpw'=>'管理者ユーザのパスワード(necopass)',
'basedn'=>'ユーザのベースDN(ou=People,dc=example,dc=com',
'scope'=>'sub',
'attributes'=>array(
'username'=>'ユーザIDに使うLDAP属性(uid)',
'nickname'=>'ニックネームに使うLDAP属性(uid)',
'email'=>'メールアドレスに使うLDAP属性(mail)',
'fullname'=>'フルネームに使うLDAP属性(cn)')
));
続いて、Apache の設定です。
ちょっと変なのですが、Apache側でLDAPで認証させてそれをもってStatusNet側の認証も通すのですが、StatusNet側ではフルネームなどのアカウント情報を改めてLDAPから取得します。
StatusNet側の認証をLDAPで直接やるプラグインもあるのですが、どう設定してもうまく動いてくれなかったので、こんな方法をとってます。
- /etc/apache2/site-avairable/necotter
Alias /necotter /var/www/necotter
<Directory "/var/www/necotter">
RewriteEngine On
RewriteBase /necotter/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?p=$1 [L,QSA]
<FilesMatch ".(ini)">
Order allow,deny
</FilesMatch>
AuthType Basic
AuthName "necotter"
AuthBasicProvider ldap
AuthLDAPURL ldap://localhost/dc=example,dc=com?uid
Require valid-user
</Directory>
次にMySQLデータベース。
ユーザとデータベースだけ作っておきます。
# mysql -u root -p
mysql> create database statusnet;
mysql> grant all privileges on statusnet.* to statusnet@localhost identified by 'necopass';
mysql> quit;
この時点で一度 Apache を起動して StatusNet 上の設定の場合 http://example.com/necotter/ にアクセスして、問題なく画面が表示されることを確認しておきます。
実は、画面を確認することが目的ではなくて、データベースを初期化することが目的なのですが。
画面が問題なく表示させたら、再び mysql に接続して、データベースのスキーマを少し変更します。
これは、メールアドレスの重複を許すためのチートです。
StatusNetでは、メールアドレスが必須なのですが、Botを作り始めると同じメアドを使いたくなるので。
そういうことしないのであればこの操作はいりません。
# mysql -u statusnet -p
mysql> alter table user drop index email;
mysql> quit;
以上でおわりです。
これで、Twitterと同じような MicroBlog が立ちあがります。
APIもTwitterとほぼ同じなので、Botはほぼ同じ実装で機能させれます。
なかなかよくできていて、企業内の限られた人数で運用するにはぴったりと思います。