Raspberry Piでコメントサーバーのissoを動かす

isso - a commenting server similar to Disqus は、静的なサイトに後付けできるコメントシステムです。シンプルな作りで管理や書き込みに外部のアカウントを必要とせず、余計な広告やトラッキングを行わないところが気にいりました。
ここでは、Raspberry Pi でコメントサーバーの isso を動かすまでの流れを記載します。

環境

Raspbian GNU/Linux 9.9 (stretch)
Python 3.5.3-1+deb9u1
Nginx 1.10.3-1+deb9u2
isso (Latest commit 78997f4 Apr 16, 2019)

必要なコンポーネントのインストール

$ sudo apt install python3-pip uwsgi-plugin-python3 nodejs npm sqlite gcc

isso 用ユーザーの作成と isso プログラムの配置

$ su -
# groupadd isso -g isso -m
# useradd isso -g isso -m
# usermod -aG isso
# passwd isso

# chmod 0755 /home/isso
# su - isso

$ mkdir web
$ cd web
$ mkdir -m 0777 data
$ chmod 0777 data
$ mkdir -m 0666 logs

$ git clone https://github.com/posativ/isso.git

isso サーバーのビルド

$ su - isso
$ cd ~/web/isso

$ pip3 install --user virtualenv
$ ~/.local/bin/virtualenv .
$ . ./bin/activate
(isso) $ python3 setup.py develop

/home/isso/web/isso/lib/python3.5/site-packages/setuptools/dist.py:474: UserWarning: Normalizing '0.12.3dev0' to '0.12.3.dev0'
  normalized_version,
running install
※ 中略 ※
Finished processing dependencies for isso==0.12.3.dev0

(isso) $ npm install -g bower requirejs uglify-js jade

(node:4927) [DEP0022] DeprecationWarning: os.tmpDir() is deprecated. Use os.tmpdir() instead.
※ 中略 ※
bower@1.8.8 node_modules/bower

(isso) $ deactivate

$ vim ~/.bashrc
# PATHの追加
export PATH=$PATH:/home/isso/web/isso/node_modules/bower/bin:/home/isso/web/isso/node_modules/requirejs/bin
$ . ~/.bashrc
$ . ./bin/activate
(isso) $ make init

(cd isso/js; bower --allow-root install almond requirejs requirejs-text jade)
※ 中略 ※
jade#1.11.0 components/jade

(isso) $ make js

r.js -o isso/js/build.embed.js out=isso/js/embed.min.js
※ 中略 ※
/home/isso/web/isso/isso/js/count.js

(isso) $ python3 setup.py install
※ 以下略 ※

isso サーバーの設定と起動確認

各項目の詳細は Server Configuration を参照。
以下は私の設定例です。

設定ファイル(isso.conf)の編集

$ vim /home/isso/web/isso/share/isso.conf
# 変更箇所のみ抜粋
# パスワードなどの文字列は*****に置き換えています

[general]
dbpath = /home/isso/web/data/comments.db
host = https://nogu.net/
max-age = 15m
notify = smtp
reply-notifications=false
log-file = /home/isso/web/logs/isso.log

[admin]
enabled = true
password = ******************************

[moderation]
enabled = true

[smtp]
username = isso@*****.com   <-- SMTP USER NAME
password = ***************  <-- SMTP PASSWORD
host = smtp.*****.com       <-- SMTP SERVER
port = 587
security = starttls
to = *****@*****.com
from = isso@*****.com

[guard]
enabled = true
ratelimit = 2
direct-reply = 20
reply-to-self = false
require-author = true
require-email = false

[markup]
options = strikethrough, autolink, fenced_code, no_intra_emphasis

[hash]
salt = **************************
algorithm = pbkdf2

起動確認

$ . ./bin/activate
(isso) $ isso run

ここでエラーが出なければ、 http://localhost:8080/admin に接続を試して、ログが流れれば起動確認OK。
エラーがでたら、一度サーバーを再起動してから上記のisso サーバーのビルドの項目を行うとうまくいくかもしれません。
起動確認後の isso サーバーは、CTRL+Cで終了する。

uWSGI の設定ファイル(uwsgi.ini)の編集

$ mkdir /var/www/isso
$ vim /var/www/isso/uwsgi.ini
[uwsgi]
plugins = python3
strict = true
socket = 127.0.0.1:3031
master = true
processes = 1
threads = 2
cache2 = name=hash,items=1024,blocksize=32
spooler = /home/isso/web/data/spool
module = isso.run
chdir = /home/isso/web/isso
virtualenv = /home/isso/web/isso
env = ISSO_SETTINGS=/var/www/isso/uwsgi.ini

isso サーバーの自動起動設定

自動起動用のスクリプトを作成します。

$ sudo vim /etc/init.d/isso
#!/bin/sh
### BEGIN INIT INFO
# Provides:          isso
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Description:       lightweight Disqus alternative
### END INIT INFO

EXEC=/usr/bin/uwsgi
EXEC_OPTS="--ini /var/www/isso/uwsgi.ini"

RUNAS=isso
PIDFILE=/var/run/isso.pid

start() {
  echo 'Starting service…' >&2
  start-stop-daemon --start --user "$RUNAS" --background --make-pidfile --pidfile $PIDFILE \
                    --exec $EXEC -- $EXEC_OPTS
}

stop() {
  echo 'Stopping service…' >&2
  start-stop-daemon --stop --user "$RUNAS" --pidfile $PIDFILE --exec $EXEC
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
esac
$ sudo chmod +x /etc/init.d/isso
$ sudo chkconfig -add isso
isso                      0:off  1:off  2:on   3:on   4:on   5:on   6:off

$ sudo /etc/init.d/isso stop
Stopping service…

sudo /etc/init.d/isso start
Starting service…

nginx の設定

以下は私の設定例です。

$ sudo vim /etc/nginx/sites-available/isso
server {
        listen 80;
        server_name isso.nogu.net;
        return 301 https://$host$request_uri;
}
server {
        listen 443 ssl http2;
        server_name isso.nogu.net;
        server_tokens off;
        gzip on;
        gzip_types text/css text/javascript application/javascript application/json;

        include ssl/include.conf;

        root /dev/null;

        location = /favicon.ico {
                return 204;
        }

        location = /robots.txt {
                default_type text/plain;
                return 200 'User-agent: *\nDisallow: /\n';
        }

        location = /admin {
                # 管理用URLは特定のIPアドレスからのみ許可
                allow '***.***.***.***';
                deny all;
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:3031;
                uwsgi_param Host $host;
                uwsgi_param X-Real-IP $remote_addr;
                uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
                uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto;
        }

        location / {
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:3031; # use uwsgi socket from config file
                uwsgi_param Host $host;
                uwsgi_param X-Real-IP $remote_addr;
                uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
                uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto;
        }

        location ~* ^/js/(count|embed).min.js$ {
                # 下記のパスは isso のバージョンによって変わるので注意
                alias /home/isso/web/isso/lib/python3.5/site-packages/isso-0.12.3.dev0-py3.5.egg/isso/js/;
                # issoサーバーに障害が発生した際、コメント入力欄を表示しないよう時間を短くした
                expires 1h;
        }
}

コメント機能を呼び出すHTML

各項目の詳細は Client Configuration を参照。
以下は私の設定例です。この例では静的サイトジェネレーターの hugo を使用しています。

    <section id="isso-thread" data-isso-id="{{ .RelPermalink | absLangURL }}" data-title="{{ .Title }}"></section>
    <script data-isso="https://isso.nogu.net/" 
        data-isso-css="true" 
        data-isso-lang="en"
        data-isso-reply-to-self="false"
        data-isso-require-author="true"
        data-isso-require-email="false"
        data-isso-avatar="true"
        data-isso-avatar-bg="#f0f0f0"
        data-isso-avatar-fg="#9163b6 #9abf88 #5698c4 #e279a3 ..."
        data-isso-max-comments-top="20"
        data-isso-max-comments-nested="5"
        data-isso-reveal-on-click="5"
        data-isso-vote="true"
        src="https://isso.nogu.net/js/embed.min.js"></script>

あとは実際の動作を確認すればOKです。
お疲れ様でした。