はじめに
これまでRSSサービスとしてInoreaderを使ってきましたが、最近アクセスが不安定で、一部のRSSフィードの内容が正常に表示されないことがありました。そんな折、DockerとTraefik v2でRSSサービスを構築する - 苏洋ブログでDockerとMinifluxを使って自分だけのRSSサービスを構築しているのを見て、ちょうど遊休状態のクラウドサーバー(Oracle Cloud)があったので、実際に試してみることにしました。
関連するツールとサービス:
Miniflux: Frédéric Guillot がGo言語で開発・メンテナンスしている、オープンソースのミニマルなRSSサービスです。ブラウザからのアクセスに対応し、Telegramへのプッシュ通知も可能。Fever APIを介してReeder(macOS)やFeedMe(Android)などのクライアントと購読を同期できます。
RSSHub: DIYGod が開発・メンテナンスするRSSジェネレーター。様々なサイトのコンテンツをRSSフィードに変換できます。Minifluxと組み合わせるとさらに便利です。
RSSHub Radar: 同じく DIYGod が開発・メンテナンスするChrome拡張機能。RSSHubの補完として、現在のページのRSSフィードを検出し、ワンクリックでMinifluxに追加できます。
Telegram Bot: Telegramのボットサービス。Telegram Bot APIを通じてTelegramと連携できます。
中国語独立ブログリスト: timqian がメンテナンスするGitHubリポジトリ。良質な中国語独立ブログのRSSフィードを収集しています。
Kill the Newsletter: メールニュースレターをRSSフィードに変換するサービス。
FeedMe - Android: Android向けRSSアプリ
Reeder - macOS: macOS向けRSSアプリ
準備
- ドメイン(HTTPSアクセス用。サブドメイン可)
- サーバー1台(本記事ではOracle Cloudのx86 VPS、スペック1C1Gを使用)
システム環境
- Ubuntu Server 24.04 LTS (x86_64)
Docker & Docker Compose のインストール
管理を容易にするため、Docker & Docker Compose を使ってMinifluxとRSSHubサービスをデプロイします。
まず、DockerとDocker Composeをインストールする必要があります。
パッケージリストを更新
sudo apt update && sudo apt full-upgrade -y
Dockerのインストール
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
Docker Composeのインストール
sudo apt install docker-compose-plugin -y
インストールの確認
# Docker バージョン確認
docker --version
# - 出力例
Docker version 27.0.0, build e92dd87
# Docker Compose バージョン確認
docker compose --version
# - 出力例
Docker Compose version v2.27.0
現在のユーザーをdockerグループに追加(sudoの入力を省略)
# 現在のユーザーをdockerグループに追加
sudo usermod -aG docker $USER
# Dockerデーモンがバインドするソケットの権限を変更し、dockerグループがアクセスできるようにする
sudo chmod a+rw /var/run/docker.sock
# Dockerサービスの再起動
sudo systemctl restart docker
# 動作確認
docker info
# 権限不足のエラーが表示されなければ成功
Dockerの自動起動を設定
sudo systemctl enable docker
Docker & Docker Composeのインストールが完了したら、Minifluxのインストールに進みます。
Miniflux のインストール
Minifluxをインストールする前に、同じディレクトリに環境変数を格納する.envファイルを作成します。
例:Minifluxのユーザー名、パスワード、データベースのユーザー名、パスワードなど。
# ディレクトリ作成
mkdir -p ~/docker/miniflux
# envファイル作成
vim ~/docker/miniflux/.env
# Esc + :wq でvimを終了し保存
注意: 以下の設定情報はご自身のものに置き換えてください。
# .env
# データベースユーザー名
POSTGRES_USER=erica
# データベースパスワード
POSTGRES_PASSWORD=erica1234
# Miniflux ユーザー名
MINIFLUX_USERNAME=erica
# Miniflux パスワード
MINIFLUX_PASSWORD=rss1234
# Miniflux アクセスURL
MINIFLUX_BASE_URL=https://miniflux.domain.com
.envファイルを作成したら、Minifluxを起動するためのcompose.ymlファイルを作成します。
# 設定ファイル作成
vim ~/docker/miniflux/compose.yml
# compose.yml
services:
miniflux:
image: miniflux/miniflux:latest
container_name: miniflux
restart: always
ports:
- "17025:8080"
depends_on:
- db
environment:
- POLLING_FREQUENCY=15
- DATABASE_URL=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db/$miniflux?sslmode=disable
- BASE_URL=${MINIFLUX_BASE_URL}
- RUN_MIGRATIONS=1
- CREATE_ADMIN=1
- ADMIN_USERNAME=${MINIFLUX_USERNAME}
- ADMIN_PASSWORD=${MINIFLUX_PASSWORD}
healthcheck:
test: ["CMD", "/usr/bin/miniflux", "-healthcheck", "auto"]
db:
image: postgres:latest
container_name: postgres
restart: always
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- miniflux-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "miniflux"]
interval: 10s
start_period: 30s
volumes:
miniflux-db:
# Esc + :wq でvimを終了し保存
ここでの注意点:
ports:17025はコンテナ外部のポート、8080はコンテナ内部のポートです。必要に応じて変更可能です。POLLING_FREQUENCY=15:Minifluxのポーリング頻度。ここでは15分に設定しています。
独自のデータベースを使用する場合は、dbサービスをコメントアウトし、DATABASE_URLの値を自身のデータベースアドレスに変更してください。
Minifluxコンテナの起動
docker compose up -d
インストールの確認
ブラウザでMinifluxのアドレスにアクセスし、正常に表示されればインストール成功です。
# サーバーでIPアドレスを確認
curl -s https://icanhazip.com
ブラウザで http://<IP>:17025 にアクセスし、正常に表示されればインストール成功です。

