# Production-style stack: build the app image from ./Dockerfile, MariaDB, Redis. # Copy .env.example to .env (or set env_file) and run: docker compose up -d # First boot: docker compose exec app php artisan key:generate --force # docker compose exec app php artisan migrate --force services: app: build: context: . dockerfile: Dockerfile image: paymenter:local restart: unless-stopped ports: - "${APP_PORT:-8080}:80" env_file: - path: .env required: false environment: APP_ENV: production APP_DEBUG: "false" APP_URL: ${APP_URL:-http://localhost:8080} DB_CONNECTION: mariadb DB_HOST: db DB_PORT: 3306 DB_DATABASE: ${DB_DATABASE:-paymenter} DB_USERNAME: ${DB_USERNAME:-paymenter} DB_PASSWORD: ${DB_PASSWORD:-changeme} CACHE_STORE: redis SESSION_DRIVER: redis QUEUE_CONNECTION: redis REDIS_HOST: redis REDIS_PORT: 6379 depends_on: db: condition: service_healthy redis: condition: service_started volumes: - paymenter_storage:/app/storage/app - paymenter_logs:/app/storage/logs networks: - paymenter queue: image: paymenter:local restart: unless-stopped command: ["php", "/app/artisan", "queue:work", "--sleep=3", "--tries=3"] env_file: - path: .env required: false environment: APP_ENV: production DB_CONNECTION: mariadb DB_HOST: db DB_PORT: 3306 DB_DATABASE: ${DB_DATABASE:-paymenter} DB_USERNAME: ${DB_USERNAME:-paymenter} DB_PASSWORD: ${DB_PASSWORD:-changeme} CACHE_STORE: redis QUEUE_CONNECTION: redis REDIS_HOST: redis REDIS_PORT: 6379 depends_on: - app - db - redis volumes: - paymenter_storage:/app/storage/app - paymenter_logs:/app/storage/logs networks: - paymenter db: image: mariadb:11 restart: unless-stopped environment: MYSQL_DATABASE: ${DB_DATABASE:-paymenter} MYSQL_USER: ${DB_USERNAME:-paymenter} MYSQL_PASSWORD: ${DB_PASSWORD:-changeme} MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-rootchangeme} volumes: - paymenter_db_data:/var/lib/mysql command: ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"] healthcheck: test: ["CMD", "mariadb-admin", "ping", "-h", "localhost", "--silent"] interval: 5s timeout: 5s retries: 30 start_period: 20s networks: - paymenter redis: image: redis:alpine restart: unless-stopped volumes: - paymenter_redis_data:/data networks: - paymenter networks: paymenter: driver: bridge volumes: paymenter_db_data: paymenter_redis_data: paymenter_storage: paymenter_logs: