version: '3.8' services: app: build: context: . dockerfile: Dockerfile.prod container_name: trip-planner-production ports: - "${APP_PORT:-8080}:80" environment: # Laravel Application APP_NAME: "Trip Planner" APP_ENV: production APP_DEBUG: false APP_KEY: ${APP_KEY} APP_URL: ${APP_URL:-http://localhost:8080} # Database (internal MariaDB) DB_CONNECTION: mysql DB_HOST: 127.0.0.1 DB_PORT: 3306 DB_DATABASE: ${DB_DATABASE:-trip_planner} DB_USERNAME: ${DB_USERNAME:-trip_user} DB_PASSWORD: ${DB_PASSWORD:?DB_PASSWORD must be set} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?MYSQL_ROOT_PASSWORD must be set} # Redis (internal) REDIS_HOST: 127.0.0.1 REDIS_PORT: 6379 REDIS_PASSWORD: null # Cache & Session CACHE_DRIVER: redis QUEUE_CONNECTION: redis SESSION_DRIVER: redis SESSION_LIFETIME: 120 # Mail (configure as needed) MAIL_MAILER: ${MAIL_MAILER:-log} MAIL_HOST: ${MAIL_HOST:-} MAIL_PORT: ${MAIL_PORT:-} MAIL_USERNAME: ${MAIL_USERNAME:-} MAIL_PASSWORD: ${MAIL_PASSWORD:-} MAIL_ENCRYPTION: ${MAIL_ENCRYPTION:-} MAIL_FROM_ADDRESS: ${MAIL_FROM_ADDRESS:-noreply@tripplanner.local} MAIL_FROM_NAME: "${MAIL_FROM_NAME:-Trip Planner}" volumes: # Persistent data for database - db-data:/var/lib/mysql # Persistent data for redis - redis-data:/data/redis # Persistent storage for uploaded files - storage-data:/var/www/html/storage/app restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost/up"] interval: 30s timeout: 10s retries: 3 start_period: 60s volumes: db-data: redis-data: storage-data: