Skip to content

アーキテクチャ設計

SirrChat は、柔軟で拡張可能なメールサーバーソリューションを提供するために、モジュラーアーキテクチャを採用しています。

全体アーキテクチャ

┌─────────────────────────────────────────────┐
│           クライアント層                     │
│  (Thunderbird, Outlook, モバイルアプリ)      │
└──────────────┬──────────────────────────────┘


┌─────────────────────────────────────────────┐
│           プロトコル層                       │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐    │
│  │  SMTP   │  │  IMAP   │  │Submission│    │
│  └─────────┘  └─────────┘  └─────────┘    │
└──────────────┬──────────────────────────────┘


┌─────────────────────────────────────────────┐
│           認証層                            │
│  ┌──────────┐  ┌─────┐  ┌─────┐  ┌──────┐ │
│  │Blockchain│  │LDAP │  │ PAM │  │Custom│ │
│  └──────────┘  └─────┘  └─────┘  └──────┘ │
└──────────────┬──────────────────────────────┘


┌─────────────────────────────────────────────┐
│           処理層                            │
│  ┌─────────┐  ┌──────┐  ┌─────────┐       │
│  │ フィルタ │  │ 変更 │  │チェック │       │
│  │  (Sieve)│  │(DKIM)│  │(SPF/etc)│       │
│  └─────────┘  └──────┘  └─────────┘       │
└──────────────┬──────────────────────────────┘


┌─────────────────────────────────────────────┐
│           ストレージ層                       │
│  ┌──────────┐  ┌────────────┐             │
│  │データベース│  │ ストレージ  │             │
│  │(PG/MySQL)│  │(Local/S3)  │             │
│  └──────────┘  └────────────┘             │
└─────────────────────────────────────────────┘

コアコンポーネント

プロトコルハンドラー

SMTP サーバー

  • メールの受信と送信
  • STARTTLS 暗号化をサポート
  • レート制限とスパム対策を実装

IMAP サーバー

  • メールの保存と取得
  • フォルダー管理
  • メール検索機能
  • IDLE プッシュ通知をサポート

Submission サーバー

  • メール送信(ポート 587)
  • 必須認証
  • 自動 DKIM 署名

認証モジュール

ブロックチェーン認証

go
type BlockchainAuth struct {
    networks map[string]RPCClient
    cache    *AuthCache
}

func (b *BlockchainAuth) Verify(address, signature, message string) bool {
    // 1. 署名者アドレスを復元
    // 2. アドレスの一致を検証
    // 3. タイムスタンプの有効性をチェック
    return verified
}

LDAP 認証

  • Active Directory をサポート
  • 組織単位(OU)マッピング
  • 属性同期

PAM 認証

  • システムアカウント統合
  • 様々な PAM モジュールをサポート

メッセージ処理パイプライン

受信メール → スパムチェック → ウイルススキャン → フィルタールール

DB に保存 ← DKIM 署名 ← コンテンツ変更 ← ユーザールール

ストレージシステム

データベース層

  • ユーザーデータ: アカウント情報、クォータ、設定
  • メールメタデータ: 送信者、受信者、件名、タイムスタンプ
  • インデックス: 高速検索と取得

ファイルストレージ

  • Maildir フォーマット: メールごとに1つのファイル
  • 圧縮: 古いメールの自動圧縮
  • S3 互換: クラウドストレージにスケーラブル

データフロー

メール送信フロー

1. クライアント接続(SMTP/Submission)

2. 認証検証

3. メールコンテンツを受信

4. 受信者を検証

5. フィルタールールを適用

6. DKIM 署名

7. キュー処理

8. ターゲットサーバーに送信

メール受信フロー

1. 外部サーバー接続

2. SPF/DKIM/DMARC チェック

3. スパムチェック

4. ユーザールール(Sieve)を適用

5. データベースに保存

6. メールファイルを保存

7. クライアントに通知(IMAP IDLE)

モジュールシステム

コアモジュール

  • auth: 認証プロバイダー
  • storage: ストレージバックエンド
  • filter: メールフィルタリング
  • modify: コンテンツ変更
  • check: 検証チェック

拡張ポイント

go
type Module interface {
    Name() string
    Init(config Config) error
    Process(ctx Context, msg *Message) error
}

パフォーマンス最適化

並行モデル

  • Goroutine プール: 並行接続を処理
  • 非同期 I/O: ノンブロッキングネットワーク操作
  • バッチ処理: データベースバッチ操作

キャッシング戦略

  • 認証キャッシュ: ブロックチェーン RPC 呼び出しを削減
  • ユーザーデータキャッシュ: 頻繁に使用されるデータをメモリキャッシュ
  • DNS キャッシュ: DNS クエリを削減

接続プーリング

  • データベース接続プール: データベース接続を再利用
  • RPC 接続プール: ブロックチェーンノード接続の再利用

セキュリティ設計

多層保護

  1. ネットワーク層: TLS 暗号化
  2. 認証層: 多要素認証サポート
  3. アプリケーション層: 入力検証、SQL インジェクション保護
  4. データ層: 保存時の暗号化

レート制限

  • 接続レート: 接続濫用を防止
  • 送信レート: スパムを防止
  • 認証試行: ブルートフォース攻撃を防止

スケーラビリティ

水平スケーリング

           ┌─────────────┐
           │ロードバランサ│
           └──────┬──────┘

        ┌─────────┼─────────┐
        ▼         ▼         ▼
    ┌──────┐  ┌──────┐  ┌──────┐
    │ノード│  │ノード│  │ノード│
    │  1   │  │  2   │  │  3   │
    └───┬──┘  └───┬──┘  └───┬──┘
        │         │         │
        └─────────┼─────────┘

         ┌────────────────┐
         │ 共有ストレージ  │
         │ (Database/S3)  │
         └────────────────┘

コンポーネント分離

  • 独立したデプロイ: SMTP、IMAP を個別にスケーリング可能
  • 共有ストレージ: 複数のインスタンスがデータを共有
  • ロードバランシング: インテリジェントなトラフィック分散

監視とログ

メトリクス収集

  • システムメトリクス: CPU、メモリ、ディスク
  • アプリケーションメトリクス: メールスループット、レイテンシ
  • ビジネスメトリクス: ユーザーアクティビティ、ストレージ使用量

ログシステム

アプリケーションログ → 構造化出力 → ログ集約 → 分析プラットフォーム
                                        (ELK/Loki)

高可用性

フェイルオーバー

  • マスタースレーブレプリケーション: データベースのマスタースレーブ構成
  • 自動切り替え: ヘルスチェックと自動フェイルオーバー
  • データバックアップ: 定期的なバックアップとリカバリーテスト

ヘルスチェック

go
type HealthCheck struct {
    Database  bool
    SMTP      bool
    IMAP      bool
    Storage   bool
}

詳細な技術情報:

Released under the GPL 3.0 License.