サービスにアクセスできない場合は、ファイアウォール設定とクラウドホストのセキュリティグループ設定を確認してください。
参考資料:Oracle Cloud ネットワークセキュリティグループ設定 - EN
#
RSSHub のインストール
続いてRSSHubをインストールし、最後にNginxでRSSHubとMinifluxサービスをリバースプロキシします。
# ディレクトリ作成
mkdir -p ~/docker/rsshub && cd ~/docker/rsshub
# compose.ymlファイルをダウンロード
wget https://raw.githubusercontent.com/DIYgod/RSSHub/master/compose.yml
# 変更が必要な設定がないか確認
vim compose.yml
# Redisキャッシュ永続化用のボリュームを作成
docker volume create redis-data
# RSSHubを起動(-dを付けないとフォアグラウンドでログが出力され確認しやすい)
docker compose up -d
# RSSHubのログを確認
docker compose logs -f
インストールの確認
ブラウザでRSSHubのアドレスにアクセスし、正常に表示されればインストール成功です。
# IPアドレス取得
curl -s https://icanhazip.com
ブラウザで http://<IP>:1200 にアクセスし、正常に表示されればインストール成功です。

Nginx Proxy Manager (NPM) のインストール
MinifluxとRSSHubの起動後、Nginxを使ってこれら2つのサービスをリバースプロキシし、ドメイン経由でのアクセスとSSL暗号化を実現します。
# ディレクトリ作成
mkdir -p ~/docker/npm && cd ~/docker/npm
# 設定ファイル作成
vim ~/docker/npm/compose.yml
compose.ymlファイルの編集
# compose.yml
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
Nginx Proxy Managerコンテナの起動
docker compose up -d
インストールの確認
ブラウザでNPMのアドレスにアクセスし、正常に表示されればインストール成功です。
# IPアドレス取得
curl -s https://icanhazip.com
ブラウザで http://<IP>:81 にアクセスし、正常に表示されればインストール成功です。

