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 は日本語タイトルを扱えないので修正が必要です。また、いくつか気に食わないところがあったので少し修正しています。
- 日本語ページ名が ascii に変換されるので修正 cf. abicky/gollum@25bf989
- grit は結果を ASCII-8BIT で返すが、grit/lib/grit_ext/* で Grit::Blob#name などが UTF-8 に変換されて整合性がなくなって Encoding::CompatibilityError が起きるので修正 cf. abicky/grit@4aa12e1, abicky/gollum-lib@5bd8712
- ページ名に ? など特殊な文字を含むとアクセスできなくなるので修正 abicky/gollum-lib@0f01ea5
- code block で特殊な文字が二重にエスケープされるので修正 cf. abicky/gollum-lib@bc2e9bd
- code block で言語を指定しなかったらエラー扱いされるので修正 cf. abicky/gollum-lib@bc2e9bd
- ファイルのソートの順番が気に食わないので変更(フォルダも含めて名前順でソート) cf. abicky/gollum-lib@9c0efb9
- Mac で Ctrl-b が太字にするためのショートカットにされるので無効化 abicky/gollum@be15c67
- 数式で \bm, \argmax, \argmin を使えるように修正 abicky/gollum@14c761b
日本語周りの扱いに関しては「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 の導入についてでした。