Ubuntu Weekly Recipe

第772回サーバー上で動くRSSリーダーであるFreshRSS

前回はUbuntuデスクトップで動くRSSリーダーであるNewsFlashを紹介しました。今回はサーバー上で動作し、任意のウェブブラウザーで閲覧可能なRSSリーダーであるFreshRSSについて紹介しましょう。

図1 Web UIながら、テーマが豊富でコンパクトにまとめて表示できるFreshRSS
図1

拡張機能も備えたFreshRSS

RSSリーダー(フィードアグリゲーター)については前回も紹介しましたが、簡単に説明すると「RSSに対応したサイトの更新通知を受け取り、その内容を閲覧できる仕組み」です。スマートフォンで言うところの「ニュースアプリ」に近いものだと思っておけば良いでしょう。

ニュースアプリはローカルで動かしてインターネット越しにデータを集めます。それに対してFreshRSSや第266回で紹介したTiny Tiny RSSなどは、サーバー側でRSSのフィードデータを定期的に収集し、ウェブブラウザーを含む任意のクライアントで閲覧できるようになっているため、PCやスマートフォンで同じようなデータを閲覧可能です。

FreshRSSは次のような機能を備えています。

  • Raspberry Pi 1でも十分に動作するぐらい軽量
  • マルチユーザーに対応
  • ユーザー認証方式として通常のログインだけでなくBasic認証やOpen ID Connectなどにも対応
  • XPathを利用したウェブスクレイピング機能も持っているためRSS非対応のサイトも情報収集可能
  • WebSubにも対応しているため、Mastodonなどのデータも取得できる
  • フィード取得時のオプションも充実
  • フィードごとの統計情報の取得
  • 拡張機能も搭載している
  • UIの日本語対応
  • Web UIでほぼすべての設定が可能
  • PHPで作られているため任意のウェブサーバーを利用可能
  • データベースもSQLiteを含めて好みのものを選択できる

「フィード取得時のオプション」としては、たとえばBasic認証のユーザー名とパスワードやCookie、User-Agent、プロキシなどが含まれます。

とりあえず試すだけならデモサイトにアクセスしてみるのもひとつの手です。右上の「Login」ボタンを押すと、自動的にユーザー名とパスワードを埋めてくれます。あとはフィードの追加や閲覧、設定の変更が自由自在にできます。

FreshRSSのインストール

さっそくFreshRSSをインストールしてみましょう。インストール方法はDockerと手動インストールの2種類が存在します。基本的にはDockerで問題ないでしょう。簡単にDocker環境を構築したいだけなら、Ubuntuの公式リポジトリから次のパッケージをインストールすれば十分です。

$ sudo apt install docker.io docker-compose git

Docker Compose用のファイルはFreshRSSのリポジトリにあります。複数のファイルにわかれていますが、README.mdに丁寧な解説があるためそちらも参照してください。ここではこれを流用することにします。

$ git clone https://github.com/FreshRSS/FreshRSS.git
$ cd FreshRSS/Docker/freshrss/
$ ls -1
docker-compose-db.yml
docker-compose-development.yml
docker-compose-local.yml
docker-compose-proxy.yml
docker-compose.yml
example.env
traefik

前述した通り、複数のファイルにわかれています。簡単に意味合いを説明しておきましょう。

  • docker-compose.yml:FreshRSSの本体となるファイル
  • docker-compose-db.yml:SQLiteではなくPostgreSQLで動かしたい時のファイル
  • docker-compose-development.yml:開発版を使いたい時のファイル
  • docker-compose-local.yml:ローカル用に8080ポートを開くファイル
  • docker-compose-proxy.ymlTraefikを使ってリバースプロキシーを設定
  • example.env:設定ファイルの雛形

たとえばSQLiteをデータベースとし、ローカルからアクセスしたいのであればdocker-compose.ymlに加えてdocker-compose-local.ymlを使いますし、データベースをPostgreSQLにしたいのであればdocker-compose-db.ymlも利用します。

