# vim: ft=yaml.docker-compose
x-sidekiq: &sidekiq
  image: tootsuite/mastodon:{{ services.mastodon.version }}
  restart: always
  env_file: mastodon.env
  networks:
    - default
    - postfix
    - external_services
  volumes:
    - "./mastodon_data:/mastodon/public/system"
  healthcheck:
    test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ 6' || false"]
  depends_on:
    db:
      condition: service_healthy
    redis:
      condition: service_healthy

version: "3.8"

services:
  db:
    restart: always
    image: postgres:{{ services.mastodon.postgres_version }}
    shm_size: 256mb
    volumes:
      - "./postgres_data:/var/lib/postgresql/data"
      - "./postgres_config:/config:ro"
    command: postgres -c config_file=/config/postgresql.conf
    environment:
      POSTGRES_HOST_AUTH_METHOD: trust
    healthcheck:
      test: ['CMD', 'pg_isready', '-U', 'postgres']

  redis:
    restart: always
    image: redis:{{ services.mastodon.redis_version }}
    volumes:
      - "./redis_data:/data"
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']

  web:
    image: tootsuite/mastodon:{{ services.mastodon.version }}
    restart: always
    env_file: mastodon.env
    command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000"
    networks:
      - default
      - external_services
    volumes:
      - "./mastodon_data:/mastodon/public/system"
    environment:
      MAX_THREADS: 10
      WEB_CONCURRENCY: 3
      VIRTUAL_HOST: "{{ services.mastodon.domain }}"
      VIRTUAL_PORT: "3000"
      VIRTUAL_PATH: /
      LETSENCRYPT_HOST: "{{ services.mastodon.domain }}"
      LETSENCRYPT_EMAIL: "{{ letsencrypt_email }}"
    healthcheck:
      test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:3000/health || exit 1']
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy

  streaming:
    image: tootsuite/mastodon:{{ services.mastodon.version }}
    restart: always
    env_file: mastodon.env
    command: node ./streaming
    networks:
      - default
      - external_services
    ports:
      - "127.0.0.1:4000:4000"
    environment:
      DB_POOL: 15
      VIRTUAL_HOST: "{{ services.mastodon.domain }}"
      VIRTUAL_PORT: "4000"
      VIRTUAL_PATH: "/api/v1/streaming"
    healthcheck:
      test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1']
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy

  # sidekiq-default-push-pull: DB_POOL = 25, -c 25 for 25 connections
  sidekiq-default-push-pull:
    <<: *sidekiq
    command: bundle exec sidekiq -c 25 -q default -q push -q pull
    environment:
      DB_POOL: 25

  # sidekiq-default-pull-push: DB_POOL = 25, -c 25 for 25 connections
  sidekiq-default-pull-push:
    <<: *sidekiq
    command: bundle exec sidekiq -c 25 -q default -q pull -q push
    environment:
      DB_POOL: 25

  # sidekiq-pull-default-push: DB_POOL = 25, -c 25 for 25 connections
  sidekiq-pull-default-push:
    <<: *sidekiq
    command: bundle exec sidekiq -c 25 -q pull -q default -q push
    environment:
      DB_POOL: 25

  # sidekiq-push-default-pull: DB_POOL = 25, -c 25 for 25 connections
  sidekiq-push-default-pull:
    <<: *sidekiq
    command: bundle exec sidekiq -c 25 -q push -q default -q pull
    environment:
      DB_POOL: 25

  # sidekiq-push-scheduler: DB_POOL = 5, -c 5 for 5 connections
  sidekiq-push-scheduler:
    <<: *sidekiq
    command: bundle exec sidekiq -c 5 -q push -q scheduler
    environment:
      DB_POOL: 5

  # sidekiq-push-mailers: DB_POOL = 5, -c 5 for 5 connections
  sidekiq-push-mailers:
    <<: *sidekiq
    command: bundle exec sidekiq -c 5 -q push -q mailers
    environment:
      DB_POOL: 5

  # sidekiq-push-ingress: DB_POOL = 10, -c 10 for 10 connections
  sidekiq-push-ingress:
    <<: *sidekiq
    command: bundle exec sidekiq -c 10 -q push -q ingress
    environment:
      DB_POOL: 10

networks:
  external_services:
    external: true
  postfix:
    external: true