KUSONEKOの見る世界

Tiny Tiny RSS を Docker版に移行した

日常的に使用しているRSSリーダーであるTiny Tiny RSSですが、久々に公式ページを覗いてみると様子が違いました。

調べてみると、以下のような状況でした。

  • 物理サーバ(非Docker)で最新にすると、そのままでは使えなくなる
  • 今後はDocker版でしかサポートしなくなる

最新にせずにこのまま使い続けるという選択肢もあるかもしれませんが、何らかの要因で使えなくなるかもしれません。(サーバ故障、ミドルウェアの更新、ディストリビューションの変更等)
今後の事を考え、物理サーバ上からDockerへ移行することにしました。

ただし、データベースが物理サーバ上のMySQLから、Docker上のPostgreSQLになるため、簡単にはデータ移行ができなさそうです。
なので、OPMLのバックアップ・リストアで移行を行います。
この方法では、フィードのURL、カテゴリ、フィルタなどは引き継げますが、既読、お気に入りの記事、保管された記事などは失われますが諦めます。

また、Tiny Tiny RSS のアクセスURLが変わらないよう、物理サーバ上のNginxでリバースプロキシを使用しました。

iPhoneで使用するため、feverプラグインも導入します。

■物理サーバ環境
CPU:Intel Celeron N3150
メモリ:8GB
CentOS 8.4.2105
Nginx 1.14.1

Docker 準備

Docker環境の準備をします。既に準備が終わっている場合は不要です。

Docker インストール

# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
repo の追加: https://download.docker.com/linux/centos/docker-ce.repo
# dnf install docker-ce docker-ce-cli containerd.io
========================================================================================================================
 パッケージ                     Arch        バージョン                                      リポジトリー          サイズ
========================================================================================================================
インストール:
 containerd.io                  x86_64      1.4.9-3.1.el8                                   docker-ce-stable       30 M
 docker-ce                      x86_64      3:20.10.7-3.el8                                 docker-ce-stable       27 M
 docker-ce-cli                  x86_64      1:20.10.7-3.el8                                 docker-ce-stable       33 M
依存関係のインストール:
 container-selinux              noarch      2:2.162.0-1.module_el8.4.0+830+8027e1c4         appstream              52 k
 docker-ce-rootless-extras      x86_64      20.10.7-3.el8                                   docker-ce-stable      9.2 M
 docker-scan-plugin             x86_64      0.8.0-3.el8                                     docker-ce-stable      4.2 M
 fuse-common                    x86_64      3.2.1-12.el8                                    baseos                 21 k
 fuse-overlayfs                 x86_64      1.4.0-3.module_el8.4.0+830+8027e1c4             appstream              72 k
 fuse3                          x86_64      3.2.1-12.el8                                    baseos                 50 k
 fuse3-libs                     x86_64      3.2.1-12.el8                                    baseos                 94 k
 libcgroup                      x86_64      0.41-19.el8                                     baseos                 70 k
 libslirp                       x86_64      4.3.1-1.module_el8.4.0+575+63b40ad7             appstream              69 k
 slirp4netns                    x86_64      1.1.8-1.module_el8.4.0+641+6116a774             appstream              51 k
モジュールストリームの有効化中:
 container-tools                            rhel8                                                                      

トランザクションの概要
========================================================================================================================
インストール  13 パッケージ
# systemctl start docker
# systemctl enable docker

Docker Compose インストール

# curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(unname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

バックアップ

OPMLのエクスポート

旧Tiny Tiny RSS のWebから[設定]に入り、[フィード]→[OPML]から、OPMLのエクスポートをクリックします。
ダウンロードしたファイルをDocker版でインポートします。

OPMLのエクスポート

カスタマイズのCSS、フィルター、ラベルなども移行できました。

Docker版のセットアップ

Tiny Tiny RSS インストール

# git clone https://git.tt-rss.org/fox/ttrss-docker-compose.git ttrss-docker && cd ttrss-docker
# cp .env-dist .env

