Top > IRC > tiarra

tiarra

tiarraの設置方法とかメンテとか。

tiarraとtiarraMetroの設置方法(Ubuntu 14.04.3 LTSの場合)

2015/09現在です。tiarraMetroもセットで設置する前提で合わせて記載します(必要無い人は読み飛ばして)。

tiarra本体

$ cd /opt
$ sudo svn co http://svn.coderepos.org/share/lang/perl/tiarra/trunk/ tiarra

最後の引数(tiarra)は設置するディレクトリ名です。上記の場合は/opt/tiarra配下に降ってきます。なぜこんなところに、しかも所有者rootで置いてるのかというと、複数ユーザでtiarraのモジュールを共有利用する前提です(なのでroot権限を持ってない人は別に /home/hoge 配下に置いても問題なし)。

古いバージョンを利用するとSSL非対応だったりして割と困るので、上記のようにcodereposから持ってくるのがお勧めです。

基本的にはこれで問題ないですが、キーワード通知をpushbulletに送りたいので対応版Notify.pmで上書きします。

$ git clone https://gist.github.com/ba3f9e25314ac2f013db.git notify_pushbullet
$ sudo cp notify_pushbullet/Notify.pm /opt/tiarra/module/Auto/Notify.pm

※参考:http://oquno.com/log/eid3150.html

tiarraMetro

今回はNginxでやっていっていますが、Apache2でも変わらないはずです。すでにPHPが動作する状態であることが前提です。

$ sudo apt-get install php-pear php5-mcrypt php5-mysql
$ sudo php5enmod mcrypt

PHP関係のモジュールはこれで入るはず。Nginxの場合はphp5-fpmの再起動を。

$ sudo service php5-fpm restart

まずはどっか適当なところでgit cloneします。

$ git clone https://github.com/tyoro/tiarraMetro.git dir_name

最後の引数(dir_name)は設置ディレクトリ名です。省略しても構いませんが自分の場合は複数個設置するので変更します。

tiarraMetroに同梱されているLog:DBIをtiarra本体のmoduleディレクトリへ。

$ cd tiarraMetro
$ sudo cp misc/DBI.pm /opt/tiarra/module/Log/ 

同じくSendMessage.pmもmoduleディレクトリへ。

$ sudo cp misc/SendMessage.pm /opt/tiarra/module/System/SendMessage.pm

tiarraのUnixSocketのパーミッションを700から777へ変更するためmain/ControlPort.pmを書き換えます。

$ sudo vi /opt/tiarra/main/ControlPort.pm

べつにviじゃなくてもなんでもいいですが、何らかの手段で以下の通り書き換えてください。

chmod 0700, $filename;

chmod 0777, $filename;

次に、絵文字対応のためtiarraMetroのDBまわりの文字コード指定を「utf8」から「utf8mb4」に変更します(MySQLのバージョンが古いとutf8mb4非対応なので注意。5.6以上推奨。)。

$ vi conf/base.php

1ヶ所しかないはずです。

define("DATABASE_CHARSET","utf8");

define("DATABASE_CHARSET","utf8mb4");
$ vi misc/table_create.sql

4ヶ所ぐらいあります(テーブルの数だけ同じように変更する)。

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;

さらに、utf8mb4の場合そのままではテーブル作成に失敗することがあるので(後述)、MySQLの設定を変更します。

$ sudo vi /etc/mysql/my.cnf

my.cnfに以下の3行を追加。

innodb_file_format = BARRACUDA
innodb_file_per_table = ON
innodb_large_prefix = ON

restartして、ちゃんと反映されたか確認。

$ sudo service mysql restart
$ mysql -u root -p
mysql> show variables like 'innodb_large_prefix';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_large_prefix | ON    |
+---------------------+-------+
1 row in set (0.00 sec)

ONになってればOK。

database作成に入ります。db_name,username,passwordは適宜名前をつけてください(読み替えてください)。あとで使います。

mysql> create database db_name character set utf8mb4;

DBができたかどうか確認。

mysql> show databases;

できてたら次は権限の設定。

mysql> grant all privileges on db_name.* to username@localhost identified by 'password';
mysql> show grants for username@localhost;

うまくいってたらこんな感じになるはず。

+------------------------------------------------------------------------------------------------------------------+
| Grants for username@localhost                                                                                   |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY PASSWORD '*XXXXXXXXXXXXXXXXXXXX' |
| GRANT ALL PRIVILEGES ON `db_name`.* TO 'username'@'localhost'                                          |
+------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

