静的生成ウェブサイトに Isso でコメントシステム導入

## 状況

静的ウェブサイト生成ツールの [Hugo](https://gohugo.io/) を使って blog を書いていて，[GitHub Pages](https://pages.github.com/) で運用しています．おおむね満足しているのですけれど，読者の方がコメントを書く手段が無いのが難点です．いや，実際には私の blog の読者なんてほとんどいないので，実際上は問題無いのですけれど，ひょっとしたら将来，なにか間違いを見つけて指摘してやろうという奇特な人が出てこないとも限らない．

## Disqus はダメだった

[Disqus](https://blog.disqus.com/) を使うというのが定番らしく，Hugo でもサポートしています．無料ですので，使ってみました．導入は簡単でよかったのですが，不満があります．

* 広告が表示される
* コメントを書く人は，自分のメールアドレスを入力しなければならない．

この広告がまたたくさん出てきて目立ち，ちょっと勘弁してほしい，という感じでした．なんか他のサイトへのリンクみたいなんですが，リンク先の内容も気に食わないものがいくつかありまして，嫌になってしまいました．実際上の問題としては，メールアドレスを強制する，というのも大きなマイナスです．

## Isso

他にもコメントシステムは [たくさんある](https://www.digitalcube.jp/shifter/4675/) のだと思いますが，とりあえず目に付いた [Isso](https://posativ.org/isso/) というのを導入してみました．Python で書かれているので親近感があったのと，日本語で「導入したよ」という記事をいくつか ([その1](https://qiita.com/cellolism/items/5e79e67927df6d7cb657)，[その2](http://kikei.github.io/blog/2018/11/29/isso-comment.html)) 見たので．これは Disqus と違って，コメントサーバを自分で運用する必要があります．したがって，レンタルサーバなどを使える，という前提が必要です．だったら，blog もそっちでやったら，と言われそうですが，経緯が...．

## しくみ

blog のページの方には，つぎのような記述を置いておきます

```html
<script src="https://(issoサーバ)/js/embed.min.js"
     data-isso="https://(issoサーバ)/">           <!-- 多数のオプションがあるが，デフォルトで運用している -->
</script>
<section id="isso-thread" data-isso-id="(このページを特定するID)" data-title="(このページのタイトル)">
</section>
```

すると，下のような感じの画面になって，コメントが入力できます．もちろん日本語も入れられます．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398368/3f999309-a807-28fc-3c7a-f06988048cfe.png" width="90%">

Submit ボタンが押されますと，Isso サーバにデータが飛んでいく，というわけです．したがって，自分のレンタルサーバなどで，issoサーバを動かし，HTTPリクエストを受け取る必要があるわけです．issoサーバは，Isso が提供するスクリプトをそのまま実行することでも動かせ (るはずですし)，Apache で mod_wsgi を使って動かすこともできます (し，その他にもいろいろ方法があります．公式ドキュメントを参照してください)．私は (すでに他のアプリケーションを運用していることもあって) Apache + mod_wsgi にしました．

## 前提

私の場合の前提，ということで，これらが必要，というわけではありません．

* さくらの VPS 
* Ubuntu
* Apache + mod_wsgi 運用中
* SQLite 導入済み

## インストール

```
$ virtualenv /opt/isso
$ source /opt/isso/bin/activate
(isso)$ pip install isso
```

私は導入済みでしたが，SQLite など，他に必要なソフトウェアがあります．[公式ドキュメント](https://posativ.org/isso/docs/install/) に書いてあります．

## 設定ファイル作成

公式ドキュメント通り．私の例は以下の通りです:

```
[general]
dbpath = /opt/isso/db/comments.db
host = (blog の URL)
log-file = /var/log/isso/isso.log

# コメントが投稿されるとメールで教えてくれる
notify = smtp

[smtp]
username = (アカウント)
password = (パスワード)
host = (ホスト)
port = 587
security = starttls
to = (コメント投稿通知を受け取るアドレス)
from = (コメント投稿通知の from アドレス)
timeout = 10

# 有効にしておくと，https://(issoサーバ)/admin で，コメントの管理 (削除など) ができる
[admin]
enabled = true
password = (パスワード)

# 有効にした場合，承認しないとコメントが表示されない．
[moderation]
enabled = false

[hash]
salt = (ランダムな文字列)
```

## isso サーバのテスト

ここで，Isso が提供する issoサーバを使ってテストができるはずなのですが，何故か動作しませんでした．ファイアウォールの設定か，とも思ったのですが，ちゃんとしているように見えるんだけどなあ．テストはあきらめて先に進むことに．

## Apache の設定

WSGI アプリケーションを置いておくディレクトリ `/var/www/wsgi` をつくってありますので，そこに，isso というサブディレクトリをつくり，そこに isso.wsgi というファイルを作りました．内容は次の通り:

```python
import site
site.addsitedir('/opt/isso/lib/python3.x/site-packages')

import os

from isso import make_app
from isso import dist, config

application = make_app(
    config.load(
        os.path.join(dist.location, dist.project_name, "defaults.ini"),
        '/opt/isso/isso.cfg'
    )
)

```

これは，[公式ドキュメント](https://posativ.org/isso/docs/extras/deployment/) の2番目の例ほぼそのままですが，multiprocessing パラメタでエラーが出たので削除し，addsitedir の引数を具体的にどうするかわからなかったので，上の「その2」であげた放置演算子さんの記事を参考にしました．ありがとうございます．

次に，`/etc/apahce2/sites-enabled/001-default-ssl.conf` ファイルに，WSGIScriptAlias の最後の行を追加しました．追加した結果は以下の通り．この辺は，ファイル名とかいろいろ，apache や OS のバージョンなどによって違うのかもしれません．公式ドキュメントの例を見ると，別のファイルに書くべきなのか，と思ったりしますが，その辺は全然分かりませんので，あくまでご参考...．まあ一応，これで動いています．

```
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html_secure

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      (パス名)
                SSLCertificateKeyFile   (パス名)
                SSLCertificateChainFile (パス名)

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

                WSGIScriptAlias /wsgi_sample /var/www/wsgi/sample/wsgi_sample_app.wsgi
                WSGIScriptAlias /appl1 /var/www/wsgi/appl1/appl1.wsgi
                WSGIScriptAlias /appl2 /var/www/wsgi/appl2/appl2.wsgi
                WSGIScriptAlias /isso /var/www/wsgi/isso/isso.wsgi

                <Directory /var/www/wsgi>
                        Require all granted
                </Directory>
        </VirtualHost>
</IfModule>
```

設定したら，apache を再起動して，導入作業は終了です．