version: '3.8' services: # ======================================== # Laravel PHP-FPM Application # ======================================== laravel: build: context: . dockerfile: Dockerfile container_name: abbauf_kasir_app restart: unless-stopped working_dir: /var/www/html volumes: # Mount storage untuk uploads dan logs (persistent) - ./storage/app/public:/var/www/html/storage # Mount public build assets (read-only) - ./public/build:/var/www/html/public/build:ro environment: # Application APP_NAME: ${APP_NAME:-Abbauf-Kasir} APP_ENV: ${APP_ENV:-production} APP_KEY: ${APP_KEY} APP_DEBUG: ${APP_DEBUG:-false} APP_URL: ${APP_URL:-http://localhost} # Database DB_CONNECTION: mysql DB_HOST: mysql DB_PORT: 3306 DB_DATABASE: ${DB_DATABASE:-kasir_db} DB_USERNAME: ${DB_USERNAME:-kasir_user} DB_PASSWORD: ${DB_PASSWORD} # Cache & Session CACHE_STORE: redis SESSION_DRIVER: redis REDIS_HOST: redis REDIS_PORT: 6379 # Queue QUEUE_CONNECTION: redis depends_on: mysql: condition: service_healthy redis: condition: service_started networks: - kasir_network healthcheck: test: ["CMD", "php-fpm", "-t"] interval: 30s timeout: 10s retries: 3 # ======================================== # Nginx Web Server # ======================================== nginx: image: nginx:alpine container_name: abbauf_kasir_nginx restart: unless-stopped ports: - "${APP_PORT:-80}:80" volumes: # Nginx configuration - ./nginx.conf:/etc/nginx/conf.d/default.conf # Laravel public directory (untuk static assets) - ./public:/var/www/html/public # Storage symlink untuk file uploads - ./storage/app/public:/var/www/html/public/storage depends_on: - laravel networks: - kasir_network healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/"] interval: 30s timeout: 10s retries: 3 # ======================================== # MySQL Database # ======================================== mysql: image: mysql:8.4 container_name: abbauf_kasir_db restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root_secret_password} MYSQL_DATABASE: ${DB_DATABASE:-kasir_db} MYSQL_USER: ${DB_USERNAME:-kasir_user} MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_CHARACTER_SET_SERVER: utf8mb4 MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci ports: - "${DB_PORT:-3306}:3306" volumes: - mysql_data:/var/lib/mysql # Optional: backup folder - ./docker/mysql/backups:/backups networks: - kasir_network healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-root_secret_password}"] interval: 10s timeout: 5s retries: 5 # command: --default-authentication-plugin=mysql_native_password # ======================================== # Redis Cache & Session Store # ======================================== redis: image: redis:7-alpine container_name: abbauf_kasir_redis restart: unless-stopped ports: - "${REDIS_PORT:-6379}:6379" volumes: - redis_data:/data networks: - kasir_network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 3 command: redis-server --appendonly yes # ======================================== # Queue Worker (Optional - untuk background jobs) # ======================================== queue: build: context: . dockerfile: Dockerfile container_name: abbauf_kasir_queue restart: unless-stopped working_dir: /var/www/html volumes: - ./storage:/var/www/html/storage environment: APP_ENV: ${APP_ENV:-production} APP_KEY: ${APP_KEY} DB_CONNECTION: mysql DB_HOST: mysql DB_PORT: 3306 DB_DATABASE: ${DB_DATABASE:-kasir_db} DB_USERNAME: ${DB_USERNAME:-kasir_user} DB_PASSWORD: ${DB_PASSWORD} REDIS_HOST: redis QUEUE_CONNECTION: redis depends_on: - laravel - redis - mysql networks: - kasir_network command: php artisan queue:work --tries=3 --timeout=90 # ======================================== # Networks # ======================================== networks: kasir_network: driver: bridge # ======================================== # Persistent Volumes # ======================================== volumes: mysql_data: driver: local redis_data: driver: local