Skip to content

Docker でインストール

公式イメージには nginx、PHP 8.2、MariaDB、Redis が同梱されています。設定は一切不要です。起動してブラウザを開けば、そこにインストーラがあります。

  • イメージ:ghcr.io/lizhipay/acg-faka:latest
  • 対応アーキテクチャ:amd64arm64(ARM サーバーや Apple シリコンの Mac でも動きます)
  • サイズ:約 265 MB

先に Docker を入れる

すでに入っている場合は読み飛ばしてください。Docker を知らなくても大丈夫です —— 「組み立て済みのマシン」だと考えてください。アプリケーション、PHP、データベース、Redis がすべて中に封じ込められているので、ひとつずつ入れてバージョンを合わせる必要がありません。取得して起動すれば、設定済みのサーバーが手に入ります。

Linux サーバー

SSH で接続し、コマンド 1 行で完了します(Debian / Ubuntu / CentOS いずれも可)。

bash
curl -fsSL https://get.docker.com | sh

サーバーの回線が遅い場所にある場合はミラーを使います。

bash
curl -fsSL https://get.docker.com | sh -s -- --mirror Aliyun

起動して、自動起動も有効にします。

bash
systemctl start docker && systemctl enable docker

確認します。バージョンが表示されれば完了です。

bash
docker -v

Windows / 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 行

bash
docker run -d --name faka -p 80:80 -v acg_data:/data --restart unless-stopped ghcr.io/lizhipay/acg-faka:latest

20 秒ほど待ってから http://サーバーのIP を開くと、インストーラが表示されます。

データベースの入力欄は空のまま次へ進んでください。同梱のデータベースは作成済みで、ウィザードが自動的に埋めます。

コマンドの各部分の意味

部分役割
-dバックグラウンドで実行
--name fakaコンテナ名。docker logs faka などで使います
-p 80:80ポートマッピング。最も間違えやすい部分(下記参照)
-v acg_data:/dataデータをボリュームに保存。付けないとアップグレードで消えます
--restart unless-stoppedサーバー再起動後に自動で立ち上げ直す

ポートマッピング:-p 80:80

ポートマッピングの図ポートマッピングの図

コロンの左がホスト側のポート(ブラウザに入力する方)、右がコンテナ内部のポートです。

コンテナ内部は常に 80 です。右側の 80 は絶対に変更しないでください。

サーバーの 80 番が他のサイトで使われている場合は、左側を変更します。

bash
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 にあります。このボリュームさえ残っていれば、コンテナを削除しても、イメージを入れ替えても、バージョンを上げてもデータは残ります。

この指定を省くと、コンテナを消した瞬間にすべて失われます。

アップグレード

プログラム自体は管理画面左下のバージョン番号をクリックすればオンラインで更新できます。通常コンテナに触れる必要はありません。

イメージを入れ替える場合:

bash
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 件も失われません。

よく使うコマンド

bash
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 は塞がっています。コンテナを作り直してください(データはボリュームにあるので消えません)。

bash
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:証明書を発行する

ドメインとメールアドレスを自分のものに置き換えて実行します。

bash
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 を追加します。

bash
(crontab -l 2>/dev/null; echo "0 3 * * * docker exec faka acg-ssl-renew") | crontab -

残り 30 日を切ったときだけ実際に更新されるため、毎日実行してもレート制限には掛かりません。

複数のドメイン

ドメインを並べて書き、最後にメールアドレスを置きます。すべて 1 枚の証明書にまとまります。

bash
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 でオリジンを取得していて、強制すると無限リダイレクトになる場合):

bash
docker exec faka acg-ssl abc.com www.abc.com [email protected] --no-redirect

さらに踏み込むなら HSTS を付けます。ブラウザがこのドメインへの http を 1 年間拒否するようになり、最初の 301 すら不要になります。

bash
docker exec faka acg-ssl abc.com www.abc.com [email protected] --hsts

HSTS を有効にすると1 年間 http に戻せません。ブラウザがアクセスそのものを拒否します。HTTPS を恒久的に使うと決めてから有効にしてください。

すでに証明書を持っている場合(Cloudflare オリジン証明書/購入した証明書)

Let's Encrypt で取得する必要はありません。手元の証明書をそのまま入れられます。まずホスト側で 2 つのファイルをコンテナへコピーします。

bash
docker cp cert.pem faka:/tmp/
docker cp key.pem faka:/tmp/

そのうえでインストールします。

bash
docker exec faka acg-ssl-import --cert /tmp/cert.pem --key /tmp/key.pem

ドメインの指定は不要です。 証明書から読み取ります。ワイルドカード *.abc.com も正しく認識されます。手動で指定するときは後ろに並べてください(ワイルドカードは引用符で囲みます)。

bash
docker exec faka acg-ssl-import --cert /tmp/cert.pem --key /tmp/key.pem abc.com '*.abc.com'

--no-redirect--hstsacg-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 が無い)

詳細ログはコンテナ内にあります。

bash
docker exec faka tail -30 /data/ssl/logs/letsencrypt.log

ドメインを変更する

手順 2 をもう一度実行するだけです。新しい設定が古いものを置き換えます(複数ドメインの場合は全部を並べてください。新しい 1 つだけではいけません)。

bash
docker exec faka acg-ssl 新しいドメイン [email protected]

すでにリバースプロキシがある場合

サーバー上で別のサイトが動いていてポート 80 が使用中なら、証明書はその層に任せ、コンテナは内部ポート(例:-p 8080:80)だけ公開してプロキシします。この場合は acg-ssl を実行しないでください

プロキシは次の 3 つのヘッダーを転送する必要があります。無いと注文の IP がすべてプロキシのアドレスになります。

nginx
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 を使う

接続情報を環境変数で渡すと、同梱データベースは自動的にスキップされます。

bash
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)をランダムなデータベースパスワードで起動します。

bash
docker compose up -d

ヘルスチェック

イメージにはヘルスチェックが組み込まれており、docker ps の STATUS 列に healthy と表示されます。nginx と PHP の両方が生きていることを同時に確認します。

bash
docker inspect --format='{{.State.Health.Status}}' faka

うまくいかないとき

症状原因
ブラウザで開けないポートマッピングが逆、またはクラウドのセキュリティグループが未開放
起動直後に 502データベースを初期化中です。20 秒待って再読み込み
アップグレード後にデータが消えた最初に -v acg_data:/data を付けていなかった
コンテナが再起動を繰り返すdocker logs faka でログを確認

詳しくはトラブルシューティングを参照してください。

MIT ライセンスで公開