NPM リバースプロキシの設定
http://<IP>:81 にログインします。デフォルトのユーザー名は admin@example.com、パスワードは changeme です。
ログイン後は必ずデフォルトのメールアドレスとパスワードを変更してください。メールアドレスはSSL証明書の更新通知の受信に使用されます。
DockerコンテナのIPを取得する
リバースプロキシを設定する前に、DockerコンテナのIPを取得する必要があります。
ターミナルで以下のコマンドを実行し、DockerコンテナのIPを取得します。
# 以下のコマンドを実行
ip addr show docker0
# 出力結果例
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:a6:c8:15:72 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
上記の 172.17.0.1 がDockerコンテナのIPです。
次に、NPMでリバースプロキシを設定します。
Miniflux リバースプロキシの追加
- ダッシュボードページで
0 Proxy Hostカードをクリックし、リバースプロキシを追加します。 Proxy HostページでAdd Proxy Hostボタンをクリックし、New Proxy Hostウィンドウを開きます。New Proxy Hostウィンドウで以下を入力します。Domain Names:ドメイン名を入力(例:miniflux.domain.com)。Scheme:デフォルトのHTTPを選択。Forward Hostname / IP:DockerコンテナのIPを入力(例:172.17.0.1)。Forward Port:17025を入力。
SSLタブに切り替え、SSL CertificateオプションでRequest a new SSL Certificate with Let's Encryptを選択。Force SSLオプションを有効化。HTTP/2 Supportオプションを有効化。Let's Encrypt Terms of Serviceに同意。
Saveボタンをクリックして保存(証明書生成のため、少し待つ場合があります)。- 最後に、追加した
miniflux.domain.comリンクをクリックし、正常にアクセスできればNPMリバースプロキシの設定は成功です。
RSSHub リバースプロキシの追加
上記の手順を繰り返し、RSSHubのリバースプロキシを追加します。以下を入力します。
Domain Names:ドメイン名を入力(例:rsshub.domain.com)。Scheme:デフォルトのHTTPを選択。Forward Hostname / IP:'DockerコンテナのIP' を入力。Forward Port:1200を入力。SSLタブに切り替え、SSL CertificateオプションでRequest a new SSL Certificate with Let's Encryptを選択。Force SSLオプションを有効化。HTTP/2 Supportオプションを有効化。Email Address for Let's Encrypt:メールアドレスを入力。Let's Encrypt Terms of Serviceに同意。
Saveボタンをクリックして保存(証明書生成のため、少し待つ場合があります)。- 最後に、追加した
rsshub.domain.comリンクをクリックし、正常にアクセスできればNPMリバースプロキシの設定は成功です。
リバースプロキシ設定の確認
✅ https://miniflux.domain.com からMinifluxにアクセスできれば、NPMリバースプロキシの設定は成功です。
✅ https://rsshub.domain.com からRSSHubにアクセスできれば、NPMリバースプロキシの設定は成功です。
✅ NPMリバースプロキシを設定した後は、クラウドホストのセキュリティグループで該当ポートのアクセス権限を閉じておくことを推奨します。悪意のあるアクセスを防ぐためです。
(オプション) Caddy を使ったリバースプロキシ
NPMを使いたくない場合は、Caddy を使ってリバースプロキシを設定することもできます。
設定ファイルは以下の通りです。
vim caddyfile
miniflux.example.org
reverse_proxy miniflux:17025
services:
caddy:
image: caddy:2
container_name: caddy
depends_on:
- miniflux
ports:
- "80:80"
- "443:443"
volumes:
- $PWD/Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
miniflux:
image: ${MINIFLUX_IMAGE:-miniflux/miniflux:latest}
container_name: miniflux
depends_on:
- db
environment:
- DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
- RUN_MIGRATIONS=1
- CREATE_ADMIN=1
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD=test123
- BASE_URL=https://miniflux.example.org
db:
image: postgres:15
container_name: postgres
environment:
- POSTGRES_USER=miniflux
- POSTGRES_PASSWORD=secret
volumes:
- miniflux-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "miniflux"]
interval: 10s
start_period: 30s
volumes:
miniflux-db:
caddy_data:
caddy_config:
(オプション) Traefik を使ったリバースプロキシ
NPMを使いたくない場合、traefik も良い選択肢です。
設定ファイルは以下の通りです。
services:
traefik:
image: "traefik:v2.3"
container_name: traefik
command:
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.myresolver.acme.tlschallenge=true"
- "--certificatesresolvers.myresolver.acme.email=postmaster@example.com"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
depends_on:
- miniflux
ports:
- "443:443"
volumes:
- "./letsencrypt:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
miniflux:
image: ${MINIFLUX_IMAGE:-miniflux/miniflux:latest}
container_name: miniflux
depends_on:
- db
expose:
- "8080"
environment:
- DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
- RUN_MIGRATIONS=1
- CREATE_ADMIN=1
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD=test123
- BASE_URL=https://miniflux.example.org
labels:
- "traefik.enable=true"
- "traefik.http.routers.miniflux.rule=Host(`miniflux.example.org`)"
- "traefik.http.routers.miniflux.entrypoints=websecure"
- "traefik.http.routers.miniflux.tls.certresolver=myresolver"
db:
image: postgres:15
container_name: postgres
environment:
- POSTGRES_USER=miniflux
- POSTGRES_PASSWORD=secret
volumes:
- miniflux-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "miniflux"]
interval: 10s
start_period: 30s
volumes:
miniflux-db:
Miniflux でRSSを購読する
言語設定:Minifluxにログイン後、Settings をクリックし、Language オプションで 简体中文 を選択、ページ最下部の Save ボタンをクリックして保存します。
記事の並び順:同じページの 文章排序 ラベルで 新->旧 を選択し、ページ最下部の Save ボタンをクリックして保存します。
新しいフィードの追加:画面上部の 源(+) ラベルを見つけ、+ ラベルをクリックし、https://pinw.ca/zhs/index.xml を入力、青色の 查找源 ボタンをクリックします。しばらく待つと、Minifluxが自動的にRSS情報を取得し、購読リストに追加します。
注意:上記の https://pinw.ca/zhs/index.xml は 私のブログ のRSSアドレスです。ぜひ購読してください。
RSSHub でRSSを購読する
Minifluxの使用感は非常に良いですが、RSSフィードのみを購読でき、BilibiliやYouTubeなどの他のタイプのコンテンツは購読できません。そんな時にRSSHubが役立ちます。
Bilibiliの購読
RSSHub を開き、検索ボックスに bilibili と入力し、Bilibili->UP主动态 をクリックします。
YouTubeの購読
RSSHub を開き、検索ボックスに youtube と入力し、YouTube->用户 をクリックします。
rsshub.domain.com は、先ほど設定したリバースプロキシのドメイン名に置き換えてください。
RSSHub Radar でRSSを購読する
RSSHubは多くのルートルールを提供していますが、その都度 RSSHub を開いてルールを検索するのは不便です。そんな時に役立つのが、RSSHubが提供するルートを発見するためのツールです。
RSSHub Radar は、RSSHubの作者 DIYgod が開発したChrome拡張機能で、現在のウェブサイトのRSSルートルールを素早く見つけることができます。
- RSSHub Radar - Chrome Extension をクリックしてRSSHub Radar拡張機能をダウンロードし、インストールします。
- RSSHub Radar拡張機能のアイコンをクリックし、
设置ボタンをクリックして設定ページに移動します。 常规設定で、自定义 RSSHub 域名にrsshub.domain.comを入力します。一键订阅設定で、开启にチェックを入れ、自定义 Miniflux 域名にminiflux.domain.comを入力します。

