version: '{{ compose_version }}'

services:
  api:
    image: cojedzie/api:latest
    networks: 
      - "{{ ingress_network }}"
      - default
    volumes: 
      - db_data:/var/db
    environment:
      - TRUSTED_PROXIES=10.0.0.0/8
    env_file:
      - ./environment
    deploy:
      mode: replicated
      replicas: 1
      labels:
        - traefik.enable=true
        - traefik.http.routers.{{ service }}-api.rule=(Host(`{{ service }}.{{ main_domain }}`) || Host(`{{ cojedzie_domain }}`)) && (PathPrefix(`/api/`) || PathPrefix(`/bundles/`))
        - traefik.http.routers.{{ service }}-api.priority=100
        - traefik.http.routers.{{ service }}-api.tls=true
        - traefik.http.routers.{{ service }}-api.tls.certresolver=lets-encrypt
        - traefik.http.services.{{ service }}-api.loadbalancer.server.port=8080

  update-job:
    image: cojedzie/api:latest
    command: ["console", "app:update", "--async"]
    networks: 
      - default
    volumes: 
      - db_data:/var/db
    env_file:
      - ./environment
    deploy:
      mode: replicated
      replicas: 0
      labels:
        - "swarm.cronjob.enable=true"
        - "swarm.cronjob.schedule={{ cojedzie_update_cron }}"
      restart_policy:
        condition: none
  
  cron:
    image: cojedzie/cron:latest
    env_file:
      - ./environment
    volumes: 
      - db_data:/var/db
    depends_on:
      - api
  
  worker:
    image: cojedzie/worker:latest
    env_file:
      - ./environment
    volumes: 
      - db_data:/var/db
    depends_on:
      - api

  mercure:
    image: dunglas/mercure
    networks: 
      - "{{ ingress_network }}"
      - default
    environment:
      SERVER_NAME: ':80'
      USE_FORWARDED_HEADERS: 1
      MERCURE_PUBLISHER_JWT_KEY: '{{ cojedzie_mercure_jwt_key }}'
      MERCURE_SUBSCRIBER_JWT_KEY: '{{ cojedzie_mercure_jwt_key }}'
    volumes:
      - mercure_data:/data
      - mercure_config:/config
    deploy:
      mode: replicated
      replicas: 1
      labels:
        - traefik.enable=true
        - traefik.http.routers.{{ service }}-mercure.rule=(Host(`{{ service }}.{{ main_domain }}`) || Host(`{{ cojedzie_domain }}`)) && PathPrefix(`/.well-known/mercure`)
        - traefik.http.routers.{{ service }}-mercure.tls=true
        - traefik.http.routers.{{ service }}-mercure.tls.certresolver=lets-encrypt
        - traefik.http.services.{{ service }}-mercure.loadbalancer.server.port=80

  front:
    image: cojedzie/front:latest
    networks: 
      - "{{ ingress_network }}"
      - default
    depends_on:
      - api
    environment:
      - APP_GTM={{ cojedzie_gtm }}
    deploy:
      mode: replicated
      replicas: 1
      labels:
        - traefik.enable=true
        - traefik.http.routers.{{ service }}-front.rule=Host(`{{ service }}.{{ main_domain }}`) || Host(`{{ cojedzie_domain }}`)
        - traefik.http.routers.{{ service }}-front.tls=true
        - traefik.http.routers.{{ service }}-front.middlewares=gzip@file
        - traefik.http.routers.{{ service }}-front.tls.certresolver=lets-encrypt
        - traefik.http.services.{{ service }}-front.loadbalancer.server.port=3000

volumes:
  db_data: ~
  mercure_data: ~
  mercure_config: ~