おわったらさっきのsqlファイルを読み込みます。mysqlコマンドを叩いたときパスワードを求められるので、上記「権限の設定」のときに設定したpasswordを入力します(OS側のパスワードではない)。

mysql> quit
Bye
% mysql -u username -p db_name
mysql> source table_create.sql

※以下のようにしても可。

$ mysql -u username -p db_name < table_create.sql

このとき下記のエラーが発生した場合は、ここまでのどこかでミスってる可能性が高いのでやり直しです!!

ERROR 1071 (42000) at line 1: Specified key was too long; max key length is 767 bytes

詳細に書くと、innodb_large_prefixが清く正しくONになっていないとunique keyの最大長が767bytesに制限され、utf8mb4の場合は1文字4bytesなので191文字以上のカラムがあるとエラーになるとのこと。で、今回流し込んでるsqlファイルは255文字のカラムを作ろうとしてるので死にます。罠っぽい。innodb_large_prefixはMySQL 5.7でデフォルトがONになった(らしい)ので、最初から5.7ならこんなに頑張らなくてもいいのかも。

無事におわったらテーブルできたよね確認。4テーブルあります。

mysql> show tables;
+----------------------------+
| Tables_in_db_name     |
+----------------------------+
| channel                    |
| log                        |
| nick                       |
| priv                       |
+----------------------------+
4 rows in set (0.00 sec)

logテーブルのstatusを見て文字コードとか合ってるよね確認。

mysql> show table status like 'log'\G
*************************** 1. row ***************************
           Name: log
         Engine: InnoDB
        Version: 10
     Row_format: Dynamic
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 49152
      Data_free: 0
 Auto_increment: 1
    Create_time: 2015-09-29 18:56:14
    Update_time: NULL
     Check_time: NULL
      Collation: utf8mb4_general_ci
       Checksum: NULL
 Create_options: row_format=DYNAMIC
        Comment:
1 row in set (0.00 sec)

tiarra起動

tiarraのconfの書き方はさすがに省略するけど(自分の秘伝のタレ的なconfファイルを持ってるでしょ)、tiarraMetroを利用する場合は下記2点追記・修正が必要です。

1) control-socket-name のコメントを外し、何かしらユニークな値(ソケット名)を設定する(あとで利用します)。

2) 下記を最下行に追加。

+ System::SendMessage {
}

それではtiarraを起動します。tiarraのconfigを /home/hoge/conf/tiarra/hoge.conf に置いた場合です。

$ perl /opt/tiarra/tiarra --config=/home/hoge/conf/tiarra/hoge.conf 

起動時にERRORがないことを確認しましょう。あと、適当に発言してみてERRORが出ないことも確認しましょう(Log::DBIがちゃんと動いてるかの確認)。

いけそうなら一旦落として、下記のようにバックグラウンドで動作させればとりあえずはOKです。ログの吐き先を/dev/nullにするか実ファイルにするかはお好みで(よほどディスクが足りないとかじゃなければ実ファイルに吐いておいたほうがよいと思う)。てか、nohupを利用するかどうかもお好みでどうぞ。

$ nohup perl /opt/tiarra/tiarra --config=/home/hoge/conf/tiarra/hoge.conf >> /dev/null 2>&1 &

tiarraMetro起動

tiarraMetroのconfをつくります。

$ cp conf.yaml.sample conf.yaml
$ vi conf.yaml

さきほどMySQLに設定した内容を以下のように記載します。NAMEとIDが紛らわしいですが、NAMEがデータベース名でIDはMySQLのログインIDと考えるとわかりやすいです。

DATABASE_ID: 'username'
DATABASE_PASS: 'password'
DATABASE_NAME: 'db_name'

あと、tiarra_socket_nameはtiarraのconfに書いたソケット名(control-socket-name)と同じにしましょう。それ以外の項目は適宜見てくださいという感じですが、せっかくここまでがんばったのでemojiはtrueにしたほうが幸せになれそうです。

つぎにNginxのconfを書きます。Apacheの人は適宜やってください。

$ sudo vi /etc/nginx/conf.d/hoge.conf

ファイル名は適当です。中身はこんなん。tiarraMetroの設置場所を /path/to/tiarraMetro とした場合の例です。

