#!/usr/bin/env bash set -eu # Real Estate Crawler - Development Server # Starts all backend services + frontend + Caddy HTTPS proxy via Docker Compose. # # Usage: # ./start.sh - Start all services (backend + frontend) # ./start.sh --build - Rebuild images before starting # ./start.sh --down - Stop and remove all containers # ./start.sh --logs - Follow logs from all services # ./start.sh --help - Show help show_help() { echo "Real Estate Crawler - Development Server" echo "" echo "Usage: ./start.sh [OPTIONS]" echo "" echo "Options:" echo " (default) Start all services with Docker Compose" echo " --build Rebuild Docker images before starting" echo " --down Stop and remove all containers" echo " --logs Follow logs from all services" echo " --help Show this help message" echo "" echo "Services started:" echo " redis Redis broker + cache (port 6379)" echo " mysql MySQL database (port 3306)" echo " app FastAPI backend (hot-reload) (port 5001)" echo " celery Celery background worker" echo " celery-beat Celery periodic scheduler" echo " frontend Vite dev server (hot-reload) (port 5173)" echo " caddy HTTPS reverse proxy (port 443)" echo "" echo "Environment variables:" echo " DEV_HOST Hostname for HTTPS access (default: localhost)" echo " Set this to your dev machine's hostname for OIDC auth." echo "" echo "Examples:" echo " ./start.sh # Start everything" echo " ./start.sh --build # Rebuild and start" echo " DEV_HOST=devvm.local ./start.sh # Start with custom hostname" } get_compose_cmd() { if command -v docker &> /dev/null; then echo "docker compose" elif command -v podman-compose &> /dev/null; then echo "podman-compose" else echo "❌ Error: Neither docker nor podman-compose found." >&2 echo " Install Docker: https://docs.docker.com/get-docker/" >&2 exit 1 fi } start_docker() { local build_flag="" if [[ "${1:-}" == "--build" ]]; then build_flag="--build" fi echo "Starting all services with Docker Compose..." echo "" local compose_cmd compose_cmd=$(get_compose_cmd) $compose_cmd up $build_flag } stop_docker() { echo "Stopping all containers..." local compose_cmd compose_cmd=$(get_compose_cmd) $compose_cmd down } show_logs() { local compose_cmd compose_cmd=$(get_compose_cmd) $compose_cmd logs -f } # Parse arguments case "${1:-}" in --help|-h) show_help ;; --down) stop_docker ;; --logs) show_logs ;; --build) start_docker --build ;; "") start_docker ;; *) echo "❌ Unknown option: $1" echo "" show_help exit 1 ;; esac