LaCoocan に WikiFarm を作る修行

やりたいことは、こんなところ。

  • 一つの Wiki エンジンで複数の Wiki サイトを動かす
  • いわゆる WikiFarm エンジンの機能*1は要らない

もしかしたらそもそもこれは WikiFarm と言わないのかもしれない。

Hiki*2 編 → 断念

初めて自分でインストールしてみた Wiki エンジンも Hiki だった。Ruby を覚えたいから、ちょうどいいかな、とか。それが 4 年前とか?
LaCoocanWikiFarm を作ろうとしたときの第一候補が Hiki になったのも、同じ理由。進歩していないということか。

それはさておき。
403 とか 500 しか出ないんで難儀していたが、例外を拾って text/plain で表示するような仕組みを入れて試し、セキュリティ関連であることがわかった。
その後もいろいろ試したが、とりあえず LaCoocan では Hiki が使えない*3、という結論を導いた。

  • $SAFE = 1 を 0 にすれば使えるが、1 前提で作られているものを 0 で使うのは、怖くてできない*4
  • LaCoocan でユーザがアクセスできるディレクトリ /homepage の mode は others も writable である。
    • $SAFE = 1 の場合、/ からたどってひとつでも others も writable なディレクトリがあるディレクトリからは require できないのだろうと解釈した。

PukiWiki*5 編 → とりあえず成功

基本的な構想は、次のとおり。

  • plugin を含む Wiki のエンジン部分は非公開な共通の場所に
  • Wiki サイトごとに
    • 公開している場所に最低限のファイル
    • 非公開な場所に /var 的なもの

で結局このようにした。

エンジン置き場 (ENGINE_DIR)
/homepage/hidden/pukiwiki/
 +- lib/
 +- plugin/

元の pukiwiki の lib と plugin だけ残った。

サイト 1 公開領域
/homepage/site1/
 +- index.php
 +- skin/
 +- image/

index.php の中身で重要なところは、こんな感じ。

 define('DATA_HOME',	'/homepage/hidden/site1/');
 define('ENGINE_DIR', '/homepage/hidden/pukiwiki/');
 define('LIB_DIR',	ENGINE_DIR.'lib/');

image/ を共通公開環境に置くという手もあるだろう。が、wiki 以外の要素も考慮したサイト構成としては、サイト 1 の情報が URI としてまとまっているほうがよいと判断した。
site/ は微妙。このディレクトリの意義をちゃんと把握できてないので。

サイト 1 データ領域
/homepage/hidden/site1/
 +- ...
 +- まだ出てきていないもろもろ
 +- ...
 +- pukiwiki.ini.php

pukiwiki.ini.php の重要な変更点は次のとおり。

 define('PLUGIN_DIR',    ENGINE_DIR . 'plugin/'   ); // Plugin directory
 define('SKIN_DIR', '../../site1/skin/');

*1:配下のサイトの一覧、新規サイトの登録機能など

*2:0.8.7

*3:現状の私のスキル、 LaCoocan の仕組みでは

*4:コードを読んで大丈夫と思えるかもしれないが、今のところそこまでのスキルと気力がない

*5:1.4.7_notb