PukiWiki の代わりに Gollum を導入してみた

プライベート用の技術メモとして学生時代から PukiWiki を使ってたんですが、今どき PukiWiki を使っててもなぁと思って Gollum を導入してみました。
Qiita の private posts もありかと思ったんですが、ちょっと使ってみた感じだと private posts には検索をかけられない感じでしょうか。

PukiWiki と比べると Gollum は次のような特徴があるのかなぁと思います。

  • 今もそれなりにはメンテナンスされてそう
  • Git でファイルの管理ができる
  • syntax highlight に対応している
  • Markdown で記述できる
    • 設定によっては ReStructuredText や Textile なども使える
  • 数式を記述できる (Mathjax)
  • Rack のミドルウェアを使っていくらでも拡張できそう
    • 編集権限の管理とかも Rack::Auth::Basic と Rack::URLMap を使えばサクッと導入できそう
  • アップロードしたファイルの一覧を見ることができない(まだ使い方がわかってないだけかも)
    • 最悪 .png とかで検索をかけると見つかる
    • 必要になれば自分でサクッと実装できると思う
  • 編集の衝突に対しての考慮がない(衝突したことにすら気付けない)
    • History で diff を見てなんとかするしかなさそう
  • プラグインという概念がない
    • 便利な機能を作って他の人でも利用できる形で配布することは現時点でできなさそう

導入する際、自分の中での絶対条件は Markdown で記述できて検索ができて数式に対応していることだったのでその辺はクリアできてそうです。
Gollum でググるとそれなりに情報が見つかるんですが、日本語タイトルや Apache が稼働しているサーバで動かすことに関して言及されているものがほとんどない気がするので自分なりにまとめました。
使い方などはググるか gollum/wiki を参照すると良いと思います。

導入

Gollum は日本語タイトルを扱えないので修正が必要です。また、いくつか気に食わないところがあったので少し修正しています。

日本語周りの扱いに関しては「Gollumで日本語ページを使う - Yoshimopedia」を参考にさせていただきました。

以降、私のリポジトリの Gollum を使う前提で説明するので、導入するかたはオリジナルから fork して cherry-pick するなりしてください。

Wiki 用のリポジトリの作成と初期化

gem のリポジトリを指定するため Bundler を使います。abicky/grit, abicky/gollum, abicky/gollum-lib は自分のリポジトリとブランチを指定してください。

% mkdir wiki
% cd wiki
% cat <<GEM > Gemfile
source 'https://rubygems.org'

gem 'gitlab-grit', github: 'abicky/grit', branch: 'master'
gem 'gollum-lib', github: 'abicky/gollum-lib', branch: 'master'
gem 'gollum', github: 'abicky/gollum', branch: 'master'
GEM
% bundle install
% git init
% git config core.quotepath false  # これをしないと日本語ファイルがフィルタリングされる
% git add Gemfile*
% git commit -m 'Add Gemfile'

あとは Gollum の設置方法について 3 通り説明します。

特定の port に対して直接アクセスする場合

リポジトリのトップで次のコマンドを実行すると 8080 番ポートでサーバが起動します。

% bundle exec gollum --mathjax --allow-uploads --port=8080

Apache をリバースプロキシとして使う場合

サーバの特定のポートしか空いていなくて既に別の Web サーバとして Apache が稼働している場合は Apache をリバースプロキシとして使うか、後述するように Passenger を導入すると良いと思います。
リバースプロキシとして使う場合は、httpd.conf などに次の内容を記述して再起動します。

ProxyPreserveHost On
ProxyPass /wiki http://localhost:8080/wiki retry=0
ProxyPassReverse /wiki http://localhost:8080/wiki

その後、リポジトリのトップで次のコマンドを実行します。

% bundle exec gollum --mathjax --allow-uploads --port=8080 --base-path=wiki

あとはこのサーバの /wiki にアクセスすると利用可能です。

なお、Rack::URLMap#call (rack 1.5.2) の実装的に ProxyPreserveHost を On にしないとハマるので注意してください。
cf. https://github.com/gollum/gollum/issues/212

Apache & Passenger を使う場合

Passenger のユーザガイドを参考に導入します。

アプリのディレクトリ以下に config.ru ファイル, public ディレクトリ, tmp ディレクトリが必要なので作成します。

% cd /path/to/wiki
% mkdir {public,tmp}
% cat <<GEM > config.ru
require 'rubygems'
require 'bundler'
Bundler.require
require 'gollum/app'

Precious::App.set(:gollum_path, __dir__)
Precious::App.set(
  :wiki_options,
  live_preview:  false,
  allow_uploads: true,
  mathjax:       true,
)
run Precious::App
GEM

次に Passenger をインストールします。
以下、Debian 6, Ruby 2.0, Passenger 4.0, Apache 2.2 という構成ですが、他の構成でも手順はそれほど変わらないはずです。

% which ruby
/home/arabiki/.rbenv/shims/ruby
% ruby -v
ruby 2.0.0p451 (2014-02-24 revision 45167) [x86_64-linux]
% gem install passenger
% rbenv rehash
% passenger-install-apache2-module

(snip)

--------------------------------------------
Almost there!

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /home/arabiki/.rbenv/versions/2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.50/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /home/arabiki/.rbenv/versions/2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.50
     PassengerDefaultRuby /home/arabiki/.rbenv/versions/2.0.0-p451/bin/ruby
   </IfModule>

After you restart Apache, you are ready to deploy any number of web
applications on Apache, with a minimum amount of configuration!

Press ENTER to continue.


--------------------------------------------

Deploying a web application: an example

Suppose you have a web application in /somewhere. Add a virtual host to your
Apache configuration file and set its DocumentRoot to /somewhere/public:

   <VirtualHost *:80>
      ServerName www.yourhost.com
      # !!! Be sure to point DocumentRoot to 'public'!
      DocumentRoot /somewhere/public
      <Directory /somewhere/public>
         # This relaxes Apache security settings.
         AllowOverride all
         # MultiViews must be turned off.
         Options -MultiViews
         # Uncomment this if you're on Apache >= 2.4:
         #Require all granted
      </Directory>
   </VirtualHost>

And that's it! You may also want to check the Users Guide for security and
optimization tips, troubleshooting and other useful information:

  /home/arabiki/.rbenv/versions/2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.50/doc/Users guide Apache.html
  https://www.phusionpassenger.com/documentation/Users%20guide%20Apache.html

Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) :-)
https://www.phusionpassenger.com

Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.

メッセージに表示された内容を Apache の設定に追加します。Debian 系 Linux の流儀に従って /etc/apache2/mods-available/passenger.{load,conf} を作成していますが、他に LoadModule している箇所に追記すればいいと思います。

% echo 'LoadModule passenger_module /home/arabiki/.rbenv/versions/2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.50/buildout/apache2/mod_passenger.so' | sudo tee /etc/apache2/mods-available/passenger.load
LoadModule passenger_module /home/arabiki/.rbenv/versions/2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.50/buildout/apache2/mod_passenger.so
% cat <<EOF | sudo tee /etc/apache2/mods-available/passenger.conf
<IfModule mod_passenger.c>
  PassengerRoot /home/arabiki/.rbenv/versions/2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.50
  PassengerDefaultRuby /home/arabiki/.rbenv/versions/2.0.0-p451/bin/ruby
</IfModule>
EOF
% sudo a2enmod passenger
Enabling module passenger.
Run '/etc/init.d/apache2 restart' to activate new configuration!

サイトの設定に関しては同じドメインに対してパスを分けてアクセスできるようにしたかったので、表示された内容とは別にここを参考に <VirtualHost *:80> … </VirtualHost> の中に次のような内容を記述しました。

    Alias /wiki /path/to/wiki/public
    <Directory /path/to/wiki/public>
        Allow from all
        Options -MultiViews
        # Uncomment this if you're on Apache >= 2.4:
        #Require all granted

        PassengerBaseURI /wiki
        PassengerAppRoot /path/to/wiki
    </Directory>

あとは Apache を再起動して /wiki にアクセスすると利用可能になっているはずです。

アプリケーションを再起動したい場合は次のコマンドを実行します。

% touch /path/to/wiki/tmp/restart.txt

Basic 認証をかける

私の場合は Apache 側で Basic 認証をかけていますが、Rack::Auth::Basic を利用することですんなり導入できます。
例えば、config.ru を次のように記述することで認証がかけられます。

require 'rubygems'
require 'bundler'
Bundler.require
require 'gollum/app'

Precious::App.set(:gollum_path, __dir__)
Precious::App.set(
  :wiki_options,
  live_preview:  false,
  allow_uploads: true,
  mathjax:       true,
)

use Rack::Auth::Basic, 'Authentication Required' do |username, password|
  username == 'some user' && password == 'password'
end

run Precious::App

参考: githubのwikiエンジン”gollum”の導入と細かい設定 - yukke::note

以上、Gollum の導入についてでした。