timoth-y/kicksware-api

View on GitHub
docker-compose.yml

Summary

Maintainability
Test Coverage
version: '3.7'
services:
  products-service:
    build:
      context: services/products
      dockerfile: ./docker/Dockerfile
      target: prod
    image: ${CI_REGISTRY_PREFIX}/api/products-service
    container_name: products
    env_file: services/products/env/.env.prod
    restart: always
    labels:
      - traefik.http.routers.product-router-rest.rule=Host(`api.kicksware.com`) && PathPrefix(`/products`)
      - traefik.http.routers.product-router-rest.service=product-service-rest
      - traefik.http.routers.product-router-rest.tls=true
      - traefik.http.routers.product-router-rest.tls.certresolver=le
      - traefik.http.services.product-service-rest.loadbalancer.server.scheme=http
      - traefik.http.routers.product-router-grpc.rule=Host(`api.kicksware.com`) && PathPrefix(`/proto.ProductService`)
      - traefik.http.routers.product-router-grpc.service=product-service-grpc
      - traefik.http.services.product-service-grpc.loadbalancer.server.scheme=h2c
      - traefik.docker.network=web
    networks:
      - web
      - data
    volumes:
      - /${SOURCE_DIR}/product-service/env:/env
      - key-volume:/keys

  users-service:
    build:
      context: services/users
      dockerfile: ./docker/Dockerfile
      target: prod
    image: ${CI_REGISTRY_PREFIX}/api/users-service
    container_name: users
    env_file: services/users/env/.env.prod
    restart: always
    labels:
      - traefik.http.routers.user-router-rest.rule=Host(`api.kicksware.com`) && PathPrefix(`/users`) || PathPrefix(`/auth`) ||
        PathPrefix(`/mail`) || PathPrefix(`/interact`)
      - traefik.http.routers.user-router-rest.service=user-service-rest
      - traefik.http.routers.user-router-rest.tls=true
      - traefik.http.routers.user-router-rest.tls.certresolver=le
      - traefik.http.services.user-service-rest.loadbalancer.server.scheme=http
      - traefik.docker.network=web
    networks:
      web:
        aliases:
          - user.backend
      data: {}
    volumes:
      - /${SOURCE_DIR}/user-service/env:/env
      - /${SOURCE_DIR}/user-service/template:/template
      - key-volume:/keys

  references-service:
    build:
      context: services/references
      dockerfile: ./docker/Dockerfile
      target: prod
    image: ${CI_REGISTRY_PREFIX}/api/references-service
    container_name: references
    env_file: services/references/env/.env.prod
    restart: always
    labels:
      - traefik.http.routers.reference-router-rest.rule=Host(`api.kicksware.com`) && PathPrefix(`/references`)
      - traefik.http.routers.reference-router-rest.service=reference-service-rest
      - traefik.http.routers.reference-router-rest.tls=true
      - traefik.http.routers.reference-router-rest.tls.certresolver=le
      - traefik.http.services.reference-service-rest.loadbalancer.server.scheme=http
      - traefik.http.routers.reference-router-grpc.rule=Host(`api.kicksware.com`) && PathPrefix(`/proto.ReferenceService`)
      - traefik.http.routers.reference-router-grpc.service=reference-service-grpc
      - traefik.http.services.reference-service-grpc.loadbalancer.server.scheme=h2c
      - traefik.docker.network=web
    volumes:
      - /${SOURCE_DIR}/reference-service/env:/env
      - key-volume:/keys
    networks:
      - web
      - data

  search-service:
    build:
      context: services/search
      dockerfile: ./docker/Dockerfile
      target: prod
    image: ${CI_REGISTRY_PREFIX}/api/search-service
    container_name: search
    env_file: services/search/env/.env.prod
    restart: always
    labels:
      - traefik.http.routers.search-router-rest.rule=Host(`api.kicksware.com`) && PathPrefix(`/search`)
      - traefik.http.routers.search-router-rest.service=search-service-rest
      - traefik.http.routers.search-router-rest.tls=true
      - traefik.http.routers.search-router-rest.tls.certresolver=le
      - traefik.http.services.search-service-rest.loadbalancer.server.scheme=http
      - traefik.http.routers.search-router-grpc.rule=Host(`api.kicksware.com`) &&
        PathPrefix(`/proto.SearchReferencesService`) || PathPrefix(`/proto.SearchProductService`)
      - traefik.http.routers.search-router-grpc.service=search-service-grpc
      - traefik.http.services.search-service-grpc.loadbalancer.server.scheme=h2c
      - traefik.docker.network=web
    networks:
      - web
      - elastic
      - data
    volumes:
      - /${SOURCE_DIR}/search-service/env:/env
      - key-volume:/keys
    depends_on:
      - references-service
      - products-service

  orders-service:
    build:
      context: services/orders
      dockerfile: ./docker/Dockerfile
      target: prod
    image: ${CI_REGISTRY_PREFIX}/api/orders-service
    container_name: orders
    env_file: services/orders/env/.env.prod
    restart: always
    labels:
      - traefik.http.routers.order-router-rest.rule=Host(`api.kicksware.com`) && PathPrefix(`/orders`)
      - traefik.http.routers.order-router-rest.service=order-service-rest
      - traefik.http.routers.order-router-rest.tls=true
      - traefik.http.routers.order-router-rest.tls.certresolver=le
      - traefik.http.services.order-service-rest.loadbalancer.server.scheme=http
      - traefik.http.routers.order-router-grpc.rule=Host(`api.kicksware.com`) && PathPrefix(`/proto.OrderService`)
      - traefik.http.routers.order-router-grpc.service=order-service-grpc
      - traefik.http.services.order-service-grpc.loadbalancer.server.scheme=h2c
      - traefik.docker.network=web
    volumes:
      - /${SOURCE_DIR}/order-service/env:/env
      - key-volume:/keys
    networks:
      - web
      - data

  cdn-service:
    build:
      context: services/cdn
      dockerfile: ./docker/Dockerfile
      target: prod
    image: ${CI_REGISTRY_PREFIX}/api/cdn-service
    container_name: cdn
    env_file: services/cdn/env/.env.prod
    restart: always
    labels:
      - traefik.http.routers.cdn-router-rest.rule=Host(`cdn.kicksware.com`)
      - traefik.http.routers.cdn-router-rest.service=cdn-service-rest
      - traefik.http.routers.cdn-router-rest.tls=true
      - traefik.http.routers.cdn-router-rest.tls.certresolver=le
      - traefik.http.services.cdn-service-rest.loadbalancer.server.scheme=http
      - traefik.http.routers.cdn-router-grpc.rule=Host(`cdn.kicksware.com`)
      - traefik.http.routers.cdn-router-grpc.service=cdn-service-grpc
      - traefik.http.services.cdn-service-grpc.loadbalancer.server.scheme=h2c
      - traefik.docker.network=web
    volumes:
      - /${SOURCE_DIR}/cdn-service/env:/env
      - key-volume:/keys
      - type: bind
        source: /source/storage
        target: /storage
    networks:
      - web
      - data

networks:
  elastic:
    driver: bridge
  data:
    driver: bridge
  web:
    external: true

volumes:
  key-volume:
    driver: local
    driver_opts:
       o: bind
       type: none
       device: /source/keys