services:
    redis:
        image: redis:alpine
        command: [ redis-server, --maxmemory 128mb, --maxmemory-policy volatile-lru, --save "" ]

    rabbitmq:
        image: rabbitmq:alpine
        volumes:
            - pimcore-rabbitmq:/var/lib/rabbitmq/

    db:
        image: mariadb:10.11
        working_dir: /application
        command: [ mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_520_ci, --innodb-file-per-table=1 ]
        volumes:
            - pimcore-database:/var/lib/mysql
        environment:
            - MYSQL_ROOT_PASSWORD=ROOT
            - MYSQL_DATABASE=pimcore
            - MYSQL_USER=pimcore
            - MYSQL_PASSWORD=pimcore
        healthcheck:
            # The service is considered healthy when:
            # - connection to pimcore db can be established, and
            # - we can run a simple SQL query.
            test: [ "CMD-SHELL", "mysql -h db -u$$MYSQL_USER -p$$MYSQL_PASSWORD $$MYSQL_DATABASE -e 'SHOW TABLES;'" ]
            interval: 10s
            retries: 6
            start_period: 1m
            timeout: 3s

    nginx:
        image: nginx:stable-alpine
        ports:
            - "8888:80"
        volumes:
            - .:/var/www/html:ro
            - ./.docker/nginx.conf:/etc/nginx/conf.d/default.conf:ro
        depends_on:
            - php

    php:
        #user: '1002:1004' # set to your uid:gid
        image: pimcore/pimcore:php8.5-max-5.x
        environment:
            COMPOSER_HOME: /var/www/html
            PHP_IDE_CONFIG: serverName=localhost
            # Feed installer configuration via ENV variables.
            # See: https://pimcore.com/docs/pimcore/current/Development_Documentation/Getting_Started/Advanced_Installation_Topics.html#page_Advanced-Installation-Topics
        depends_on:
            db:
                condition: service_healthy
        volumes:
            - .:/var/www/html

    supervisord:
        #user: '1002:1004' # set to your uid:gid
        image: pimcore/pimcore:php8.5-supervisord-5.x
        depends_on:
            rabbitmq:
                condition: service_started
            db:
                condition: service_healthy
        volumes:
            - .:/var/www/html
            - ./.docker/supervisord.conf:/etc/supervisor/conf.d/pimcore.conf:ro

    mercure:
        image: dunglas/mercure
        restart: unless-stopped
        environment:
            # Uncomment the following line to disable HTTPS
            SERVER_NAME: ':80'
            MERCURE_PUBLISHER_JWT_KEY: 'CHANGE_ME_THIS_IS_MY_SECRET_KEY_THAT_IS_LONG_ENOUGH_FOR_VALIDATION'
            MERCURE_SUBSCRIBER_JWT_KEY: 'CHANGE_ME_THIS_IS_MY_SECRET_KEY_THAT_IS_LONG_ENOUGH_FOR_VALIDATION'
            MERCURE_EXTRA_DIRECTIVES: anonymous
        # Uncomment the following line to enable the development mode
        # command: /usr/bin/caddy run -config /etc/caddy/Caddyfile.dev
        ports:
            - "8080:80"
        #    - "8443:443"

    opensearch:
        image: opensearchproject/opensearch:2
        environment:
            - cluster.name=opensearch-cluster # Name the cluster
            - node.name=opensearch-node # Name the node that will run in this container
            - discovery.seed_hosts=opensearch-node # Nodes to look for when discovering the cluster
            - cluster.routing.allocation.disk.threshold_enabled=false # Disable disk usage watermark
            # - cluster.initial_cluster_manager_nodes=opensearch-node # Nodes eligible to serve as cluster manager
            - bootstrap.memory_lock=true # Disable JVM heap memory swapping
            - "OPENSEARCH_JAVA_OPTS=-Xms1024m -Xmx1024m" # Set min and max JVM heap sizes to at least 50% of system RAM
            - discovery.type=single-node
            - action.auto_create_index=false
            - OPENSEARCH_INITIAL_ADMIN_PASSWORD=gBsVe!Dut723
        ulimits:
            memlock:
                soft: -1 # Set memlock to unlimited (no soft or hard limit)
                hard: -1
            nofile:
                soft: 65536 # Maximum number of open files for the opensearch user - set to at least 65536
                hard: 65536
        volumes:
            - pimcore-demo-opensearch:/usr/share/opensearch/data

    opensearch-dashboards:
        image: opensearchproject/opensearch-dashboards:2 # Make sure the version of opensearch-dashboards matches the version of opensearch installed on other nodes
        ports:
            - 5601:5601
        environment:
            OPENSEARCH_HOSTS: '["https://opensearch:9200"]'

    # The following two services are used for testing.
    # We restrict these services to the test profile only, so we don't spin them up with every `docker compose up`.
    # See: https://docs.docker.com/compose/profiles/
    test-db:
        profiles: [ 'test' ]
        extends: db
        volumes:
            - pimcore-test-database:/var/lib/mysql

    test-php:
        profiles: [ 'test' ]
        extends: php
        environment:
            APP_ENV: test
            PIMCORE_TEST_DB_DSN: ${PIMCORE_TEST_DB_DSN:-mysql://pimcore:pimcore@test-db/pimcore}
        depends_on:
            test-db:
                condition: service_healthy
        volumes:
            - pimcore-test-var:/var/www/html/var
            - pimcore-test-public-var:/var/www/html/public/var

volumes:
    pimcore-database:
    pimcore-rabbitmq:
    pimcore-test-database:
    pimcore-test-var:
    pimcore-test-public-var:
    pimcore-demo-opensearch:
