003_bonus_website_architecture
Date: 2026-02-05 (Updated) Status: Accepted Author: Antigravity (AI Assistant)
Context
Docker Infrastructure プロジェクトのボーナス課題として、以下の追加要件を満たす必要があります。
- サービスの追加: PHP以外の言語によるWebサイト (VitePress on Node.js)、Redis キャッシュ、FTPサーバー、Adminer、その他有用なサービス。
- セキュリティ強化: ModSecurity (WAF) の導入。
- アーキテクチャ統合: これらのサービスを既存の Docker Infrastructure インフラストラクチャ(Docker + Nginx)に統合する。
初期の検討では独立したポートを使用する案もありましたが、最終的に Nginx を単一のエントリーポイント (Single Entrypoint) とするリバースプロキシ構成 を採用しました。
Architecture Overview
C4 Container Diagram (System Context)
システム全体は nginx コンテナをゲートウェイとして機能させ、URLパスに基づいて各サービスへルーティングします。
Routing Strategy (Nginx Configuration)
全てのHTTPSリクエストは nginx コンテナが Port 443 で受け付け、パスルーティングを行います。
| URL Path | Service | Container:Port | Description |
|---|---|---|---|
/ | WordPress | wordpress:9000 | FastCGI経由でPHPを実行。メインコンテンツ。 |
/website/ | Bonus Website | website:4443 | Node.js Expressサーバーへプロキシ。VitePressドキュメント。 |
/adminer/ | Adminer | adminer:8080 | Adminerコンテナへプロキシ。DB管理画面。 |
Key Decisions
1. Single Entrypoint Architecture (Reverse Proxy)
- Decision: すべてのWebトラフィックを Nginx (Port 443) 経由にする。
- Reason:
- セキュリティ: ModSecurity (WAF) を Nginx に集約させることで、後段のアプリケーションを一元的に保護できる可能性があります(※現状の設定では主にWordPressを保護)。
- シンプルさ: ユーザーは単一のドメインとポートにアクセスするだけで済みます。ファイアウォール(UFW)で開放するポートを最小限(443とFTPポートのみ)に抑えられます。
- 証明書管理: SSL/TLS終端を Nginx に集約できるため、証明書の管理が容易になります。
2. ModSecurity (WAF) Integration
- Decision: Nginx をソースコードからコンパイルし、ModSecurity v3 と OWASP Core Rule Set (CRS) を組み込む。
- Reason:
- ボーナス要件: WAFの使用が求められているため。
- 実装: Debian 公式パッケージの Nginx では ModSecurity モジュールが標準で利用できない場合があるため、Dockerfile 内でビルドプロセスを構築しました。
3. Bonus Website (VitePress + Express)
- Decision: 静的サイトジェネレータ (VitePress) の出力を、Express サーバーで配信し、OAuth API 認証をかける。
- Reason:
- 単なる静的ファイル配信ではなく、アプリケーションとしての要件(認証など)を満たすため。
- Nginx からは
/website/というパスでプロキシされるため、Express側でBASE_URLの調整が必要となるが、柔軟に対応可能。
4. Redis Caching
- Decision: WordPress のセッションやオブジェクトキャッシュとして Redis を使用する。
- Reason:
- WordPress のパフォーマンス向上。
redisコンテナを立ち上げ、WordPress 側に Redis プラグイン (Redis Object Cache 等) を導入して連携させる(またはwp-config.phpで設定)。
5. FTP Server (vsftpd)
- Decision: 独立した
ftpコンテナを立ち上げ、WordPress のボリューム (/var/www/html) を共有する。 - Reason:
- ユーザーが FTP フライアントを使用して WordPress のテーマやプラグインを直接アップロード/編集できるようにするため。
- セキュリティのため、SSL/TLS (FTPS) を強制する設定とする。