# This file is designed for production server deployment, not local development work
# For a containerized local dev environment, see: https://github.com/mastodon/mastodon/blob/main/docs/DEVELOPMENT.md#docker

services:
  db:
    container_name: ${mastodonDBName}
    restart: ${restartPolicy}
    image: postgres:14-alpine
    shm_size: 256mb
    networks:
      - mastodonNet
    healthcheck:
      test: ['CMD', 'pg_isready', '-U', 'postgres']
    volumes:
      - postgres:/var/lib/postgresql/data
    # environment:
    #   - 'POSTGRES_HOST_AUTH_METHOD=trust'
    env_file:
      - ../../secret/env-mastodonDB

  redis:
    container_name: ${mastodonRedisName}
    restart: ${restartPolicy}
    image: redis:7-alpine
    networks:
      - mastodonNet
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
    volumes:
      - redis:/data

  # es:
  #   restart: always
  #   image: docker.elastic.co/elasticsearch/elasticsearch:7.17.4
  #   environment:
  #     - "ES_JAVA_OPTS=-Xms512m -Xmx512m -Des.enforce.bootstrap.checks=true"
  #     - "xpack.license.self_generated.type=basic"
  #     - "xpack.security.enabled=false"
  #     - "xpack.watcher.enabled=false"
  #     - "xpack.graph.enabled=false"
  #     - "xpack.ml.enabled=false"
  #     - "bootstrap.memory_lock=true"
  #     - "cluster.name=es-mastodon"
  #     - "discovery.type=single-node"
  #     - "thread_pool.write.queue_size=1000"
  #   networks:
  #      - external_network
  #      - 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
  #     nofile:
  #       soft: 65536
  #       hard: 65536
  #   ports:
  #     - '127.0.0.1:9200:9200'

  web:
    # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
    # build: .
    container_name: ${mastodonServName}
    image: ghcr.io/mastodon/mastodon:v4.3.6
    restart: ${restartPolicy}
    environment:
      - LOCAL_DOMAIN=${mastodonHost}.${domain}
      - SMTP_SERVER=smtp.${domain}
      - SMTP_LOGIN=admin@${domain}
      - SMTP_FROM_ADDRESS=admin@${domain}
    env_file:
      - env-config
      - ../../secret/env-mastodonServ
      - ../../secret/env-mastodonDB
    command: bundle exec puma -C config/puma.rb
    networks:
      - mastodonNet
    healthcheck:
      # prettier-ignore
      test: ['CMD-SHELL',"curl -s --noproxy localhost localhost:3000/health | grep -q 'OK' || exit 1"]
    ports:
      - '127.0.0.1:3000:3000'
    depends_on:
      - db
      - redis
      # - es
    volumes:
      - public_system:/mastodon/public/system
      - images:/mastodon/app/javascript/images
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.koz.rule=Host(`${mastodonHost}.${domain}`)"
      - "traefik.http.services.koz.loadbalancer.server.port=3000"
      - "traefik.docker.network=mastodonNet"


  streaming:
    # You can uncomment the following lines if you want to not use the prebuilt image, for example if you have local code changes
    # build:
    #   dockerfile: ./streaming/Dockerfile
    #   context: .
    container_name: ${mastodonStreamingName}
    image: ghcr.io/mastodon/mastodon-streaming:v4.3.6
    restart: ${restartPolicy}
    environment:
      - LOCAL_DOMAIN=${mastodonHost}.${domain}
      - SMTP_SERVER=smtp.${domain}
      - SMTP_LOGIN=admin@${domain}
      - SMTP_FROM_ADDRESS=admin@${domain}
    env_file:
      - env-config
      - ../../secret/env-mastodonServ
    command: node ./streaming/index.js
    networks:
      - mastodonNet
    healthcheck:
      # prettier-ignore
      test: ['CMD-SHELL', "curl -s --noproxy localhost localhost:4000/api/v1/streaming/health | grep -q 'OK' || exit 1"]
    ports:
      - '127.0.0.1:4000:4000'
    depends_on:
      - db
      - redis
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.kozs.rule=(Host(`${mastodonHost}.${domain}`) && PathPrefix(`/api/v1/streaming`))"
      - "traefik.http.services.kozs.loadbalancer.server.port=4000"
      - "traefik.docker.network=mastodonNet"

  sidekiq:
    # You can uncomment the following line if you want to not use the prebuilt image, for example if you have local code changes
    # build: .
    container_name: ${mastodonSidekiqName}
    image: ghcr.io/mastodon/mastodon:v4.3.6
    restart: ${restartPolicy}
    environment:
      - LOCAL_DOMAIN=${mastodonHost}.${domain}
      - SMTP_SERVER=smtp.${domain}
      - SMTP_LOGIN=admin@${domain}
      - SMTP_FROM_ADDRESS=admin@${domain}
    env_file:
      - env-config
      - ../../secret/env-mastodonServ
    command: bundle exec sidekiq
    depends_on:
      - db
      - redis
    networks:
      - mastodonNet
    volumes:
      - public_system:/mastodon/public/system
    healthcheck:
      test: ['CMD-SHELL', "ps aux | grep '[s]idekiq\ 6' || false"]

  ## Uncomment to enable federation with tor instances along with adding the following ENV variables
  ## http_hidden_proxy=http://privoxy:8118
  ## ALLOW_ACCESS_TO_HIDDEN_SERVICE=true
  # tor:
  #   image: sirboops/tor
  #   networks:
  #      - external_network
  #      - internal_network
  #
  # privoxy:
  #   image: sirboops/privoxy
  #   volumes:
  #     - ./priv-config:/opt/config
  #   networks:
  #     - external_network
  #     - internal_network

volumes:
  postgres:
  redis:
  public_system:
  images:

networks:
  mastodonNet:
    external: true
    name: mastodonNet