tDiary.org - 日記コミュニケーションを加速する


同一サーバで複数のtDiaryを運営する方法

Last Update: 2011-11-03 17:48:28

単一のWebサーバ上で、複数のtDiaryを運用したい場合があります(tDiary.Netのように)。個々の日記をそれぞれ別のtDiaryで運用してもいいのですが、バージョンアップなどが面倒です。

こういう場合に、単一のインストールイメージで複数の日記を運用できる仕組みが、tDiaryには備わっています。以下にその手順を解説します。この方法は、tDiary.Netで使われているものとぼほ同じです。

tDiaryのインストール

バージョンアップを簡単にするために、Gitを使ってtDiaryをインストールします。ここでは最新版(master/HEAD)を使うことにします。ただし、ダウンロードページにもあるように、Git版は非常に不安定な状態にある可能性があります。トラブルを自分で回避する自信がない場合はパッケージを使いましょう。

さて、とりあえずインストール先を「/usr/local/share/tdiary」としましょう。

# mkdir /usr/local/share/tdiary
# cd /usr/local/share/tdiary
# git clone git://github.com/tdiary/tdiary-core.git core
# git clone git://github.com/tdiary/tdiary-theme.git theme
(以下略)

これで、/usr/local/share/tdiaryの下に、core、themeの各パッケージのディレクトリができました。また、themeの中身を、core/themeの下にシンボリックリンクを張っておきます。

# cd /usr/local/share/tdiary/core/theme
# ln -s ../../theme/* .

テーマとJavaScriptの設定

通常、/usr/local/share/tdiary/themeはWebサーバで公開されていませんから、公開しているところにシンボリックリンクを張らなければなりません。公開ディレクトリを「/home/httpd/html」とし、このトップに置くことにします。また同様に、JavaScriptの入ったjsディレクトリも、Webサーバから参照できるようにしておかなくてはいけません。

# cd /home/httpd/html
# ln -s /usr/local/share/tdiary/core/theme theme
# ln -s /usr/local/share/tdiary/core/js js

また、シンボリックリンクが使えるように、Apacheの設定でFollowSymLinksを設定しておく必要があります。

これだけではtDiaryが正しいテーマのURLを埋め込んでくれないので、以下のプラグインを書いて、「/usr/local/share/tdiary/plugin」に置いておきます。

# change_url.rb
def theme_url
   '/theme'
end
 
def js_url
   '/js'
end

共通のtdiary.conf

複数の日記それぞれにtdiary.confを設置するのは、重複する情報もあり、効率が悪いです。サーバ側の設定を変えたいときにも、共通の設定ができていれば、一ヶ所修正するだけで済みます。@headerや@footerをあらかじめ設定しておくことで、初めて使うユーザに適切なメッセージを送ることもできます。

そこで、個々の日記のtdiary.confから読み込まれる、共通のtdiary.confを用意しておきましょう。ファイル名は「/etc/tdiary.conf」とします。仕掛けは、変数「@user_name」です。これで一括変換できます。

# shared tdiary.conf
@data_path = "/var/tdiary/#{@user_name}"
@smtp_host = 'localhost'
@author_name = "#{@user_name}"
@mail_header = "#{@user_name}"
@html_title = "#{@user_name}日記"
 
@header = <<HEADER
<%=navi%>
<h1>#{@user_name}日記</h1>
<%=calendar%>
HEADER
 
@footer = <<FOOTER
<%=calendar%>
<%=navi%>
FOOTER
 
@options['apply_plugin'] = true
@options['sp.path'] = '/usr/share/tdiary/core/misc/plugin'
 
@secure = true
load_cgi_conf

これで、設定画面からユーザごとに好きなプラグインを選択可能です。ここでは最小限の設定をしていますが、付属のtdiary.conf.beginnerをベースにしても良いでしょう。

@secureはデフォルトでtrueにしておきましょう。falseにしたい場合は、あとで設置する個々の日記用のtdiary.conf内で指定できます。また、必要に応じて@no_refererや@referer_tableも設定しておくと各ユーザが設定する手間を省けます。

各日記の設定

個々の日記は、インストールしたtDiaryのindex.rbとupdate.rbにシンボリックリンクを張ることで実現します。例えばユーザ「hoge」の日記を「/home/hoge/public_html/diary」に置く場合です。

# cd /home/hoge/public_html
# mkdir diary
# cd diary
# ln -s /usr/local/share/tdiary/core/index.rb index.rb
# ln -s /usr/local/share/tdiary/core/update.rb update.rb

この他に、付属のdot.htaccessを適当に修正して.htaccessとする必要があります(もちろんhttpd.confで設定してもかまいません)。また、htpasswdコマンドでパスワードを設定する必要があります。