普段アクセスするURLに変更。

# vi .env

TTRSS_SELF_URL_PATH=http://localhost:8280/tt-rss
↓
TTRSS_SELF_URL_PATH=https://FQDN or IPアドレス/tt-rss
# docker-compose up --build -d

ホスト側Nginx設定

https://FQDN or IPアドレス/tt-rss で、Docker上のtt-rssにアクセスできるように、ホスト上のNginxの設定を変更します。

# vi /etc/nginx/nginx.conf
以下を必要な個所に追加。

    location ^~ /tt-rss/ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;

            proxy_pass http://127.0.0.1:8280/tt-rss/;
            break;
    }
# systemctl restart nginx

初回ログイン

Webブラウザで、今まで通りのURL(https://FQDN or IPアドレス/tt-rss)でアクセスする。

デフォルトのユーザ名とパスワードは、admin/password 。

ユーザを作成する場合は、この時点で作成してログインしておく。
不正アクセスされないよう、adminのパスワードをリセットしておく。

fever プラグイン インストール

Docker Volumeの場所を確認。

docker volume inspect ttrss-docker_app | grep Mountpoint
        "Mountpoint": "/var/lib/docker/volumes/ttrss-docker_app/_data",

ディレクトリの所有者を確認しておく。(私の場合なぜか一般ユーザになっていました)

# ls -l /var/lib/docker/volumes/ttrss-docker_app/_data/tt-rss/

ディレクトリの所有者にsuしてから、gitをする。(git後にchownでも良いと思います)

# su ディレクトリの所有者
$ cd /var/lib/docker/volumes/ttrss-docker_app/_data/tt-rss/plugins.local
$ git clone https://github.com/DigitalDJ/tinytinyrss-fever-plugin fever

fever プラグイン 有効化

Webから[設定]に入り、[プラグイン]で、feverにチェックを入れ、[Enable selected]をクリック。(私は最初から有効化されていました)

Webから[設定]に入り、[Fever Emulation]のテキストボックスにfeverプラグイン用のパスワードを入れ、[Set Password]ボタンをクリック。

リストア

OPMLのインポート

Webから[設定]に入り、[フィード]→[OPML]で、[ファイルを選択...]をクリックし、バックアップしたOPML選択、[OPML インポート]をクリックします。

しばらくすると、新着フィードが出てくるはずです。

旧Tiny Tiny RSS のフィードのアップデートを止める

# systemctl stop ttrss.service
# systemctl disable ttrss.service

systemdではなく、crontabを使っていた場合は、そちらを削除。

iPhone, iPadのReeder設定

Reederがうまく動かない場合は、一旦アカウント設定を削除して再設定をします。
設定方法は以前の記事をご参照ください。

【初めてのiPhone】Tiny Tiny RSSを使いやすくする

iPhone (iOS) でTiny Tiny RSSを便利に使用する方法を記載しました。

最後に

初めてのDockerでしたが、何とか移行することができました。

不思議なのですが、Tiny Tiny RSSのWebの動作が体感で速くなった気がします。
ただ、Reederの画像同期となるとディスクアクセスが発生するためか、遅くなったように感じます。
通常のWebアクセスでの使用では全く問題ありませんので、移行をしておいた方が良いと思います。

あとDockerコンテナは、リソース使用量が少なく、思っていたより動作が軽いので驚きました。

# docker container stats

CONTAINER ID   NAME                       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O        PIDS
61a9ec2ad89f   ttrss-docker_updater_1     0.01%     13.38MiB / 7.436GiB   0.18%     1.61GB / 918MB   28.7kB / 528MB   2
b38cc0c42bb9   ttrss-docker_web-nginx_1   0.00%     7.457MiB / 7.436GiB   0.10%     79MB / 102MB     4.1kB / 28.7kB   134
d2d7413066d4   ttrss-docker_backups_1     0.00%     468KiB / 7.436GiB     0.01%     271kB / 0B       0B / 0B          2
ea746ff82ed4   ttrss-docker_app_1         0.01%     30MiB / 7.436GiB      0.39%     120MB / 146MB    12.3kB / 41kB    5
32559d0a90b9   ttrss-docker_db_1          0.35%     41.27MiB / 7.436GiB   0.54%     947MB / 1.3GB    0B / 9.45GB      7

これからDockerで色々な事が出来そうです。

追記

Declaration of FeverAPI::before($method) must be compatible with Handler::before(string $method): bool

Tiny Tiny RSSを更新したら、Event Logに上記のログが出て、feverがsyncしなくなりました。
以下の対処をしました。

# cd /var/lib/docker/volumes/ttrss-docker_app/_data/tt-rss/plugins.local/fever
# git pull

記事が更新されなくなったとき

updaterが止まって、記事が更新されなくなる事がありました。
一旦、停止から起動することで直りました。

# docker container stats
CONTAINER ID   NAME                       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O        PIDS
74998a1b6747   ttrss-docker_web-nginx_1   0.00%     11.34MiB / 7.432GiB   0.15%     16.5MB / 21.3MB   4.36MB / 0B      133
826792436bc6   ttrss-docker_app_1         0.00%     38.08MiB / 7.432GiB   0.50%     26.1MB / 30.7MB   73.5MB / 0B      5
de42b4d33a23   ttrss-docker_db_1          0.01%     59.13MiB / 7.432GiB   0.78%     16.3MB / 23.4MB   149MB / 38.8MB   7

# docker-compose down                                                                        
Stopping ttrss-docker_web-nginx_1 ... done                                                                              
Stopping ttrss-docker_app_1       ... done                                                                              
Stopping ttrss-docker_db_1        ... done                                                                              
Removing ttrss-docker_web-nginx_1 ... done                                                                              
Removing ttrss-docker_updater_1   ... done                                                                              
Removing ttrss-docker_backups_1   ... done                                                                              
Removing ttrss-docker_app_1       ... done                                                                              
Removing ttrss-docker_db_1        ... done                                                                              
Removing network ttrss-docker_default                                                                                   

# docker-compose up --build -d    
(snip)
Creating ttrss-docker_db_1 ... done                                                                                     
Creating ttrss-docker_backups_1   ... done                                                                              
Creating ttrss-docker_app_1     ... done                                                                                
Creating ttrss-docker_web-nginx_1 ... done                                                                              
Creating ttrss-docker_updater_1   ... done                                                                              

# docker container stats
CONTAINER ID   NAME                       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O        PIDS
e89881273c59   ttrss-docker_web-nginx_1   0.00%     9.039MiB / 7.432GiB   0.12%     656B / 0B         2.18MB / 16.4kB   133
51457877c072   ttrss-docker_updater_1     0.00%     452KiB / 7.432GiB     0.01%     656B / 0B         4.1kB / 0B        2
8c5176d11ab1   ttrss-docker_backups_1     0.00%     460KiB / 7.432GiB     0.01%     740B / 0B         45.1kB / 0B       2
48ae3515f818   ttrss-docker_app_1         0.00%     20.51MiB / 7.432GiB   0.27%     1.19MB / 24.7kB   92.3MB / 1.31MB   4
28708b5fce20   ttrss-docker_db_1          0.00%     17.53MiB / 7.432GiB   0.23%     5.5kB / 4.03kB    7.67MB / 156kB    7

記事が更新されなくなったとき(iptables/nftables関連)

各コンテナが動いていても、記事が更新されなくなる事がありました。
サーバが起動する際に、nftablesよりもdockerのサービスが先に起動してしまったようで、Dockerからインターネットに通信が出来ていなかったようです。
Dockerを再起動することで直りました。

# docker-compose down
# docker-compose up --build -d
Creating network "ttrss-docker_default" with the default driver
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule:  (iptables failed: iptables --wait -t nat -I DOCKER -i br-e598b68bdf51 -j RETURN: iptables: No chain/target/match by that name.
 (exit status 1))
# systemctl restart docker
# docker-compose up --build -d