Skip to content

003_bonus_website_architecture

Date: 2026-02-05 (Updated) Status: Accepted Author: Antigravity (AI Assistant)

Context

Docker Infrastructure プロジェクトのボーナス課題として、以下の追加要件を満たす必要があります。

  1. サービスの追加: PHP以外の言語によるWebサイト (VitePress on Node.js)、Redis キャッシュ、FTPサーバー、Adminer、その他有用なサービス。
  2. セキュリティ強化: ModSecurity (WAF) の導入。
  3. アーキテクチャ統合: これらのサービスを既存の 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 PathServiceContainer:PortDescription
/WordPresswordpress:9000FastCGI経由でPHPを実行。メインコンテンツ。
/website/Bonus Websitewebsite:4443Node.js Expressサーバーへプロキシ。VitePressドキュメント。
/adminer/Admineradminer:8080Adminerコンテナへプロキシ。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) を強制する設定とする。

Infrastructure & Data Flow

Sequence Diagram: Accessing Bonus Website

Released under the MIT License.