eccube-docker · v1.0.11 · Apache-2.0
脆弱性の告知が来ても、当てるのが怖くて何か月も放置される。原因は「上げると壊れるかもしれない」 「戻し方が分からない」の 2 つです。ここでは本体をイメージに焼き、あなたのコードだけを git で 持つ。だから上げるのはイメージを引き直すだけで、退避してから確かめ、 ダメなら何も変えずに止まる。インストールもサーバー移転も同じ考え方で 1 コマンドにしました。
EC-CUBE 本体のパッチ(4.3.1 → 4.3.2 など)も、PHP や拡張の更新も、やることは同じ 2 つ。プラグインの移植が要るのはメジャー・マイナー(4.3 → 4.4)だけです。
bin/self-update.sh
PHP・拡張・compose・スクリプトが新しいリリースに揃う。差分は git で見えるので、何が変わるか分かってから進める。
bin/upgrade.sh ~4.3.0 --prod
退避 → 新しい本体でプラグインが読めるかを稼働中に触る前に確認 → メンテナンス表示 → migration → 疎通。途中で失敗したら何も変えずに止まる。
EC-CUBE の中身を直接編集した環境は、上げるたびに「どこを直したか」の調査から始まります。ここでは置き場所が最初から分かれています。
app/Customize/)app/template/)html/user_data/)app/Plugin/ ほか)パッチを当てても1 ファイルも触られない。上書きされる心配がないので、当てる前に「どこを直したか」を思い出す必要がない。
手で編集しないので、新しいイメージを引き直すだけで新しくなる。だからパッチが出たその日に当てられる。本体を編集した環境ではこれができない。
bin/theme.sh diff と bin/plugin.sh template diff が、本体側で変わったファイルを上げたあとに挙げます。
PHP・EC-CUBE 本体・この環境自体は、別々に上げ下げできます。どれもデータ(受注・会員・商品・画像)はそのままです。
| 変えたいもの | やること | かかる時間 |
|---|---|---|
| PHP 8.2 → 8.3 など |
.env のタグの php8.2 を php8.3 に書き換えてdocker compose pull ec-cube && docker compose up -d |
約 20 秒 戻すのも同じ |
| EC-CUBE 本体 4.3.1 → 4.3.2 など |
bin/upgrade.sh ~4.3.0 --prod |
数分 失敗したら何も変えずに止まる |
| この環境 bin/ や compose |
bin/self-update.sh |
1 分 差分を git で見てから commit |
vendor はボリュームの中にあります。だからイメージを差し替えても入れ替わるのは PHP だけで、店のデータにも本体のバージョンにも触りません(作り直されるのはアプリのコンテナ 1 つ、約 20 秒)。合わない組み合わせのタグは存在しないので、壊れる前に pull が失敗します。選べる PHP は下の表のとおりです。
左は実際によく聞く声、右はこの環境がどう片付けるか。ひとつでも当たれば、続きを読む価値があります。
店の担当者 / 引き継いだ人
「脆弱性の案内が来たけど、上げるのが怖くてそのまま。PHP も古いと言われた」 制作会社に頼むと数十万で数週間。自分でやると壊れそうで、戻し方も分からない。
バックアップを取り、新しい本体でプラグインが読めるかを稼働中の環境に触る前に確かめ、ダメなら何も変えずに止まります。スキーマの差分に「列の削除」が混じっていれば、それも止まる。
bin/upgrade.sh ~4.3.2 --prod
初めて自分で公開する人
「サーバーは借りた。でもドメインと SSL の設定で止まっている。ポートを開けるのも怖い」 A レコード、証明書の更新、ファイアウォール。どれか 1 つ間違えると、サイトが出ないか、危ない状態で出る。
Cloudflare の画面でトンネルを作り、公開ホスト名に shop.example.com → http://nginx:80 と書く。あとは発行されたトークンを .env に 1 行。サーバー側はポートを開けず、A レコードも証明書も触らない(HTTPS は Cloudflare が終端し、更新も向こうがやる)。既定の公開方式なので、追加の設定はこれだけです。
COMPOSE_PROFILES=tunnel
TUNNEL_TOKEN=eyJhIjoi... # Cloudflare Zero Trust で発行
引き継いだ人
「前の会社が作ったサイト。直したのに反映されない。何がどこにあるか分からない」 キャッシュを消しても変わらない。エラーも出ない。触るのが怖い。
本番モードの EC-CUBE は、コードを直しても例外も 500 も出さずに古いまま動き続けます。doctor が残骸の掃除・無効プラグインの検出・キャッシュの組み立て直し・疎通確認までやり、何が悪いかを出します。
本体とあなたのコードは置き場が分かれています。どこを直せばいいかで迷わない。
bin/plugin.sh doctor
レンタルサーバーから出たい人
「共用サーバーで始めたけど、もう上げられない。VPS に移したい。でも画像と DB とテンプレが散らばっている」 移転の手順を検索すると、人によって言うことが違う。
DB・画像・管理画面が書いたファイル・設定の 4 点セットを 1 コマンドで退避。新しいサーバーでは clone → init → restore。同じ手順がどの VPS でも通ります。
bin/backup.sh
# 新しいサーバーで
bin/init.sh && bin/restore.sh backups/<日時>
制作会社 / フリーランス
「案件ごとにサーバーの手順が違う。前と同じにならない。保守が赤字」 本番の反映で毎回ひやひやする。メンテナンス表示を出し忘れる。
退避 → メンテナンス表示 → 取り込み → DB 更新 → キャッシュ → 確認 → 解除。失敗したらメンテナンス表示のまま止まり、壊れた画面をお客さんに出しません。どの案件でも同じ手順。
bin/deploy.sh --remote=shop:/srv/myshop
プラグイン開発者
「本番と同じ環境で試したい。テンプレの上書きと更新で毎回悩む」 写しを置いたら、プラグインを更新しても古いほうが勝ち続けた。
private リポジトリから clone して install → enable まで 1 コマンド。テンプレは app/template/plugin/ に写して直し、プラグインを更新したら「自分が変えた/上流が変わった/衝突」を分けて出します。
bin/plugin.sh add git@github.com:you/MyPlugin.git bin/plugin.sh template add MyPlugin admin/config.twig
直す場所(手元)と動かす場所(サーバー)を分ける。この環境の全部です。
bin/init.sh # 初回だけ。終わると URL とログイン情報が表示されるgit add -A && git commit -m "何を直したか" && git push
bin/deploy.sh --remote=shop:/srv/myshop
手元から送るので、サーバーに git も GitHub の鍵も要りません(最初の 1 回は bin/bootstrap-server.sh が Docker まで入れる)。数分かかります。終わったらお店を開いて目で確かめる。
本番には main の先頭と同じものしか送れません。出る前に「何が出るか」を見せ、プロジェクト名を打つまで何も変えない。見るだけなら --check。
エンジニアが直し、担当者が承認して、本番へ出す。「エンジニアが勝手に出す」と「担当者がうっかり出す」を、別々の壁で止めます。どれか 1 枚が無くても残りは効く。
bin/setup.sh protect
PR 必須、担当者(CODEOWNERS)の承認必須、force push と削除の禁止。管理者も例外なし。非公開リポジトリは GitHub の有料プランが要ります(無ければ②③だけで運用)。
bin/deploy.sh --remote=shop:/srv/myshop
✗ いまのブランチは feature です。出せるのは main だけ別のブランチ、コミットしていない変更、push していないコミット。どれか 1 つでも本番へは送らない。何もしなくて効きます。
コード: 3f2a1c0 → 9b7e4d2(3 コミット) ⚠ migration が含まれます 続けるなら、プロジェクト名 myshop を入力:
y では通しません。指が覚えて通してしまわないように、プロジェクト名を打つ。誰が・いつ・何を出したかは var/deploy.log に残る。
正直に書きます。合わない人が使うと、お互いに時間を失うので。
bin/setup.sh mail / db が質問に答えるだけで、先に試してから書く)main しか出ない)AGENTS.md が入っていて、やることと絶対にやらないことが書いてある).env に 1 行。どちらも同梱、外部のマネージド DB も可).env に 1 行足す設計です。最初から全部入りではありません。
git clone しません。 リリースの中身をもらって、自分専用の非公開リポジトリとして始めます。
# 配布元の最新リリースの中身をもらう(git の履歴は付いてこない) curl -fsSL https://github.com/kurozumi/eccube-docker/releases/latest/download/eccube-docker.tar.gz | tar -xz mv eccube-docker-* myshop && cd myshop # 自分のリポジトリとして始める(非公開で) git init -b main && git add -A && git commit -m "eccube-docker から開始" gh repo create myshop --private --source=. --push # 動かす(配布イメージを引くので数十秒。PHP はタグで選ぶ) bin/init.sh --image=ghcr.io/kurozumi/eccube-docker/ec-cube:4.3-php8.3
bin/self-update.sh が取り込みます。
配布イメージを使うと、手元でビルドせずに数十秒で立ち上がります(bin/init.sh --image=… か .env の ECCUBE_IMAGE)。PHP はタグで選びます: 4.3-php8.3 のように書くとその PHP、-php を省くと系列の既定。
| 系列 | イメージ(本番はこれ) | 選べる PHP | 備考 |
|---|---|---|---|
| 4.3 | ghcr.io/kurozumi/eccube-docker/ec-cube:4.3 | 8.1† / 8.2 / 8.3 | 推奨 |
| 4.2 | ghcr.io/kurozumi/eccube-docker/ec-cube:4.2 | 8.1† / 8.2 | |
| 4.4 | ghcr.io/kurozumi/eccube-docker/ec-cube:4.4 | 8.2 / 8.3 / 8.4 / 8.5 | 上流の開発ブランチから焼いている。同じものを立てたいなら日付タグで固定 |
イメージは毎週月曜に焼き直され、PHP と OS のセキュリティパッチが入ります。 †PHP 8.1 は 2025 年 12 月で終了しています。OS のパッチは入りますが PHP 自体の修正はもう出ないので、8.1 でしか動かないプラグインが無ければ 8.2 以上を。太字は -php 無しの既定。PHP を選ぶなら 4.4-php8.5 のように書く。同じものを何度も立てたい人は日付タグ 4.3-20260907、リリース時点なら 4.3-v1.0.11。
DB は MariaDB / MySQL(既定)か PostgreSQL。版は .env の MARIADB_VERSION / PG_VERSION。.env の DB_ENGINE で選び、バックアップも引っ越しも同じコマンドで通ります。手元の DB でも、クラウドのマネージド DB でも。
理由を書かない手引きと、理由を書いた文書の 2 段構えです。
登場するものは 5 つ、毎日やることは 3 つ、困ったときは 1 コマンド。理由は書きません。
取得から公開まで。.env の中身、公開方式、プラグインの扱い、デザインを直す場所。
運用中の店を上げる手順と切り戻し。マイナーをまたぐときに黙って壊れる 3 つの型。
down と down -v の違い、消えるコマンド、消したときの復旧。
誰が・何を・どうやって本番へ出すか。3 枚の壁、--check、記録、緊急時、誰に何を渡すか。
5 点セット、送り先、暗号化、引っ越し。bin/setup.sh backup が毎日の cron まで入れる。
一人で使っている限り、この環境は一人分の経験でしか良くなりません。あなたの店で起きたことが、次の人の「黙って壊れる」を一つ減らします。
GITHUB ISSUE · 募集中
「エラーが出た」「この手順で止まった」「こういう構成で使いたい」。どれも歓迎です。うまく書けなくても構いません。実行したコマンドと出た文字をそのまま貼ってください。
bin/plugin.sh doctor の出力と、EC-CUBE と PHP の版CONTACT · 構築・引っ越し・バージョンアップの相談
本番の URL や DB の中身が絡む相談、受託での構築や引っ越し、B2B サイトの構築、プラグイン開発の依頼はメールで受けています。返信は営業日に順次。
作った人: Akira Kurozumi(a-zumi.net)。EC-CUBE のプラグインを作りながら、この環境で自分の店も動かしています。