345529cde0
Безопасный коммит незакоммиченной работы перед реализацией бронирования слотов. Вне коммита оставлены: package-lock.json (пустой, мусор), requests.json (scratch-данные).
137 lines
3.2 KiB
Bash
Executable File
137 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
bundle_dir="$(cd "$script_dir/.." && pwd)"
|
|
|
|
compose() {
|
|
if docker compose version >/dev/null 2>&1; then
|
|
docker compose "$@"
|
|
elif command -v docker-compose >/dev/null 2>&1; then
|
|
docker-compose "$@"
|
|
else
|
|
echo "docker compose or docker-compose is required." >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
ensure_env_file() {
|
|
if [[ ! -f "$bundle_dir/.env" && -f "$bundle_dir/.env.example" ]]; then
|
|
cp "$bundle_dir/.env.example" "$bundle_dir/.env"
|
|
echo "Created .env from .env.example"
|
|
fi
|
|
}
|
|
|
|
load_env() {
|
|
set -a
|
|
# shellcheck disable=SC1091
|
|
source "$bundle_dir/.env"
|
|
set +a
|
|
}
|
|
|
|
wait_for_postgres() {
|
|
local attempt
|
|
for attempt in {1..60}; do
|
|
if compose exec -T postgres pg_isready -U "${POSTGRES_USER:-postgres}" -d postgres >/dev/null 2>&1; then
|
|
return 0
|
|
fi
|
|
sleep 2
|
|
done
|
|
|
|
echo "Postgres is not ready after 120 seconds." >&2
|
|
exit 1
|
|
}
|
|
|
|
wait_for_external_postgres() {
|
|
local container_name="${EXTERNAL_POSTGRES_CONTAINER:-}"
|
|
local attempt
|
|
|
|
if [[ -z "$container_name" ]]; then
|
|
echo "EXTERNAL_POSTGRES_CONTAINER is required when USE_EXTERNAL_INFRA=true and SKIP_DB_INIT is not true." >&2
|
|
exit 1
|
|
fi
|
|
|
|
for attempt in {1..60}; do
|
|
if docker exec "$container_name" pg_isready -U "${POSTGRES_USER:-postgres}" -d postgres >/dev/null 2>&1; then
|
|
return 0
|
|
fi
|
|
sleep 2
|
|
done
|
|
|
|
echo "External Postgres is not ready after 120 seconds: $container_name" >&2
|
|
exit 1
|
|
}
|
|
|
|
create_database_if_missing() {
|
|
local db_name="$1"
|
|
local exists
|
|
|
|
exists="$(
|
|
compose exec -T postgres psql -U "${POSTGRES_USER:-postgres}" -d postgres -tAc \
|
|
"SELECT 1 FROM pg_database WHERE datname = '$db_name'" | tr -d '[:space:]'
|
|
)"
|
|
|
|
if [[ "$exists" == "1" ]]; then
|
|
echo "Database already exists: $db_name"
|
|
return 0
|
|
fi
|
|
|
|
echo "Creating database: $db_name"
|
|
compose exec -T postgres createdb -U "${POSTGRES_USER:-postgres}" "$db_name"
|
|
}
|
|
|
|
create_external_database_if_missing() {
|
|
local db_name="$1"
|
|
local container_name="${EXTERNAL_POSTGRES_CONTAINER:-}"
|
|
local exists
|
|
|
|
exists="$(
|
|
docker exec "$container_name" psql -U "${POSTGRES_USER:-postgres}" -d postgres -tAc \
|
|
"SELECT 1 FROM pg_database WHERE datname = '$db_name'" | tr -d '[:space:]'
|
|
)"
|
|
|
|
if [[ "$exists" == "1" ]]; then
|
|
echo "Database already exists: $db_name"
|
|
return 0
|
|
fi
|
|
|
|
echo "Creating database: $db_name"
|
|
docker exec "$container_name" createdb -U "${POSTGRES_USER:-postgres}" "$db_name"
|
|
}
|
|
|
|
databases=(
|
|
pcp_ballistics
|
|
pcp_requests
|
|
pcp_route_processing
|
|
pcp_missions
|
|
pcp_slots
|
|
pcp_complex_plan
|
|
pcp_satellite_catalog
|
|
pcp_stations
|
|
pcp_tgu
|
|
pcp_satellites
|
|
)
|
|
|
|
ensure_env_file
|
|
load_env
|
|
|
|
cd "$bundle_dir"
|
|
if [[ "${USE_EXTERNAL_INFRA:-false}" == "true" ]]; then
|
|
wait_for_external_postgres
|
|
|
|
for db_name in "${databases[@]}"; do
|
|
create_external_database_if_missing "$db_name"
|
|
done
|
|
else
|
|
compose up -d postgres
|
|
wait_for_postgres
|
|
|
|
for db_name in "${databases[@]}"; do
|
|
create_database_if_missing "$db_name"
|
|
done
|
|
fi
|
|
|
|
echo "Database initialization completed. Tables are left to service Flyway migrations."
|
|
echo "No schema objects or seed data were created by this script."
|