このドキュメントは、予約システムの完全なデプロイ手順を、開発環境と本番環境の両方を対象に説明するものです。
booking-deploy/
├── compose/ # Docker Compose 設定ファイル
│ ├── docker-compose.dev.yml # 開発環境オーケストレーション
│ ├── docker-compose.prod.yml # 本番環境オーケストレーション
│ ├── dev.compose.env.example # 開発環境変数のテンプレート
│ └── prod.compose.env.example # 本番環境変数のテンプレート
├── env/ # アプリケーション環境変数
│ ├── dev/ # 開発環境
│ │ ├── backend.env.example
│ │ └── frontend.env.example
│ └── prod/ # 本番環境
│ ├── backend.env.example
│ └── frontend.env.example
└── scripts/ # デプロイスクリプト
└── verify-images.sh # イメージ検証スクリプト
- Docker Engine 20.10+ または Docker Desktop
- Docker Compose v2+ (推奨) または docker-compose v1.29+
# テンプレートファイルをコピー
cd booking-deploy
# Compose 用環境変数
cp compose/dev.compose.env.example compose/dev.compose.env
# 必要に応じて dev.compose.env を編集し、Docker Hub のイメージアドレスを更新
# アプリケーション用環境変数
cp env/dev/backend.env.example env/dev/backend.env
cp env/dev/frontend.env.example env/dev/frontend.env
# .env ファイルを編集し、実際の値(JWT_SECRET など)を設定cd booking-deploy
cp compose/prod.compose.env.example compose/prod.compose.env
cp env/prod/backend.env.example env/prod/backend.env
cp env/prod/frontend.env.example env/prod/frontend.env
# 重要: 本番環境では強いパスワードと本物のシークレットが必要予約システムの CI/CD パイプラインは、複数種類の Docker イメージタグを自動生成します。それぞれ目的と信頼性の特性が異なります。
| タグ種別 | 形式例 | 変更可否 | 推奨用途 | 信頼性 |
|---|---|---|---|---|
| ブランチタグ | dev, main |
可変 — プッシュのたびに更新 | 迅速な開発、統合テスト | 低 — 本番には不適 |
| コミットタグ | dev-abc123, main-def456 |
不変 — 特定コミットに紐付け | 信頼性のあるデプロイ、ロールバック、監査 | 高 — 本番推奨 |
| セマンティックバージョン | v1.0.0, v1.2.3 |
不変 — バージョン付けされたリリース | 公式リリース、バージョン管理 | 最高 — 本番のベストプラクティス |
| PR タグ | pr-123 |
可変 — PR のビルド | PR 検証、コードレビュー | 低 — 一時用途のみ |
| latest | latest |
可変 — main の最新 | 開発便宜 | 低 — 本番禁止 |
-
開発環境:
- 迅速なイテレーション:
devブランチタグを使用 - 信頼性のあるテスト:
dev-<commit-hash>コミットタグを使用
- 迅速なイテレーション:
-
本番環境:
- 不変タグを必ず使用: コミットタグまたはセマンティックバージョンタグ
- 緊急修正:
main-<commit-hash>を使用 - 公式リリース:
v1.0.0のようなセマンティックバージョンを使用 - 禁止:
mainまたはlatestタグ
すべてのイメージは実際のデプロイトポロジーで検証されます:
- ✅ PostgreSQL と Redis の依存関係を含む
- ✅ データベースマイグレーションを実行
- ✅ ヘルスエンドポイント(
/v1/health)を検証 - ✅ データベースと Redis の接続状態を確認
- ✅ フロントエンドのアクセシビリティを検証
イメージタグは GitHub Actions のワークフローにより自動生成されます:
- バックエンドイメージ: booking-backend/.github/workflows/backend-image.yml
- フロントエンドイメージ: booking-frontend/.github/workflows/frontend-image.yml
- マイグレーションイメージ: 専用の
booking-backend-migrationイメージ
以前のバージョンへロールバックするには:
- 以前のコミットタグ(例:
main-abc123def)を確認 prod.compose.envファイル内のイメージタグを更新- 更新した設定でサービスを再起動:
docker compose -f compose/docker-compose.prod.yml --env-file compose/prod.compose.env up -d
# 特定のコミットへロールバック
BACKEND_IMAGE=docker.io/cho-geer/booking-backend:main-previous-commit
BACKEND_MIGRATION_IMAGE=docker.io/cho-geer/booking-backend-migration:main-previous-commit
FRONTEND_IMAGE=docker.io/cho-geer/booking-frontend:main-previous-commit# booking-deploy ディレクトリへ移動
cd booking-deploy
# 開発環境を起動
docker compose -f compose/docker-compose.dev.yml --env-file compose/dev.compose.env up -dup -d の動作:
- データベースマイグレーションを実行(独立したマイグレーションサービスが
up時に自動実行) - すべてのサービスを開始(PostgreSQL、Redis、バックエンド、フロントエンド)し、バックグラウンドで起動し続けます
- ヘルスチェックで依存サービスの起動完了を待機してから、後続のサービスを起動します
既存イメージを最新に更新してから起動する場合は、事前に pull を実行します:
docker compose -f compose/docker-compose.dev.yml --env-file compose/dev.compose.env pull起動後の確認先:
- バックエンドヘルスエンドポイント:
http://localhost:3001/v1/health - バックエンド Swagger:
http://localhost:3001/api/docs - フロントエンドページ:
http://localhost:3000
イメージ取得から起動・ヘルス検証までを一時的な起動でまとめて確認する場合は、検証スクリプトを使用します(検証完了後に自動で down します):
./scripts/verify-images.sh dev本番環境(prod)は現行スコープ外です(手順書 §6 で保留中)。prod を復活させる際に、本番デプロイ手順を改めて定義します。
| サービス | イメージ | ポート | 説明 |
|---|---|---|---|
| PostgreSQL | postgres:16 |
5432 | メインデータベース |
| Redis | redis:7-alpine |
6379 | キャッシュとセッションストア |
| Backend | ${BACKEND_IMAGE} |
3001 | NestJS API サービス |
| Frontend | ${FRONTEND_IMAGE} |
3000 | Next.js フロントエンドアプリケーション |
| Migration | ${BACKEND_MIGRATION_IMAGE} |
- | データベースマイグレーションサービス |
- コンテナ化された PostgreSQL の代わりに外部データベース(例: RDS)を使用する場合あり
- 外部 Redis クラスターを使用する場合あり
- ロードバランサーや監視サービスを追加する場合あり
- リソース制限や再起動ポリシーが異なる
デプロイプロセスには、独立した migration サービスが含まれており、以下を保証します:
- マイグレーションはアプリ起動前に実行される
- 失敗時にはデプロイを停止し、アプリが整合性のない DB に接続するのを防ぐ
- 冪等性:
prisma migrate deployは安全に繰り返し実行可能
# 開発環境
docker compose -f compose/docker-compose.dev.yml --env-file compose/dev.compose.env run --rm migration
# 本番環境
docker compose -f compose/docker-compose.prod.yml --env-file compose/prod.compose.env run --rm migration- Backend:
GET /v1/health— アプリ、DB、Redis の状態を返す - PostgreSQL: Docker ヘルスチェックは
pg_isreadyを使用 - Redis: Docker ヘルスチェックは
redis-cli pingを使用
検証スクリプト ./scripts/verify-images.sh dev は以下を自動検証します:
- バックエンドのヘルスエンドポイントが
200 OKを返すこと - Swagger UI にアクセス可能であること
- フロントエンドのホームページにアクセス可能であること
# バックエンドのヘルスチェック
curl http://localhost:3001/v1/health | jq .
# サービスステータスの確認
docker compose -f compose/docker-compose.dev.yml --env-file compose/dev.compose.env psMissing booking-deploy/compose/dev.compose.env
Create it from booking-deploy/compose/dev.compose.env.example
解決策: テンプレートファイルをコピーし、実際の値を入力してください。
Error: P3009: migrate found failed migrations in the target database
解決策:
- データベース接続文字列を確認
- 手動でマイグレーションを修正:
docker compose exec postgres psql -U postgres -d booking_system - マイグレーションログを確認
ヘルスチェックは依存サービスの起動完了を待機します。 解決策:
- サービスログを確認:
docker compose logs backend - データベース接続を確認:
docker compose exec backend npm run prisma:deploy - ポート競合を確認
Error response from daemon: pull access denied for cho-geer/booking-backend
解決策:
- Docker Hub リポジトリが存在し、公開されていることを確認
- もしくはローカルビルドイメージを使うように
compose/dev.compose.envを更新
# 全サービスのログを表示
docker compose -f compose/docker-compose.dev.yml --env-file compose/dev.compose.env logs
# 特定サービスのログを表示
docker compose -f compose/docker-compose.dev.yml --env-file compose/dev.compose.env logs backend
# リアルタイムでログを追跡
docker compose -f compose/docker-compose.dev.yml --env-file compose/dev.compose.env logs -fcompose/dev.compose.envまたはcompose/prod.compose.envのイメージタグを更新- サービスを再起動:
docker compose -f compose/docker-compose.dev.yml --env-file compose/dev.compose.env up -d - 新バージョンの機能を検証
- 環境変数ファイルの古いイメージタグを復元
- サービスを再起動:
docker compose -f compose/docker-compose.dev.yml --env-file compose/dev.compose.env up -d - データベース前方互換性: 古いバージョンのアプリが現在の DB スキーマで動作することを確認
現在のデプロイ戦略はローリング再起動を使用しており、将来的には次のような拡張が可能です:
- ブルーグリーンデプロイ
- カナリーリリース
- Docker Swarm または Kubernetes の利用
.envファイルをバージョン管理に絶対にコミットしない- 本番シークレットにはシークレット管理サービス(例: AWS Secrets Manager)を使用
- JWT シークレットや DB パスワードを定期的にローテーション
- 本番環境には専用ネットワークを使用
- データベースと Redis への外部アクセスを制限
- ファイアウォールルールを有効化
- イメージの脆弱性を定期的にスキャン
- 最小限のベースイメージを使用
- 依存関係を迅速に更新
現在のデプロイは手動起動ですが、将来的に CI/CD パイプラインと統合する予定です:
name: Deploy to Production
on:
push:
tags:
- 'v*'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy to Server
uses: appleboy/ssh-action@v0.1.5
with:
host: ${{ secrets.PROD_HOST }}
username: ${{ secrets.PROD_USER }}
key: ${{ secrets.PROD_SSH_KEY }}
script: |
cd /opt/booking-system/booking-deploy
docker compose -f compose/docker-compose.prod.yml --env-file compose/prod.compose.env up -d本番デプロイには以下を含める必要があります:
- コードレビュー
- 自動テスト合格
- 手動承認
- デプロイ後の検証
# イメージを取得
docker compose -f compose/docker-compose.dev.yml --env-file compose/dev.compose.env pull
# マイグレーションを実行
docker compose -f compose/docker-compose.dev.yml --env-file compose/dev.compose.env run --rm migration
# サービスを起動
docker compose -f compose/docker-compose.dev.yml --env-file compose/dev.compose.env up -d
# サービスを停止
docker compose -f compose/docker-compose.dev.yml --env-file compose/dev.compose.env down
# ステータスを表示
docker compose -f compose/docker-compose.dev.yml --env-file compose/dev.compose.env ps各 .env.example ファイルのコメントを参照してください。
最終更新: 2026-04-08 メンテナー: DevOps チーム