システム構成
MTS Translation Bot は、役割の異なる複数のプロセスが連携して動作します。このページでは技術的な全体像を説明します(運用に必須の知識ではありません)。
構成要素
┌──────────────────────────┐
Discord ◀────────▶│ Bot 本体 (discord.js) │
ゲートウェイ │ シャーディングで分散実行 │
└─────────────┬────────────┘
│ 直接読み書き
ブラウザ ─OAuth─┐ ▼
│ ┌────────────────┐
┌──────────────▼───────┐ │ PostgreSQL │
│ Web ダッシュボード │ │ (設定/課金/統計) │
│ (Next.js) │ └────────▲───────┘
└──────────┬───────────┘ │ 直接読み書き
│ 内部API (認証付き) │
▼ │
┌──────────────────────────────┴──┐
│ internal-api (Express) │
│ ダッシュボード向けの読み書き窓口 │
└──────────────────────────────────┘| コンポーネント | 役割 |
|---|---|
| Bot 本体 | Discord と接続し、発言の取得・翻訳・Webhook投稿・リアクション/編集/削除の処理を行う中核。 |
| internal-api | ダッシュボードからの設定変更・情報取得を受け付ける内部APIサーバー。認証付きで、外部公開はされません。 |
| ダッシュボード | 管理者が使う Web UI。internal-api 経由でデータを読み書きします。 |
| PostgreSQL | 設定・課金・利用統計などを保存するデータベース。Bot と internal-api が共有します。 |
翻訳の処理フロー
- 受信:対象チャンネルの発言(または国旗リアクション)を検知。
- フィルタ:除外設定(ユーザー/ロール/キーワード/コードブロック)を適用。
- 整形:メンション・絵文字・チャンネルリンク・URL をプレースホルダーで保護。
- エンジン選択:モード(LocalLLM / DeepL)と残量・上限に応じて翻訳先エンジンを決定。
- 翻訳:選択エンジンで翻訳。失敗・過負荷時はフォールバックで別エンジンへ。
- 復元・整形:保護したトークンを元に戻し、改行構造を可能な限り復元。
- 投稿:Webhook で、発言者の名前/アイコンを再現して翻訳結果を投稿。
- 記録:元メッセージと翻訳投稿の対応関係を記録(編集/削除の追従に使用)。利用回数を集計。
シャーディング
Discord の大規模運用に対応するため、Bot はシャーディング(接続を複数のワーカーに分割)で動作します。これにより、多数のサーバーに参加していても安定して稼働します。
ストレージ
- すべての永続データは PostgreSQL に集約されます(キー・バリュー方式 + 楽観的ロックで整合性を担保)。
- 保存される主なもの:サーバー/ユーザー設定、課金・権利情報、利用回数の集計、メッセージ対応関係 など。
- メッセージ本文は恒久保存しません(→ データの取り扱い)。
決済連携
- 課金は Stripe を利用します。
- 購入はまず「保留(pending)」として作成され、Stripe の Webhook で決済確定後に「承認(approved)」へ。
- 失敗・期限切れは自動で「却下」、月額は請求書/サブスクイベントに応じて状態が更新されます。
- Webhook 処理が一時的に失敗しても、Stripe の再送により最終的に整合する設計です。
信頼性の工夫
- 多段フォールバックで翻訳の途切れを防止(→ 翻訳エンジンとフォールバック)。
- 利用上限でサーバー間の公平性とリソース保護を両立(→ 利用上限とレート)。
- 設定変更は内部APIを通すため、ダッシュボードと Bot の設定が一貫します。
このページの内容は概念的な説明です。実際の構成・パラメータは運用状況により調整されます。
