
services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: dbname
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: rootpassword
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 5s
      retries: 10

  redis:
    image: redis:alpine

  app:
    build: .
    environment:
      - DATABASE_URL=mysql+aiomysql://user:password@mysql:3306/dbname
      - REDIS_URL=redis://redis:6379/0
      - CELERY_BROKER_URL=redis://redis:6379/0
      - CELERY_RESULT_BACKEND=redis://redis:6379/0
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_started

  worker:
    build: .
    entrypoint: ''
    command: celery -A worker.tasks.celery_app worker --loglevel=info
    environment:
      - DATABASE_URL=mysql+aiomysql://user:password@mysql:3306/dbname
      - REDIS_URL=redis://redis:6379/0
      - CELERY_BROKER_URL=redis://redis:6379/0
      - CELERY_RESULT_BACKEND=redis://redis:6379/0
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_started

  beat:
    build: .
    entrypoint: ''
    command: celery -A worker.tasks.celery_app beat --loglevel=info
    environment:
      - DATABASE_URL=mysql+aiomysql://user:password@mysql:3306/dbname
      - REDIS_URL=redis://redis:6379/0
      - CELERY_BROKER_URL=redis://redis:6379/0
      - CELERY_RESULT_BACKEND=redis://redis:6379/0
      - SYNC_SWEEP_INTERVAL_SECONDS=1800
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_started

  unit-lint:
    build:
      context: .
      target: unit-lint
    volumes:
      - .:/var/app

  integration-test:
    build:
      context: .
      target: integration-test
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_started
    environment:
      - DATABASE_URL=mysql+aiomysql://user:password@mysql:3306/dbname
      - REDIS_URL=redis://redis:6379/0
      - CELERY_BROKER_URL=redis://redis:6379/0
      - CELERY_RESULT_BACKEND=redis://redis:6379/0
    volumes:
      - .:/var/app

  uv-lock-upgrade:
    image: ghcr.io/astral-sh/uv:python3.14-alpine
    working_dir: /var/app
    command: uv lock --upgrade
    volumes:
      - .:/var/app
