v1.3.8: NAS 마이그레이션 환경 파일 없을 때 보정
.env.production이 없으면 .env 또는 실행 중 DB 컨테이너 환경 변수로 migrate-production-db.sh가 동작한다. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user