82 lines
2.7 KiB
Bash
82 lines
2.7 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
export POSTGRES_DB="${GEOINTEL_POSTGRES_DB:-${POSTGRES_DB:-geointel}}"
|
|
export POSTGRES_USER="${GEOINTEL_POSTGRES_USER:-${POSTGRES_USER:-geointel}}"
|
|
export POSTGRES_PASSWORD="${GEOINTEL_POSTGRES_PASSWORD:-${POSTGRES_PASSWORD:-geointel}}"
|
|
export PGDATA="${PGDATA:-/var/lib/postgresql/data}"
|
|
export STORAGE_ROOT="${STORAGE_ROOT:-${GEOINTEL_STORAGE_ROOT:-/app/storage}}"
|
|
export DATABASE_URL="${DATABASE_URL:-postgresql+psycopg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@127.0.0.1:5432/${POSTGRES_DB}}"
|
|
export CORS_ORIGINS="${GEOINTEL_CORS_ORIGINS:-${CORS_ORIGINS:-http://localhost:1202,http://127.0.0.1:1202}}"
|
|
export MAX_UPLOAD_MB="${GEOINTEL_MAX_UPLOAD_MB:-${MAX_UPLOAD_MB:-500}}"
|
|
export YOLO_MODELS_DIR="${YOLO_MODELS_DIR:-/app/models}"
|
|
export YOLO_CONFIG_DIR="${YOLO_CONFIG_DIR:-$STORAGE_ROOT/ultralytics}"
|
|
|
|
mkdir -p "$PGDATA" "$STORAGE_ROOT" "$YOLO_CONFIG_DIR" /run/nginx /var/log/nginx
|
|
chown -R postgres:postgres "$PGDATA"
|
|
|
|
postgres_pid=""
|
|
backend_pid=""
|
|
|
|
shutdown() {
|
|
if [ -n "$backend_pid" ] && kill -0 "$backend_pid" 2>/dev/null; then
|
|
kill "$backend_pid" 2>/dev/null || true
|
|
fi
|
|
if [ -n "$postgres_pid" ] && kill -0 "$postgres_pid" 2>/dev/null; then
|
|
kill "$postgres_pid" 2>/dev/null || true
|
|
wait "$postgres_pid" 2>/dev/null || true
|
|
fi
|
|
}
|
|
trap shutdown INT TERM EXIT
|
|
|
|
echo "Starting embedded PostGIS..."
|
|
/usr/local/bin/docker-entrypoint.sh postgres &
|
|
postgres_pid="$!"
|
|
|
|
echo "Waiting for embedded PostGIS..."
|
|
for attempt in $(seq 1 60); do
|
|
if pg_isready -h 127.0.0.1 -U "$POSTGRES_USER" -d "$POSTGRES_DB" >/dev/null 2>&1; then
|
|
echo "PostGIS is ready after attempt ${attempt}."
|
|
break
|
|
fi
|
|
if ! kill -0 "$postgres_pid" 2>/dev/null; then
|
|
echo "PostGIS process exited before becoming ready."
|
|
wait "$postgres_pid"
|
|
fi
|
|
sleep 2
|
|
done
|
|
|
|
if ! pg_isready -h 127.0.0.1 -U "$POSTGRES_USER" -d "$POSTGRES_DB" >/dev/null 2>&1; then
|
|
echo "PostGIS did not become ready."
|
|
exit 1
|
|
fi
|
|
|
|
echo "Applying Alembic migrations..."
|
|
python -m alembic upgrade head
|
|
|
|
echo "Starting GeoIntel backend..."
|
|
uvicorn app.main:app --host 127.0.0.1 --port 8000 &
|
|
backend_pid="$!"
|
|
|
|
echo "Waiting for GeoIntel backend..."
|
|
python - <<'PY'
|
|
import time
|
|
import urllib.request
|
|
|
|
last_error = None
|
|
for attempt in range(1, 61):
|
|
try:
|
|
urllib.request.urlopen("http://127.0.0.1:8000/health", timeout=3).read()
|
|
print(f"Backend is ready after attempt {attempt}.")
|
|
break
|
|
except Exception as exc:
|
|
last_error = exc
|
|
print(f"Backend not ready yet ({attempt}/60): {exc}")
|
|
time.sleep(1)
|
|
else:
|
|
raise SystemExit(f"Backend did not become ready: {last_error}")
|
|
PY
|
|
|
|
echo "Starting nginx frontend on container port 80..."
|
|
exec nginx -g "daemon off;"
|