version: "3"
services:
  reverse-proxy:
    image: traefik:v2.0
    command:
      - --api.insecure=true
      - --providers.docker
      - --entryPoints.web.address=:80
      - --entryPoints.websecure.address=:443
    ports:
      - "80:80"
      - "443:443"
      # The Web UI (enabled by --api.insecure=true)
      - "8080:8080"
    depends_on:
      - back
      - front
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

  front:
    image: thecodingmachine/nodejs:14
    environment:
      DEBUG_MODE: "$DEBUG_MODE"
      JITSI_URL: $JITSI_URL
      JITSI_PRIVATE_MODE: "$JITSI_PRIVATE_MODE"
      HOST: "0.0.0.0"
      NODE_ENV: development
      PUSHER_URL: /pusher
      UPLOADER_URL: /uploader
      #ADMIN_URL: /admin
      MAPS_URL: /maps
      ICON_URL: /icon
      STARTUP_COMMAND_1: ./templater.sh
      STARTUP_COMMAND_2: yarn install
      TURN_SERVER: "turn:localhost:3478,turns:localhost:5349"
      DISABLE_NOTIFICATIONS: "$DISABLE_NOTIFICATIONS"
      SKIP_RENDER_OPTIMIZATIONS: "$SKIP_RENDER_OPTIMIZATIONS"
      # Use TURN_USER/TURN_PASSWORD if your Coturn server is secured via hard coded credentials.
      # Advice: you should instead use Coturn REST API along the TURN_STATIC_AUTH_SECRET in the Back container
      TURN_USER: ""
      TURN_PASSWORD: ""
      START_ROOM_URL: "$START_ROOM_URL"
      DISABLE_ANONYMOUS: "$DISABLE_ANONYMOUS"
    command: yarn run start
    volumes:
      - ./front:/usr/src/app
    labels:
      - "traefik.http.routers.front.rule=PathPrefix(`/`)"
      - "traefik.http.routers.front.entryPoints=web,traefik"
      - "traefik.http.services.front.loadbalancer.server.port=8080"
      - "traefik.http.routers.front-ssl.rule=PathPrefix(`/`)"
      - "traefik.http.routers.front-ssl.entryPoints=websecure"
      - "traefik.http.routers.front-ssl.tls=true"
      - "traefik.http.routers.front-ssl.service=front"

  pusher:
    image: thecodingmachine/nodejs:14
    command: yarn dev
    #command: yarn run prod
    #command: yarn run profile
    environment:
      DEBUG: "*"
      STARTUP_COMMAND_1: yarn install
      # wait for files generated by "messages" container to exists
      STARTUP_COMMAND_2: while [ ! -f /usr/src/app/src/Messages/generated/messages_pb.js ]; do sleep 1; done
      SECRET_JITSI_KEY: "$SECRET_JITSI_KEY"
      SECRET_KEY: yourSecretKey
      ADMIN_API_TOKEN: "$ADMIN_API_TOKEN"
      API_URL: back:50051
      JITSI_URL: $JITSI_URL
      JITSI_ISS: $JITSI_ISS
      FRONT_URL: http://localhost
      OPID_CLIENT_ID: $OPID_CLIENT_ID
      OPID_CLIENT_SECRET: $OPID_CLIENT_SECRET
      OPID_CLIENT_ISSUER: $OPID_CLIENT_ISSUER
      OPID_CLIENT_REDIRECT_URL: $OPID_CLIENT_REDIRECT_URL
      OPID_PROFILE_SCREEN_PROVIDER: $OPID_PROFILE_SCREEN_PROVIDER
      DISABLE_ANONYMOUS: $DISABLE_ANONYMOUS
    volumes:
      - ./pusher:/usr/src/app
    labels:
      - "traefik.http.middlewares.strip-pusher-prefix.stripprefix.prefixes=/pusher"
      - "traefik.http.routers.pusher.rule=PathPrefix(`/pusher`)"
      - "traefik.http.routers.pusher.middlewares=strip-pusher-prefix@docker"
      - "traefik.http.routers.pusher.entryPoints=web"
      - "traefik.http.services.pusher.loadbalancer.server.port=8080"
      - "traefik.http.routers.pusher-ssl.rule=PathPrefix(`/pusher`)"
      - "traefik.http.routers.pusher-ssl.middlewares=strip-pusher-prefix@docker"
      - "traefik.http.routers.pusher-ssl.entryPoints=websecure"
      - "traefik.http.routers.pusher-ssl.tls=true"
      - "traefik.http.routers.pusher-ssl.service=pusher"

  maps:
    image: thecodingmachine/nodejs:12-apache
    environment:
      DEBUG_MODE: "$DEBUG_MODE"
      HOST: "0.0.0.0"
      NODE_ENV: development
      #APACHE_DOCUMENT_ROOT: dist/
      #APACHE_EXTENSIONS: headers
      #APACHE_EXTENSION_HEADERS: 1
      STARTUP_COMMAND_0: sudo a2enmod headers
      STARTUP_COMMAND_1: yarn install
      STARTUP_COMMAND_2: yarn run dev &
    volumes:
      - ./maps:/var/www/html
    labels:
      - "traefik.http.middlewares.strip-maps-prefix.stripprefix.prefixes=/maps"
      - "traefik.http.routers.maps.rule=PathPrefix(`/maps`)"
      - "traefik.http.routers.maps.middlewares=strip-maps-prefix@docker"
      - "traefik.http.routers.maps.entryPoints=web,traefik"
      - "traefik.http.services.maps.loadbalancer.server.port=80"
      - "traefik.http.routers.maps-ssl.rule=PathPrefix(`/maps`)"
      - "traefik.http.routers.maps-ssl.middlewares=strip-maps-prefix@docker"
      - "traefik.http.routers.maps-ssl.entryPoints=websecure"
      - "traefik.http.routers.maps-ssl.tls=true"
      - "traefik.http.routers.maps-ssl.service=maps"

  back:
    image: thecodingmachine/nodejs:12
    command: yarn dev
    #command: yarn run profile
    environment:
      DEBUG: "*"
      STARTUP_COMMAND_1: yarn install
      # wait for files generated by "messages" container to exists
      STARTUP_COMMAND_2: while [ ! -f /usr/src/app/src/Messages/generated/messages_pb.js ]; do sleep 1; done
      SECRET_KEY: yourSecretKey
      SECRET_JITSI_KEY: "$SECRET_JITSI_KEY"
      ALLOW_ARTILLERY: "true"
      ADMIN_API_TOKEN: "$ADMIN_API_TOKEN"
      JITSI_URL: $JITSI_URL
      JITSI_ISS: $JITSI_ISS
      MAX_PER_GROUP: "$MAX_PER_GROUP"
      REDIS_HOST: redis
      NODE_ENV: development
    volumes:
      - ./back:/usr/src/app
    labels:
      - "traefik.http.middlewares.strip-api-prefix.stripprefix.prefixes=/api"
      - "traefik.http.routers.back.rule=PathPrefix(`/api`)"
      - "traefik.http.routers.back.middlewares=strip-api-prefix@docker"
      - "traefik.http.routers.back.entryPoints=web"
      - "traefik.http.services.back.loadbalancer.server.port=8080"
      - "traefik.http.routers.back-ssl.rule=PathPrefix(`/api`)"
      - "traefik.http.routers.back-ssl.middlewares=strip-api-prefix@docker"
      - "traefik.http.routers.back-ssl.entryPoints=websecure"
      - "traefik.http.routers.back-ssl.tls=true"
      - "traefik.http.routers.back-ssl.service=back"

  uploader:
    image: thecodingmachine/nodejs:12
    command: yarn dev
    #command: yarn run profile
    environment:
      DEBUG: "*"
      STARTUP_COMMAND_1: yarn install
    volumes:
      - ./uploader:/usr/src/app
    labels:
      - "traefik.http.middlewares.strip-uploader-prefix.stripprefix.prefixes=/uploader"
      - "traefik.http.routers.uploader.rule=PathPrefix(`/uploader`)"
      - "traefik.http.routers.uploader.middlewares=strip-uploader-prefix@docker"
      - "traefik.http.routers.uploader.entryPoints=web"
      - "traefik.http.services.uploader.loadbalancer.server.port=8080"
      - "traefik.http.routers.uploader-ssl.rule=PathPrefix(`/uploader`)"
      - "traefik.http.routers.uploader-ssl.middlewares=strip-uploader-prefix@docker"
      - "traefik.http.routers.uploader-ssl.entryPoints=websecure"
      - "traefik.http.routers.uploader-ssl.tls=true"
      - "traefik.http.routers.uploader-ssl.service=uploader"

  messages:
    #image: thecodingmachine/nodejs:14
    image: thecodingmachine/workadventure-back-base:latest
    environment:
      #STARTUP_COMMAND_0: sudo apt-get install -y inotify-tools
      STARTUP_COMMAND_1: yarn install
      STARTUP_COMMAND_2: yarn run proto:watch
    volumes:
      - ./messages:/usr/src/app
      - ./back:/usr/src/back
      - ./front:/usr/src/front
      - ./pusher:/usr/src/pusher

  redis:
    image: redis:6

  icon:
    image: matthiasluedtke/iconserver:v3.13.0
    labels:
      - "traefik.http.middlewares.strip-icon-prefix.stripprefix.prefixes=/icon"
      - "traefik.http.routers.icon.rule=PathPrefix(`/icon`)"
      - "traefik.http.routers.icon.middlewares=strip-icon-prefix@docker"
      - "traefik.http.routers.icon.entryPoints=web"
      - "traefik.http.services.icon.loadbalancer.server.port=8080"
      - "traefik.http.routers.icon-ssl.rule=PathPrefix(`/icon`)"
      - "traefik.http.routers.icon-ssl.middlewares=strip-icon-prefix@docker"
      - "traefik.http.routers.icon-ssl.entryPoints=websecure"
      - "traefik.http.routers.icon-ssl.tls=true"
      - "traefik.http.routers.icon-ssl.service=icon"

#  coturn:
#    image: coturn/coturn:4.5.2
#    command:
#      - turnserver
#      #- -c=/etc/coturn/turnserver.conf
#      - --log-file=stdout
#      - --external-ip=$$(detect-external-ip)
#      - --listening-port=3478
#      - --min-port=10000
#      - --max-port=10010
#      - --tls-listening-port=5349
#      - --listening-ip=0.0.0.0
#      - --realm=localhost
#      - --server-name=localhost
#      - --lt-cred-mech
#      # Enable Coturn "REST API" to validate temporary passwords.
#      #- --use-auth-secret
#      #- --static-auth-secret=SomeStaticAuthSecret
#      #- --userdb=/var/lib/turn/turndb
#      - --user=workadventure:WorkAdventure123
#      # use real-valid certificate/privatekey files
#      #- --cert=/root/letsencrypt/fullchain.pem
#      #- --pkey=/root/letsencrypt/privkey.pem
#    network_mode: host