version: '3'

services:
    nginx:
        image: nginx:alpine
        depends_on:
            - php
        restart: always
        tty: false
        ports:
            - "80:80"
            - "443:443"
        volumes:
            # Nginx
            - ./docker/nginx/nginx.conf:/var/nginx/social.conf
            - ./docker/nginx/domain.sh:/var/nginx/domain.sh
            # Certbot
            - ./docker/certbot/www:/var/www/certbot
            - ./docker/certbot/.files:/etc/letsencrypt
            # Social
            - ./public:/var/www/social/public
        env_file:
            - ./docker/bootstrap/bootstrap.env
            - ./docker/db/db.env
        command: /bin/sh -c '/var/nginx/domain.sh;
                             while :; do
                                 sleep 6h & wait $${!};
                                 nginx -s reload;
                             done &
                             nginx -g "daemon off;"'

    certbot:
        image: certbot/certbot
        # Check for certificate renewal every 12h as
        # recommended by Let's Encrypt
        entrypoint: /bin/sh -c 'trap exit TERM;
                                while :; do
                                    certbot renew > /dev/null;
                                    sleep 12h & wait $${!};
                                done'
        volumes:
          - ./docker/certbot/www:/var/www/certbot
          - ./docker/certbot/.files:/etc/letsencrypt

    php:
        build: docker/php
        restart: always
        tty: true
        ports:
            - 9000:9000
        volumes:
            # Entrypoint
            - ./docker/php/entrypoint.sh:/entrypoint.sh
            - ./docker/db/wait_for_db.sh:/wait_for_db.sh
            - ./docker/social/install.sh:/var/entrypoint.d/social_install.sh
            # Main files
            - .:/var/www/social
            - /var/www/social/docker # don't map docker folder
        env_file:
            - ./docker/social/social.env
            - ./docker/db/db.env
        command: /entrypoint.sh

    worker:
        build: docker/php
        restart: always
        tty: true
        volumes:
            # Entrypoint
            - ./docker/php/entrypoint.sh:/entrypoint.sh
            - ./docker/db/wait_for_db.sh:/wait_for_db.sh
            - ./docker/social/install.sh:/var/entrypoint.d/10_social_install.sh
            - ./docker/social/worker.sh:/var/entrypoint.d/20_social_worker.sh
            # Main files
            - .:/var/www/social
            - /var/www/social/docker # don't map docker folder
        env_file:
            - ./docker/social/social.env
            - ./docker/db/db.env
        command: /entrypoint.sh

    db:
        image: postgres:alpine
        restart: always
        tty: false
        ports:
            - 3306:3306
        env_file:
            - ./docker/db/db.env

    redis:
        image: redis:alpine
        restart: always
        tty: false
        ports:
            - 6379:6379

    mail:
        build: docker/mail
        env_file:
          - ./docker/mail/mail.env
        ports:
          - 25:25
          - 110:110
          - 143:143
          - 587:587
          - 993:993
        volumes:
          - ./docker/mail/mail:/var/mail
          - ./docker/mail/config:/etc/mail
          # Certbot
          - ./docker/certbot/www:/var/www/certbot
          - ./docker/certbot/.files:/etc/letsencrypt
volumes:
    database: