#!/usr/bin/env bash set -euo pipefail # --- CONFIG --- SANDBOX_STORAGE="${SANDBOX_STORAGE:-./data}" APP_URL="${APP_URL:-http://localhost:8000}" # --- FUNCTIONS --- prepare_storage() { echo "[*] Checking storage path: $SANDBOX_STORAGE" if [ ! -d "$SANDBOX_STORAGE" ]; then echo " -> Creating $SANDBOX_STORAGE on host" sudo mkdir -p "$SANDBOX_STORAGE" fi echo " -> Setting ownership to Playwright user (pwuser / UID 1000)" sudo chown -R 1000:1000 "$SANDBOX_STORAGE" sudo chmod -R 755 "$SANDBOX_STORAGE" echo "[+] Storage ready." } start_stack() { prepare_storage echo "[*] Building Docker image..." docker compose build if [[ "${1:-}" == "-d" ]]; then echo "[*] Starting services in detached mode..." docker compose up -d else echo "[*] Starting services (attached)..." docker compose up fi } stop_stack() { echo "[*] Stopping services..." docker compose down } clean_stack() { echo "[*] Removing containers, networks, and volumes..." docker compose down -v --remove-orphans } restart_stack() { stop_stack echo "[*] Restarting services..." start_stack -d } logs_stack() { echo "[*] Showing logs (Ctrl+C to exit)..." docker compose logs -f } status_stack() { echo "[*] Current service status:" docker compose ps } healthcheck_stack() { echo "[*] Running health check on $APP_URL ..." if curl -fsS "$APP_URL" > /dev/null; then echo "[+] Service is healthy and reachable." else echo "[!] Service is NOT reachable at $APP_URL" exit 1 fi } # --- MAIN --- case "${1:-}" in start) shift start_stack "$@" ;; stop) stop_stack ;; restart) restart_stack ;; clean) clean_stack ;; logs) logs_stack ;; status) status_stack ;; healthcheck) healthcheck_stack ;; *) echo "Usage: $0 {start [-d for detached mode] | stop | restart | clean | logs | status | healthcheck}" exit 1 ;; esac