Docker でインストール
公式イメージには nginx、PHP 8.2、MariaDB、Redis が同梱されています。設定は一切不要です。起動してブラウザを開けば、そこにインストーラがあります。
- イメージ:
ghcr.io/lizhipay/acg-faka:latest - 対応アーキテクチャ:
amd64、arm64(ARM サーバーや Apple シリコンの Mac でも動きます) - サイズ:約 265 MB
先に Docker を入れる
すでに入っている場合は読み飛ばしてください。Docker を知らなくても大丈夫です —— 「組み立て済みのマシン」だと考えてください。アプリケーション、PHP、データベース、Redis がすべて中に封じ込められているので、ひとつずつ入れてバージョンを合わせる必要がありません。取得して起動すれば、設定済みのサーバーが手に入ります。
Linux サーバー
SSH で接続し、コマンド 1 行で完了します(Debian / Ubuntu / CentOS いずれも可)。
curl -fsSL https://get.docker.com | shサーバーの回線が遅い場所にある場合はミラーを使います。
curl -fsSL https://get.docker.com | sh -s -- --mirror Aliyun起動して、自動起動も有効にします。
systemctl start docker && systemctl enable docker確認します。バージョンが表示されれば完了です。
docker -vWindows / macOS
Docker Desktop を入れて画面操作で進めます。Windows へインストールを参照してください。
Windows は 64 ビット版 Windows 10 バージョン 2004 以降、または Windows 11 が必要です。インストーラーが WSL 2 も用意します。
インストールできないとき
| 症状 | 対処 |
|---|---|
| スクリプトが止まる/タイムアウトする | 上のミラー版コマンドを使う |
docker: command not found | 反映されていません。SSH を接続し直してください |
Cannot connect to the Docker daemon | サービスが起動していません:systemctl start docker |
| CentOS 7 で入るが起動しない | カーネルが古すぎます。Debian 12 か Ubuntu 22.04 へ |
コマンド 1 行
docker run -d --name faka -p 80:80 -v acg_data:/data --restart unless-stopped ghcr.io/lizhipay/acg-faka:latest20 秒ほど待ってから http://サーバーのIP を開くと、インストーラが表示されます。
データベースの入力欄は空のまま次へ進んでください。同梱のデータベースは作成済みで、ウィザードが自動的に埋めます。
コマンドの各部分の意味
| 部分 | 役割 |
|---|---|
-d | バックグラウンドで実行 |
--name faka | コンテナ名。docker logs faka などで使います |
-p 80:80 | ポートマッピング。最も間違えやすい部分(下記参照) |
-v acg_data:/data | データをボリュームに保存。付けないとアップグレードで消えます |
--restart unless-stopped | サーバー再起動後に自動で立ち上げ直す |
ポートマッピング:-p 80:80
コロンの左がホスト側のポート(ブラウザに入力する方)、右がコンテナ内部のポートです。
コンテナ内部は常に 80 です。右側の 80 は絶対に変更しないでください。
サーバーの 80 番が他のサイトで使われている場合は、左側を変更します。
docker run -d --name faka -p 8080:80 -v acg_data:/data --restart unless-stopped ghcr.io/lizhipay/acg-faka:latestこのときアクセス先は http://サーバーのIP:8080 になります。
ページが開けないときは、9 割がここが逆になっているか、ホスト側のポートが使用中です。
-p 8080:80で試してください。クラウドサーバーではセキュリティグループでの開放も必要です。
データボリューム:-v acg_data:/data
コンテナ自体は使い捨てで、削除すれば消えます。しかしデータベース・設定ファイル・アップロードした画像はすべて /data にあります。このボリュームさえ残っていれば、コンテナを削除しても、イメージを入れ替えても、バージョンを上げてもデータは残ります。
この指定を省くと、コンテナを消した瞬間にすべて失われます。
アップグレード
プログラム自体は管理画面左下のバージョン番号をクリックすればオンラインで更新できます。通常コンテナに触れる必要はありません。
イメージを入れ替える場合:
docker pull ghcr.io/lizhipay/acg-faka:latest
docker stop faka && docker rm faka
docker run -d --name faka -p 80:80 -v acg_data:/data --restart unless-stopped ghcr.io/lizhipay/acg-faka:latest-v acg_data:/data が同じであれば、データは 1 件も失われません。
よく使うコマンド
docker logs -f faka # ログ。問題が起きたらまずこれ
docker restart faka # 再起動
docker exec -it faka bash # コンテナ内部へ
docker stop faka # 停止HTTPS をコマンド 1 行で
イメージには nginx と certbot が同梱されているため、証明書はコンテナの中で発行します。パネルも別立てのリバースプロキシも不要です。
前提
| 満たすべき条件 | やること |
|---|---|
| ドメインがこのサーバーに向いている | ドメイン事業者で A レコードをサーバー IP に向ける |
| 80 と 443 が外部から到達できる | クラウドではセキュリティグループで両方を開放 |
| コンテナが 80 と 443 を公開している | 次の手順を参照 |
手順 1:80 と 443 の両方を公開する
最初に -p 80:80 だけで起動していた場合、443 は塞がっています。コンテナを作り直してください(データはボリュームにあるので消えません)。
docker stop faka && docker rm faka
docker run -d --name faka -p 80:80 -p 443:443 -v acg_data:/data --restart unless-stopped ghcr.io/lizhipay/acg-faka:latest手順 2:証明書を発行する
ドメインとメールアドレスを自分のものに置き換えて実行します。
docker exec faka acg-ssl shop.abc.com [email protected]✔ 配好了:https://shop.abc.com と出れば完了です。ブラウザで開くと鍵マークが付きます。
このコマンドは、Let's Encrypt への証明書申請 → nginx の HTTPS 設定生成 → nginx リロード、の 3 つをまとめて行います。設定ファイルを編集する必要はありません。
メールアドレスは Let's Encrypt からの有効期限通知に使われます。実際に受け取れるものを指定してください。
手順 3:自動更新を設定する
Let's Encrypt の証明書は 90 日で切れます。ホスト側に毎日実行の cron を追加します。
(crontab -l 2>/dev/null; echo "0 3 * * * docker exec faka acg-ssl-renew") | crontab -残り 30 日を切ったときだけ実際に更新されるため、毎日実行してもレート制限には掛かりません。
複数のドメイン
ドメインを並べて書き、最後にメールアドレスを置きます。すべて 1 枚の証明書にまとまります。
docker exec faka acg-ssl abc.com www.abc.com shop.abc.com [email protected]メインドメインと www をまとめて発行するのが一般的で、どちらのアドレスでも警告なしに開けます。
後からドメインを足すときは、すべてのドメインを並べて実行し直してください。 追加分だけ書くと設定ごと置き換わり、書かなかったドメインが証明書から外れます。
1 つでも解決しないドメインがあると、証明書全体が失敗します。 先にすべての A レコードをこのサーバーへ向けてください。
サブストア用のワイルドカード
*.abc.comはこの方法では取得できません。Let's Encrypt はワイルドカードを DNS 認証でしか発行しないためです。ワイルドカード証明書を参照してください。
HTTPS を強制する
既定で有効です。 証明書を発行した時点で http:// は https:// へ 301 転送されます。ほかに設定することはありません。
転送を止めたいとき(例:前段の CDN が http でオリジンを取得していて、強制すると無限リダイレクトになる場合):
docker exec faka acg-ssl abc.com www.abc.com [email protected] --no-redirectさらに踏み込むなら HSTS を付けます。ブラウザがこのドメインへの http を 1 年間拒否するようになり、最初の 301 すら不要になります。
docker exec faka acg-ssl abc.com www.abc.com [email protected] --hstsHSTS を有効にすると1 年間 http に戻せません。ブラウザがアクセスそのものを拒否します。HTTPS を恒久的に使うと決めてから有効にしてください。
すでに証明書を持っている場合(Cloudflare オリジン証明書/購入した証明書)
Let's Encrypt で取得する必要はありません。手元の証明書をそのまま入れられます。まずホスト側で 2 つのファイルをコンテナへコピーします。
docker cp cert.pem faka:/tmp/
docker cp key.pem faka:/tmp/そのうえでインストールします。
docker exec faka acg-ssl-import --cert /tmp/cert.pem --key /tmp/key.pemドメインの指定は不要です。 証明書から読み取ります。ワイルドカード *.abc.com も正しく認識されます。手動で指定するときは後ろに並べてください(ワイルドカードは引用符で囲みます)。
docker exec faka acg-ssl-import --cert /tmp/cert.pem --key /tmp/key.pem abc.com '*.abc.com'--no-redirect と --hsts は acg-ssl と同じように使えます。
サブストア問題の答えがこれです。
acg-sslは Let's Encrypt の HTTP 認証なのでワイルドカードを取得できませんが、Cloudflare のオリジン証明書は最初から*.abc.comを含むため、取り込めばすべてのサブストアドメインを一度にカバーできます。
インストール前に、よくある 3 つの誤りを弾きます:証明書と秘密鍵が対になっていない(nginx が起動しなくなります)、証明書の期限切れ、中間証明書が付いていない(デスクトップでは正常に見えても Android や古いクライアントで失敗します)。
この証明書は自動更新されません。
acg-ssl-renewが扱うのは Let's Encrypt で発行したものだけです。商用証明書は期限前に新しいファイルで同じコマンドを実行し直してください。Cloudflare のオリジン証明書は既定で 15 年なので、ほぼ気にする必要はありません。
CDN の下で使う(Cloudflare など)
3 点あります。どれか 1 つでも欠けると不具合になります。
1. オリジンへの接続方式を合わせる。 Cloudflare の SSL モードは フル(厳密)/ Full (strict) にし、上で入れたオリジン証明書と組み合わせます。「フレキシブル」(CDN からオリジンへ http で接続)を選んだままサイト側で HTTPS を強制すると、無限リダイレクトになります。その場合は --no-redirect を付けて実行し直してください。
2. Cloudflare のオリジン証明書は CDN 経由でのみ有効です。 公的に信頼された証明書ではないため、DNS レコードは**プロキシ有効(オレンジの雲)**のままにしてください。グレー(DNS のみ)に変えた瞬間、ブラウザは証明書エラーを出します。
3. 実 IP の設定をしないと、注文の IP がすべて CDN のものになります。 管理画面の サイト設定 → セキュリティ で:
- IP 取得方法を
CF-Connecting-IPに(他の CDN では通常X-Forwarded-For) - 信頼するプロキシ IP に CDN の送出 IP レンジを記入。Cloudflare の一覧は cloudflare.com/ips にあります
「IP 取得方法」だけ変えても効きません。 信頼するプロキシが空のとき、プログラムは転送ヘッダーを一切信用せず、接続元アドレス(CDN のもの)に戻ります。ヘッダー偽装による IP 詐称を防ぐための仕様で、不具合ではありません。サイト設定を参照してください。
アップグレードしても残りますか
残ります。証明書と nginx 設定はデータボリュームの /data/ssl と /data/nginx にあるので、イメージを入れ替えてもコンテナを作り直しても保持されます。再発行は不要です。
失敗するとき
コマンドが理由を表示します。よくあるのは次の 3 つです。
| 表示 | 原因 |
|---|---|
| 認証失敗/接続タイムアウト | ドメインがまだこのサーバーに向いていない、または DNS 未反映(数分待って再試行) |
| 同上 | ポート 80 が閉じている。セキュリティグループで開放を |
| 同上 | コンテナがポート 80 を公開していない(-p 80:80 が無い) |
詳細ログはコンテナ内にあります。
docker exec faka tail -30 /data/ssl/logs/letsencrypt.logドメインを変更する
手順 2 をもう一度実行するだけです。新しい設定が古いものを置き換えます(複数ドメインの場合は全部を並べてください。新しい 1 つだけではいけません)。
docker exec faka acg-ssl 新しいドメイン [email protected]すでにリバースプロキシがある場合
サーバー上で別のサイトが動いていてポート 80 が使用中なら、証明書はその層に任せ、コンテナは内部ポート(例:-p 8080:80)だけ公開してプロキシします。この場合は acg-ssl を実行しないでください。
プロキシは次の 3 つのヘッダーを転送する必要があります。無いと注文の IP がすべてプロキシのアドレスになります。
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;自前の MySQL / Redis を使う
接続情報を環境変数で渡すと、同梱データベースは自動的にスキップされます。
docker run -d --name faka -p 80:80 -v acg_data:/data \
-e ACG_DB_HOST=192.168.1.10 \
-e ACG_DB_PORT=3306 \
-e ACG_DB_DATABASE=faka \
-e ACG_DB_USERNAME=faka \
-e ACG_DB_PASSWORD=パスワード \
-e ACG_REDIS_HOST=192.168.1.11 \
--restart unless-stopped ghcr.io/lizhipay/acg-faka:latest| 変数 | 説明 |
|---|---|
ACG_DB_HOST | データベースのホスト。指定すると同梱データベースを使いません |
ACG_DB_PORT | ポート。既定は 3306 |
ACG_DB_DATABASE | データベース名 |
ACG_DB_USERNAME / ACG_DB_PASSWORD | 認証情報 |
ACG_DB_PASSWORD_FILE | ファイルからパスワードを読む。Docker secrets 用 |
ACG_DB_PREFIX | テーブル接頭辞。既定は acg_ |
ACG_REDIS_HOST | 指定するとセッションを Redis に保存。未指定ならファイル |
ACG_REDIS_PORT / ACG_REDIS_DB | 既定は 6379 / 0 |
データベースユーザーの権限は
'faka'@'localhost'ではなく'faka'@'%'で付与してください。MySQL のlocalhostは Unix ソケット接続にしか一致せず、コンテナからは TCP 接続になるため、localhostでは接続できません。
docker compose
リポジトリには docker-compose.yml が含まれており、3 つのコンテナ(本体 + MySQL 5.7 + Redis 7.2)をランダムなデータベースパスワードで起動します。
docker compose up -dヘルスチェック
イメージにはヘルスチェックが組み込まれており、docker ps の STATUS 列に healthy と表示されます。nginx と PHP の両方が生きていることを同時に確認します。
docker inspect --format='{{.State.Health.Status}}' fakaうまくいかないとき
| 症状 | 原因 |
|---|---|
| ブラウザで開けない | ポートマッピングが逆、またはクラウドのセキュリティグループが未開放 |
| 起動直後に 502 | データベースを初期化中です。20 秒待って再読み込み |
| アップグレード後にデータが消えた | 最初に -v acg_data:/data を付けていなかった |
| コンテナが再起動を繰り返す | docker logs faka でログを確認 |
詳しくはトラブルシューティングを参照してください。
