riceshop を本番 VPS(Linux)へデプロイ・更新するための運用者向け手順書です。初回セットアップと、以後の更新作業をカバーします。
このドキュメントは旧
specs/11_本番環境デプロイ手順書.md(Ver.4.0) を、現行のdocker-compose.yml/Dockerfile/entrypoint.sh/env.production.template/config/settings.pyと照合して再構成したものです。旧手順書との差異・運用上の注意は本文中に「実装メモ」「⚠️」として注記しています。⚠️ 本書は本番環境を操作します。 コマンドの影響範囲(特に DB データの削除)を理解したうえで実行してください。
makemigrations は実行しない。 環境差異による不整合・障害の原因になります。entrypoint.sh が自動化する。 本番用 docker-compose.yml は Dockerfile の ENTRYPOINT(= entrypoint.sh)で起動するため、コンテナ起動時に マイグレーション → 静的ファイル収集 → Gunicorn 起動 が自動実行されます。手動の migrate / collectstatic は不要です。実装メモ:
entrypoint.shはpython manage.py migrate --noinput→python manage.py collectstatic --noinput→exec gunicorn config.wsgi:application --bind 0.0.0.0:8000を順に実行します。docker-compose.ymlのappサービスはcommandを指定せず、Dockerfile のENTRYPOINTをそのまま使います(開発用docker-compose.dev.ymlがentrypointをrunserverに上書きするのとは対照的です → 開発環境構築 §2.3)。
docker と Docker Compose (V2)、git がインストール済み。riceshop ユーザーが docker グループに所属していること。Traefik が稼働し、外部 Docker ネットワーク traefik-net が存在すること(docker-compose.yml が external: true で参照)。riceshop.keinafarm.net の A レコードが VPS の IP を指していること。実装メモ(Traefik 連携):
docker-compose.ymlのappサービスは以下のラベルで Traefik にルーティングされます。Host(riceshop.keinafarm.net)をwebsecureエントリポイントで受け、letsencryptで TLS 証明書を取得、内部ポート 8000 へロードバランスします。appはdefaultとtraefik-netの両ネットワークに参加します。
SSH 接続: SSH クライアントで riceshop(または管理ユーザー経由)でサーバーにログインします。鍵認証を推奨します。
(未実施なら)Docker 実行権限付与: 管理ユーザーで一度だけ実行し、riceshop を docker グループへ追加します。新しいセッションから有効になります。
sudo usermod -aG docker riceshop
sudo su - riceshop # 新セッションで権限を反映
リポジトリをクローン:
cd ~
git clone https://gitea.keinafarm.net/akira/riceshop.git develop/riceshop
cd develop/riceshop
本番用環境変数ファイルを作成: テンプレートをコピーし、プレースホルダーを本番用の安全な値に書き換えます。
cp env.production.template env.production
nano env.production
最低限、以下を実値へ変更します(env.production は Git 管理外)。
| 変数 | 内容 |
|---|---|
DJANGO_SECRET_KEY |
本番用のランダムなシークレットキー(要変更) |
MYSQL_PASSWORD |
本番 DB ユーザーのパスワード(要変更) |
MYSQL_ROOT_PASSWORD |
本番 DB の root パスワード(要変更) |
MYSQL_HOST |
DB 接続先ホスト。テンプレート既定は db(compose の DB サービス名と一致するため通常は変更不要) |
MYSQL_DATABASE / MYSQL_USER |
DB 名・ユーザー名。テンプレート既定値のままで可(必要に応じて変更) |
テンプレートには本番値として DJANGO_DEBUG=False / DJANGO_ALLOWED_HOSTS=riceshop.keinafarm.net / DJANGO_CSRF_TRUSTED_ORIGINS=https://riceshop.keinafarm.net が既に設定されています。
実装メモ(DB 接続先): Django の DB 接続先は
config/settings.pyがMYSQL_HOST(既定db)から決定します。DB 接続エラー時はまずこの値とdbサービスの起動状況を確認してください。
実装メモ(本番セキュリティ):
DJANGO_DEBUG=Falseのときconfig/settings.pyがSECURE_SSL_REDIRECT/SESSION_COOKIE_SECURE/CSRF_COOKIE_SECURE/SECURE_PROXY_SSL_HEADER=('HTTP_X_FORWARDED_PROTO','https')を有効化します。HTTPS 終端は Traefik が担う前提です(→ development/共通基盤 §1.6)。
以降は riceshop ユーザーで、プロジェクトディレクトリ(~/develop/riceshop)で実行します。
ビルドと起動(entrypoint.sh が migrate / collectstatic / Gunicorn を自動実行):
./scripts/deploy-production.sh
このスクリプトは現在の完全な Git コミット ID を Docker イメージへ記録してから起動します。未コミットの変更がある場合は、表示する版と実際の内容が食い違わないようデプロイを中止します。
起動ログ確認(最後に Starting Gunicorn server... が出てエラーがなければ成功。Ctrl+C で抜ける):
docker compose logs -f app
管理者アカウント作成:
docker compose exec app python manage.py createsuperuser
動作確認: ブラウザで https://riceshop.keinafarm.net にアクセスし、ログイン画面が表示されれば成功です。
ソースに修正・機能追加があった場合の通常手順です。
cd ~/develop/riceshop
git pull --ff-only
./scripts/deploy-production.sh
entrypoint.sh が migrate / collectstatic を自動実行します。本番で makemigrations は実行しないでください(§1)。
deploy-production.sh は git rev-parse HEAD で取得した完全なコミット ID を、コンテナ内の APP_VERSION とイメージの OCI revision ラベルへ記録します。通常の更新では必ずこのスクリプトを使い、直接 docker compose up -d --build を実行しないでください。
稼働中のコンテナに記録されたコミット ID は、次の1コマンドで確認できます。
docker compose exec -T app printenv APP_VERSION
イメージ自体に記録された OCI revision ラベルも確認できます。
docker image inspect "$(docker compose images -q app)" --format '{{ index .Config.Labels "org.opencontainers.image.revision" }}'
両方に同じ40文字の Git コミット ID が表示されれば、その版が現在稼働しています。unknown と表示される場合は、旧手順または版情報を指定しない方法でビルドされています。git pull --ff-only の後に ./scripts/deploy-production.sh で再デプロイしてください。
データ移行など特別な管理コマンドが必要な場合は、起動後に手動実行します(→ operations/データ移行)。
⚠️ 注意(破壊的コマンドの例について): 旧手順書は「送料モデル移行時の例」として
docker compose exec app python manage.py clear_ordersを挙げていますが、clear_ordersは注文系データを全削除する破壊的コマンドです(→ development/補足資料 §1.2)。本番では原則実行せず、必要な場合も事前に DB バックアップを取得してください。
| 操作 | コマンド |
|---|---|
| ログ確認 | docker compose logs -f app |
| 稼働版確認 | docker compose exec -T app printenv APP_VERSION |
| 再起動 | docker compose restart |
| 停止(データは保持) | docker compose down |
| 停止+ボリューム削除 | docker compose down -v |
運用メモ(起動順・再起動):
docker-compose.ymlではappがdepends_on: db: condition: service_healthyで MySQL の healthcheck 成功後に起動し、app/dbともrestart: alwaysです。サーバー再起動後やコンテナ異常終了時も自動的に復帰します。障害切り分け時はdocker compose psとdocker compose logs -f appで healthcheck・起動順を確認してください。
⚠️ 重要(本番 DB データの実体は named volume): 本番の
dbサービスはdocker-compose.ymlで named volumericeshop_db_data(riceshop_db_data:/var/lib/mysql)にデータを永続化します。したがってdocker compose down -vを実行すると本番データベースが消去されます。開発環境(./db_dataの bind mount でdown -vでは消えない → 開発環境構築 §5.1)とは挙動が異なります。本番では-vを安易に付けないでください。
clear_orders 等) → development/補足資料元資料: specs/11_本番環境デプロイ手順書.md (Ver.4.0) を現行コード(docker-compose.yml, Dockerfile, entrypoint.sh, env.production.template, config/settings.py)と照合して再構成。サーバー個別の接続手順(SSH クライアント・鍵)は一般化
関連: README, specs棚卸し表, Issue #1