server {
    listen 80;
    server_name hoge.example.net;

    root /path/to/tiarraMetro/public;
    index index.php;

    if (-f $request_filename) { break; }
    if (-d $request_filename) { break; }
    rewrite . /index.php last;
    location ~ \.php$ {
        fastcgi_pass    unix:/var/run/php5-fpm.sock;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME /path/to/tiarraMetro/public/$fastcgi_script_name;
        include         fastcgi_params;
    }
}

保存したらconfigtestします。

$ sudo /etc/init.d/nginx configtest

無事通ったらrestartで反映します。

$ sudo /etc/init.d/nginx restart

ブラウザから動作確認して問題なければこれでおしまいです。

お疲れさまでした!!!

tiarraMetroの過去データを退避してテーブルを作り直す手順

これ何?

tiarraMetroはlogテーブルにあらゆるIRCの発言を溜め込みますが、削除する仕組みがなくどんどん発言が溜まっていくためlogテーブルのselectが遅くなり、tiarraMetroの動作(特にブラウザを起動したあとの初回表示時)が重く遅くなります。これを回避するために、他テーブルとの整合性を保ちつつlogテーブルの中身を一旦全捨てします。

やりかた(DBつくりなおし版)

mysqlのrootで以下を実行

 show databases;
create database tiarra_karia_201610 character set utf8mb4;
show databases;
show grants for karia@localhost;
GRANT ALL PRIVILEGES ON `tiarra_karia_201610`.* TO 'karia'@'localhost';
show grants for karia@localhost;

一旦quitした後に下記。

mysql -u root -p tiarra_karia_201610 < /usr/share/nginx/miu/misc/table_create.sql

その後、

  • tiarraMetroのconf.ymlのDATABASE_NAME
  • tiarraの Log::DBIセクションのsource

を書き換え、tiarra再起動でおしまいのはず。。

やりかた

※AUTO_INCREMENTの数値が増加するため必ずtiarraを停止した状態で実施する

show tables;

テーブルの一覧をまず確認。対象テーブルは基本的にはlogのみでOK(channelも実施すると見た目的に良いかも)。

show create table log;

このコマンドを実行することで以下のようにcreate文が表示されるので、丸ごとエディタ等にコピーし、最後に;(セミコロン)を付与する。 ※AUTO_INCREMENTの値は変動する。また "DEFAULT CHARSET=utf8mb4" にすると絵文字が正しく表示できるようになる(要MySQL5.5.3以上)。

CREATE TABLE `log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `channel_id` int(11) DEFAULT NULL,
  `nick_id` int(11) DEFAULT NULL,
  `log` text,
  `is_notice` tinyint(4) DEFAULT NULL,
  `created_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_on` datetime DEFAULT NULL,
  PRIMARY KEY (`id`,`created_on`),
  KEY `nick_id` (`nick_id`),
  KEY `id_idx` (`id`),
  KEY `created_channel` (`created_on`,`channel_id`),
  KEY `channel_id_and_created_on` (`channel_id`,`created_on`)
) ENGINE=InnoDB AUTO_INCREMENT=xxxxxxx DEFAULT CHARSET=utf8
;

logテーブルをリネームする。

rename table log to log_20140807;

先ほど退避しておいた "CREATE TABLE `log`"以下の構文を丸ごとペーストする。何度もいうけど最後にセミコロンの付与を忘れずに。

logテーブルが作られたことを確認する。

show tables;

tiarraを起動して動作確認して終わり。

tiarra設置方法(CentOSの場合)

※すごい古いので参考にしないほうがよいです(2015年9月追記)

$ wget http://www.clovery.jp/tiarra/archive/2010/02/tiarra-20100212.tar.gz
$ tar xzvf tiarra-20100212.tar.gz
$ mv tiarra-20100212 /opt/tiarra 
$ /usr/bin/perl /opt/tiarra/tiarra --config=/home/karia/karia.conf

とやればおもむろに起動できますが、たぶんなんかエラー吐きます。ここから下はエラーを地道に潰した記録。rootもしくはsudoでどうぞ。

# cpan -i HTTP::Request::Common

ここから下はAuto::Notifyを使わない人は不要だと思う。

# yum -y install openssl-devel

必ず-develにすること。

# yum -y install perl-Crypt-SSLeay.x86_64

cpanでOpenSSL認識してくれなかったので仕方なく。

# cpan -i IO::Socket::SSL

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes
Last-modified: Sun, 02 Oct 2016 07:22:18 HADT (2923d)