Stabilize Prefect DB host resolution and startup

This commit is contained in:
Ruslan Bakiev
2026-03-13 16:08:07 +07:00
parent a3c602e591
commit cb66a9a777
3 changed files with 68 additions and 0 deletions

View File

@@ -13,6 +13,8 @@ services:
PREFECT_SERVER_API_HOST: 0.0.0.0
PREFECT_UI_API_URL: https://prefect.optovia.ru/api
PREFECT_API_DATABASE_CONNECTION_URL: ${PREFECT_API_DATABASE_CONNECTION_URL}
PREFECT_DB_HOST: ${PREFECT_DB_HOST:-prefect_db_v18}
PREFECT_DB_PORT: ${PREFECT_DB_PORT:-5432}
# Vault
VAULT_ADDR: http://optovia-vault:8200
VAULT_TOKEN: ${VAULT_TOKEN}
@@ -39,6 +41,8 @@ services:
environment:
PREFECT_API_URL: http://prefect-server:4200/api
PREFECT_API_DATABASE_CONNECTION_URL: ${PREFECT_API_DATABASE_CONNECTION_URL}
PREFECT_DB_HOST: ${PREFECT_DB_HOST:-prefect_db_v18}
PREFECT_DB_PORT: ${PREFECT_DB_PORT:-5432}
ARANGODB_URL: ${ARANGODB_URL:-http://arangodb:8529}
ARANGODB_DATABASE: ${ARANGODB_DATABASE:-optovia_maps}
ARANGODB_PASSWORD: ${ARANGODB_PASSWORD}

View File

@@ -5,6 +5,38 @@ set -e
echo "Loading secrets from Vault..."
. /app/scripts/load-vault-env.sh
echo "Normalizing Prefect DB URL..."
NORMALIZED_DB_URL="$(python - <<'PY'
import os
from urllib.parse import parse_qsl, urlencode, urlparse, urlunparse
db_url = os.environ.get("PREFECT_API_DATABASE_CONNECTION_URL", "")
if not db_url:
raise SystemExit("PREFECT_API_DATABASE_CONNECTION_URL is not set")
parsed = urlparse(db_url)
if not parsed.hostname:
raise SystemExit(f"Cannot parse DB host from URL: {db_url}")
host = os.environ.get("PREFECT_DB_HOST", parsed.hostname) or parsed.hostname
port = int(os.environ.get("PREFECT_DB_PORT", str(parsed.port or 5432)))
user = parsed.username or ""
password = parsed.password or ""
auth = user
if password:
auth = f"{auth}:{password}"
if auth:
auth = f"{auth}@"
query = urlencode(parse_qsl(parsed.query, keep_blank_values=True), doseq=True)
netloc = f"{auth}{host}:{port}"
new_url = urlunparse((parsed.scheme, netloc, parsed.path, parsed.params, query, parsed.fragment))
print(new_url)
PY
)"
export PREFECT_API_DATABASE_CONNECTION_URL="${NORMALIZED_DB_URL}"
echo "Waiting for Prefect DB..."
python - <<'PY'
import os

View File

@@ -5,5 +5,37 @@ set -e
echo "Loading secrets from Vault..."
. /app/scripts/load-vault-env.sh
echo "Normalizing Prefect DB URL..."
NORMALIZED_DB_URL="$(python - <<'PY'
import os
from urllib.parse import parse_qsl, urlencode, urlparse, urlunparse
db_url = os.environ.get("PREFECT_API_DATABASE_CONNECTION_URL", "")
if not db_url:
raise SystemExit("PREFECT_API_DATABASE_CONNECTION_URL is not set")
parsed = urlparse(db_url)
if not parsed.hostname:
raise SystemExit(f"Cannot parse DB host from URL: {db_url}")
host = os.environ.get("PREFECT_DB_HOST", parsed.hostname) or parsed.hostname
port = int(os.environ.get("PREFECT_DB_PORT", str(parsed.port or 5432)))
user = parsed.username or ""
password = parsed.password or ""
auth = user
if password:
auth = f"{auth}:{password}"
if auth:
auth = f"{auth}@"
query = urlencode(parse_qsl(parsed.query, keep_blank_values=True), doseq=True)
netloc = f"{auth}{host}:{port}"
new_url = urlunparse((parsed.scheme, netloc, parsed.path, parsed.params, query, parsed.fragment))
print(new_url)
PY
)"
export PREFECT_API_DATABASE_CONNECTION_URL="${NORMALIZED_DB_URL}"
echo "Starting Prefect services..."
exec prefect server services start