x-app-common: &app-common
  networks:
    appnet:
    externalnet:
  deploy:
    placement:
      constraints:
        - node.labels.gpu != true
  volumes:
    - /root/rose-ash/_config/app-config.yaml:/app/config/app-config.yaml:ro

x-app-env: &app-env
  DATABASE_URL_ACCOUNT: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_account
  DATABASE_URL_FEDERATION: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_federation
  SMTP_HOST: ${SMTP_HOST}
  SMTP_PORT: ${SMTP_PORT}
  MAIL_FROM: ${MAIL_FROM}
  SMTP_USER: ${SMTP_USER}
  SMTP_PASS: ${SMTP_PASS}
  GHOST_API_URL: ${GHOST_API_URL}
  GHOST_ADMIN_API_URL: ${GHOST_ADMIN_API_URL}
  GHOST_PUBLIC_URL: ${GHOST_PUBLIC_URL}
  GHOST_CONTENT_API_KEY: ${GHOST_CONTENT_API_KEY}
  GHOST_WEBHOOK_SECRET: ${GHOST_WEBHOOK_SECRET}
  GHOST_ADMIN_API_KEY: ${GHOST_ADMIN_API_KEY}
  REDIS_AUTH_URL: redis://redis-auth:6379/0
  SECRET_KEY: ${SECRET_KEY}
  SUMUP_API_KEY: ${SUMUP_API_KEY}
  APP_URL_BLOG: https://blog.rose-ash.com
  APP_URL_MARKET: https://market.rose-ash.com
  APP_URL_CART: https://cart.rose-ash.com
  APP_URL_EVENTS: https://events.rose-ash.com
  APP_URL_FEDERATION: https://federation.rose-ash.com
  APP_URL_ACCOUNT: https://account.rose-ash.com
  APP_URL_ORDERS: https://orders.rose-ash.com
  APP_URL_RELATIONS: http://relations:8000
  APP_URL_LIKES: http://likes:8000
  APP_URL_SX: https://sx.rose-ash.com
  APP_URL_TEST: https://test.rose-ash.com
  APP_URL_ARTDAG: https://celery-artdag.rose-ash.com
  APP_URL_ARTDAG_L2: https://artdag.rose-ash.com
  INTERNAL_URL_BLOG: http://blog:8000
  INTERNAL_URL_MARKET: http://market:8000
  INTERNAL_URL_CART: http://cart:8000
  INTERNAL_URL_EVENTS: http://events:8000
  INTERNAL_URL_FEDERATION: http://federation:8000
  INTERNAL_URL_ACCOUNT: http://account:8000
  INTERNAL_URL_ORDERS: http://orders:8000
  INTERNAL_URL_RELATIONS: http://relations:8000
  INTERNAL_URL_LIKES: http://likes:8000
  INTERNAL_URL_SX: http://sx_docs:8000
  INTERNAL_URL_TEST: http://test:8000
  INTERNAL_URL_ARTDAG: http://l1-server:8100
  AP_DOMAIN: federation.rose-ash.com
  AP_DOMAIN_BLOG: blog.rose-ash.com
  AP_DOMAIN_MARKET: market.rose-ash.com
  AP_DOMAIN_EVENTS: events.rose-ash.com
  EXTERNAL_INBOXES: "artdag|https://celery-artdag.rose-ash.com/inbox"