設定ファイルはいずれかのComposeファイルで必要になる基本的な設定をまとめています。実際はこれを.envにコピーして利用しましょう。

$ cp example.env .env

最初から入っている設定は次のとおりです。

# 管理者用メールアドレス
[email protected]

# 公開用ポートアドレス
PUBLISHED_PORT=8080

# 管理者用のパスワード
ADMIN_PASSWORD=freshrss
ADMIN_API_PASSWORD=freshrss

# FreshRSSにアクセスするためのURL
BASE_URL=https://freshrss.example.net

# データベースのホスト名(インスタンス名)
DB_HOST=freshrss-db

# データベースの名前とユーザー名とパスワード
DB_BASE=freshrss
DB_USER=freshrss
DB_PASSWORD=freshrss

とりあえず変えておいたほうが良いのが、メールアドレスとURLの2点です。URLはローカルで試しに使うだけならhttp://サーバーのIPアドレスでも良いでしょう。

準備ができたら次の手順でComposeファイルからインスタンスを立ち上げていきます。ここではSQLiteを使っています。

$ sudo docker-compose pull
$ sudo docker-compose -f docker-compose.yml -f docker-compose-local.yml up -d --remove-orphans
$ sudo docker-compose ps
  Name                Command               State                  Ports
----------------------------------------------------------------------------------------
freshrss   ./Docker/entrypoint.sh /bi ...   Up      0.0.0.0:8080->80/tcp,:::8080->80/tcp

無事に起動しました。この時点でFreshRSSのサーバー(たとえばhttp://IPアドレス:8080/⁠)にアクセスすると、管理者アカウントの作成が求められます。デプロイ後はできるだけはやめにアクセスしましょう。

アカウントの作成と基本的な使い方

無事にFreshRSSにアクセスできたら、あとはウェブブラウザーで設定が可能です。

図2 言語の選択。ただし日本語を表示してもタイムゾーンはヨーロッパのままになってしまう。あとで再設定が必要
図2
図3 必要なライブラリ等の確認。Dockerなら基本的にすべてOKになるはず
図3
図4 データベースの選択。どのComposeファイルを使ったかで変わってくる。今回はSQLiteのまま
図4
図5 デフォルトユーザーの設定
図5

デフォルトユーザー=管理者となります。なお、このデフォルトユーザーが設定したRSSフィードは、設定次第によっては「アカウントを持っていないユーザー」がアクセスした時に表示されるRSSフィードにできます。フィードの追加・削除はできないが、閲覧だけなら可能、という仕組みにも使えるのです。

図6 初期設定の完了
図6
図7 初期状態はFreshRSSのリリースアナウンスのみが表示される
図7

初期状態だとFreshRSSのリリースアナウンスのRSSフィードだけが登録してあります。さっそく任意のフィードを登録してみましょう。画面左上にある「購読されたもの管理」ボタンを押します。

図8 どのカテゴリーにRSSフィードを追加するかを選択できる
図8

カテゴリーごとに表示される「RSSフィードに追加する」を押すと、そのカテゴリー向けの登録画面が開きます。ちなみにトップページの「+」ボタンを押しても同じページに直接ジャンプします。

図9 フィードの追加画面
図9

一番上がカテゴリーの追加、真ん中がフィードの追加、最後がOPMLの追加です。ここではフィードを追加してみましょう。

ちなみに次の図のように、⁠フィードソースの種類」「高度な設定」を選択すると、より詳細な設定画面が開きます。特別なアクセスが必要なサイトの場合は役に立つでしょう。

図10 フィードの追加の詳細設定
図10

XPathを使いたい場合は、フィードソースの種類から「HTML + XPath」を選択するとXPathを利用したウェブスクレイピングも可能です。

図11 記事を表示した様子
図11

残念がらFreshRSSにはビューワーの中で記事を閲覧するモードはないようです。全文を読みたいならタイトルか右端のボタンをクリックして元のサイトを開くしかありません。

図12 フィードの左端の歯車アイコンを使うと詳細な設定ができる
図12

画面右上の歯車アイコンからは、個人・システム全体の設定が可能です。

図13 ⁠ディスプレイ」からはタイムゾーンやテーマ、ボタン配置の変更が可能
図13
図14 ⁠リーディング」は記事を表示した際の挙動を調整できる
図14
図15 ⁠アーカイブ」は自動更新間隔や保存データの量などを調整できる
図15
図16 ⁠ショートカット」もそれなりに充実している
図16
図17 ⁠拡張機能」ではおすすめの拡張機能を「確認」できる
図17

このようにFreshRSSは、ほぼWeb UIだけで設定を変更できます。数少ない例外のひとつが「拡張機能」の追加です。

拡張機能の追加

拡張機能では様々なプラグインが紹介されています。設定UIから簡単にインストールできると良いのですが、残念ながら手作業で拡張機能用のディレクトリに配置しないといけないようです。ここでは試しにPocket Buttonを導入してみましょう。これはFirefoxでも採用されている「あとで読む」サービスであるPocketに保存できるボタンを追加する仕組みです。

まずは拡張機能のインストール場所を確認しましょう。Docker Composeで起動した場合は、ボリュームが作られてそこにインストールすることになります。

$ sudo docker volume ls
DRIVER    VOLUME NAME
local     freshrss_data
local     freshrss_extensions
$ sudo docker volume inspect freshrss_extensions
[
    {
        "CreatedAt": "2023-07-24T12:53:32Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "freshrss",
            "com.docker.compose.version": "1.29.2",
            "com.docker.compose.volume": "extensions"
        },
        "Mountpoint": "/var/lib/docker/volumes/freshrss_extensions/_data",
        "Name": "freshrss_extensions",
        "Options": null,
        "Scope": "local"
    }
]
$ sudo ls -la /var/lib/docker/volumes/freshrss_extensions/_data
total 8
drwxr-xr-x 1 root www-data  38 Jul 24 12:53 .
drwx-----x 1 root root      10 Jul 24 12:53 ..
-rw-r--r-- 1 root www-data   6 Mar  4 12:26 .gitignore
-rw-r--r-- 1 root www-data 197 Mar  4 12:26 README.md

つまりこの環境だと/var/lib/docker/volumes/freshrss_extensions/_dataに保存すれば良さそうです。ただrootアカウントのディレクトリなので、管理者権限で処理します。

$ sudo -i
# cd /var/lib/docker/volumes/freshrss_extensions/_data/
# wget https://github.com/christian-putzke/freshrss-pocket-button/archive/refs/tags/v0.3.tar.gz
# tar xf v0.3.tar.gz
# rm v0.3.tar.gz
# exit

あとは拡張機能のページを再読込すると「Pocket Button」が追加されているはずです。有効化するにはPocket側のAPIキーが必要です。

図18 拡張機能が追加された
図18

Pocketの開発者ページから「CREATE AN APPLICATION」を選択した上で、必要な項目を埋めていきます。今回はPocketに追加するだけなので「Add」パーミッションがあれば十分です。

図19 Pocketのアプリケーション作成画面
図19

あとは「CONSUMER KEY」をコピーした上で、FreshRSSの「拡張機能」のページから「Pocket Button」を有効化します。その後に歯車アイコンから設定画面を開き、⁠CONSUMER KEY」を入力しましょう。

図20 拡張機能を有効化しないとコンシューマーキーを入力できないので注意する。真ん中の入力欄はショートカットキー
図20

最後のext.pocketButton.configure.connect_to_pocketボタンを押すと、Pocketの画面が表示されアプリの接続を認可できます。あとは記事一覧ページにPocketボタンが表示され、ワンタッチで登録できるようになりました。

他にもいろいろな拡張機能があります。たとえばCustom CSS/JSなんかは、ちょっとしたUIの気になる部分を少しだけ変更することも可能です。ぜひいろいろ試して自分にとって使いやすいRSSリーダーにカスタマイズしてみてください。

おすすめ記事

記事・ニュース一覧