#!/usr/bin/env bash # =========================================================================== # plug-n-pray.sh — Generate a boilerplate Docker setup for any Laravel project # # Usage: # curl -fsSL https://raw.githubusercontent.com/blax-software/docker-laravel/main/scripts/plug-n-pray.sh | bash # # or locally: # ./plug-n-pray.sh # ./plug-n-pray.sh --php=8.4 --name=my-app --host=my-app.localhost # # Assumes Traefik is already running on the "web" network. # # What it creates: # docker-compose.yml — App + MySQL + Redis (with Traefik labels) # .env.docker — Docker-specific env vars # docker/supervisor/ — Empty custom supervisor dir # =========================================================================== set -euo pipefail # --------------------------------------------------------------------------- # Defaults # --------------------------------------------------------------------------- PHP_VERSION="8.4" PROJECT_NAME="" TRAEFIK_HOST="" DB_NAME="" DB_PASSWORD="secret" IMAGE="blaxsoftware/laravel" ENABLE_QUEUE="true" ENABLE_SCHEDULER="true" ENABLE_HORIZON="false" ENABLE_REDIS="true" ENABLE_MYSQL="true" ENABLE_WEBSOCKET="false" WEBSOCKET_PORT="6001" FORCE="false" # --------------------------------------------------------------------------- # Parse args # --------------------------------------------------------------------------- for arg in "$@"; do case $arg in --php=*) PHP_VERSION="${arg#*=}" ;; --name=*) PROJECT_NAME="${arg#*=}" ;; --host=*) TRAEFIK_HOST="${arg#*=}" ;; --db=*) DB_NAME="${arg#*=}" ;; --db-pass=*) DB_PASSWORD="${arg#*=}" ;; --image=*) IMAGE="${arg#*=}" ;; --no-queue) ENABLE_QUEUE="false" ;; --no-scheduler) ENABLE_SCHEDULER="false" ;; --horizon) ENABLE_HORIZON="true" ;; --no-redis) ENABLE_REDIS="false" ;; --no-mysql) ENABLE_MYSQL="false" ;; --websocket) ENABLE_WEBSOCKET="true" ;; --websocket-port=*) WEBSOCKET_PORT="${arg#*=}" ;; --force) FORCE="true" ;; --help|-h) echo "Usage: plug-n-pray.sh [OPTIONS]" echo "" echo "Options:" echo " --php=VERSION PHP version (default: 8.4)" echo " --name=NAME Project/compose name (default: directory name)" echo " --host=HOST Traefik hostname (default: NAME.localhost)" echo " --db=NAME Database name (default: PROJECT_NAME)" echo " --db-pass=PASS Database password (default: secret)" echo " --image=IMAGE Docker image (default: blaxsoftware/laravel)" echo " --no-queue Disable queue worker" echo " --no-scheduler Disable scheduler" echo " --horizon Enable Horizon (disables basic queue)" echo " --no-redis Skip Redis service" echo " --no-mysql Skip MySQL service" echo " --websocket Enable WebSocket server (blax/laravel-websockets)" echo " --websocket-port=N WebSocket port (default: 6001)" echo " --force Overwrite existing files" echo " --help Show this help" exit 0 ;; *) echo "Unknown option: $arg (try --help)" exit 1 ;; esac done # Derive defaults from current directory if [ -z "$PROJECT_NAME" ]; then PROJECT_NAME="$(basename "$(pwd)")" # Sanitize: lowercase, replace non-alnum with dash PROJECT_NAME="$(echo "$PROJECT_NAME" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-//;s/-$//')" fi if [ -z "$TRAEFIK_HOST" ]; then TRAEFIK_HOST="${PROJECT_NAME}.localhost" fi if [ -z "$DB_NAME" ]; then DB_NAME="$(echo "$PROJECT_NAME" | sed 's/-/_/g')" fi # If horizon is on, disable basic queue if [ "$ENABLE_HORIZON" = "true" ]; then ENABLE_QUEUE="false" fi # --------------------------------------------------------------------------- # Safety check # --------------------------------------------------------------------------- if [ "$FORCE" != "true" ] && [ -f "docker-compose.yml" ]; then echo "docker-compose.yml already exists. Use --force to overwrite." exit 1 fi echo "==========================================" echo " plug-n-pray 🙏" echo "==========================================" echo " Project: $PROJECT_NAME" echo " PHP: $PHP_VERSION" echo " Image: ${IMAGE}:php${PHP_VERSION}" echo " Traefik: $TRAEFIK_HOST" echo " Database: ${ENABLE_MYSQL:+MySQL ($DB_NAME)}${ENABLE_MYSQL:+}$([ "$ENABLE_MYSQL" = "false" ] && echo "disabled")" echo " Redis: $ENABLE_REDIS" echo " Queue: $ENABLE_QUEUE" echo " Scheduler: $ENABLE_SCHEDULER" echo " Horizon: $ENABLE_HORIZON" echo " WebSocket: ${ENABLE_WEBSOCKET}$([ "$ENABLE_WEBSOCKET" = "true" ] && echo " (port ${WEBSOCKET_PORT})")" echo "==========================================" # --------------------------------------------------------------------------- # Create directory for custom supervisor configs # --------------------------------------------------------------------------- mkdir -p docker/supervisor # --------------------------------------------------------------------------- # Generate docker-compose.yml # --------------------------------------------------------------------------- cat > docker-compose.yml <> docker-compose.yml fi # --- Services --- cat >> docker-compose.yml <> docker-compose.yml <> docker-compose.yml <> docker-compose.yml <> docker-compose.yml <> docker-compose.yml < docker/supervisor/websocket.conf < .env.docker <> .env.docker <> .env.docker <> .env.docker <