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

<!-- START_SERIES -->

ホームサーバー完全構築ガイド シリーズ記事：

[ホームサーバー完全構築ガイド #0 計画とハードウェア選定](https://qiita.com/SolitudeRA/items/0a3f810efb315ba04fd2)
[ホームサーバー完全構築ガイド #1 OS導入と基本設定](https://qiita.com/SolitudeRA/items/aecc62f0bb4270367656)
[ホームサーバー完全構築ガイド #2 インフラの構築](https://qiita.com/SolitudeRA/items/4c6196234446c5965f23)
[ホームサーバー完全構築ガイド #3 サービス群の選定](https://qiita.com/SolitudeRA/items/78ed880f4fa89d466c1f)
[ホームサーバー完全構築ガイド #4 WordPressのデプロイ](https://qiita.com/SolitudeRA/items/ce9e9dadf46e19143656)
[ホームサーバー完全構築ガイド #6 クラウドストレージの構築](https://qiita.com/SolitudeRA/items/652c84442abfd818f743)
[ホームサーバー完全構築ガイド #7 DevOpsプラットフォームの構築](https://qiita.com/SolitudeRA/items/8580cffbb7de7148366a)
[ホームサーバー完全構築ガイド #8 スマートホームプラットフォームの構築](https://qiita.com/SolitudeRA/items/9626951e8d8558ef2616)

<!-- END_SERIES -->

# はじめに

**ホームサーバー完全構築ガイド**シリーズへようこそ。このシリーズでは、ホームサーバーを活用したさまざまなシステム構築方法を紹介しています。今回のテーマは、効率的に情報を収集し管理するシステムの構築です。**RSSHub** と **FreshRSS** を組み合わせ、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 リーダーです。複数ユーザーをサポートしており、簡単に拡張機能を追加できる点も魅力です

---

# 準備

## 必要な環境

- **ネットワーク**：
  - ドメイン名（例：`example.com`）が利用可能
  - サーバーがインターネットからアクセス可能な IPv4 または IPv6 アドレスを持っていること

- **ソフトウェア**：
  - OS：Ubuntu 20.04、CentOS 7、または Docker をサポートする他の Linux ディストリビューション
  - Docker および Docker Compose（インストール方法は以下のリンクを参照）：  
    [ホームサーバー完全構築ガイド #2 インフラの構築](https://qiita.com/SolitudeRA/items/4c6196234446c5965f23)
  - Nginx：Ubuntu の場合、以下のコマンドでインストール可能です
    ```bash
    sudo apt update
    sudo apt install nginx
    ```

---

## Nginx の設定

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

Nginxのインストールは[ホームサーバー完全構築ガイド #2 インフラの構築](https://qiita.com/SolitudeRA/items/4c6196234446c5965f23)を参照してください。

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

---

### RSSHub 用の Nginx 設定

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

```nginx
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` に以下の内容を追加します：

```nginx
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 設定の有効化

```bash
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
```

## Docker

Dockerのインストールは[ホームサーバー完全構築ガイド #2 インフラの構築](https://qiita.com/SolitudeRA/items/4c6196234446c5965f23)を参照してください。

## RSSHub のデプロイ

### RSSHub 用の `docker-compose.yml` 作成

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

```bash
mkdir -p ~/rsshub
cd ~/rsshub
```

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

```yaml
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
```

### RSSHub の起動

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

```bash
sudo docker-compose up -d
```

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

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

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

---

## FreshRSS のデプロイ

### FreshRSS 用の `docker-compose.yml` 作成

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

```bash
mkdir -p ~/freshrss
cd ~/freshrss
```

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

```yaml
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>
```

### FreshRSS の起動

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

```bash
sudo docker-compose up -d
```

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

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

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

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

---

## 情報収集システムの利用

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

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

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

### FreshRSS にフィードを登録

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

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

---

## セキュリティと最適化

### RSSHub のアクセス制限

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

`docker-compose.yml` の `rsshub` サービスに以下の設定を追加します：

```yaml
        environment:
            ACCESS_KEY: <your_access_key>
```

RSSHub を再起動します：

```bash
sudo docker-compose up -d
```

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

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

### FreshRSS の自動更新

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

`docker-compose.yml` の `freshrss` サービスに以下を追加します：

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

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

```bash
sudo docker-compose up -d
```

---

## トラブルシューティング

### よくある問題

1. **RSSHub が動作しない**  
   - コンテナのログを確認します：
     ```bash
     sudo docker logs rsshub
     ```
   - Nginx の設定やポートが正しいか確認してください

2. **FreshRSS が RSS フィードを取得しない**  
   - FreshRSS のログを確認します：
     ```bash
     sudo docker logs freshrss
     ```
   - フィードの URL が正しいか、アクセス可能か確認してください

---

# まとめ

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

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

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