自社開発
データ駆動の静的サイトと巡回パイプライン
Git で管理するデータから静的サイトを作り、掲載元の Web ページの変化を毎日巡回して見つける仕組みです。サイト内検索も、検索用のサーバーなしで動きます。
構成
データ
- 掲載データYAML + Pydantic(スキーマ・参照整合性の検証)
ビルド
- 静的サイト生成Python 3.12 / Jinja2(自作)
- ブラウザ側TypeScript(strict)
サーバー
- APIFastAPI / SQLite
- 巡回httpx / Playwright
運用
- 配信Caddy / systemd
- CI/CDGitHub Actions → rsync
技術的なポイント
- 検索用のサーバーが要らない検索 — 検索用の JSON をビルドのときに作っておき、絞り込みと比較はブラウザで行います。
- 変化の検知と人のレビュー — ページの本文を整えて保存し、数値を含む大事な変更だけを通知します。機械はデータを書き換えません。データへの反映には、必ず人のレビューを通します。
- 堅いセキュリティ
- パスワードは argon2 でハッシュにして保存します。
- 応答時間からアカウントの有無を推測されないようにしています(タイミング攻撃の対策)。
- ログインの試行回数を制限しています。
- SQL はすべてパラメータ化しています。
- 外部サイトへ勝手に転送されないようにしています(オープンリダイレクトの防止)。
- 作り直せるサーバー
- サーバーの構築はスクリプトで管理しています。ファイアウォール、fail2ban、自動更新、権限を最小限にする設定まで含みます。
- デプロイの経路は 1 本にまとめています。