AmputatorBot → Devvit 移行計画 v7
ステータス: 生きたドラフト — M1~M5は出荷済み、M6(クラウドデプロイ + ローンチ)は進行中。 作成日: 2026-05-25 予算上限: 月額€15
作業スタイル — 最初にこれをお読みください
Dev は、コードを書く前にアーキテクチャ上の決定について相談されることを好みます。以下のような選択については:
- どのライブラリ、フレームワーク、またはパターンを使うか
- データモデルの設計やスキーマの決定
- 新しいモジュールやレイヤーの構造化方法
- コストと複雑さのトレードオフ
- この計画から逸脱するような重要な変更
…一旦止めて、進める前に確認してください。選択肢を提示し、トレードオフを正直に説明し(反対意見があればそれも含めて)、決定を待ってください。機械的な実装作業は相談不要ですが、アーキテクチャの形状に関わるものは必要です。
Devが手動で行う外部アクション(Claudeは行わない):
- 本番MySQL / Postgresデータベースへのクエリ実行(ClaudeはSQLを書き、Devが実行する)
- サービスへのサインアップ(Scaleway、Reddit開発者アカウント、App Directory提出、バウンティプログラム登録)
- DevのIDに関わる外部アカウントへのアクセス(OAuthログイン、
devvit login、scw init、課金変更) - CloudflareでのDNS変更
- 本番PythonAnywhereボットの停止/起動
- 本番に影響を与えるリモートへの
git push - Devvitアプリの公開(
devvit upload --publish)
Claudeは正確なコマンドを準備し、Devに実行タイミングを伝えます。コードの読み取り、コードの作成、ローカルテスト、ローカルDockerビルド、ローカルcargo/npm — これらはClaudeが行います。
プロジェクトの背景
AmputatorBotとは: コメント/投稿/PM内のAMP URLを検出し、正規(非AMP)リンクで返信するRedditボット。Dev(u/Killed_Mufasa)によってメンテナンスされています。https://github.com/jvdburgh/AmputatorBot で公開中。約181のGitHubスター。スケールして動作中。RedditのDeveloper Platform移行プログラムは、Data APIからDevvitに移行するボットに2026年12月31日までに$1,000を提供します。
移行対象:
- Redditボット(Python + PRAW) → Devvitアプリ(TypeScript、
@devvit/web) - HTTP API(Flask) → Rust(Axum + Mozilla-Readability-port + sqlx)
- ウェブサイト(Flask + Bootstrap) → Astro 5 + Tailwind 4 + shadcn/ui
- データベース(PythonAnywhere上のMySQL) → Scaleway Managed Database上のPostgres 17
- ホスト(PythonAnywhere) → Scaleway(パリ、フランス — EUオリジンのマネージドクラウド)
アーキテクチャモデルの変更点: Devvitはサブレディットごとのオプトインであり、グローバルではありません。モデレーターがサブごとにアプリをインストールします。インストールされていない場所のコンテンツは見えません。返信はインストールごとのアプリIDとして投稿され、u/AmputatorBot としては投稿されません。この変更は受け入れられています。推定返信量の減少:30~60%。
目標(ユーザー発言):
- 最新スタックに移行し、その過程で学ぶ(Rust、Devvit、Astro/Tailwind4/shadcn)
- API契約は後方互換性を維持
- リライト中(M1~M5)は、古いボットはPythonAnywhere上で動作を継続し、新しい側は自由に壊せるようにする(ユーザーに影響なし)。古いボットはM6の切り替え時に退役 — 恒久的な並行稼働はなし。
- リライトは強行突破。古いコードは
praw-python-archive/に保存。
確定済みの決定事項
| パス | サブレディットごとのオプトイン。M6で直接切り替え(古いボットはM1〜M5の開発中のみ生存) |
| Devvit SDK | @devvit/web(モダンサーバーモデル) |
| Devvit設定 | devvit.json($schema付きの公式フォーマット) |
| Devvitスキャフォールド | reddit/devvit-template-bare、投稿/メニューUIを除去 |
| バックエンド言語 | Rust |
| バックエンドフレームワーク | Axum 0.8(Tokio + Hyper) |
| 記事抽出 | dom_smoothie クレート(≈0.17、Mozillaのreadability.jsを密に追従するRust Readabilityポート、2026年3月時点で活発にメンテナンス中) |
| HTML解析 | scraper クレート(html5ever上に構築) |
| HTTPクライアント | reqwest |
| Postgresドライバ | sqlx(コンパイル時チェッククエリ) |
| データベース | Scaleway Managed Database上のPostgres 17(DB DEV-S相当またはワンランク上、約2GB + 成長用ヘッドルームにサイジング)。170万行確認済み。 |
| ウェブサイト | Astro 5 + Tailwind 4 + shadcn/ui |
| ホスティング | Scaleway Serverless Containers(パリ/AMS、EUオリジンのフレンチクラウド) |
| 単一サービス | 1つのRustバイナリが /api/* とAstro静的ファイルを tower-http::ServeDir で提供 |
| 可観測性 | 初期はScaleway Cockpit(組み込みのログ + メトリクス)のみ |
| コードホスティング | GitHub(既存のモノレポ) |
| DNS | Cloudflare(既存)— レート制限も処理 |
| API認証 | どのルートもなし — 完全にオープン。Cloudflareが悪用を処理。 |
| レート制限 | Cloudflareのみ、Rustミドルウェアなし |
| ドメイン | 単一 — すべて www.amputatorbot.com |
| テストサブレディット | r/test |
| AIツール | Claude Code + Devvit MCP + IntelliJ上のJetBrains MCP |
| ユーザーごとのオプトアウト | 削除。ユーザーはボットアカウントをブロックします。インストールごとのアプリIDにより、ブロックベースのオプトアウトはインストールレベルで機能します。 |
| サブレディットごとのオプトアウト | 削除(モデレーターはアンインストールするか、インストール設定で autoReply をオフに切り替える) |
| Modmail / DM | なし。受信Modmailハンドラー、ウェルカムModmail、DMはなし — Redditの「アプリ」バッジがボット開示を処理し、Devvit App Directoryリストがオンボーディングをカバーします。 |
| カルマ閾値 | なし |
| App Directory提出者 | u/Killed_Mufasa |
これらの選択の理由
上記の決定の背後にある根拠。それぞれは、信頼できる代替案よりも意図的に選ばれました。
-
Node/TSやPythonではなくRust + Axum。 単一の静的バイナリ、実行時不要、virtualenv不要、
node_modules不要。Rustの難しい部分(ライフタイム、unsafe、高度なジェネリクス)はこの種のサービス(HTTPフェッチ + 正規表現 + HTMLクエリ + DB書き込み)ではほとんど現れないため、学習曲線は主にResult/?、async/Tokio、sqlxマクロです — すべて知る価値があります。Axum 0.8は2026年のコンセンサスフレームワークです(Tokio + Hyper + Towerミドルウェア)。sqlxはコンパイル時チェッククエリを提供します。 -
rs-trafilaturaや他のReadabilityポートではなくdom_smoothie。 既存のボットは、推測と確認の信頼度スコアリング(helpers/article_comparer.py)にnewspaper3k+difflib.SequenceMatcherを使用しています。Rustポートでは、Mozilla-Readabilityに準拠した抽出器が必要です。2026年5月時点の候補:dom_smoothie0.17(最終リリース2026年3月、約40kの最近のダウンロード、リポジトリniklak/dom_smoothie)—readability.jsに密に従い、2つのモード(Mozilla模倣 + カスタム)、JSON-LD + OGメタデータ解析、活発にメンテナンス中。readability0.3 by kumabook(最終リリース2023年12月、停滞)— arc90のオリジナルReadabilityのポート(Mozillaのフォークより前)。ダウンロード数は多いがメンテナンスされていない。readable-readability0.4(最終リリース2022年12月、停滞)。llm_readability0.0.17(活発だが0.0.x — 本番には時期尚早)。
dom_smoothieは、活発なメンテナンス + 明示的なMozillareadability.js系統で勝利。類似度スコアリングには標準(Mozilla模倣)モードを使用します。スパイクは不要。M2で `dom_smoothie =