Kasir/docker-compose.yml
2025-10-16 14:30:39 +07:00

177 lines
4.7 KiB
YAML

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:/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:ro
# Laravel public directory (untuk static assets)
- ./public:/var/www/html/public:ro
# Storage symlink untuk file uploads
- ./storage/app/public:/var/www/html/public/storage:ro
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