自分専用RSSリーダー。登録したフィードの新着記事をWeb UIで閲覧できます。
- Python 3.14
- SQLite
- FastAPI / uvicorn
- feedparser / BeautifulSoup4
docker compose up -d --buildWeb UI: http://localhost:8000
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn api:app --reload --host 0.0.0.0クエリパラメータにトークンを付与することでアクセスを制限できます。
docker-compose.override.yml をプロジェクトルートに作成します(gitignore済み):
services:
app:
environment:
- STARTS_TOKEN=<your-token>トークンの生成:
python -c "import secrets; print(secrets.token_urlsafe(32))"docker compose up 時に自動で読み込まれます。
アクセスURL:
https://example.com/s4s/?token=<token>
このURLをスマホにブックマークしてください。トークンなしのアクセスは403になります。
http://localhost:8000 にアクセスすると以下が利用できます。
- 新着タブ — 取得済みの未読エントリ一覧。フィード(ソース)ごとにグルーピングして表示し、新着が各グループの先頭に並ぶ。既読ボタンで消化、後で読むボタンで保存
- 後で読むタブ — 保存した記事の一覧。削除ボタンで消化
- フィード管理タブ — フィードの登録・削除
RSSフィードのURLだけでなく、サイトのトップURLを入力してもフィードを自動検出します。サイト名も自動で取得します。
python main.py run # 新着を取得してDBに記録フィードの追加・削除は Web UI から行います。
ヘッダーの「通知」ボタンから購読できます。通知は main.py run 実行のたびに送信されます。
VAPID鍵の生成:
python -c "from py_vapid import Vapid; v = Vapid(); v.generate_keys(); print('PRIVATE:', v.private_pem().decode()); print('PUBLIC:', v.public_key.public_bytes(__import__('cryptography.hazmat.primitives.serialization', fromlist=['Encoding','PublicFormat']).Encoding.X962, __import__('cryptography.hazmat.primitives.serialization', fromlist=['Encoding','PublicFormat']).PublicFormat.UncompressedPoint).hex())"
# または py_vapid CLI: vapid --gen環境変数に設定:
VAPID_PRIVATE_KEY=<秘密鍵>
VAPID_PUBLIC_KEY=<公開鍵(URL-safe Base64)>
VAPID_EMAIL=<your@email.com>docker-compose.override.yml に追記する場合:
services:
app:
environment:
- STARTS_TOKEN=<token>
- VAPID_PRIVATE_KEY=<秘密鍵>
- VAPID_PUBLIC_KEY=<公開鍵>
- VAPID_EMAIL=<your@email.com>git clone <repo> /srv/www/htdocs/s4s
cd /srv/www/htdocs/s4s
python -m venv .venv
.venv/bin/pip install -r requirements.txt
sudo systemctl link $(pwd)/systemd/s4s.service
sudo systemctl link $(pwd)/systemd/s4s.timer
sudo systemctl daemon-reload
sudo systemctl enable --now s4s.timer07:00 / 12:00 / 17:00 (JST) に自動で新着取得します。
sudo systemctl list-timers s4s.timer # 次回実行時刻の確認
journalctl -u s4s.service # ログ確認docker compose exec app sqlite3 data/stars.db
sqlite> .headers on
sqlite> .mode column
sqlite> SELECT * FROM feeds; -- 取得済みエントリ
sqlite> SELECT * FROM sources; -- 登録フィード一覧
sqlite> .quit