tDiary on Ubuntu 18.04


はじめに

絶対に外部に公開したくない日記、というものが存在する。Cloud上で書いて完全非公開にすればよいのかもだけれど、万が一が怖い。手書きで管理するのは今更厳しい。手で文字入力なんて、手指の筋肉が衰え切った自分では不可能だ。テキストエディタで書き続けるのもさすがにアレ。というわけでtDiary.

ターゲットとなる環境

  • OS Ubuntu 18.04.2
  • Webサーバ Apache 2.4.x
  • tDiary 5.0.x

tDiaryのサイトにもインストールガイドはある。ただ、Apache 1.3をターゲットとしたもので止まってしまっていて、現在のApache2.4ではそのまま使えない。このため、Apache2のインストールと、そのカスタマイズを記載する。
ただ、これを書いている私自身もWeb関係技術の知識はUpdateが止まっているので、もしより楽な手法があれば教えてほしいところ

注意点、というか

今まで別環境で書いてきたtDiaryのレコードを、新しい環境へ移行するためのメモ。日記のデータはテキストで作成されたものであり、PostgreSQLなどのDB化したものではない。移行も検討したが、Databaseは普段触れることもない自分では、移行の時にもだえ苦しむと判断してテキストでの保存とした。
tDiaryの日記保存先をどうやって作るか、というのはこのエントリの対象外。デフォルトでの作り方はあると思うのだけれど、そこは調べてない。

Apache2のインストール

$ sudo apt install curl     # Curlのインストール
$ sudo apt install ufw      # Firewallをインストール
$ sudo ufw enable
$ sudo ufw allow 80         # Apache2用にPort 80を穴あけ
$ sudo apt install apache2  # Apach2のインストール
$ curl localhost && echo success || echo failed

Serverを入れるので、最初にFirewallを導入。
最後のは動作確認. successと戻ってくれば成功

CGIの有効化

$ cd /etc/apache2/mods-enabled
$ sudo ln -s ../mods-available/cgid.conf ./cgid.conf
$ sudo ln -s ../mods-available/cgid.load ./cgid.load

Mod Rewriteの有効化

tDiaryで過去の日付の日記を参照するとき、(http://XXXXXX/tdiary/20YYMMDD.html) といった形式でもアクセスできるようにしたい。これを実現するため、Mod Rewriteを有効にする。

$ sudo a2enmod rewrite     # mod_rewriteを書き換え
$ sudo sh -c "echo 'RewriteEngine on' > /etc/apache2/mods-available/rewrite.conf"
$ cd /etc/apache2/mods-enabled
$ sudo ln -s ../mods-available/rewrite.load ./rewrite.load
$ sudo ln -s ../mods-available/rewrite.conf ./rewrite.conf
$ sudo systemctl restart apache2

sudo で実行したコマンドしても、リダイレクトする際はsudo 対象外となるため、2行目はこのような書き方となってしまっている。

Rewriteルールの作成

$ sudo vi /etc/apache2/sites-available/000-default.conf

Mod Rewriteはここで有効にする. VirtualHostの配下で下記を記載. 後で出てくるconf-enabledの中に書いても期待するようには動いてくれなかった。なんだろう。

RewriteRule ^/tdiary/([0-9]+).html$ "/srv/www/tdiary/index.rb?date=$1"

tDiary向けにconfファイルの修正もあるけれど、まずはtDiary自体を展開することにする。

tDiaryのインストール

$ sudo apt-cache search tdiary
$ sudo apt install tdiary tdiary-theme tdiary-contrib

Ubuntu 18.04.2標準のパッケージをインストール。5.0.8だった。

tDiaryの展開先

$ sudo mkdir -p /srv/www/tdiary

tDiaryで共通して使用される各スクリプトはここに展開する。

日記データの保存先

$ ls /home/XXXXXX/diary #ここに保存
$ sudo chown -Rf www-data:www-data /home/XXXXXX/diary

対して、各個人が書いていく日記は別のところで保存。このエントリーでは/home/XXXXXX/diaryとしている。
アクセス権限はwww-dataにする必要があった。

tDiaryイメージの展開

$ whatis /usr/bin/tdiary-setup
tdiary-setup (1)     - installer to set up tdiary files for a user
$
$ sudo /usr/bin/tdiary-setup copy /srv/www/tdiary
Input data_path (default: /home/XXXXXX/data): /home/XXXXXX/diary ←環境に合わせて入力
Choose English, Japanese, Traditional-Chinese [E/j/z]: j ← 日本語に設定

data_path: /home/XXXXXX/diary
language: j
Correct? [Y/n]: y ← 正しければy. nでアボートする。
Input password for root in /home/XXXXXX/.htpasswd: XXXXXX ← パスワードを設定
Input again to confirm: XXXXXX ← 再度パスワードを入力
Copy all flies. You should setup CGI files by yourself.

ここでhtpasswdを書き込んでいるけれど、よく見たらrootのものになっている。
ここでユーザ名を指定する方法はあるのかな? 
最終的にはここで生成される.htaccessはそのまま使わず、新しくアカウントを指定して作った。

$ sudo htpasswd -c /home/XXXXXX/.htpasswd ユーザ名

tDiary用のApache Configファイルの用意

元ネタになるConfigは'/srv/www/tdiary/dot.htaccess'. これを下記のように書き換えた。
BASIC認証のユーザ名は.htpasswdで生成されたものと同じものとする。

$ sudo vi /etc/apache2/conf-available/tdiary.conf
alias /tdiary/images /home/XXXXXXXX/diary/images
alias /tdiary        /srv/www/tdiary
<Directory /srv/www/tdiary>
    Require all granted
    Options +ExecCGI
    AddHandler cgi-script .rb
    DirectoryIndex index.rb
    AddType application/xml .rdf
    <Files "*.rhtml*">
          deny from all
    </Files>

    <Files "tdiary.*">
          deny from all
    </Files>

    <Files update.rb>
          AuthName      tDiary
          AuthType      Basic
          AuthUserFile  /home/XXXXXX/.htpasswd
          Require user  ユーザ名
    </Files>

    <Files squeeze.rb>
          AuthName      tDiary
          AuthType      Basic
          AuthUserFile  /home/XXXXXX/.htpasswd
          Require user  ユーザ名
    </Files>
</Directory>

squeeze.rbは作成した日記をHTML形式で吐き出してくれるプラグイン。便利なのでずっと使っていたのだけれど、tDiary 5.0.0からはCoreからContribに移された
でも、dot.htaccessのサンプルConfigには載せられたままだった。修正漏れかな?

$ cd /etc/apache2/conf-enabled
$ sudo ln -s ../conf-available/tdiary.conf ./tdiary.conf
$ sudo systemctl restart apache2

tDiaryのチューニング

CSRF対策

この投稿では、tDiaryでの日記の保存先'/home/XXXXXX/diary/'としている。
日記自体のConfigはこのディレクトリの'tdiary.conf’で設定される。基本的にはtDiary上から編集できるが、いくつかできないものもある。
'base_url' => "http://XXXXXX/tdiary/",
という行がある。ここのホスト名(XXXXXX)をローカルノードの名前に合わせる必要がある。
(でないと、日記を書きこめない)

squeeze.rb

全文検索エンジンにFeedさせるのに便利なので、最初期から使っている。Contribから回収し、適切な場所にコピーする。

$ sudo cp /srv/www/tdiary/contrib/plugin/squeeze.rb /usr/share/tdiary/misc/plugin/

Ubuntuだと、デフォルトのプラグイン保存先がちょっと違っていた。/srv/www/tdiary/misc/pluginにも同一のプラグインが展開されるため、最初こちらにコピーしても動作しなくて慌ててしまった。

あと、/srv/www/tdiary/tdiary.confの最後に下記を追記

$ sudo vi /srv/www/tdiary/tdiary.conf

# SQUEEZE Plugin
@options['squeeze.compat_path'] = true
@options['squeeze.suffix'] = '.html'
@options['squeeze.output_path'] = '/home/XXXXXX/diary/html' ← HTMLファイルの出力先

ひとまず、これで構築完了。動く、ハズ。