アーキテクチャ設計
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 接続プール: ブロックチェーンノード接続の再利用
セキュリティ設計
多層保護
- ネットワーク層: TLS 暗号化
- 認証層: 多要素認証サポート
- アプリケーション層: 入力検証、SQL インジェクション保護
- データ層: 保存時の暗号化
レート制限
- 接続レート: 接続濫用を防止
- 送信レート: スパムを防止
- 認証試行: ブルートフォース攻撃を防止
スケーラビリティ
水平スケーリング
┌─────────────┐
│ロードバランサ│
└──────┬──────┘
│
┌─────────┼─────────┐
▼ ▼ ▼
┌──────┐ ┌──────┐ ┌──────┐
│ノード│ │ノード│ │ノード│
│ 1 │ │ 2 │ │ 3 │
└───┬──┘ └───┬──┘ └───┬──┘
│ │ │
└─────────┼─────────┘
▼
┌────────────────┐
│ 共有ストレージ │
│ (Database/S3) │
└────────────────┘コンポーネント分離
- 独立したデプロイ: SMTP、IMAP を個別にスケーリング可能
- 共有ストレージ: 複数のインスタンスがデータを共有
- ロードバランシング: インテリジェントなトラフィック分散
監視とログ
メトリクス収集
- システムメトリクス: CPU、メモリ、ディスク
- アプリケーションメトリクス: メールスループット、レイテンシ
- ビジネスメトリクス: ユーザーアクティビティ、ストレージ使用量
ログシステム
アプリケーションログ → 構造化出力 → ログ集約 → 分析プラットフォーム
(ELK/Loki)高可用性
フェイルオーバー
- マスタースレーブレプリケーション: データベースのマスタースレーブ構成
- 自動切り替え: ヘルスチェックと自動フェイルオーバー
- データバックアップ: 定期的なバックアップとリカバリーテスト
ヘルスチェック
go
type HealthCheck struct {
Database bool
SMTP bool
IMAP bool
Storage bool
}詳細な技術情報: