公開デモの運用
公開デモの運用
https://131.186.41.241.sslip.io/ は Oracle Cloud Always Free 上の 1 インスタンスで
docker compose up 構成のまま動いている。ここでは「誰でも書き込める公開デモ」を
どう保つかだけを扱う。
資格情報
リポジトリに動く資格情報を置かない。デモのパスワードは環境変数で与える。
| 変数 | 対象 |
|---|---|
BEMART_DEMO_MEMBER_PASSWORD |
会員 login-test@example.com |
BEMART_DEMO_ADMIN_PASSWORD |
管理者 test-admin |
会員が未設定ならリポジトリのローカル開発値になる。管理者が未設定なら
docker/seed.sh がシードごとにランダムなパスワードを生成してログに 1 度だけ出す
(sql/seed/dtb-system-master.sql の committed hash は必ず上書きされる)。
公開デプロイでは両方設定する。 docker-compose.override.yml などに置き、
リポジトリには commit しない。
# docker-compose.override.yml(デモホスト側のみ。コミットしない)
services:
app:
environment:
BEMART_DEMO_MEMBER_PASSWORD: "…"
BEMART_DEMO_ADMIN_PASSWORD: "…"
設定後は一度リセット(下記)を回すと、その値がデータベースに反映される。 README にログイン情報は書かない。
コンテキストと 2 要素認証
APP_CONTEXT は prod-html-eccube-sql-hal-app。prod トークンが BEAR の ProdModule を
入れるので、① 未マップ例外は message と logref だけの本番エラーページになり
スタックトレースや絶対パスを返さない ② OPTIONS イントロスペクションが 405 になる
③ DI がコンパイルされる。docker/php.ini が display_errors を切り、
PHP_CLI_SERVER_WORKERS が php -S の単一プロセス化を緩和する。
prod コンテキストでは開発用 2FA バイパス(固定コード 123456)が効かない
(src/Dev/DevLogin::active() が prod を含む文脈を拒否する)。管理画面の初回ログイン後に
表示される鍵を認証アプリに登録して 6 桁コードを入力する。リセットで登録は消えるので、
リセット後の最初の管理操作では再登録が必要。
定期リセット
デモは読み取り専用にしない。チェックアウト・会員登録・管理画面の更新が動かない デモは、移植の成果を何も示さないからである。代わりに、書き込みを許したまま 一定間隔で seed 状態へ戻す。
docker compose exec -T app docker/demo-reset.sh
docker/demo-reset.sh は docker/seed.sh(entrypoint と共有)を使って
schema → master → dev fixture → カタログ → デモ資格情報の順に作り直す。
データベースは DROP されるので、残したいデータがある用途には使わない。
デモホスト(Oracle Cloud VM)には以下を導入済み。1 日 1 回 18:00 UTC(03:00 JST)に走る。
この間隔で足りるのは、訪問者が触れる書き込みが DB 行に限られるからである。管理画面から
書けるのは商品・受注・マスタ等の行だけで、Twig の自動エスケープを通るので残るのは
見た目の汚れだけ。サイトを壊す経路は移植されていない — メンテナンスモードは
var/tmp のフラグを書くだけで storefront に強制されず(EccubeMaintenanceMode)、
CSS/JS 編集は var/tmp の JSON に入るだけで公開ページに出力されず、テンプレート追加は
zip を展開せず名前とサイズだけを記録し、move_uploaded_file はリポジトリに存在しない。
この前提が変わったら間隔を短くする。
# /etc/systemd/system/bemart-demo-reset.service
[Unit]
Description=Reset the BeMart public demo to its seeded state
After=docker.service
Requires=docker.service
[Service]
Type=oneshot
User=ubuntu
WorkingDirectory=/home/ubuntu/BeMart
ExecStart=/usr/bin/docker compose exec -T app docker/demo-reset.sh
TimeoutStartSec=900
# /etc/systemd/system/bemart-demo-reset.timer
[Unit]
Description=Periodic BeMart demo reset
[Timer]
OnCalendar=*-*-* 18:00:00
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl enable --now bemart-demo-reset.timer
systemctl list-timers bemart-demo-reset.timer
リセットは setup-db.sh がデータベースを DROP するところから始まる。
所要はデモ VM で 14〜34 秒(3,000 商品の投入が大半)、ローカルの Docker で約 4 秒。
リセット中の /products を 0.8 秒間隔で 40 回叩いた計測では、全て 200 で
商品カードも 20 枚のままだった。訪問者に見える停止は観測できていない。