🌃

ホームサーバー完全構築ガイド #4 情報収集システムの構築

2024/11/23に公開

シリーズ記事:
ホームサーバー完全構築ガイド #0 計画とハードウェア選定
ホームサーバー完全構築ガイド #1 OS導入とインフラ設定
ホームサーバー完全構築ガイド #2 サービス群の選定
ホームサーバー完全構築ガイド #3 WordPressのデプロイ

はじめに

ホームサーバー完全構築ガイドシリーズへようこそ。このシリーズでは、ホームサーバーを活用したさまざまなシステム構築方法を紹介しています。今回のテーマは、効率的に情報を収集し管理するシステムの構築です。RSSHubFreshRSS を組み合わせ、Docker を活用して手軽に運用可能なシステムを構築します。

さらに、Nginx を使ったリバースプロキシ設定を行い、Cloudflare を DNS サービスプロバイダーとして HTTPS 通信を最適化します。

今回のゴール

  1. RSSHub の導入:カスタマイズ可能な RSS フィードを生成
  2. FreshRSS の導入:RSS リーダーとして、収集した情報を管理
  3. Nginx を使ったリバースプロキシと HTTPS 設定:ドメイン名での安全なアクセスを実現
  4. パフォーマンスとセキュリティの最適化:システムを安定して運用可能に

RSSHub と FreshRSS とは?

  • RSSHub
    RSSHub は、Web サービスやサイトからカスタム RSS フィードを生成するためのオープンソースツールです。例えば、Twitter の特定ユーザーの投稿、GitHub のリポジトリ更新、ニュースサイトの新着記事など、RSS で直接提供されない情報を簡単に取得できます

  • FreshRSS
    FreshRSS は軽量で多機能なオープンソースの RSS リーダーです。複数ユーザーをサポートしており、簡単に拡張機能を追加できる点も魅力です


1. 準備

1.1 必要な環境

  • ネットワーク

    • ドメイン名(例:example.com)が利用可能
    • サーバーがインターネットからアクセス可能な IPv4 または IPv6 アドレスを持っていること
  • ソフトウェア

    • OS:Ubuntu 20.04、CentOS 7、または Docker をサポートする他の Linux ディストリビューション
    • Docker および Docker Compose(インストール方法は以下のリンクを参照):
      Docker のインストールガイド
    • Nginx:Ubuntu の場合、以下のコマンドでインストール可能です
      sudo apt update
      sudo apt install nginx
      

2. Nginx の設定

2.1 Nginx 設定についての注意事項

以下の Nginx 設定は、Cloudflare を DNS プロバイダーとして利用し、最適化されたものです。Cloudflare を利用しない場合、設定を適宜調整してください。


RSSHub 用の Nginx 設定

/etc/nginx/sites-available/rsshub に以下の内容を追加します:

server {
    listen 80;
    listen [::]:80;

    server_name rsshub.example.com;

    server_tokens off;

    include /etc/nginx/trust_source/cloudflare;
    deny all;

    access_log /var/log/nginx/rsshub/access80.log;
    error_log /var/log/nginx/rsshub/error80.log;

    return 301 https://$server_name$request_uri;
}

server {
    listen 443      ssl;
    listen [::]:443 ssl;

    http2 on;

    server_name rsshub.example.com;

    server_tokens off;

    include /etc/nginx/trust_source/cloudflare;
    deny all;

    ssl_certificate     /path/to/example.com.pem;
    ssl_certificate_key /path/to/example.com.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;

    ssl_dhparam /path/to/dhparam;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers off;

    add_header Strict-Transport-Security "max-age=63072000" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;

    ssl_stapling on;
    ssl_stapling_verify on;

    ssl_trusted_certificate /path/to/origin_ca_rsa_root.pem;

    resolver 1.1.1.1;

    access_log /var/log/nginx/rsshub/access443.log;
    error_log /var/log/nginx/rsshub/error443.log;

    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_min_length 256;

    location / {
        proxy_pass http://127.0.0.1:7270$request_uri;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-Scheme $scheme;
        proxy_set_header Host $host;
    }
}

FreshRSS 用の Nginx 設定

/etc/nginx/sites-available/freshrss に以下の内容を追加します:

upstream freshrss {
    server 127.0.0.1:7273;
    keepalive 64;
}

server {
    listen 80;
    listen [::]:80;

    server_name news.example.com;

    server_tokens off;

    include /etc/nginx/trust_source/cloudflare;
    deny all;

    access_log /var/log/nginx/freshrss/access80.log;
    error_log /var/log/nginx/freshrss/error80.log;

    return 301 https://$server_name$request_uri;
}

server {
    listen 443      ssl;
    listen [::]:443 ssl;

    http2 on;

    server_name news.example.com;

    server_tokens off;

    include /etc/nginx/trust_source/cloudflare;
    deny all;

    ssl_certificate     /path/to/example.com.pem;
    ssl_certificate_key /path/to/example.com.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;

    ssl_dhparam /path/to/dhparam;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers off;

    add_header Strict-Transport-Security "max-age=63072000" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header Referrer-Policy "no-referrer-when-downgrade" always;

    ssl_stapling on;
    ssl_stapling_verify on;

    ssl_trusted_certificate /path/to/origin_ca_rsa_root.pem;

    resolver 1.1.1.1;

    access_log /var/log/nginx/freshrss/access443.log;
    error_log /var/log/nginx/freshrss/error443.log;

    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_min_length 256;

    location / {
        proxy_pass http://freshrss/;

        add_header X-Frame-Options SAMEORIGIN;
        proxy_redirect off;
        proxy_buffering off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy

_read_timeout 90;
    }
}

