#!/bin/bash set -e # If a command is passed (e.g. `docker compose run --rm backend alembic upgrade head`), # run it directly instead of the full startup sequence. if [ $# -gt 0 ]; then exec "$@" fi echo "🚀 Starting Document Translation API..." # Wait for database to be ready (if DATABASE_URL is set) if [ -n "$DATABASE_URL" ]; then echo "⏳ Waiting for database to be ready..." # Extract host and port from DATABASE_URL (handles postgresql+asyncpg:// and postgresql://) DB_HOST=$(python -c " import re m = re.search(r'@([^:/]+)', '$DATABASE_URL') print(m.group(1) if m else 'postgres') ") DB_PORT=$(python -c " import re m = re.search(r'@[^:]+:(\d+)', '$DATABASE_URL') print(m.group(1) if m else '5432') ") echo " Connecting to ${DB_HOST}:${DB_PORT}..." # Wait up to 30 seconds for database for i in $(seq 1 30); do if python -c " import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect(('$DB_HOST', int('$DB_PORT'))) s.close() exit(0) except: exit(1) " 2>/dev/null; then echo "✅ Database is ready!" break fi echo " Waiting for database... ($i/30)" sleep 1 done # Run database migrations echo "📦 Running database migrations..." alembic upgrade head fi # Wait for Redis if configured if [ -n "$REDIS_URL" ]; then echo "⏳ Waiting for Redis..." REDIS_HOST=$(python -c " import re m = re.search(r'://([^:/]+)', '$REDIS_URL') print(m.group(1) if m else 'redis') ") REDIS_PORT=$(python -c " import re m = re.search(r'://[^:]+:(\d+)', '$REDIS_URL') print(m.group(1) if m else '6379') ") for i in $(seq 1 10); do if python -c " import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect(('$REDIS_HOST', int('$REDIS_PORT'))) s.close() exit(0) except: exit(1) " 2>/dev/null; then echo "✅ Redis is ready!" break fi echo " Waiting for Redis... ($i/10)" sleep 1 done fi # Start the application echo "🎯 Starting uvicorn..." exec uvicorn main:app --host 0.0.0.0 --port ${PORT:-8000} --workers ${WORKERS:-4}