PythonMatrixJpのコンテンツ管理

「さくらのレンタルサーバ・ライト」で運営しております本サイト。 最近管理方法をブラッシュアップしたのでその方法をメモっときます。

特徴

  • レンタル共用サーバで運用可能。
  • サーバにPythonさえあればOK。
  • sshログインなしでもなんとかなる。
  • Mercurialを利用。

用意するもの

  • サーバ上にリモートリポジトリ作成(ドキュメントルートにした)。
  • 「repos/hgweb.cgi」を設置してhttpベースでリポジトリを公開。
  • 公開場所は運営者だけアクセスできる様にアクセス制限を掛けます。
  • リモートリポジトリをローカルにクローン。
  • ローカルにTinkerer環境をセットアップ。
  • あとローカルでリアルなテストをしたいならapache2もあると良い。

公開の流れ

  • コンテンツ自体はTinkererを使って作る。
  • 出力結果(blog/html/*)をローカルリポジトリに上書きコピー
  • ローカルリポジトリを自動コミット&リモートリポジトリへプッシュ
  • リモートリポジトリのフックで自動展開。

リモートフォルダ構成

  • www/
    • .hg/
      • hgrc
    • repos/
      • .htaccess
      • .htpasswd
      • mercurial/ ← from mercurial-source
      • hg ← from mercurial-source
      • hgweb.cgi ← from mercurial-source
      • hweb.config

「hg」と「hgweb.cgi」には実行属性を付与すること。

hgrc:

[web]
allow_push=nobonobo
contact=nobonobo
push_ssl=false
description=PythonMatrix

[hooks]
changegroup.notify=ドキュメントルート/repos/hg update -C

.htaccess:

RewriteEngine On
RewriteBase /repos
RewriteRule ^$ hgweb.cgi  [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) hgweb.cgi/$1  [QSA,L]
AuthUserFile /home/nobonobo/www/repos/.htpasswd
AuthType Basic
AuthName "Web access"
Require valid-user
Satisfy all
DirectoryIndex hgweb.cgi .ht

.htpasswd:

非公開(手元で作ってアップロードしましょう。) (今時その認証方式はどうなの?っていう意見もありますが。 さくらのレンタルサーバ・ライトではDigestモジュール外されてるみたい。)

hgweb.config:

[web]
encoding = "UTF-8"

[paths]
レポジトリ名 = "ドキュメントルート"

「レポジトリ名」には英数字とアンダースコアしか使っちゃダメー。

「mercurial/」、「hg」、「hgweb.cgi」はmercurialソースアーカイブに含まれているものです。 以下の処理をしたものをサイトにアップロードします。

mercurialフォルダでの事前処理:

cp mercurial/pure/* mercurial/

これは、コンパイルレスでmercurialを動かすおまじないです。 こうしないとターゲットのサーバ上でコンパイルするなど手順が煩雑に。

ローカルフォルダ構成

  • tinkerer-root/
    • .hg/
    • .hgignore ← www/を無視するように設定。
    • blog/
      • html/ ← Tinkererのアウトプットフォルダ
    • _static/
    • templates/
    • pages/
    • conf.py
    • www/ ← 擬似サーバードキュメントルート
      • .hg/ ← リモートのクローン
      • .hgignore ← repos/を無視するように設定。
      • repos/ ← リモートと同じものを入れると認証やhgwebビューの確認ができる。
    • httpd.conf

Apache2設定 for Mac

「さくらのレンタルサーバ・ライト」に近い環境を立ち上げます。 (再現性の高い実験が不要の場合このセクションの設定は不要。)

Apacheってシンボリックリンクを多用しないと 環境依存な設定しか書けないんだよねー。 他の環境の人はServerRoot、モジュールパス、 /private/etcなどを適時書き換えてねー。

以下の設定にて「httpd -k start -f $PWD/httpd.conf」で起動すると 「http://localhost:8888/」で擬似本番環境で内容を確認できます。

httpd.conf

ServerRoot "/usr"
LoadModule dir_module libexec/apache2/mod_dir.so
LoadModule authz_host_module libexec/apache2/mod_authz_host.so
LoadModule autoindex_module libexec/apache2/mod_autoindex.so
LoadModule alias_module libexec/apache2/mod_alias.so
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
LoadModule log_config_module libexec/apache2/mod_log_config.so
LoadModule mime_module libexec/apache2/mod_mime.so
LoadModule setenvif_module libexec/apache2/mod_setenvif.so
LoadModule cgi_module libexec/apache2/mod_cgi.so
LoadModule authn_file_module libexec/apache2/mod_authn_file.so
LoadModule authn_default_module libexec/apache2/mod_authn_default.so
LoadModule auth_basic_module libexec/apache2/mod_auth_basic.so
#LoadModule auth_digest_module libexec/apache2/mod_auth_digest.so
LoadModule authz_user_module libexec/apache2/mod_authz_user.so

PidFile "${TMPDIR}/httpd.pid"
LockFile "${TMPDIR}/accept.lock"
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog "${TMPDIR}/access.log" common
ErrorLog "${TMPDIR}/error.log"
RewriteLog "${TMPDIR}/rewrite.log"
RewriteLogLevel 9

Listen 8888
ServerName localhost

ServerSignature On
ServerTokens Full
UseCanonicalName Off
HostnameLookups Off
Timeout 30
KeepAlive On
MaxKeepAliveRequests 10
KeepAliveTimeout 15

AddDefaultCharset UTF-8
DefaultType text/plain
AddHandler cgi-script .cgi
AllowEncodedSlashes On

IndexIgnore .htaccess
<FilesMatch "^.ht">
    Order allow,deny
    Deny from all
</FilesMatch>

<IfModule mime_module>
        TypesConfig /private/etc/apache2/mime.types
        #AddType application/x-compress .Z
        #AddType application/x-gzip .gz .tgz
</IfModule>

DocumentRoot "${PWD}/www"
DirectoryIndex index.html
AccessFileName .htaccess
<Directory "${PWD}/www">
        Options Indexes FollowSymLinks ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
</Directory>

動作の概略

digraph flow {
{
  リモートリポジトリ [shape=box3d]
  ローカルリポジトリ [shape=box3d]
  出力フォルダ [shape=folder]
  reStソース [shape=folder]
  リモートドキュメント [shape=folder]
  出力フォルダ -> reStソース [dir=back, label=" 1:ビルド"]
  ローカルリポジトリ -> 出力フォルダ [dir=back, label=" 2:Copy"]
  ローカルリポジトリ -> ローカルリポジトリ [label=" 3:hg commit -A -m 'auto'"]
  リモートリポジトリ -> ローカルリポジトリ [dir=back, label=" 4::hg push"]
  {rank=same; リモートリポジトリ -> リモートドキュメント [label=" 5:hg update -C"] }
}
}

実際の運用手順

以下の手順なら、Tinkererのドラフト機能は使わなくてもイイ。

記事を書く

tinker -p title

作成されたひな形ファイルを編集する。

ビルド

tinker -b
cp -rf blog/html/* www/

注釈

Tinkererのちょっとやなところはこのビルドする時、 blog/htmlが一旦消されてから再構築するところ。 なのでwww/は別フォルダにしてコピーで持っていく。

表示確認

httpd -k start -f $PWD/httpd.conf
open http://localhost:8888/

よければリモートに反映

hg --repo www commit -A -m "auto"
hg --repo www push http://サイトのアドレス/repos/レポジトリ名

ソース群のコミット

hg commit -A -m "メッセージ"

まとめ

まーそんな感じでこのサイトの運用を再開しました。

Tinkererのいいところはすべてのコンテンツ情報は*.rstにだけ。 見た目のカスタマイズは「_static/、_template/、conf.py」にだけという分かりやすさ。

相対ページパスを書いていなければ、ざっくりフォルダ構成変えても ほとんど影響なく再構築できちゃう。