version: "3.0"

services:
    reverse-proxy:
        image: traefik:v2.1.3
        command:
            - --entrypoints.web.address=:80
            - --entrypoints.websecure.address=:443
            - --providers.docker=true
            - --certificatesResolvers.le.acme.httpChallenge.entryPoint=web
            - --certificatesresolvers.le.acme.email=martin.eigenmann@unisg.ch
            - --certificatesresolvers.le.acme.storage=/acme.json
            - --providers.docker.exposedByDefault=false
            - --serversTransport.insecureSkipVerify=true
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - ./acme.json:/acme.json
        restart: unless-stopped
        labels:
            - "traefik.enable=true"
            - "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
            - "traefik.http.routers.http-catchall.entrypoints=web"
            - "traefik.http.routers.http-catchall.middlewares=redirect-to-https"
            - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

    tapas-db:
        image: mongo
        restart: unless-stopped
        container_name: tapas_mongodb
        environment:
            MONGO_INITDB_ROOT_USERNAME: root
            MONGO_INITDB_ROOT_PASSWORD: password
        ports:
            - "27017:27017"
        command: mongod --quiet --logpath /dev/null

    tapas-tasks:
        image: openjdk
        command: "java -jar /data/tapas-tasks-0.0.1-SNAPSHOT.jar"
        restart: unless-stopped
        depends_on:
            - tapas-db
        volumes:
            - ./:/data/
        environment:
            roster.uri: http://roster:8082
            spring.data.mongodb.uri: mongodb://root:password@tapas-db:27017
        labels:
            - "traefik.enable=true"
            - "traefik.http.routers.tapas-tasks.rule=Host(`tapas-tasks.${PUB_IP}.nip.io`)"
            - "traefik.http.routers.tapas-tasks.service=tapas-tasks"
            - "traefik.http.services.tapas-tasks.loadbalancer.server.port=8081"
            - "traefik.http.routers.tapas-tasks.tls=true"
            - "traefik.http.routers.tapas-tasks.entryPoints=web,websecure"
            - "traefik.http.routers.tapas-tasks.tls.certresolver=le"

    tapas-auction-house:
        image: openjdk
        command: "java -jar /data/tapas-auction-house-0.0.1-SNAPSHOT.jar"
        restart: unless-stopped
        depends_on:
            - tapas-db
        volumes:
            - ./:/data/
        environment:
            mqtt.broker.uri: tcp://broker.hivemq.com:1883
        labels:
            - "traefik.enable=true"
            - "traefik.http.routers.tapas-auction-house.rule=Host(`tapas-auction-house.${PUB_IP}.nip.io`)"
            - "traefik.http.routers.tapas-auction-house.service=tapas-auction-house"
            - "traefik.http.services.tapas-auction-house.loadbalancer.server.port=8086"
            - "traefik.http.routers.tapas-auction-house.tls=true"
            - "traefik.http.routers.tapas-auction-house.entryPoints=web,websecure"
            - "traefik.http.routers.tapas-auction-house.tls.certresolver=le"

    roster:
        image: openjdk
        command: "java -jar /data/roster-0.0.1-SNAPSHOT.jar"
        restart: unless-stopped
        depends_on:
            - tapas-db
        volumes:
            - ./:/data/
        environment:
            task.list.uri: http://tapas-tasks:8081
            executor.robot.uri: http://executor-robot:8084
            executor.computation.uri: http://executor-computation:8085
            mqtt.broker.uri: tcp://broker.hivemq.com:1883
            spring.data.mongodb.uri: mongodb://root:password@tapas-db:27017
        labels:
            - "traefik.enable=true"
            - "traefik.http.routers.roster.rule=Host(`roster.${PUB_IP}.nip.io`)"
            - "traefik.http.routers.roster.service=roster"
            - "traefik.http.services.roster.loadbalancer.server.port=8082"
            - "traefik.http.routers.roster.tls=true"
            - "traefik.http.routers.roster.entryPoints=web,websecure"
            - "traefik.http.routers.roster.tls.certresolver=le"

    executor-pool:
        image: openjdk
        command: "java -jar /data/executor-pool-0.0.1-SNAPSHOT.jar"
        restart: unless-stopped
        depends_on:
            - tapas-db
        volumes:
            - ./:/data/
        environment:
            mqtt.broker.uri: tcp://broker.hivemq.com:1883
            spring.data.mongodb.uri: mongodb://root:password@tapas-db:27017
        labels:
            - "traefik.enable=true"
            - "traefik.http.routers.executor-pool.rule=Host(`executor-pool.${PUB_IP}.nip.io`)"
            - "traefik.http.routers.executor-pool.service=executor-pool"
            - "traefik.http.services.executor-pool.loadbalancer.server.port=8083"
            - "traefik.http.routers.executor-pool.tls=true"
            - "traefik.http.routers.executor-pool.entryPoints=web,websecure"
            - "traefik.http.routers.executor-pool.tls.certresolver=le"

    executor-computation:
        image: openjdk
        command: "java -jar /data/executor-computation-0.0.1-SNAPSHOT.jar"
        restart: unless-stopped
        depends_on:
            - executor-pool
            - roster
            - tapas-db
        volumes:
            - ./:/data/
        environment:
            EXECUTOR_POOL_URI: http://executor-pool:8083
            ROSTER_URI: http://roster:8082
        labels:
            - "traefik.enable=true"
            - "traefik.http.routers.executor-computation.rule=Host(`executor-computation.${PUB_IP}.nip.io`)"
            - "traefik.http.routers.executor-computation.service=executor-computation"
            - "traefik.http.services.executor-computation.loadbalancer.server.port=8084"
            - "traefik.http.routers.executor-computation.tls=true"
            - "traefik.http.routers.executor-computation.entryPoints=web,websecure"
            - "traefik.http.routers.executor-computation.tls.certresolver=le"
    executor-robot:
        image: openjdk
        command: "java -jar /data/executor-robot-0.0.1-SNAPSHOT.jar"
        restart: unless-stopped
        depends_on:
            - executor-pool
            - roster
            - tapas-db
        volumes:
            - ./:/data/
        environment:
            EXECUTOR_POOL_URI: http://executor-pool:8083
            ROSTER_URI: http://roster:8082
        labels:
            - "traefik.enable=true"
            - "traefik.http.routers.executor-robot.rule=Host(`executor-robot.${PUB_IP}.nip.io`)"
            - "traefik.http.routers.executor-robot.service=executor-robot"
            - "traefik.http.services.executor-robot.loadbalancer.server.port=8085"
            - "traefik.http.routers.executor-robot.tls=true"
            - "traefik.http.routers.executor-robot.entryPoints=web,websecure"
            - "traefik.http.routers.executor-robot.tls.certresolver=le"