これで、任意のウェブサイトでRSSHub Radar拡張機能を使用できるようになります。
Fever API を使ってRSSを同期する
Fever APIはRSS同期プロトコルです。Fever APIを介してRSSを他のRSSリーダー(FeedMeなど)に(読み取り専用で)同期できます。
设置ボタンをクリックし、設定ページに移動します。集成ボタンをクリックし、統合ページに移動します。启用 Fever APIオプションにチェックを入れ、Fever 用户名とFever 密码を入力します。更新ボタンをクリックして保存します。

Android プラットフォームで読む
FeedMe はAndroidプラットフォームのRSSリーダーで、Fever APIを使用してMinifluxのRSSを同期できます。
Telegram Bot プッシュ設定
- Telegramで
@BotFatherを検索し、/startを送信してBotFatherを起動します。 /newbotを送信し、ボット作成を開始します。- ボットの名前を入力します(例:
RSS Notification)。 - ボットのユーザー名を入力します(例:
123wasdRSSPushbot)。 - ボットのトークンをコピーします(例:
123456789:ABCDEF1234567890ABCDEF1234567890ABC)。後で使用します。 - Telegramで
@getidsbotを検索し、/startを送信してChat IDを取得します。 - Chat IDをコピーします(例:
1234567890)。後で使用します。 - Minifluxにログインし、
设置タブをクリックして設定ページに移動します。 集成タブをクリックし、統合ページに移動します。- ページを一番下までスクロールし、
将新文章推送到 Telegramオプションにチェックを入れ、先ほどコピーした机器人令牌とChat IDを入力します。 更新ボタンをクリックして保存します。
以降、Minifluxに新しい記事が追加されるたびに、Telegram Botを介してあなたのTelegramアカウントにプッシュ通知が届きます。
注意:グループやチャンネルにプッシュする場合は、ボットをグループやチャンネルに追加し、グループやチャンネルで /start を送信して現在のChat IDを取得する必要があります。
まとめ
楽しい試行錯誤の末、ついに自分だけのRSSサービスを快適に使えるようになりました。
enjoy it!