diff --git a/deploy_local.sh b/deploy_local.sh new file mode 100755 index 0000000..bfa87ad --- /dev/null +++ b/deploy_local.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# ローカル本番同等環境の起動スクリプト +# 使用: bash deploy_local.sh +set -e + +cd "$(dirname "$0")" + +echo "=== KeinaSystem ローカル本番環境 ===" + +# .env ファイル確認 +if [ ! -f ".env" ]; then + echo "エラー: .env ファイルがありません" + echo " .env.production.example を .env にコピーして値を設定してください" + exit 1 +fi + +echo "[1/4] 停止..." +docker compose -f docker-compose.local.yml down + +echo "[2/4] ビルド..." +docker compose -f docker-compose.local.yml build + +echo "[3/4] 起動..." +docker compose -f docker-compose.local.yml up -d + +echo "[4/4] マイグレーション..." +sleep 5 +docker compose -f docker-compose.local.yml exec backend python manage.py migrate + +echo "" +echo "=== 起動完了 ===" +docker compose -f docker-compose.local.yml ps +echo "" +echo " フロントエンド: http://localhost:3000" +echo " バックエンドAPI: http://localhost:8000/api/" +echo "" +echo "DBをサーバーと同期する場合: bash sync_db.sh" diff --git a/docker-compose.local.yml b/docker-compose.local.yml new file mode 100644 index 0000000..22da335 --- /dev/null +++ b/docker-compose.local.yml @@ -0,0 +1,59 @@ +# ローカルでの本番同等テスト用 +# Traefikなし、ポート直接公開、本番用Dockerfileを使用 +# 使用: docker compose -f docker-compose.local.yml up -d + +services: + db: + image: postgis/postgis:16-3.4 + container_name: keinasystem_db + environment: + POSTGRES_DB: keinasystem + POSTGRES_USER: keinasystem + POSTGRES_PASSWORD: ${DB_PASSWORD} + ports: + - "5432:5432" + volumes: + - postgres_data_local:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U keinasystem -d keinasystem"] + interval: 5s + timeout: 5s + retries: 5 + + backend: + build: + context: ./backend + dockerfile: Dockerfile.prod + container_name: keinasystem_backend + environment: + DB_NAME: keinasystem + DB_USER: keinasystem + DB_PASSWORD: ${DB_PASSWORD} + DB_HOST: db + DB_PORT: 5432 + SECRET_KEY: ${SECRET_KEY} + DEBUG: "False" + ALLOWED_HOSTS: localhost,127.0.0.1 + CORS_ALLOWED_ORIGINS: http://localhost:3000 + MAIL_API_KEY: ${MAIL_API_KEY} + FRONTEND_URL: http://localhost:3000 + ports: + - "8000:8000" + depends_on: + db: + condition: service_healthy + + frontend: + build: + context: ./frontend + dockerfile: Dockerfile.prod + args: + NEXT_PUBLIC_API_URL: http://localhost:8000 + container_name: keinasystem_frontend + ports: + - "3000:3000" + depends_on: + - backend + +volumes: + postgres_data_local: diff --git a/document/20_ローカルテスト環境.md b/document/20_ローカルテスト環境.md new file mode 100644 index 0000000..df41a82 --- /dev/null +++ b/document/20_ローカルテスト環境.md @@ -0,0 +1,92 @@ +# ローカルテスト環境(Ubuntu PC) + +本番同等の環境をローカルで起動し、サーバーのデータで動作確認するための手順。 + +--- + +## 構成 + +| ファイル | 用途 | +|---------|------| +| `docker-compose.local.yml` | 本番用Dockerfileを使用、Traefikなし、ポート直接公開 | +| `deploy_local.sh` | ローカル環境のビルド・起動 | +| `sync_db.sh` | サーバーのDBダンプをローカルに取り込む | +| `.env` | 本番と同じ環境変数(git管理外) | + +アクセス先: +- フロントエンド: http://localhost:3000 +- バックエンドAPI: http://localhost:8000/api/ + +--- + +## 初回セットアップ + +### 1. .env を作成 + +```bash +cp .env.production.example .env +# .env に本番と同じ値を設定する +``` + +### 2. ローカル環境を起動 + +```bash +bash deploy_local.sh +``` + +ビルド(初回は10〜15分)→ 起動 → マイグレーションが自動実行される。 + +### 3. サーバーのDBを同期 + +**サーバー側で実行**(keinasystemユーザーで): +```bash +docker exec keinasystem_db pg_dump -U keinasystem keinasystem > /tmp/keinasystem_dump.sql +``` + +**ローカル側で実行**: +```bash +bash sync_db.sh +``` + +--- + +## 2回目以降の起動 + +```bash +# 停止中の場合は起動 +docker compose -f docker-compose.local.yml up -d + +# 停止 +docker compose -f docker-compose.local.yml down +``` + +コードを変更した場合は再ビルドが必要: +```bash +bash deploy_local.sh +``` + +--- + +## DBの再同期 + +サーバーのデータをローカルに反映したい時。 + +**サーバー側**(keinasystemユーザーで): +```bash +docker exec keinasystem_db pg_dump -U keinasystem keinasystem > /tmp/keinasystem_dump.sql +``` + +**ローカル側**: +```bash +bash sync_db.sh +``` + +> **注意**: ローカルのDBデータは上書きされる。ローカルで加えた変更は失われる。 + +--- + +## 注意事項 + +- `.env` は gitignore 対象(コミットしない) +- ローカルDBは `postgres_data_local` ボリュームに保存(本番の `postgres_data` とは別) +- `sync_db.sh` は SSH設定 `keinafarm`(`~/.ssh/config`)を使用 diff --git a/sync_db.sh b/sync_db.sh new file mode 100755 index 0000000..ceb1404 --- /dev/null +++ b/sync_db.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# サーバーのDBをローカルに同期するスクリプト +# +# 事前準備(サーバー側でkeinasystemユーザーとして実行): +# docker exec keinasystem_db pg_dump -U keinasystem keinasystem > /tmp/keinasystem_dump.sql +# +# 使用: bash sync_db.sh +set -e + +REMOTE_HOST="keinafarm" +LOCAL_DUMP="/tmp/keinasystem_dump.sql" + +echo "=== DBSync: サーバー → ローカル ===" + +# 1. サーバーからdumpファイルをscpで取得 +echo "[1/4] サーバーからダンプファイルを取得..." +scp "$REMOTE_HOST:/tmp/keinasystem_dump.sql" "$LOCAL_DUMP" +echo " → ダンプ取得完了: $LOCAL_DUMP ($(du -sh $LOCAL_DUMP | cut -f1))" + +# 2. ローカルのDBコンテナが起動しているか確認 +echo "[2/4] ローカルDBコンテナを確認..." +if ! docker compose -f docker-compose.local.yml ps db 2>/dev/null | grep -q "running"; then + echo " → ローカルDBコンテナが起動していません。起動します..." + docker compose -f docker-compose.local.yml up -d db + echo " → DB起動待機中..." + sleep 10 +fi + +# 3. 既存データをドロップして復元 +echo "[3/4] ローカルDBにリストア(既存データをリセット)..." +# DBを一旦削除して再作成してからリストア +docker compose -f docker-compose.local.yml exec -T db \ + psql -U keinasystem -d postgres -c "DROP DATABASE IF EXISTS keinasystem;" --quiet +docker compose -f docker-compose.local.yml exec -T db \ + psql -U keinasystem -d postgres -c "CREATE DATABASE keinasystem OWNER keinasystem;" --quiet +cat "$LOCAL_DUMP" | docker compose -f docker-compose.local.yml exec -T db \ + psql -U keinasystem -d keinasystem --quiet +echo " → リストア完了" + +# 4. クリーンアップ +echo "[4/4] 一時ファイル削除..." +rm -f "$LOCAL_DUMP" + +echo "" +echo "=== 同期完了 ===" +echo "ローカルでの起動: bash deploy_local.sh"