MoinMoinの移設作業は開発環境でDockerイメージを作成するところから始めます。現在はCentOS6.5 + Apache + mod_wsgi
で動いていますが、Ubuntu + Nginx + uWSGIに移行してみました。
データボリュームコンテナはdocker-lloyd を使ってIDCFオブジェクトストレージにバックアップしたかったのですが、コードを読んでも動作がわからなかったので、これまで通りテンポラリのコンテナを経由してアーカイブの操作をします。
プロジェクトの作成 MoinMoinのイメージを作成するプロジェクトの構成です。
$ tree ~/docker_apps/m oinmoin/ ~/docker_apps/m oinmoin/ ├── Dockerfile ├── common.css ├── nginx.conf ├── run.sh ├── screen.css └── user
Dockerfile 最初に作成したDockerfileです。dperson/moinmoinのDockerfile を参考にしました。
~/docker_apps/moinmoin/Dockerfile FROM ubuntu:14.04 MAINTAINER Masato Shimizu <ma6ato@gmail.com> ENV HOME /root ENV WORKDIR /root RUN sed -i~ -e 's/archive.ubuntu.com/ftp.jaist.ac.jp/' /etc/apt/sources.list \ && apt-get update RUN DEBIAN_FRONTEND=noninteractive apt-get install -qy language-pack-ja ENV LANG ja_JP.UTF-8 RUN locale-gen $LANG && update-locale $LANG && \ ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime RUN DEBIAN_FRONTEND=noninteractive \ apt-get install -qy nginx uwsgi uwsgi-plugin-python python wget unzip ADD nginx.conf /etc/nginx/sites-available/default RUN wget http://static.moinmo.in/files/moin-1.9.7.tar.gz -P /tmp && \ tar xzf /tmp/moin-1.9.7.tar.gz -C /tmp && \ cd /tmp/moin-1.9.7 && \ python setup.py install --force --prefix=/usr/local && \ sed -e '/sitename/s/Untitled //' \ -e '/page_front_page.*Front/s/#\(page_front_page\)/\1/' \ -e '/superuser/ { s/#\(superuser\)/\1/; s/YourName/ScottTiger/ }' \ -e '/page_front_page/s/#u/u/' \ -e '/acl_rights_before/s/.*/ acl_rights_default = u"ScottTiger:read,write,delete,revert,admin"\n&/' \ -e '/theme_default/s/modernized/europython/' \ -e '/theme_default/s/.*/ tz_offset = 9.0\n&/' \ /usr/local /share/moin/config/wikiconfig.py > \ /usr/local /share/moin/wikiconfig.py && \ chown -Rh www-data. /usr/local /share/moin/data \ /usr/local /share/moin/underlay && \ wget https://bitbucket.org/thesheep/moin-europython/get/3995afe116b0.zip -P /tmp && \ unzip /tmp/3995afe116b0.zip -d /tmp && \ cd /tmp/thesheep* && \ cp europython.py /usr/local /share/moin/data/plugin/theme && \ mkdir /usr/local /lib/python2.7/dist-packages/MoinMoin/web/static/htdocs/europython && \ cp -R css /usr/local /lib/python2.7/dist-packages/MoinMoin/web/static/htdocs/europython && \ cp -R img /usr/local /lib/python2.7/dist-packages/MoinMoin/web/static/htdocs/europython ADD screen.css /usr/local /lib/python2.7/dist-packages/MoinMoin/web/static/htdocs/europython/css/screen.css ADD common.css /usr/local /lib/python2.7/dist-packages/MoinMoin/web/static/htdocs/europython/css/common.css ADD user /usr/local /share/moin/data/user/1338720549.58.37773 ADD run.sh /run.sh VOLUME ["/usr/local/share/moin/data/pages" ] CMD ["bash" , "/run.sh" ] EXPOSE 80 RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
sedでwikiconfig.pyの編集 moin-1.9.7.tar.gzをダウンロードしたあと、wikiconfig.pyの編集をsedで編集します。 dperson/moinmoinのDockerfile を参考にしました。 こういったsedの使い方は初めて見ました。奥が深いです。とても良い勉強になりました。
Europythonのテーマ MoinMoinのテーマはEuropython を使います。pypi と同じテーマなので気に入っています。 ローカルでzipを解凍してデフォルトのfont-familyを修正してからADDします。
screen.cssのfont-familyを編集します。
~/docker_apps/moinmoin/screen.css html { font-family : "lucida grande" ,tahoma,verdana,arial,'ヒラギノ角ゴ Pro W3' , 'Hiragino Kaku Gothic Pro' , 'Osaka' , 'Meiryo UI' ,'メイリオ' , 'MS Pゴシック' , sans-serif; } div #sidebar ul #navibar li a { }
common.cssのfont-familyを編集します。
~/docker_apps/moinmoin/common.css h1 , h2 , h3 , h4 , h5 { font-weight : normal; letter-spacing : 0.05em ; }
Nginx /etc/nginx/sites-available/defaultにコピーするnginx.confです。 デフォルトの設定ファイルからIPv6とtry_files
をコメントアウトします。 uWSGIとドメインソケットで通信する設定をします。
~/docker_apps/moinmoin/nginx.conf server { listen 80 default_server; root /usr/share/nginx/html; index index.html index.htm; server_name localhost; location / { include uwsgi_params; uwsgi_modifier1 30; uwsgi_pass unix:/tmp/moin.sock; } location /moin_static197 { alias /usr/local /lib/python2.7/dist-packages/MoinMoin/web/static/htdocs; } }
uWSGIの起動 Dockerコンテナの起動スクリプトを用意します。uWSGIをデーモンで起動したあと、Nginxをフォアグラウンドで起動します。 以前はruintやSupervisordでinitを書いていましたが、最近はこういった起動スクリプトを用意する方がDockerらしい気がします。
またデータコンテナをアタッチするときにpagesディレクトリの権限を修正するため、起動前にwww-data:www-data
に所有者を変更します。
~/docker_apps/moinmoin/run.sh #!/bin/bash chown -R www-data:www-data /usr/local /share/moin/data/pages uwsgi --uid www-data \ -s /tmp/moin.sock \ --plugins python \ --pidfile /var/run/uwsgi-moinmoin.pid \ --wsgi-file server/moin.wsgi \ -M -p 4 \ --chdir /usr/local /share/moin \ --python-path /usr/local /share/moin \ --harakiri 30 \ --die-on-term \ --daemonize /var/log /uwsgi/app/moinmoin.log nginx -g 'daemon off;'
起動と確認 イメージをビルドしてコンテナを起動します。
$ docker build -t masato/moinmoin . $ docker tag masato/moinmoin localhost:5000/moin $ docker push localhost:5000/moin $ docker run --name wiki -d masato/moinmoin $ docker inspect --format="{{ .NetworkSettings.IPAddress }}" wiki 172.17.0.178
ブラウザで確認します。
docker-backupdのバックアップとリストアは断念 docker-backup を試してみましたが、Goのコードを読んでも挙動がよくわかりませんでした。Goはもっと勉強しないと。
データボリュームコンテナの作成 データボリュームコンテナを作成する前に、起動しているmoinのコンテナを削除します。
$ docker kill wiki && docker rm wiki
データボリュームコンテナを作成します。
$ docker run -v /usr/local /share/moin/data/pages --name wiki-vol busybox true
既存のさくらVPSで動かしているMoinMoinのpagesはDropboxにバックアップ しています。 データボリュームコンテナにDropboxからダウンロードしたpagesのアーカイブをuntarします。
$ docker run --rm --volumes-from wiki-vol -v $(pwd ):/backup ubuntu tar zxfv /backup/141012171613_pages.tar.gz --strip-components=1 -C /usr/local /share/moin/data/pages
データコンテナをアタッチしてwikiを起動
$ docker run --name wiki -d --volumes-from wiki-vol masato/moinmoin $ docker inspect --format="{{ .NetworkSettings.IPAddress }}" wiki 172.17.0.201
ブラウザで確認するとACLが機能して、ログインしないとコンテンツが表示されません。
管理者ユーザーの作成 この設定ではユーザーは管理者ユーザー(ScottTiger)のみ操作が可能です。
/usr/local/share/moin/wikiconfig.py acl_rights_default = u'ScottTiger:read,write,delete,revert,admin'
従って既存のデータを移行する場合は、/usr/local/share/moin/data/user/
のディレクトリにあるユーザー定義ファイルをコピーして追加しないと、何も操作ができなくなります。
ADD user /usr/local /share/moin/data/user/1338720549.58.37773
予め登録してある管理者ユーザーでログインするとWikiページが表示されました。