EC-CUBE 4の index.php は、環境変数 APP_ENV が渡っていると .env を読みません。DockerのComposeで env_file に APP_ENV=prod を書いた環境では、.env に書いた ECCUBE_AUTH_MAGIC や ECCUBE_ADMIN_ROUTE は使われず、それぞれ既定値の <change.me> と admin で動きます。エラーは出ないので、会員が全員ログインできない、管理画面のURLが変わっている、といった症状で初めて気付きます。
読まれるかどうかはindex.phpの1行で決まる
4.3.1の index.php の該当部分です。
// The check is to ensure we don't use .env in production
if (!isset($_SERVER['APP_ENV'])) {
if (file_exists(__DIR__.'/.env')) {
(Dotenv::createUnsafeMutable(__DIR__))->load();
}
}
PHP-FPMの公式Dockerイメージは clear_env = no なので、コンテナの環境変数はそのまま $_SERVER に入ります。APP_ENV が1つあるだけで .env を読むブロック全体が実行されず、.env に何を書いても反映されません。逆に、開発用Composeで APP_ENV を渡していないと .env が読まれるので、「開発では動くのに検証サーバーでだけ挙動が違う」という食い違いになります。
既定値に戻ると何が起きるか
.env が読まれなくても起動は失敗しません。EC-CUBE側の設定に既定値があるからです。
| 変数 | 既定値 | 読まれなかったときの見え方 |
|---|---|---|
ECCUBE_AUTH_MAGIC |
<change.me> |
パスワードのハッシュに使う値が変わり、既存の会員・管理者が全員ログイン不可 |
ECCUBE_ADMIN_ROUTE |
admin |
管理画面が /admin/ に戻る。独自パスは404 |
ECCUBE_TEMPLATE_CODE |
default |
独自テンプレートではなく標準テンプレートで表示される |
ECCUBE_COOKIE_NAME |
eccube |
Cookie名を変えている環境では、ログイン中のセッションが全部切れる |
ECCUBE_ADMIN_ALLOW_HOSTS |
[] |
IP制限をかけていた場合に外れる |
ECCUBE_LOCALE |
ja |
影響なし |
既定値は app/config/eccube/packages/eccube.yaml と services.yaml の env(...) にあります。一番被害が大きいのは ECCUBE_AUTH_MAGIC で、値が変わると4.0から移行した会員データのパスワードが1つも照合できなくなります。ログにはエラーが出ず、ログイン画面で「メールアドレスまたはパスワードが正しくありません」と出るだけです。
env_fileにEC-CUBEの変数を全部書く
対処は単純で、APP_ENV を渡す環境では .env に頼らず、EC-CUBEが読む変数を全部 env_file 側に書くことです。最低限、上の表の6つと DATABASE_URL・MAILER_DSN・TRUSTED_HOSTS・ECCUBE_FORCE_SSL が必要です。
# docker/.env.staging(git管理外)
APP_ENV=prod
APP_DEBUG=0
DATABASE_URL=mysql://user:password@mysql:3306/eccube_db
ECCUBE_AUTH_MAGIC=(本番と同じ値)
ECCUBE_ADMIN_ROUTE=(本番と同じ値)
ECCUBE_ADMIN_ALLOW_HOSTS='[]'
ECCUBE_COOKIE_NAME=eccube
ECCUBE_TEMPLATE_CODE=custom
ECCUBE_LOCALE=ja
.env.example をテンプレートにしているなら、そこに6つを入れておけば環境を作る人が落としません。
既存環境から値を写すときは一致をハッシュで確かめる
ECCUBE_AUTH_MAGIC は40文字程度のランダム文字列で、手で見比べても一致は確認しにくいです。旧環境のコンテナ内 .env と新しい env_file の値をそれぞれ md5sum でハッシュ化し、同じ値になることを確認してから起動すると、コピペミスを防げます。値そのものを画面に出さずに済むので、作業ログにも残せます。
docker exec old-eccube sh -c 'grep ^ECCUBE_AUTH_MAGIC= /path/to/eccube/.env | cut -d= -f2 | tr -d "\r\n" | md5sum'
grep ^ECCUBE_AUTH_MAGIC= docker/.env.staging | cut -d= -f2 | tr -d '\r\n' | md5sum
起動後は、既存の会員でログインできること、管理画面が従来のパスで開くことの2点を確認すれば、値が届いているかどうかは判定できます。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。