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 というファイルを作成し、以下のように設定します。

<?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 <admin@example.com>)';
$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 が立ちあがります。
APITwitterとほぼ同じなので、Botはほぼ同じ実装で機能させれます。


なかなかよくできていて、企業内の限られた人数で運用するにはぴったりと思います。