services:
  blog:
    <<: *app-common
    image: registry.rose-ash.com:5000/blog:latest
    build:
      context: .
      dockerfile: blog/Dockerfile
    environment:
      <<: *app-env
      DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_blog
      ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_blog
      REDIS_URL: redis://redis:6379/0
      DATABASE_HOST: db
      DATABASE_PORT: "5432"
      RUN_MIGRATIONS: "true"
      WORKERS: "1"

  market:
    <<: *app-common
    image: registry.rose-ash.com:5000/market:latest
    build:
      context: .
      dockerfile: market/Dockerfile
    volumes:
      - /root/rose-ash/_config/app-config.yaml:/app/config/app-config.yaml:ro
      - /root/rose-ash/_snapshot:/app/_snapshot
    environment:
      <<: *app-env
      DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_market
      ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_market
      REDIS_URL: redis://redis:6379/1
      DATABASE_HOST: db
      DATABASE_PORT: "5432"
      RUN_MIGRATIONS: "true"
      WORKERS: "1"

  cart:
    <<: *app-common
    image: registry.rose-ash.com:5000/cart:latest
    build:
      context: .
      dockerfile: cart/Dockerfile
    environment:
      <<: *app-env
      DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_cart
      ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_cart
      REDIS_URL: redis://redis:6379/2
      DATABASE_HOST: db
      DATABASE_PORT: "5432"
      RUN_MIGRATIONS: "true"
      WORKERS: "1"

  events:
    <<: *app-common
    image: registry.rose-ash.com:5000/events:latest
    build:
      context: .
      dockerfile: events/Dockerfile
    environment:
      <<: *app-env
      DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_events
      ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_events
      REDIS_URL: redis://redis:6379/3
      DATABASE_HOST: db
      DATABASE_PORT: "5432"
      RUN_MIGRATIONS: "true"
      WORKERS: "1"

  federation:
    <<: *app-common
    image: registry.rose-ash.com:5000/federation:latest
    build:
      context: .
      dockerfile: federation/Dockerfile
    environment:
      <<: *app-env
      DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_federation
      ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_federation
      REDIS_URL: redis://redis:6379/4
      DATABASE_HOST: db
      DATABASE_PORT: "5432"
      RUN_MIGRATIONS: "true"
      WORKERS: "1"

  account:
    <<: *app-common
    image: registry.rose-ash.com:5000/account:latest
    build:
      context: .
      dockerfile: account/Dockerfile
    environment:
      <<: *app-env
      DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_account
      ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_account
      REDIS_URL: redis://redis:6379/5
      DATABASE_HOST: db
      DATABASE_PORT: "5432"
      RUN_MIGRATIONS: "true"
      WORKERS: "1"

  relations:
    <<: *app-common
    image: registry.rose-ash.com:5000/relations:latest
    build:
      context: .
      dockerfile: relations/Dockerfile
    environment:
      <<: *app-env
      DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_relations
      ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_relations
      REDIS_URL: redis://redis:6379/6
      DATABASE_HOST: db
      DATABASE_PORT: "5432"
      RUN_MIGRATIONS: "true"
      WORKERS: "1"

  likes:
    <<: *app-common
    image: registry.rose-ash.com:5000/likes:latest
    build:
      context: .
      dockerfile: likes/Dockerfile
    environment:
      <<: *app-env
      DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_likes
      ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_likes
      REDIS_URL: redis://redis:6379/7
      DATABASE_HOST: db
      DATABASE_PORT: "5432"
      RUN_MIGRATIONS: "true"
      WORKERS: "1"

  orders:
    <<: *app-common
    image: registry.rose-ash.com:5000/orders:latest
    build:
      context: .
      dockerfile: orders/Dockerfile
    environment:
      <<: *app-env
      DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_orders
      ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_orders
      REDIS_URL: redis://redis:6379/8
      DATABASE_HOST: db
      DATABASE_PORT: "5432"
      RUN_MIGRATIONS: "true"
      WORKERS: "1"

  test:
    <<: *app-common
    image: registry.rose-ash.com:5000/test:latest
    build:
      context: .
      dockerfile: test/Dockerfile
    environment:
      <<: *app-env
      REDIS_URL: redis://redis:6379/9
      WORKERS: "1"

  sx_docs:
    <<: *app-common
    image: registry.rose-ash.com:5000/sx_docs:latest
    build:
      context: .
      dockerfile: sx/Dockerfile
    environment:
      <<: *app-env
      REDIS_URL: redis://redis:6379/10
      WORKERS: "1"

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-postgres}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-change-me}
      POSTGRES_DB: ${POSTGRES_DB:-appdb}
    volumes:
      - db_data_1:/var/lib/postgresql/data
    networks:
      appnet:
    deploy:
      placement:
        constraints:
          - node.labels.gpu != true

  pgbouncer:
    image: edoburu/pgbouncer:latest
    environment:
      DB_HOST: db
      DB_PORT: "5432"
      DB_USER: ${POSTGRES_USER:-postgres}
      DB_PASSWORD: ${POSTGRES_PASSWORD:-change-me}
      POOL_MODE: transaction
      DEFAULT_POOL_SIZE: "20"
      MAX_CLIENT_CONN: "300"
      MIN_POOL_SIZE: "5"
      AUTH_TYPE: plain
    networks:
      appnet:
    deploy:
      placement:
        constraints:
          - node.labels.gpu != true

  adminer:
    image: adminer
    networks:
      appnet:
      externalnet:
    deploy:
      placement:
        constraints:
          - node.labels.gpu != true

  redis:
    image: redis:7-alpine
    container_name: redis
    volumes:
      - redis_data:/data
    networks:
      appnet:
    command:
      redis-server
      --maxmemory 1gb
      --maxmemory-policy allkeys-lru
    deploy:
      placement:
        constraints:
          - node.labels.gpu != true

  redis-auth:
    image: redis:7-alpine
    volumes:
      - redis_auth_data:/data
    networks:
      appnet:
    command:
      redis-server
      --maxmemory 64mb
      --maxmemory-policy noeviction
    deploy:
      placement:
        constraints:
          - node.labels.gpu != true

volumes:
  db_data_1:
  redis_data:
  redis_auth_data:
networks:
  appnet:
    driver: overlay
  externalnet:
    driver: overlay
    external: true
