Kōhei Yamamoto

フィードリーダーをMinifluxのセルフホストに移行した

雑記

これまで、フィードリーダーとして10年以上Feedlyを無料の範疇で使っていた。また、最近はフィードを読むためのクライアントとしてFeedlyではないアプリを使っていて1、Feedlyは事実上フィード管理だけを責務とするバックエンドになっていた。

ところが、数か月前からiOSでそのクライアントアプリを使う際にFeedlyが429を返すようになり、手元に新しいフィードがダウンロードできなくなってしまった。Private Relayを有効化しているわけでもない。ためしにクライアントアプリから再連携すると、今度は401が返ってきてしまう。さらに、macOSからFeedlyにログインしても401になったり、iOSからキャリア回線で接続すると正常に閲覧できるなど、症状もまちまち。数日放置してからFeedlyのiOSアプリを使うとログインできたが、別のクライアント経由だとエラーは解消しなかった。

問い合わせしてもよかったが、そもそも無料ユーザーだし、サービスページを見るとサイバーセキュリティ向けにリブランディングしている感じで、なんかもうお呼びでなさそうである。惰性で10年以上使ってきてはいたが、使い続ける強い理由もない。一方で、フィードを通じて得ている情報の重要度は職業上の都合でそれなりに高いので、突然アクセスしづらくなるのは困る。そうであれば、フィードリーダーのシステム自体を自分の管理下に置くほうがいいだろうと思い、セルフホストすることにした。

セルフホストするフィードリーダーとしては、シンプルさをとってMinifluxを使うことにした。

現在使っているクライアントはMinifluxのAPIをサポートしているので、その点は問題なし。

VPSを借りて、そこでMinifluxをホストする。また、リバースプロキシとして、簡単に証明書発行とHTTPS終端ができるCaddyを使う。サービス群はDocker Composeで立ち上げる。

compose.yml
services:
miniflux:
image: miniflux/miniflux:2.3.3
restart: unless-stopped
expose:
- "8080"
depends_on:
db:
condition: service_healthy
environment:
DATABASE_URL: postgres://miniflux:${POSTGRES_PASSWORD}@db/miniflux?sslmode=disable
RUN_MIGRATIONS: 1
POLLING_SCHEDULER: entry_frequency
POLLING_FREQUENCY: 30
POLLING_LIMIT_PER_HOST: 3
TZ: Asia/Tokyo
db:
image: postgres:18
restart: unless-stopped
environment:
POSTGRES_USER: miniflux
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: miniflux
TZ: Asia/Tokyo
volumes:
- miniflux-db:/var/lib/postgresql
healthcheck:
test: ["CMD", "pg_isready", "-U", "miniflux"]
interval: 10s
start_period: 30s
caddy:
image: caddy:2
restart: unless-stopped
depends_on:
- miniflux
ports:
- "80:80"
- "443:443"
- "443:443/udp"
environment:
TZ: Asia/Tokyo
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy-data:/data
- caddy-config:/config
volumes:
miniflux-db:
caddy-data:
caddy-config:

また、ホストに適当なドメインを当てて、Caddyfileを次のように書く。そのうえでdocker compose upすれば、そのままHTTPS終端できるリバースプロキシが立ち上がる。

{
email kymmt90@gmail.com
}
<ドメイン> {
reverse_proxy miniflux:8080
}

ホストに当てたドメインにアクセスすると、Minifluxの画面が表示される。あとはMinifluxにログインして、あらかじめFeedlyからエクスポートしておいたOPMLファイル2をMinifluxの/importからインポートすれば移行はほぼ終わり。

また、念のためDBのデータをバックアップしておきたいので、バックアップリポジトリの管理にはrestic(厳密にはそのラッパーであるresticprofile)を、ストレージへの転送にはrcloneを使い、DBダンプのスナップショットをGoogle Driveに保存するようにした。それぞれドキュメントは充実している。手順に従って、rcloneをOAuthクライアントとしてGoogle Drive APIが使えるように設定したあと、resticprofileの設定を書けば、定期バックアップが動くようになった。保存期間はとりあえず1か月。バックアップするデータはそこまで大きくなく、Google Driveは無料枠ですらあまり使っていないので、現状これで十分そうである。

これで、クライアントアプリを通じてフィードを読むぶんには、移行前とまったく変わらない体験になった。VPSのコストが年間数千円にはなるが、他にも用途はありそうなので、ひとまずこのままいってみる。

脚注

  1. ReadKitというAppleプラットフォームネイティブのアプリ

  2. UIから見つけにくいがhttps://feedly.com/i/opmlにある