#format text_markdown
MoinMoin のセットアップメモ
===========================
[MoinMoin](https://moinmo.in/) を自分用の公開メモサイトとして使うため 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](https://wiki.ubuntu.com/) 等で稼働している実績がある。
* Moin 独自の文法だけでなく、簡易マークアップ言語の ReST 等にも対応している。Markdown にも頑張れば対応可能。
* ユーザ管理、ページのパーミッション設定がある。
* スキンや文法の追加ができるプラグインシステムあり。
* ページの階層化が可能。通常のディレクトリであるかのようにアクセスできる。
* 開発が続いていて、コードがメンテされている。現在、構造を大幅に見直した 2.0 の開発が進行中。
インストール
------------
[公式インストールガイド](http://master.moinmo.in/InstallDocs)
apt-get でインストールすることも可能だが、色々といじりたかったので自分のユーザーディレクトリ内に手動でインストールした。実行時には suexec により自ユーザの権限で動作させた。
インストール場所を `/home/USER/` と仮定する。
### ダウンロード ###
[公式ダウンロード](http://moinmo.in/MoinMoinDownload)
最新のリリースは 1.9.7. zip をダウンロードして解凍してもよいが、[リポジトリ](https://bitbucket.org/thomaswaldmann/moin-1.9)から最新のソースを入手してもよい。リポジトリは Mercurial で管理されているので、hg を使って clone する。hg は apt-get でインストール可能。hg をインストールしたら MoinMoin のレポジトリを clone する。
```console
$ 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` を解凍する。(ヘルプ等のシステムページのデータが入っている)
```console
$ 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` の両方で設定が必要。
```python
# 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 とする
here = os.path.dirname(os.path.abspath(__file__))
# 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')))
#(中略)
fix_script_name = '' # MoinMoin がリンクを生成するときに URL rewriting 対応のものを生成
```
##### .htaccess #####
以下のような内容の `.htaccess` を作成して `public/` に置く。
```apache
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 からも読めるようにする。
```console
$ chmod -R go-rw moin-1.9
$ chmod -R go+r moin-1.9/public
```
### とりあえずのテストに必要な最低限の設定 ###
設定は `wiki/config/wikiconfig.py` に書かれている。
デフォルトでは instance_dir が変な場所を参照しているので、修正しておく。
```python
# 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 で運用すると仮定する。
```apache
# http://domain/
ServerName domain
DocumentRoot /home/USER/moin-1.9/public
# cgi 実行ユーザー
SuexecUserGroup USER USER
# VirtualHost 専用にログを分ける
ErrorLog ${APACHE_LOG_DIR}/domain_error.log
CustomLog ${APACHE_LOG_DIR}/domain_access.log combined
# http://domain/~USER/ で変なファイルが表示されるかもしれないので disabled に
Userdir disabled
# mod_fcgid の設定
# 104857600 = 100 MiB
# 受け付ける最大リクエスト長。デフォルトは約 130 KiB だが
# 添付ファイルのアップロード用に適当な長さを確保したい
FcgidMaxRequestLen 104857600
AllowOverride AuthConfig Indexes FileInfo Limit
# mod_rewrite を有効にするために SymLinksIfOwnerMatch, fcgi のために ExecCGI
Options MultiViews SymLinksIfOwnerMatch ExecCGI
Require method GET POST OPTIONS PROPFIND
# 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 行だけ表示したりすると見やすい。
```console
$ tail -n 50 /var/log/apache2/domain_error.log
```
### 管理用ユーザー作成 ###
ログインページからユーザーの作成ができる。
FirstnameLastname 形式と書いてあるが hoge でも fuga でも何でもよい。
ここで作成したユーザーを、後から `wikiconfig.py` 中でスーパーユーザーに指定する。
各種設定
--------
設定は `wikiconfig.py` に書く。このファイルも python プログラムであり、コードを正しくインデントしないと動作しないので注意。(設定値を追加する時はスペース 4 つ分インデントすればよい)
### 基本設定 ###
サイト名や管理者等の基本的な部分。
##### サイト名 #####
```python
sitename = u'サイト名'
```
##### フロントページ #####
フロントページを指定しないとサイトトップが LanguageSetup になってしまうため必須。
翻訳辞書に載っている単語 (u"FrontPage" 等) を指定すると、閲覧者の言語によってページ名も翻訳されて異なったものとなる (e.g. 日本語ブラウザで見ると "フロントページ" になる)。が、この方法は言語毎にフロントページを用意しないと not found となるためお勧めしない。
top や Home 等、辞書に載っていない適当な単語にするのがよい。
```python
page_front_page = u"top"
```
##### 管理者 #####
先ほど作った (管理用に使う予定の) ユーザーを管理用に指定し、ついでに全ページの全権限を得られるようにしておく。
```python
superuser = [u"さっき作ったユーザー", ]
acl_rights_before = u"さっき作ったユーザー:read,write,delete,revert,admin"
```
### その他の細かい設定 ###
##### デフォルト言語 #####
ついでにタイムゾーンも指定しておくと更新日時もローカライズされて表示される。
```python
language_default = 'ja'
tz_offset = 9.0
```
##### デフォルトテーマ #####
Pukiwiki 風に言うとスキン。標準では `classic`, `modern`, `modernized`, `modernized_cms`, `rightsidebar` が選択できる。デフォルトは `modernized`.
```python
theme_default = 'modernized'
```
##### フッターのクレジット表記 #####
`page_credits` を設定するとデフォルト値がオーバーライドされる。クレジットは一個ずつリストにして入れる。リスト項目の中では html を直接記述してもよい。
```python
page_credits = [
u'© 2014 俺様.',
u'Powered by MoinMoin',
]
```
##### 更新ユーザーのホスト名を非表示に #####
半プライベートなサイトならホスト名の表示も要らないかも知れない。
```python
show_hosts = 0
```