TwitterクローンのStatusNetを使ってみた
バックアップの完了イベントとか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 というファイルを作成し、以下のように設定します。
- 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', ); // LDAPの設定 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', // LDAPS使うならここはtrue '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"> # funcyURLの設定 RewriteEngine On # NOTE: change this to your actual StatusNet base URL path, # minus the domain part: # # http://example.com/ => / # http://example.com/mublog/ => /mublog/ # RewriteBase /necotter/ ## Uncomment these if having trouble with API authentication ## when PHP is running in CGI or FastCGI mode. # #RewriteCond %{HTTP:Authorization} ^(.*) #RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) index.php?p=$1 [L,QSA] <FilesMatch ".(ini)"> Order allow,deny </FilesMatch> # LDAPの設定 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はほぼ同じ実装で機能させれます。
なかなかよくできていて、企業内の限られた人数で運用するにはぴったりと思います。