Nginx 設定の有効化

sudo ln -s /etc/nginx/sites-available/rsshub /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/freshrss /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

以下是剩余部分的内容,完整翻译为日语,并调整为针对日本读者习惯优化的本地化表达。


3. RSSHub のデプロイ

3.1 RSSHub 用の docker-compose.yml 作成

RSSHub の設定ファイルを保存するディレクトリを作成します:

mkdir -p ~/rsshub
cd ~/rsshub

以下の内容を含む docker-compose.yml ファイルを作成します:

version: '3.9'

services:
    rsshub:
        image: diygod/rsshub:chromium-bundled
        restart: always
        ports:
            - 'ポート:1200'
        environment:
            NODE_ENV: production
            CACHE_TYPE: redis
            REDIS_URL: 'redis://redis:6379/'
            PUPPETEER_WS_ENDPOINT: 'ws://browserless:3000'
        depends_on:
            - redis
            - browserless

    browserless:
        image: browserless/chrome
        restart: always

    redis:
        image: redis:alpine
        restart: always
        volumes:
            - /var/www/rsshub/data:/data

3.2 RSSHub の起動

docker-compose.yml ファイルがあるディレクトリで以下のコマンドを実行して RSSHub を起動します:

sudo docker-compose up -d

RSSHub が正しく動作しているか確認するには、以下の URL にアクセスしてください:

http://<サーバーのIPアドレス>:ポート

RSSHub のトップページが表示されれば、正常に動作しています。


4. FreshRSS のデプロイ

4.1 FreshRSS 用の docker-compose.yml 作成

FreshRSS の設定ファイルを保存するディレクトリを作成します:

mkdir -p ~/freshrss
cd ~/freshrss

以下の内容を含む docker-compose.yml ファイルを作成します:

version: "3.8"

services:
  freshrss:
    image: freshrss/freshrss:latest
    container_name: freshrss
    depends_on:
      - mysql
    restart: unless-stopped
    ports:
      - "ポート:80"
    volumes:
      - /var/www/freshrss/data:/var/www/FreshRSS/data
      - /var/www/freshrss/extensions:/var/www/FreshRSS/extensions

  mysql:
    image: mysql:latest
    container_name: mysql
    restart: unless-stopped
    volumes:
      - /var/www/freshrss/mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: <MYSQL_ROOT_PASSWORD>
      MYSQL_DATABASE: freshrss
      MYSQL_USER: freshrss
      MYSQL_PASSWORD: <MYSQL_PASSWORD>

4.2 FreshRSS の起動

docker-compose.yml ファイルがあるディレクトリで以下のコマンドを実行して FreshRSS を起動します:

sudo docker-compose up -d

FreshRSS が正しく動作しているか確認するには、以下の URL にアクセスしてください:

http://<サーバーのIPアドレス>:ポート

ブラウザで FreshRSS の初期設定ページが表示されるはずです。画面の指示に従って設定を完了してください:

  1. 管理者アカウントの作成:ユーザー名とパスワードを入力
  2. データベースの設定docker-compose.yml で指定した MySQL の設定を入力
  3. 言語とタイムゾーンの設定:日本語と Asia/Tokyo を選択

5. 情報収集システムの利用

5.1 RSSHub を活用したフィード生成

例えば、Twitter の特定ユーザーの投稿を RSS フィード化する場合、以下の形式の URL を使用します:

http://rsshub.example.com/twitter/user/ユーザー名

5.2 FreshRSS にフィードを登録

  1. FreshRSS にログイン
  2. 左上の 「購読管理」 をクリック
  3. 「新しいフィードを追加」 を選択し、RSSHub で生成した URL(例:http://rsshub.example.com/twitter/user/ユーザー名)を入力
  4. カテゴリを選択して 「追加」 をクリック

FreshRSS が自動的にフィードを取得し、記事をリストに表示します。


6. セキュリティと最適化

6.1 RSSHub のアクセス制限

RSSHub へのアクセスを制限するため、API キーを設定できます。

docker-compose.ymlrsshub サービスに以下の設定を追加します:

        environment:
            ACCESS_KEY: <your_access_key>

RSSHub を再起動します:

sudo docker-compose up -d

API キーを設定した場合、生成された RSS URL に ?key=<your_access_key> を追加する必要があります:

http://rsshub.example.com/twitter/user/ユーザー名?key=<your_access_key>

6.2 FreshRSS の自動更新

FreshRSS は定期的に RSS フィードを更新します。この更新間隔を調整するには、CRON を設定します。

docker-compose.ymlfreshrss サービスに以下を追加します:

        environment:
            CRON_MIN: '0,30' # 30分ごとに更新

設定を変更したら、コンテナを再起動します:

sudo docker-compose up -d

7. トラブルシューティング

よくある問題

  1. RSSHub が動作しない

    • コンテナのログを確認します:
      sudo docker logs rsshub
      
    • Nginx の設定やポートが正しいか確認してください
  2. FreshRSS が RSS フィードを取得しない

    • FreshRSS のログを確認します:
      sudo docker logs freshrss
      
    • フィードの URL が正しいか、アクセス可能か確認してください

8. まとめ

本記事では、RSSHubFreshRSS を活用した情報収集システムを構築しました。以下の内容をカバーしました:

  1. Docker Compose を使用して RSSHub と FreshRSS をデプロイ
  2. Nginx を使ってリバースプロキシと HTTPS を設定
  3. フィード生成から管理までのワークフローを紹介

これにより、効率的で安全な情報収集システムを運用可能になりました。ぜひ、ご自身のニーズに合わせてカスタマイズしてみてください。

Discussion