version: '3'
services:
  db:
    restart: always
    image: postgres:14-alpine
    shm_size: 1gb
    command: postgres -c "max_connections=200" -c "shared_buffers=768MB" -c "effective_cache_size=2304MB" -c "maintenance_work_mem=192MB" -c "checkpoint_completion_target=0.9" -c "wal_buffers=16MB" -c "default_statistics_target=100" -c "random_page_cost=1.1" -c "effective_io_concurrency=200" -c "work_mem=1966kB" -c "min_wal_size=1GB" -c "max_wal_size=4GB"
    networks:
      - internal_network
    healthcheck:
      test: ['CMD', 'pg_isready', '-U', 'postgres']
    volumes:
      - ./postgres14:/var/lib/postgresql/data
      - ./backups:/backups
    environment:
      - 'POSTGRES_HOST_AUTH_METHOD=trust'

  redis:
    restart: always
    image: redis:6-alpine
    networks:
      - internal_network
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
    volumes:
      - ./redis:/data

  es:
    restart: always
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "cluster.name=es-mastodon"
      - "discovery.type=single-node"
      - "bootstrap.memory_lock=true"
      - "cluster.routing.allocation.disk.watermark.low=0.9"
      - "cluster.routing.allocation.disk.watermark.high=0.94"
    networks:
      - internal_network
    healthcheck:
       test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
    volumes:
      - elasticsearch:/usr/share/elasticsearch/data
    ulimits:
      memlock:
        soft: -1
        hard: -1

  web:
    build: .
    image: git.solarpunk.moe/solarpunk/mastodon
    restart: always
    env_file: .env.production
    environment:
      - WEB_CONCURRENCY=4
      - MAX_THREADS=4
    command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000"
    networks:
      internal_network:
      httpsproxy:
      external_network:
        aliases:
          - masto_web
      mail:
    labels:
      - "traefik.enable=true"
      - "traefik.http.services.mastodon.loadbalancer.server.port=3000"
      - "traefik.http.routers.mastodon.rule=Host(`solarpunk.moe`)"
      - "traefik.http.routers.mastodon.tls.certresolver=leresolver"
      - "traefik.http.routers.mastodon.entrypoints=websecure"

    healthcheck:
      # prettier-ignore
      test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:3000/health || exit 1']
    depends_on:
      - db
      - redis
      # - es
    volumes:
      - ./public/system:/mastodon/public/system

  streaming:
    build: .
    image: git.solarpunk.moe/solarpunk/mastodon:latest
    restart: always
    env_file: .env.production
    command: node ./streaming
    networks:
      httpsproxy:
      internal_network:
      external_network:
        aliases:
          - masto_streaming
      mail:

    labels:
      - "traefik.enable=true"
      - "traefik.http.services.mastodon-streaming.loadbalancer.server.port=4000"
      - "traefik.http.routers.mastodon-streaming.rule=(Host(`solarpunk.moe`) && PathPrefix(`/api/v1/streaming`))"
      - "traefik.http.routers.mastodon-streaming.tls.certresolver=leresolver"
      - "traefik.http.routers.mastodon-streaming.entrypoints=websecure"
    healthcheck:
      # prettier-ignore
      test: ['CMD-SHELL', 'wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1']
    depends_on:
      - db
      - redis
  
  sidekiq-mailers:
    build: .
    image: git.solarpunk.moe/solarpunk/mastodon:latest
    restart: always
    env_file: .env.production
    command: bundle exec sidekiq -c 2 -q mailers -q scheduler
    environment:
      - DB_POOL=2
    depends_on:
      - db
      - redis
    networks:
      - external_network
      - internal_network
      - mail
    volumes:
      - ./public/system:/mastodon/public/system

  sidekiq-ingress-pull-push-default:
    build: .
    image: git.solarpunk.moe/solarpunk/mastodon:latest
    restart: always
    env_file: .env.production
    command: bundle exec sidekiq -c 5 -q ingress -q pull -q push -q default
    environment:
      - DB_POOL=5
    depends_on:
      - db
      - redis
    networks:
      - external_network
      - internal_network
      - mail
    volumes:
      - ./public/system:/mastodon/public/system

  sidekiq-default-push-pull:
    build: .
    image: git.solarpunk.moe/solarpunk/mastodon:latest
    restart: always
    env_file: .env.production
    command: bundle exec sidekiq -c 3 -q default -q ingress -q push -q pull
    environment:
      - DB_POOL=3
    depends_on:
      - db
      - redis
    networks:
      - external_network
      - internal_network
      - mail
    volumes:
      - ./public/system:/mastodon/public/system

  sidekiq-pull-push-default:
    build: .
    image: git.solarpunk.moe/solarpunk/mastodon:latest
    restart: always
    env_file: .env.production
    command: bundle exec sidekiq -c 8 -q pull -q push -q default -q ingress
    environment:
      - DB_POOL=5
    depends_on:
      - db
      - redis
    networks:
      - external_network
      - internal_network
      - mail
    volumes:
      - ./public/system:/mastodon/public/system

volumes:
  elasticsearch:

networks:
  mail:
    external: true
  httpsproxy:
    external: true
  external_network:
  internal_network:
    internal: true
