同一サーバで複数のtDiaryを運営する方法
単一のWebサーバ上で、複数のtDiaryを運用したい場合があります(tDiary.Netのように)。個々の日記をそれぞれ別のtDiaryで運用してもいいのですが、バージョンアップなどが面倒です。
こういう場合に、単一のインストールイメージで複数の日記を運用できる仕組みが、tDiaryには備わっています。以下にその手順を解説します。この方法は、tDiary.Netで使われているものとぼほ同じです。
tDiaryのインストール
バージョンアップを簡単にするために、Subversionを使ってtDiaryをインストールします。ここでは最新版(trunk)を使うことにします。ただし、ダウンロードページにもあるように、Subversion版は非常に不安定な状態にある可能性があります。トラブルを自分で回避する自信がない場合はリリース版を使いましょう。
さて、とりあえずインストール先を「/usr/local/share/tdiary」としましょう。
# cd /usr/local/share # svn co https://tdiary.svn.sourceforge.net/svnroot/tdiary/trunk tdiary (以下略)
これで、/usr/local/share/tdiaryの下に、core、plugin、themeなどの各パッケージのディレクトリができました。また、themeの中身を、core/themeの下にシンボリックリンクを張っておきます。
# cd /usr/local/share/tdiary/core/theme # ln -s ../../theme/* .
テーマの設定
通常、/usr/local/share/tdiary/themeはWebサーバで公開されていませんから、公開しているところにシンボリックリンクを張らなければなりません。公開ディレクトリを「/home/httpd/html」とし、このトップに置くことにします。
# cd /home/httpd/html # ln -s /usr/local/share/tdiary/core/theme theme
また、シンボリックリンクが使えるように、Apacheの設定でFollowSymLinksを設定しておく必要があります。
これだけではtDiaryが正しいURLを埋め込んでくれないので、以下のプラグインを書いて、「/usr/local/share/tdiary/plugin」に置いておきます。
# theme_url.rb def theme_url '/theme' 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['sp.path'] = '/usr/share/tdiary/plugin'
@secure = true
load_cgi_conf
@options['sp.path']でプラグイン集(plugin)をプラグイン選択の対象にしています。これで、設定画面からユーザごとに好きなプラグインを選択可能です。
@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/env ruby require '/usr/local/share/tdiary/core/index'
最後に、以下のようなtdiary.confを用意します。
@user_name = 'hoge' eval( File::readlines( "/etc/tdiary.conf" ).join.untaint )

/etc/tdiary.confに<br>@secure = true<br>load_cgi_conf<br>がなくてはまりましたそさ(笑)
すんまそん。追記しておきました。
「シンボリックリンクを許可したくない場合には、以下のようなindex.rbを用意」ということで、用意した時に、chmod +x をし忘れて、ちょい悩みました。<br> あとは、実は初っぱなから「複数のtDiaryを運営する」に挑戦したので、単純にインストールしたときにも出会う問題なんだと思いますが、日記の保存先に、@data_path = "/var/tdiary/#{@user_name}"というディレクトリーを作らないと行けないのだと思いますが、 /var/tdiaryまでしか作って無いというミスをしました。<br><br>とりあえずは、このドキュメントどおりにインストールしたら、うまく動きだして幸せです。<br>これからのupdateもcvs updateだけですむし…
なるほど。追記しておきましょう。
以前掲示板で聞いたときに,各ユーザ用のtdiary.confでjoinの後に「.untaint」を付けてとの事だったと思うんですけど,付けなくても大丈夫になったんですか?
そういえばそうでした。追記しておきます。
Insecure operation - require (SecurityError)<br><br>と、mod_ruby環境で言われてしまうのですが……。<br>どうしてなんでしょう。
どのバージョンだかわかりませんが、1.5.2はmod_rubyで動きません(最新版で修正済み)<br><br>#関係ないトピックへのツッコミはご遠慮願います
すみません。<br>1.4.4.1は、mod_rubyで動いていたものですから、<br>このドキュメントに従って、installしたから、<br>mod_rubyで動かなくなったのかと勘違いしておりました。<br><br>申し訳ありませんでした。
このドキュメントどおりインストールをしたはずなのですが、おそらくあと一歩のところで動きません。<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スクリプトは動いています。
通常、Apacheのエラーは引用されている部分の「前に」出るんですが、何も出ていませんか?
作業中に出力された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>でした。
まさか改行コードがCRLFじゃないですよね?
自分で打ち込んだファイルを調べたんですが改行コードはLFでした。<br>どのファイルの改行コードがCRLFだとまずいのでしょうか。
昨日からぼちぼちと設定をやっております。<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で管理したいなと思いまして。
tDiary 1.5.6 では、plugin ディレクトリは core を CVS から取得した、ほとんど空の状態のままで、<br>misc/plugin に「すべての plugin の」シンボリックリンクを張って、設定画面から各自が自分の使う plugin を -コンフリクトしないように- 選ぶという形式になっていますね。
プラグイン選択のパスを設定すれば、シンボリックリンクは不要ですね。最新版にあわせて書き換えておきました
プラグインのパスをフルパスにしないと駄目な場合があるようで、はまってしまいました。
# cd theme2<br># for t in *; do (cd ../theme; ln -s ../theme2/$t $t); done<br>は<br># cd theme<br># ln -s ../theme2/* .<br>じゃだめなんでしょうか?
おっしゃるとおりです、ありがとう。直しておきました
cvs.tdiary.sf.net は現在使えない状態のようです。<br>とりあえずcvs.sourceforge.net に変更しちゃえばCVSが使えます(読者向けコメント)。
ご指摘どうも。修正しておきました
Solaris10で動きました<br>多少の変更は必要でしたけどね
tb.rbをrequireで設置したときに,<br>#!/usr/bin/env ruby -I /usr/local/install/tdiary<br>を指定しないと,トラックバックの受信がうまくできませんでした.
tb.rbはindex.rbやupdate.rbと同じ場所にコピーしなければなりません(マニュアル参照)。それをしないと上記のような設定が必要になります。
cvsやsourceforge.netの事はあまり知らないんですが...<br>cvs.sourceforge.netでは上手くいかず、tdiary.cvs.sourceforge.netとしたら出来ました。
irgalさん、おっしゃるとおり、CVSサーバが変わったのに追従していませんでした。修正しておきます。
対応早いですね。ナイスです。<br>ついでにもう一つ、私の環境もひろひろさんのコメント同様、@options['sp.path'] = 'plugin2'はフルパスで無いとpluginの選択が出来ませんでした。
>、@options['sp.path'] = 'plugin2'はフルパスで無いとpluginの選択が出来ませんでした。 <br><br>調査します。<br>ref. http://tdiary-users.sourceforge.jp/cgi-bin/wiki.cgi?Ticket-101
sp.pathの件は、記事中では絶対パスに直しました。<br>相対パスも指定可能ですが、各日記のパスからの相対になります。