:::: MENU ::::

C.a.T!

CATch a TAIL!

Japanese sub culture and tech.

  • 2011/04/13
  • 0
engineer

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はほぼ同じ実装で機能させれます。

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

Leave a comment