version: '3.8' services: # PHP Application app: build: context: . dockerfile: docker/php/Dockerfile container_name: webshop_app restart: unless-stopped working_dir: /var/www/html volumes: - ./:/var/www/html - ./docker/php/local.ini:/usr/local/etc/php/conf.d/local.ini - ./docker/php/php.ini:/usr/local/etc/php/php.ini networks: - webshop_network depends_on: - db - redis environment: - APP_ENV=local - APP_DEBUG=true - DB_HOST=db - DB_PORT=3306 - DB_DATABASE=webshop - DB_USERNAME=webshop - DB_PASSWORD=webshop_password - REDIS_HOST=redis - REDIS_PORT=6379 - MAIL_HOST=mailhog - MAIL_PORT=1025 # Nginx Web Server nginx: image: nginx:alpine container_name: webshop_nginx restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./:/var/www/html - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf - ./docker/nginx/conf.d:/etc/nginx/conf.d - ./docker/nginx/ssl:/etc/nginx/ssl - ./logs/nginx:/var/log/nginx networks: - webshop_network depends_on: - app # MySQL Database db: image: mysql:8.0 container_name: webshop_db restart: unless-stopped ports: - "3306:3306" environment: MYSQL_DATABASE: webshop MYSQL_USER: webshop MYSQL_PASSWORD: webshop_password MYSQL_ROOT_PASSWORD: root_password volumes: - db_data:/var/lib/mysql - ./docker/mysql/init:/docker-entrypoint-initdb.d - ./docker/mysql/conf.d:/etc/mysql/conf.d - ./logs/mysql:/var/log/mysql networks: - webshop_network command: --default-authentication-plugin=mysql_native_password # Redis Cache redis: image: redis:7-alpine container_name: webshop_redis restart: unless-stopped ports: - "6379:6379" volumes: - redis_data:/data - ./docker/redis/redis.conf:/usr/local/etc/redis/redis.conf networks: - webshop_network command: redis-server /usr/local/etc/redis/redis.conf # MailHog for Email Testing mailhog: image: mailhog/mailhog:latest container_name: webshop_mailhog restart: unless-stopped ports: - "1025:1025" - "8025:8025" networks: - webshop_network # phpMyAdmin phpmyadmin: image: phpmyadmin/phpmyadmin:latest container_name: webshop_phpmyadmin restart: unless-stopped ports: - "8080:80" environment: PMA_HOST: db PMA_PORT: 3306 PMA_USER: webshop PMA_PASSWORD: webshop_password networks: - webshop_network depends_on: - db # Adminer (Alternative to phpMyAdmin) adminer: image: adminer:latest container_name: webshop_adminer restart: unless-stopped ports: - "8081:8080" networks: - webshop_network depends_on: - db # Elasticsearch for Search elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0 container_name: webshop_elasticsearch restart: unless-stopped environment: - discovery.type=single-node - xpack.security.enabled=false - "ES_JAVA_OPTS=-Xms512m -Xmx512m" volumes: - elasticsearch_data:/usr/share/elasticsearch/data networks: - webshop_network ports: - "9200:9200" # Kibana for Elasticsearch Management kibana: image: docker.elastic.co/kibana/kibana:8.11.0 container_name: webshop_kibana restart: unless-stopped environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 networks: - webshop_network depends_on: - elasticsearch ports: - "5601:5601" # RabbitMQ for Message Queue rabbitmq: image: rabbitmq:3-management-alpine container_name: webshop_rabbitmq restart: unless-stopped environment: RABBITMQ_DEFAULT_USER: webshop RABBITMQ_DEFAULT_PASS: webshop_password volumes: - rabbitmq_data:/var/lib/rabbitmq networks: - webshop_network ports: - "5672:5672" - "15672:15672" # MinIO for Object Storage minio: image: minio/minio:latest container_name: webshop_minio restart: unless-stopped ports: - "9000:9000" - "9001:9001" environment: MINIO_ROOT_USER: webshop MINIO_ROOT_PASSWORD: webshop_password volumes: - minio_data:/data networks: - webshop_network command: server /data --console-address ":9001" # Varnish Cache varnish: image: varnish:7.3 container_name: webshop_varnish restart: unless-stopped ports: - "6081:6081" - "6082:6082" volumes: - ./docker/varnish/default.vcl:/etc/varnish/default.vcl networks: - webshop_network depends_on: - nginx # Monitoring Stack prometheus: image: prom/prometheus:latest container_name: webshop_prometheus restart: unless-stopped ports: - "9090:9090" volumes: - ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus networks: - webshop_network grafana: image: grafana/grafana:latest container_name: webshop_grafana restart: unless-stopped ports: - "3000:3000" environment: GF_SECURITY_ADMIN_PASSWORD: admin volumes: - grafana_data:/var/lib/grafana networks: - webshop_network depends_on: - prometheus volumes: db_data: driver: local redis_data: driver: local elasticsearch_data: driver: local rabbitmq_data: driver: local minio_data: driver: local prometheus_data: driver: local grafana_data: driver: local networks: webshop_network: driver: bridge ipam: config: - subnet: 172.20.0.0/16