Docker

同梱の Dockerfile と compose.yaml は、1 つのコンテナで 1 つのサイトを実行します。コンテナは、ホスト名にかかわらずすべてのリクエストを FLEXAGON_PUBLIC ディレクトリ(デフォルトは public)に送ります。どのドメインをどのコンテナに振り分けるかは、ロードバランサー、Ingress、または Cloud Run のドメインマッピングで決めます。

ターゲット 用途 内容
dev ローカル開発(compose.yaml) プロジェクトを /app にマウント、php.ini-development、composer、Xdebug(インストール済み、未ロード)
alpha、beta、production ステージごとのデプロイ用イメージ プロジェクトをコピーし、application/ を application/_Config/<stage>/ のファイルで上書き、composer install --no-dev、php.ini-production、opcache のタイムスタンプチェック無効、www-data で実行、ビルド中に flexagon check を実行

PHP 8.3 + Apache のイメージで、コンテナは PORT(デフォルトは 8080)で待ち受けます。インストールする拡張モジュールは Dockerfile 冒頭の PHP_EXTENSIONS で指定します。使わないものは削除し、足りないものは追加してください(DEPLOY.md を参照)。

イメージに含まれるデフォルトの PHP 拡張モジュール:pdo_mysql、pdo_pgsql、opcache、bcmath、exif、gd、gettext、intl、zip

開発

docker compose up -d                       # web(:8080)
docker compose exec web composer install   # vendor/ がない場合
docker compose --profile xdebug up -d      # + Xdebug を有効にした web-xdebug(:8081)

MySQL 8.4 と PostgreSQL 17 のコンテナはコメントアウトされた状態で含まれているため、デフォルトでは起動せず、アプリケーションは .env.php の設定どおりに接続します。どちらかを使う場合は、compose.yaml のうち MySQL または PostgreSQL と記された部分(environment 配下の DB_* / PGSQL_DB_*、depends_on、サービス本体、volumes)のコメントを解除してください。

コメントを解除すると、DB_* と PGSQL_DB_* の値が .env.php より優先されるため、コンテナ内のアプリケーションは .env.php の内容にかかわらず、これらのデータベースコンテナに接続します。すべてのポートは 127.0.0.1 でのみ待ち受け、FLEXAGON_HTTP_PORT、FLEXAGON_XDEBUG_PORT、FLEXAGON_MYSQL_PORT、FLEXAGON_PGSQL_PORT で変更できます。

複数のサイト — public/ と同じ階層にある public_* ディレクトリは、それぞれ別のサイトになります。application/ は共有されますが、サイトごとに __flexagon.php、.htaccess、_entry.php、_prepare.php、_router.php が必要です(public/ からコピーしてください)。サイトごとに 1 つのコンテナを、たとえば FLEXAGON_PUBLIC: public_admin のように指定して実行します(compose.yaml の admin の例を参照)。ローカルではサイトごとにポートが異なりますが、Cookie はポートで区別されないため、それぞれ別のホスト名でも開くようにしてください。例:http://admin.localhost:8082

デプロイ — 手順の詳細は DEPLOY.md にあります。

docker build --target production -t myapp .
docker run -p 8080:8080 -e DB_HOST=... -e DB_PASSWORD=... myapp                 # public/
docker run -p 8080:8080 -e FLEXAGON_PUBLIC=public_admin -e DB_HOST=... myapp    # public_admin/
  • シークレットは、プラットフォームのシークレットストアを通じて環境変数として渡してください。.dockerignore によって .env.php と .env はビルドから除外されるため、イメージに含まれることはありません。
  • イメージは 1 つだけビルドし、FLEXAGON_PUBLIC だけを変えてサイトごとに 1 つのサービスとして実行します。これにより、サイトごとにデータベースアカウント、スケーリング、ネットワークへの公開範囲(たとえば管理サイトは内部ネットワークのみ)を分けられます。
  • 各ステージ(alpha、beta、production)は --target でそれぞれ別のイメージとしてビルドされるため、myapp:1.0.0-beta のようにタグで区別してください。
  • ビルドではホストの vendor/ を使わず、コンテナ内で composer.lock からインストールします。プロジェクト内のパスリポジトリ(./packages/...)もインストールされます。
  • セッションは暗号化された Cookie なので、インスタンスを増やしても共有ストアは必要ありません。すべてのインスタンスに同じ SESSION_ENCRYPTION_STRING を設定してください。
  • コンテナのファイルシステムは再起動すると消えます。本番環境では SQLite やローカルへのアップロードを使わず、マネージドデータベースとオブジェクトストレージを使用してください。
  • ルートファイルシステムを読み取り専用にする場合は、/var/run/apache2 と /tmp に tmpfs をマウントしてください。
  • Apache のプロセス数(MaxRequestWorkers)は、起動時にコンテナのメモリ上限から(上限 − 64MB)÷ 48MB として算出され、最小 2、最大 256 になります(512MB → 9、1GB → 20、2GB → 41)。リクエストがより多くのメモリを使う場合は APACHE_WORKER_MEMORY_MB を引き上げるか、APACHE_MAX_REQUEST_WORKERS で数を直接指定してください。上限を超えたリクエストは失敗せず、待機します。Cloud Run のようにインスタンスごとの同時実行数を設定するプラットフォームでは、その値をプロセス数に合わせてください。各プロセスは 1000 接続ごとに入れ替えられます(APACHE_MAX_CONNECTIONS_PER_CHILD)。