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)

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

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

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

 1$ su -
 2# groupadd isso -g isso -m
 3# useradd isso -g isso -m
 4# usermod -aG isso
 5# passwd isso
 6
 7# chmod 0755 /home/isso
 8# su - isso
 9
10$ mkdir web
11$ cd web
12$ mkdir -m 0777 data
13$ chmod 0777 data
14$ mkdir -m 0666 logs
15
16$ git clone https://github.com/posativ/isso.git

isso サーバーのビルド

 1$ su - isso
 2$ cd ~/web/isso
 3
 4$ pip3 install --user virtualenv
 5$ ~/.local/bin/virtualenv .
 6$ . ./bin/activate
 7(isso) $ python3 setup.py develop
 8
 9/home/isso/web/isso/lib/python3.5/site-packages/setuptools/dist.py:474: UserWarning: Normalizing '0.12.3dev0' to '0.12.3.dev0'
10  normalized_version,
11running install
12※ 中略 ※
13Finished processing dependencies for isso==0.12.3.dev0
14
15(isso) $ npm install -g bower requirejs uglify-js jade
16
17(node:4927) [DEP0022] DeprecationWarning: os.tmpDir() is deprecated. Use os.tmpdir() instead.
18※ 中略 ※
19bower@1.8.8 node_modules/bower
20
21(isso) $ deactivate
22
23$ vim ~/.bashrc
1# PATHの追加
2export PATH=$PATH:/home/isso/web/isso/node_modules/bower/bin:/home/isso/web/isso/node_modules/requirejs/bin
 1$ . ~/.bashrc
 2$ . ./bin/activate
 3(isso) $ make init
 4
 5(cd isso/js; bower --allow-root install almond requirejs requirejs-text jade)
 6※ 中略 ※
 7jade#1.11.0 components/jade
 8
 9(isso) $ make js
10
11r.js -o isso/js/build.embed.js out=isso/js/embed.min.js
12※ 中略 ※
13/home/isso/web/isso/isso/js/count.js
14
15(isso) $ python3 setup.py install
16※ 以下略 ※

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

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

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

1$ vim /home/isso/web/isso/share/isso.conf
 1# 変更箇所のみ抜粋
 2# パスワードなどの文字列は*****に置き換えています
 3
 4[general]
 5dbpath = /home/isso/web/data/comments.db
 6host = https://nogu.net/
 7max-age = 15m
 8notify = smtp
 9reply-notifications=false
10log-file = /home/isso/web/logs/isso.log
11
12[admin]
13enabled = true
14password = ******************************
15
16[moderation]
17enabled = true
18
19[smtp]
20username = isso@*****.com   <-- SMTP USER NAME
21password = ***************  <-- SMTP PASSWORD
22host = smtp.*****.com       <-- SMTP SERVER
23port = 587
24security = starttls
25to = *****@*****.com
26from = isso@*****.com
27
28[guard]
29enabled = true
30ratelimit = 2
31direct-reply = 20
32reply-to-self = false
33require-author = true
34require-email = false
35
36[markup]
37options = strikethrough, autolink, fenced_code, no_intra_emphasis
38
39[hash]
40salt = **************************
41algorithm = pbkdf2

起動確認

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

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

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

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

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

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

1$ sudo vim /etc/init.d/isso
 1#!/bin/sh
 2### BEGIN INIT INFO
 3# Provides:          isso
 4# Required-Start:    $local_fs $network
 5# Required-Stop:     $local_fs $network
 6# Default-Start:     2 3 4 5
 7# Default-Stop:      0 1 6
 8# Description:       lightweight Disqus alternative
 9### END INIT INFO
10
11EXEC=/usr/bin/uwsgi
12EXEC_OPTS="--ini /var/www/isso/uwsgi.ini"
13
14RUNAS=isso
15PIDFILE=/var/run/isso.pid
16
17start() {
18  echo 'Starting service…' >&2
19  start-stop-daemon --start --user "$RUNAS" --background --make-pidfile --pidfile $PIDFILE \
20                    --exec $EXEC -- $EXEC_OPTS
21}
22
23stop() {
24  echo 'Stopping service…' >&2
25  start-stop-daemon --stop --user "$RUNAS" --pidfile $PIDFILE --exec $EXEC
26}
27
28case "$1" in
29  start)
30    start
31    ;;
32  stop)
33    stop
34    ;;
35  restart)
36    stop
37    start
38    ;;
39  *)
40    echo "Usage: $0 {start|stop|restart}"
41esac
1$ sudo chmod +x /etc/init.d/isso
2$ sudo chkconfig -add isso
3isso                      0:off  1:off  2:on   3:on   4:on   5:on   6:off
4
5$ sudo /etc/init.d/isso stop
6Stopping service…
7
8sudo /etc/init.d/isso start
9Starting service…

nginx の設定

以下は私の設定例です。

1$ sudo vim /etc/nginx/sites-available/isso
 1server {
 2        listen 80;
 3        server_name isso.nogu.net;
 4        return 301 https://$host$request_uri;
 5}
 6server {
 7        listen 443 ssl http2;
 8        server_name isso.nogu.net;
 9        server_tokens off;
10        gzip on;
11        gzip_types text/css text/javascript application/javascript application/json;
12
13        include ssl/include.conf;
14
15        root /dev/null;
16
17        location = /favicon.ico {
18                return 204;
19        }
20
21        location = /robots.txt {
22                default_type text/plain;
23                return 200 'User-agent: *\nDisallow: /\n';
24        }
25
26        location = /admin {
27                # 管理用URLは特定のIPアドレスからのみ許可
28                allow '***.***.***.***';
29                deny all;
30                include uwsgi_params;
31                uwsgi_pass 127.0.0.1:3031;
32                uwsgi_param Host $host;
33                uwsgi_param X-Real-IP $remote_addr;
34                uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
35                uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto;
36        }
37
38        location / {
39                include uwsgi_params;
40                uwsgi_pass 127.0.0.1:3031; # use uwsgi socket from config file
41                uwsgi_param Host $host;
42                uwsgi_param X-Real-IP $remote_addr;
43                uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
44                uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto;
45        }
46
47        location ~* ^/js/(count|embed).min.js$ {
48                # 下記のパスは isso のバージョンによって変わるので注意
49                alias /home/isso/web/isso/lib/python3.5/site-packages/isso-0.12.3.dev0-py3.5.egg/isso/js/;
50                # issoサーバーに障害が発生した際、コメント入力欄を表示しないよう時間を短くした
51                expires 1h;
52        }
53}

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

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

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

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