H2O のリバースプロキシ機能を使って gem でインストールした tDiary を表示させるまで

Web サーバを変更したら tDiary が(当然ながら)そのままでは動かなかった

H2O から直接 動かす方法は諦めました

先日 VPS で利用している Web サーバを H2O に交換したことでハマっていたトラブルをようやく解決?

Apache 環境下では CGI で動かしていた旧日記システムである tDiary が H2O ではなかなか上手く動作させられず、どうやったら良いかと考えあぐねて数日。いちおう、動作実績と設定例は見つけられたのですが、さすがに4年近く前だと、いろいろ変更があったのか、そのままでは上手くいかず、かといって解決するための知識も足りないので別の方法で解決しました。

gem でインストールした tDiary をリバースプロキシ経由で表示する

次善の策として思いついたのが、tDiary を gem からインストールすると自前の Web サーバで動作してくれるので、それを H2O のリバースプロキシを利用してインターネットへと公開するのはどうだろうと。

ただ、CentOS7ではデフォルトで入っている Ruby が2.0 のため最新の gem が利用できなかったので rbenv で別バージョンを利用する準備から入らなければいけませんでした。

$ /usr/bin/ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

gem で tDiary をインストールするまでの流れ

まずは rbenv をインストールして現在の安定版 2.7.1 を利用できるようにします。

参考にした以下のサイトの手順でインストールできました。

# gitのインストール
$ sudo yum -y install git
rbenv のインストール
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
# ruby-build のインストール
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
# bash の設定に追記
$ echo '# rbenv' >> ~/.bash_profile
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# 設定を反映
$ exec $SHELL --login
# ruby のコンパイルに必要なパッケージをインストール
$ sudo yum -y install bzip2 gcc openssl-devel readline-devel zlib-devel
# インストール可能なバージョンのリスト
$ rbenv install --list
2.5.8
2.6.6
2.7.1
jruby-9.2.13.0
maglev-1.0.0
mruby-2.1.2
rbx-5.0
truffleruby-20.2.0
truffleruby+graalvm-20.2.0
Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all' to show all local versions.
# Ruby 2.7.1をインストール
$ rbenv install 2.7.1
# 使用するするバージョンを 2.7.1に設定
$ rbenv global 2.7.1
$ rbenv versions
system
* 2.7.1 (set by /home/yuuichi/.rbenv/version)
$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]

ざっくりですが以上の手順でユーザーが使用する Ruby を 2.7.1 に変更できました。これでようやく gem を利用して tDiary をインストールできます。

tDiary のインストール

# gem を使って tDiary をインストール
$ gem install tdiary
# エラーが出なければバージョン確認ができます
$ tdiary version
tdiary 5.1.3
# 新しい tDiary を設置する
$ tdiary new newdiary
create newdiary
create newdiary/public
create newdiary/misc/plugin
create newdiary/lib/tdiary/filter
create newdiary/lib/tdiary/style
create newdiary/js
create newdiary/theme
create newdiary/README.md
create newdiary/Gemfile
create newdiary/Gemfile.lock
create newdiary/config.ru
create newdiary/tdiary.conf.beginner
create newdiary/tdiary.conf.sample
create newdiary/tdiary.conf.sample-en
create newdiary/doc
create newdiary/doc/HOWTO-authenticate-in-rack.md
create newdiary/doc/HOWTO-make-io.md
create newdiary/doc/HOWTO-make-plugin.md
create newdiary/doc/HOWTO-make-theme.md
create newdiary/doc/HOWTO-testing-tDiary.md
create newdiary/doc/HOWTO-use-plugin.md
create newdiary/doc/HOWTO-write-tDiary.en.md
create newdiary/doc/HOWTO-write-tDiary.md
create newdiary/doc/INSTALL-cgi.md
create newdiary/doc/INSTALL-paas.md
create newdiary/doc/INSTALL-rack.md
create newdiary/doc/INSTALL.md
create newdiary/doc/README.en.md
create newdiary/doc/README.md
create newdiary/doc/UPGRADE.md
create newdiary/doc/doc.css
create newdiary/tdiary.conf
create newdiary/Gemfile.local
[DEPRECATED] `Bundler.with_clean_env` has been deprecated in favor of `Bundler.with_unbundled_env`. If you instead want the environment before bundler was originally loaded, use `Bundler.with_original_env` (called at /home/yuuichi/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/tdiary-5.1.3/lib/tdiary/cli.rb:23)
run bundle install --without test development from "./newdiary"
[DEPRECATED] The `--without` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set without 'test development'`, and stop using this flag
Fetching gem metadata from https://rubygems.org/.......
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Using rake 13.0.1
Using bundler 2.1.4
Using thor 1.0.1
Using emot 0.0.4
Using fastimage 2.2.0
Using hikidoc 0.1.0
Using mini_mime 1.0.2
Using mail 2.7.1
Using rack 2.2.3
Using tdiary 5.1.3
Bundle complete! 24 Gemfile dependencies, 10 gems now installed.
Gems in the groups test and development were not installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
run bundle exec tdiary htpasswd from "./newdiary"
Input your username/password
Username: hogehoge
New password: 
Re-type new password: 
install finished
run `tdiary server` in newdiary directory to start server

管理用のユーザー名とパスワードを設定してインストールが完了。

# 作成したディレクトリに移動して tDiary サーバを起動
$ cd newdiary
$ bundle exec tdiary server
[2020-09-14 22:00:31] INFO WEBrick 1.6.0
[2020-09-14 22:00:31] INFO ruby 2.7.1 (2020-03-31) [x86_64-linux]
[2020-09-14 22:00:31] INFO WEBrick::HTTPServer#start: pid=5295 port=19292
# Ctrl-C で Webサーバをシャットダウン
[2020-09-14 22:00:57] INFO going to shutdown ...
[2020-09-14 22:00:57] INFO WEBrick::HTTPServer#start done.
# ローカルホストのポート 19292 にアクセスしてみて tDiary の画面が表示されたら成功
$ w3m http://localhost:19292/ -O utf8

以上で gem でインストールした tDiary を起動することができました。

H2O でのリバースプロキシの設定

ここはシンプルです。

# リバースプロキシで https://www.u-1.net/t/ へのアクセスを tDiary サーバへ向ける
paths:
"/t":
proxy.reverse.url: http://localhost:19292/

とりあえず、最低限これで表示はできます。

gem 環境で動かしていると 設定ファイルの更新などに失敗する

ところが、tDiary 自体が http://localhost:19292/ で動作しているため、外向きのアドレスでアクセスした際、CSRF 対策が効いていて新しいエントリの作成や設定ファイルの更新に失敗します。これは設定ファイルを自前で編集しなければいけないのですがソースを見つけるのに苦労しました。まぁ、GitHub内の更新履歴を見ると分かるのですが、そこにたどり着くのが大変でした。

ここ経由で、base_url を指定してやれば良いという情報を得たものの、そのままでは変更が反映されず、

base_url、tdiary で検索して以下の情報を見つけ、大本にたどり着いた次第

ということで、設置したディレクトリ内にある tdiary.conf に自環境の設定を記述してやります。

@index = "https://www.u-1.net/t/"
@update = "https://www.u-1.net/t/update.rb"
@options['base_url'] = "https://www.u-1.net/t/"

以上でインターネットからサーバ内で動かしているローカル環境の tDiary データを表示することができました。

あくまで昔のデータなのでアクセスできなくてもそんなにダメージはないのですが、せっかくなので試してみました。上手くいって良かった良かった。