MoinMoin のセットアップメモ
MoinMoin を自分用の公開メモサイトとして使うため Linux サーバ上にセットアップした際の詳細。
標準のインストール方法を使わず、ユーザーディレクトリにインストールした。
サーバの OS は Ubuntu Server 13.10 x64。 Web サーバには apache 2.4 (suexec-custom, mod_fcgid) を用い、専用の VirtualHost を割り当てて運用した。
以下、http://domain/ でホストすると仮定する。
Linux や apache に関する基礎知識はあるものとして話を進める。
MoinMoin とは
特徴と、個人的に気に入った点は以下の通り。
- Python で書かれた Wiki クローン。
- スタンドアロンの daemon だけでなく wsgi, cgi/fcgi 等のインターフェイスを持っている。
- Ubuntu Wiki 等で稼働している実績がある。
- Moin 独自の文法だけでなく、簡易マークアップ言語の ReST 等にも対応している。Markdown にも頑張れば対応可能。
- ユーザ管理、ページのパーミッション設定がある。
- スキンや文法の追加ができるプラグインシステムあり。
- ページの階層化が可能。通常のディレクトリであるかのようにアクセスできる。
- 開発が続いていて、コードがメンテされている。現在、構造を大幅に見直した 2.0 の開発が進行中。
インストール
apt-get でインストールすることも可能だが、色々といじりたかったので自分のユーザーディレクトリ内に手動でインストールした。実行時には suexec により自ユーザの権限で動作させた。
インストール場所を /home/USER/ と仮定する。
ダウンロード
最新のリリースは 1.9.7. zip をダウンロードして解凍してもよいが、リポジトリから最新のソースを入手してもよい。リポジトリは Mercurial で管理されているので、hg を使って clone する。hg は apt-get でインストール可能。hg をインストールしたら MoinMoin のレポジトリを clone する。
$ hg clone https://bitbucket.org/thomaswaldmann/moin-1.9
設置
以下のようなディレクトリ構造を目指して設置した。
/home/USER/moin-1.9/
|-- MoinMoin/ 本体コード
|-- wiki/ データ
| |-- config/ MoinMoin 本体の設定
| |-- data/ Wiki のページ内容、ユーザ情報等
| |-- server/ 起動用スクリプトのテンプレートが入っている
| `-- underlay/ ヘルプ等のシステムページ
`-- public/ サイトの DocumentRoot (自前で作成、後述)
MoinMoin 本体
インストール用のスクリプトもあるが、今回は手動でファイルをコピー/移動した。
レポジトリを clone してできた moin-1.9/ をホームディレクトリ以下の外部から見えない位置に移動する (DocumentRoot の中に入れないこと!)。今回は /home/USER/moin-1.9/ とする。
移動したら moin-1.9/wiki/underlay.tar を解凍する。(ヘルプ等のシステムページのデータが入っている)
$ tar xf underlay.tar
DocumentRoot 以下のファイル
web から直接見えることになる DocumentRoot 用のディレクトリは自前で作成する。
中には呼び出し用のスクリプト moin.fcgi と .htaccess のみあればよい。(favicon をカスタマイズしたい場合は favicon.ico をここに置いてもよい)
今回は moin-1.9/public/ を作り、そこを DocumentRoot とした。
public/ の内容を準備する。
MoinMoin 呼び出し用スクリプト
今回は fcgi 版を使うことにした。
moin-1.9/wiki/server/moin.fcgi をコピーし、必要箇所を書き換える。
- MoinMoin 本体および config が呼び出せるように sys.path にパスを追加
- URL rewriting を有効化して見やすい URL にする。
通常は cgi スクリプトへの引数が含まれた長くて読みづらい URL になるが、普通のサイトのような綺麗な URL にしたい。通常のファイルへのアクセスのような URL を渡してもらい、それを内部で書き換えて cgi に渡すことにする。moin.fcgiと.htaccessの両方で設定が必要。
# a1) Path of the directory where the MoinMoin code package is located.
# Needed if you installed with --prefix=PREFIX or you didn't use setup.py.
here = os.path.dirname(os.path.abspath(__file__)) # このファイルのディレクトリ名を here とする
# sys.path にここの親ディレクトリを追加 (/home/USER/moin-1.9)
sys.path.insert(0, os.path.abspath(os.path.join(here, '../')))
# a2) Path of the directory where wikiconfig.py / farmconfig.py is located.
# See wiki/config/... for some sample config files.
# /home/USER/moin-1.9/wiki/config を追加
sys.path.insert(0, os.path.abspath(os.path.join(here, '../wiki/config')))
#(中略)
# Is fixing the script name needed?
# Use None if your url looks like http://domain/wiki/moin.fcgi
# Use '' if you use rewriting to run at http://domain/
# Use '/mywiki' if you use rewriting to run at http://domain/mywiki/
fix_script_name = '' # MoinMoin がリンクを生成するときに URL rewriting 対応のものを生成
.htaccess
以下のような内容の .htaccess を作成して public/ に置く。
DirectoryIndex moin.fcgi
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ moin.fcgi/$1 [L,QSA]
これで apache により URL が書き換えられる。
例えば、http://domain/file へアクセスするとする。file が DocumentRoot 以下に実際に存在すれば直接表示される。存在しなければ (通常はこちらの動作になる) http://domain/moin.fcgi/file へのアクセスとして内部で変換される。
パーミッション
環境によるが、今回の環境では suexec により自ユーザの権限で動作させるため、MoinMoin 本体およびデータは自分以外から読めないことが望ましい。ただし、DocumentRoot である public/ 以下は Apache からも読めるようにする。
$ chmod -R go-rw moin-1.9
$ chmod -R go+r moin-1.9/public
とりあえずのテストに必要な最低限の設定
設定は wiki/config/wikiconfig.py に書かれている。
デフォルトでは instance_dir が変な場所を参照しているので、修正しておく。
# instance_dir はデフォルトで wikiconfig.py と同じディレクトリ (wiki/config/) になっているので、
# その親ディレクトリ wiki/ に変更
instance_dir = os.path.dirname(wikiconfig_dir)
サイト名等々は後から設定する。
apache の設定
今回の構成で apache 本体に必要な mod は以下の通り。
- mod_rewrite (多分デフォルトで入っている)
- mod_fcgid (MoinMoin の fcgi 版を使うなら必要、他のインターフェイスの場合はそれに応じたものを)
- suexec-custom (今回は自ユーザ権限で MoinMoin を走らせるため。apache2-suexec-custom のインストールが必要)
mod の組み込みや suexec の設定はここでは解説しない。
専用の VirtualHost を立てて運用することにしたので、そのための conf を書く (管理者権限が必要)。
Ubuntu 13.10 では conf が VirtualHost ごとに分割されている。/etc/apache2/sites-available/ にまとめて入っているので、適当なファイル名で MoinMoin ホスト用のファイルを書く。今回は 500-moin.conf とした。例では http://domain/、ユーザー/グループは USER/USER で運用すると仮定する。
<VirtualHost *:80>
# http://domain/
ServerName domain
DocumentRoot /home/USER/moin-1.9/public
# cgi 実行ユーザー
<IfModule mod_suexec.c>
SuexecUserGroup USER USER
</IfModule>
# VirtualHost 専用にログを分ける
ErrorLog ${APACHE_LOG_DIR}/domain_error.log
CustomLog ${APACHE_LOG_DIR}/domain_access.log combined
# http://domain/~USER/ で変なファイルが表示されるかもしれないので disabled に
<IfModule mod_userdir.c>
Userdir disabled
</IfModule>
# mod_fcgid の設定
<IfModule mod_fcgid.c>
# 104857600 = 100 MiB
# 受け付ける最大リクエスト長。デフォルトは約 130 KiB だが
# 添付ファイルのアップロード用に適当な長さを確保したい
FcgidMaxRequestLen 104857600
</IfModule>
<Directory "/home/USER/moin-1.9/public">
AllowOverride AuthConfig Indexes FileInfo Limit
# mod_rewrite を有効にするために SymLinksIfOwnerMatch, fcgi のために ExecCGI
Options MultiViews SymLinksIfOwnerMatch ExecCGI
Require method GET POST OPTIONS PROPFIND
</Directory>
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
必要なら mod を組み込み、サイトを有効化して apache を再起動。
テストとユーザー作成
ブラウザから http://domain/ にアクセスして表示できるかテストしてみる。LanguageSetup が表示されたら ok.
エラーが出たら
apache のログを見てみるとよい。/var/log/apache2/domain_error.log にエラーが記録されているかも知れない。
ログが長い (かも知れない) ので、こんな風にラスト 50 行だけ表示したりすると見やすい。
$ tail -n 50 /var/log/apache2/domain_error.log
管理用ユーザー作成
ログインページからユーザーの作成ができる。
FirstnameLastname 形式と書いてあるが hoge でも fuga でも何でもよい。
ここで作成したユーザーを、後から wikiconfig.py 中でスーパーユーザーに指定する。
各種設定
設定は wikiconfig.py に書く。このファイルも python プログラムであり、コードを正しくインデントしないと動作しないので注意。(設定値を追加する時はスペース 4 つ分インデントすればよい)
基本設定
サイト名や管理者等の基本的な部分。
サイト名
sitename = u'サイト名'
フロントページ
フロントページを指定しないとサイトトップが LanguageSetup になってしまうため必須。
翻訳辞書に載っている単語 (u”FrontPage” 等) を指定すると、閲覧者の言語によってページ名も翻訳されて異なったものとなる (e.g. 日本語ブラウザで見ると “フロントページ” になる)。が、この方法は言語毎にフロントページを用意しないと not found となるためお勧めしない。
top や Home 等、辞書に載っていない適当な単語にするのがよい。
page_front_page = u"top"
管理者
先ほど作った (管理用に使う予定の) ユーザーを管理用に指定し、ついでに全ページの全権限を得られるようにしておく。
superuser = [u"さっき作ったユーザー", ]
acl_rights_before = u"さっき作ったユーザー:read,write,delete,revert,admin"
匿名ユーザーの編集禁止
個人用メモなら自分か限られたユーザー以外の編集は禁止したい。普通にブラウザで開いただけの非ログイン状態ではページの編集ができないようにする。(誰でも編集できるようにしたい時は必要ない)
acl_rights_default = u"All:read"
これを指定しないとデフォルトで全ユーザーに書き込み権限が与えられる。ここでは全ユーザーに読み出し権限のみを与え、書き込み権限を指定しないことで書き込みを不可能にしている。
ACL は before → default → after の順で加算されるように適用される。管理者は既に before 段で全権限を付与されており、後の段で明示的に剥奪されない限り全操作が可能となる。default はページごとの ACL があれば上書きされるため、特定のページだけ匿名ユーザーの閲覧を禁止したい場合にも対応できる。
ACL について詳しくは HelpOnAccessControlLists を参照。
自由にユーザーを作れないようにする
MoinMoin はデフォルトでは誰でも自由にユーザーを作りまくることができる。個人用なら自分の把握できる範囲に留めたいので、制限をかけることにする。
制限には色々と方法が提案されているが、ここでは textcha を使ってみた。本体に手を加えることなく制限でき、作成したくなった場合にもパスワードを入れるだけで簡単に対応できる。
textchas = {
'ja': {
u"Admin password?": ur"textcha 解除用パスワード",
},
}
textchas_disabled_group = u"Admin"