EC-CUBE4.3 .env Docker PHP

EC-CUBE 4の index.php は、環境変数 APP_ENV が渡っていると .env を読みません。DockerのComposeで env_fileAPP_ENV=prod を書いた環境では、.env に書いた ECCUBE_AUTH_MAGICECCUBE_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.yamlservices.yamlenv(...) にあります。一番被害が大きいのは ECCUBE_AUTH_MAGIC で、値が変わると4.0から移行した会員データのパスワードが1つも照合できなくなります。ログにはエラーが出ず、ログイン画面で「メールアドレスまたはパスワードが正しくありません」と出るだけです。

env_fileにEC-CUBEの変数を全部書く

対処は単純で、APP_ENV を渡す環境では .env に頼らず、EC-CUBEが読む変数を全部 env_file 側に書くことです。最低限、上の表の6つと DATABASE_URLMAILER_DSNTRUSTED_HOSTSECCUBE_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オープンプラットフォーム「EC-CUBE」 EC-CUBEゴールドパートナー EC-CUBEは株式会社イーシーキューブの商標です

EC-CUBEに関するお問い合わせ


    [重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。

    EC-CUBEバージョンアップ