それから、日記のデータの置き場所を作成しておくのを忘れないようにしましょう。@data_pathには/var/tdiary/#{@user_name}を指定してありますから、この場合は/var/tdiary/hogeというディレクトリを作成しておきます。このディレクトリは、Webサーバの権限で書き込めるようにしておく必要があります。

もし、シンボリックリンクを許可したくない場合には、以下のようなindex.rbを用意することで同等のことが実現できます(update.rbも同様です)。これらのファイルにはWebサーバの実行アカウント権限で実行可能にしておく必要があります。また、suExec環境下の場合は、個々のユーザがindex.rbの所有者である必要がありますから(実行権限もownerに)、以下の方法しか使えません。

#!/usr/bin/ruby
require '/usr/local/share/tdiary/core/index'

最後に、以下のようなtdiary.confを用意します。

@user_name = 'hoge'
eval( File::readlines( "/etc/tdiary.conf" ).join.untaint )
コメント(30) [コメントを投稿する]
しんちゃん (2002-12-06 05:22)

/etc/tdiary.confに<br>@secure = true<br>load_cgi_conf<br>がなくてはまりましたそさ(笑)

ただただし (2002-12-06 10:25)

すんまそん。追記しておきました。

おのたくや (2003-01-11 14:22)

「シンボリックリンクを許可したくない場合には、以下のようなindex.rbを用意」ということで、用意した時に、chmod +x をし忘れて、ちょい悩みました。<br> あとは、実は初っぱなから「複数のtDiaryを運営する」に挑戦したので、単純にインストールしたときにも出会う問題なんだと思いますが、日記の保存先に、@data_path = "/var/tdiary/#{@user_name}"というディレクトリーを作らないと行けないのだと思いますが、 /var/tdiaryまでしか作って無いというミスをしました。<br><br>とりあえずは、このドキュメントどおりにインストールしたら、うまく動きだして幸せです。<br>これからのupdateもcvs updateだけですむし…

ただただし (2003-01-11 14:57)

なるほど。追記しておきましょう。

えむず (2003-01-19 15:50)

以前掲示板で聞いたときに,各ユーザ用のtdiary.confでjoinの後に「.untaint」を付けてとの事だったと思うんですけど,付けなくても大丈夫になったんですか?

ただただし (2003-01-19 23:48)

そういえばそうでした。追記しておきます。

こにし (2003-01-31 00:28)

Insecure operation - require (SecurityError)<br><br>と、mod_ruby環境で言われてしまうのですが……。<br>どうしてなんでしょう。

ただただし (2003-01-31 00:57)

どのバージョンだかわかりませんが、1.5.2はmod_rubyで動きません(最新版で修正済み)<br><br>#関係ないトピックへのツッコミはご遠慮願います

こにし (2003-01-31 01:18)

すみません。<br>1.4.4.1は、mod_rubyで動いていたものですから、<br>このドキュメントに従って、installしたから、<br>mod_rubyで動かなくなったのかと勘違いしておりました。<br><br>申し訳ありませんでした。

たぬき (2003-02-09 22:05)

このドキュメントどおりインストールをしたはずなのですが、おそらくあと一歩のところで動きません。<br><br>環境はDebian3.0woody+apache1.3.26+ruby1.6.7です。<br>mod_rubyは使っていません。<br><br>apacheのエラーログを見ると<br>[Sun Feb 9 21:29:24 2003] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /home/(ユーザ名)/public_<br>html/tdiary/index.rb<br>とだけ書かれています。その後にエラーは出力されていません。<br><br>/var/tdiary/(ユーザ名)ディレクトリは作ってあります。<br>apacheを動かしているユーザでコマンドで動かしてみると<br>HTML文書は出力されました。<br>他のrubyスクリプトは動いています。

ただただし (2003-02-10 10:11)

通常、Apacheのエラーは引用されている部分の「前に」出るんですが、何も出ていませんか?

たぬき (2003-02-10 11:03)

作業中に出力されたerror.logは<br><br>[Sun Feb 9 20:18:24 2003] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /home/(ユーザ名)/public_html/tdiary/index.rb<br>[Sun Feb 9 20:18:24 2003] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /home/(ユーザ名)/public_html/tdiary/index.rb<br>[Sun Feb 9 20:18:25 2003] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /home/(ユーザ名)/public_html/tdiary/index.rb<br>[Sun Feb 9 20:18:25 2003] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /home/(ユーザ名)/public_html/tdiary/index.rb<br>[Sun Feb 9 20:18:26 2003] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /home/(ユーザ名)/public_html/tdiary/index.rb<br>[Sun Feb 9 20:18:26 2003] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /home/(ユーザ名)/public_html/tdiary/index.rb<br>[Sun Feb 9 20:26:41 2003] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /home/(ユーザ名)/public_html/tdiary/index.rb<br>[Sun Feb 9 20:26:42 2003] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /home/(ユーザ名)/public_html/tdiary/index.rb<br>[Sun Feb 9 20:26:42 2003] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /home/(ユーザ名)/public_html/tdiary/index.rb<br>[Sun Feb 9 20:28:04 2003] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /home/(ユーザ名)/public_html/tdiary/index.rb<br>[Sun Feb 9 20:36:48 2003] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /home/(ユーザ名)/public_html/tdiary/index.rb<br>[Sun Feb 9 20:59:56 2003] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /home/(ユーザ名)/public_html/tdiary/index.rb<br>[Sun Feb 9 21:16:12 2003] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /home/(ユーザ名)/public_html/tdiary/index.rb<br><br>でした。

きた (2003-02-10 11:14)

まさか改行コードがCRLFじゃないですよね?

たぬき (2003-02-10 21:52)

自分で打ち込んだファイルを調べたんですが改行コードはLFでした。<br>どのファイルの改行コードがCRLFだとまずいのでしょうか。

さかもと (2003-05-09 01:37)

昨日からぼちぼちと設定をやっております。<br><br>需要があるかわかりませんが、/etc/tdiary.confを<br><br>if @diary_name then<br> @data_path = "/var/tdiary/#{@user_name}/#{@diary_name}"<br>else<br> @data_path = "/var/tdiary/#{@user_name}"<br>end<br><br>と書いた上で、日記を公開するディレクトリのtdiary.confに<br><br>@diary_name = 'hoge'<br><br>という行を追加すれば、「一人のユーザーが複数の日記をつける」ことも出来ました。日記の他に、備忘録もtdiaryで管理したいなと思いまして。

yaemon (2004-03-14 09:52)

tDiary 1.5.6 では、plugin ディレクトリは core を CVS から取得した、ほとんど空の状態のままで、<br>misc/plugin に「すべての plugin の」シンボリックリンクを張って、設定画面から各自が自分の使う plugin を -コンフリクトしないように- 選ぶという形式になっていますね。

ただただし (2004-03-15 00:07)

プラグイン選択のパスを設定すれば、シンボリックリンクは不要ですね。最新版にあわせて書き換えておきました

ひろひろ (2004-03-24 15:28)

プラグインのパスをフルパスにしないと駄目な場合があるようで、はまってしまいました。

ふじしまひろし (2004-05-04 19:06)

# cd theme2<br># for t in *; do (cd ../theme; ln -s ../theme2/$t $t); done<br>は<br># cd theme<br># ln -s ../theme2/* .<br>じゃだめなんでしょうか?

ただただし (2004-05-04 19:17)

おっしゃるとおりです、ありがとう。直しておきました

さくらぃ (2004-12-22 02:06)

cvs.tdiary.sf.net は現在使えない状態のようです。<br>とりあえずcvs.sourceforge.net に変更しちゃえばCVSが使えます(読者向けコメント)。

ただただし (2004-12-22 20:20)

ご指摘どうも。修正しておきました

あきあき (2005-09-01 18:32)

Solaris10で動きました<br>多少の変更は必要でしたけどね

tanimasa (2006-02-13 09:28)

tb.rbをrequireで設置したときに,<br>#!/usr/bin/env ruby -I /usr/local/install/tdiary<br>を指定しないと,トラックバックの受信がうまくできませんでした.

ただただし (2006-02-13 20:36)

tb.rbはindex.rbやupdate.rbと同じ場所にコピーしなければなりません(マニュアル参照)。それをしないと上記のような設定が必要になります。

irgal (2007-05-09 23:17)

cvsやsourceforge.netの事はあまり知らないんですが...<br>cvs.sourceforge.netでは上手くいかず、tdiary.cvs.sourceforge.netとしたら出来ました。

ただただし (2007-05-09 23:56)

irgalさん、おっしゃるとおり、CVSサーバが変わったのに追従していませんでした。修正しておきます。

irgal (2007-05-10 02:00)

対応早いですね。ナイスです。<br>ついでにもう一つ、私の環境もひろひろさんのコメント同様、@options['sp.path'] = 'plugin2'はフルパスで無いとpluginの選択が出来ませんでした。

ただただし (2007-05-10 14:50)

>、@options['sp.path'] = 'plugin2'はフルパスで無いとpluginの選択が出来ませんでした。 <br><br>調査します。<br>ref. http://tdiary-users.sourceforge.jp/cgi-bin/wiki.cgi?Ticket-101

ただただし (2007-07-22 19:58)

sp.pathの件は、記事中では絶対パスに直しました。<br>相対パスも指定可能ですが、各日記のパスからの相対になります。


«「長年日記」をmain trunkにマージ 最新 xyzzy用tdiary-mode» 編集
Fork me on GitHub