v1.3.8: NAS 마이그레이션 환경 파일 없을 때 보정

.env.production이 없으면 .env 또는 실행 중 DB 컨테이너 환경 변수로 migrate-production-db.sh가 동작한다.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-05-20 14:44:43 +09:00
parent cc34db40f2
commit a396d1d022
5 changed files with 71 additions and 16 deletions

View File

@@ -2,28 +2,79 @@
set -eu
ROOT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
ENV_FILE=${ENV_FILE:-.env.production}
DB_SERVICE=${DB_SERVICE:-sori-studio-db}
MIGRATIONS_DIR="$ROOT_DIR/db/migrations"
CONTAINER_MIGRATIONS_DIR=${CONTAINER_MIGRATIONS_DIR:-/docker-entrypoint-initdb.d}
SCHEMA_MIGRATIONS_TABLE=${SCHEMA_MIGRATIONS_TABLE:-schema_migrations}
MODE=${1:-migrate}
BASELINE_TARGET=${2:-}
COMPOSE_ENV_FILE=
cd "$ROOT_DIR"
if [ -f "$ENV_FILE" ]; then
set -a
# shellcheck disable=SC1090
. "$ENV_FILE"
set +a
fi
POSTGRES_DB=${POSTGRES_DB:-sori_studio}
POSTGRES_USER=${POSTGRES_USER:-sori_studio}
# 환경 파일(.env.production → .env) 선택
pick_compose_env_file() {
if [ -n "${ENV_FILE:-}" ] && [ -r "$ENV_FILE" ]; then
COMPOSE_ENV_FILE=$ENV_FILE
return 0
fi
if [ -r .env.production ]; then
COMPOSE_ENV_FILE=.env.production
return 0
fi
if [ -r .env ]; then
COMPOSE_ENV_FILE=.env
return 0
fi
COMPOSE_ENV_FILE=
}
# 환경 파일 로드(없으면 컨테이너 환경 변수 사용)
load_env_file() {
pick_compose_env_file
if [ -z "$COMPOSE_ENV_FILE" ]; then
echo "환경 파일(.env.production 또는 .env)이 없습니다. 실행 중인 DB 컨테이너 환경 변수를 사용합니다." >&2
return 0
fi
set -a
# shellcheck disable=SC1090
. "./$COMPOSE_ENV_FILE"
set +a
}
compose() {
docker compose --env-file "$ENV_FILE" "$@"
if [ -n "$COMPOSE_ENV_FILE" ]; then
docker compose --env-file "$COMPOSE_ENV_FILE" "$@"
return 0
fi
docker compose "$@"
}
# 실행 중인 DB 컨테이너에서 PostgreSQL 계정 정보 읽기
load_db_env_from_container() {
if ! compose exec -T "$DB_SERVICE" true >/dev/null 2>&1; then
return 0
fi
container_db=$(compose exec -T "$DB_SERVICE" printenv POSTGRES_DB 2>/dev/null | tr -d '\r' || true)
container_user=$(compose exec -T "$DB_SERVICE" printenv POSTGRES_USER 2>/dev/null | tr -d '\r' || true)
if [ -n "$container_db" ]; then
POSTGRES_DB=$container_db
fi
if [ -n "$container_user" ]; then
POSTGRES_USER=$container_user
fi
}
psql_exec() {
@@ -101,7 +152,6 @@ print_status() {
baseline_migrations() {
ensure_schema_migrations_table
baseline_count=0
found_target=0
migration_files | while IFS= read -r file_name; do
@@ -111,7 +161,6 @@ baseline_migrations() {
run_sql "INSERT INTO $SCHEMA_MIGRATIONS_TABLE (file_name) VALUES ('$file_name') ON CONFLICT (file_name) DO NOTHING;"
echo "baseline $file_name"
baseline_count=$((baseline_count + 1))
if [ -n "$BASELINE_TARGET" ] && { [ "$file_name" = "$BASELINE_TARGET" ] || echo "$file_name" | grep -q "^${BASELINE_TARGET}_"; }; then
found_target=1
@@ -136,7 +185,6 @@ migrate_database() {
fi
ensure_schema_migrations_table
applied_count=0
migration_files | while IFS= read -r file_name; do
if is_applied "$file_name"; then
@@ -146,13 +194,15 @@ migrate_database() {
echo "apply $file_name"
psql_exec -f "$CONTAINER_MIGRATIONS_DIR/$file_name"
run_sql "INSERT INTO $SCHEMA_MIGRATIONS_TABLE (file_name) VALUES ('$file_name') ON CONFLICT (file_name) DO NOTHING;"
applied_count=$((applied_count + 1))
done
echo "마이그레이션 실행 완료"
}
load_env_file
load_db_env_from_container
ensure_database_ready
load_db_env_from_container
case "$MODE" in
status)