services:
  frontend:
    image: verdox/solar-miner
    user: "${SOLARMINER_UID:-1000}:${SOLARMINER_GID:-1000}"
    ports:
      - "8080:8080"
    depends_on:
      frontend-storage-init:
        condition: service_completed_successfully
      mariadb-frontend:
        condition: service_started
      influxdb-frontend:
        condition: service_healthy
      currency-service:
        condition: service_started
      core:
        condition: service_started
      phoenixd:
        condition: service_started
    restart: unless-stopped
    env_file:
      - .env
    environment:
      - INFLUXDB_URL=http://influxdb-frontend:8086
      - MYSQL_URL=jdbc:mariadb://mariadb-frontend:3306/solarminer
      - CURRENCY_MICRO_SERVICE_URL=http://currency-service:8080
      - CORE_MICRO_SERVICE_URL=http://core:8080/api/miners
      - PHOENIXD_BACKEND_URL=http://phoenixd:9740
      - PHOENIX_CONFIG_PATH=/app/phoenixd/phoenix.conf
      - PHOENIX_SEED_PATH=/app/phoenixd/seed.dat
      - SOLARMINER_STORAGE_ROOT=/app/storage

      - INFLUXDB_ADMIN_TOKEN=${INFLUXDB_ADMIN_TOKEN}
      - INFLUXDB_ORG=SolarMiner
      - INFLUXDB_BUCKET=solarminer
      - INFLUXDB_WRITE_BATCH_SIZE=500
      - INFLUXDB_WRITE_FLUSH_INTERVAL=5s
      - MYSQL_USER=solarminer
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    entrypoint:
      - java
      - -Dspring.profiles.active=production
      - -jar
      - ./pv-miner.jar
    volumes:
      - ./app/frontend/app:/app/storage
      - ./app/phoenixd:/app/phoenixd:ro
    logging:
      driver: "json-file"
      options:
        max-size: "20m"
        max-file: "3"

  frontend-storage-init:
    image: verdox/solar-miner
    user: "0:0"
    restart: "no"
    entrypoint:
      - /bin/sh
      - -c
      - mkdir -p /app/storage && chown -R "${SOLARMINER_UID:-1000}:${SOLARMINER_GID:-1000}" /app/storage
    volumes:
      - ./app/frontend/app:/app/storage

  mariadb-frontend:
    image: mariadb:latest
    container_name: mariadb-frontend
    restart: always
    env_file:
      - .env
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
      MYSQL_DATABASE: solarminer
      MYSQL_USER: solarminer
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    ports:
      - "3306:3306"
    volumes:
      - ./app/frontend/mariadb_data:/var/lib/mysql

  influxdb-frontend:
    image: influxdb:2
    restart: always
    mem_limit: 3g
    cpus: 2.0
    healthcheck:
      test: ["CMD", "influx", "ping", "--host", "http://localhost:8086"]
      interval: 10s
      timeout: 5s
      retries: 12
      start_period: 30s
    environment:
      DOCKER_INFLUXDB_INIT_MODE: setup
      DOCKER_INFLUXDB_INIT_ORG: SolarMiner
      DOCKER_INFLUXDB_INIT_BUCKET: solarminer
      DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: ${INFLUXDB_ADMIN_TOKEN}
      DOCKER_INFLUXDB_INIT_USERNAME: ${DOCKER_INFLUXDB_INIT_USERNAME}
      DOCKER_INFLUXDB_INIT_PASSWORD: ${DOCKER_INFLUXDB_INIT_PASSWORD}
      INFLUXD_QUERY_CONCURRENCY: 2
      INFLUXD_QUERY_QUEUE_SIZE: 10
      INFLUXD_QUERY_INITIAL_MEMORY_BYTES: 16777216
      INFLUXD_QUERY_MEMORY_BYTES: 268435456
      INFLUXD_QUERY_MAX_MEMORY_BYTES: 536870912
      INFLUXD_STORAGE_CACHE_MAX_MEMORY_SIZE: 536870912
      INFLUXD_STORAGE_MAX_CONCURRENT_COMPACTIONS: 1
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
        max-file: "3"
    volumes:
      - ./app/frontend/influxdb/data:/var/lib/influxdb2
      - ./app/frontend/influxdb/config:/etc/influxdb2
    ports:
      - "8086:8086"

  currency-service:
    image: verdox/currency-rates-api:latest
    ports:
      - "8081:8080"
    depends_on:
      - mariadb-currency-service
    restart: unless-stopped
    env_file:
      - .env
    environment:
      MYSQL_URL: jdbc:mariadb://mariadb-currency-service:3306/currency_rates
      MYSQL_USER: currency_rates
      MYSQL_PASSWORD: ${CURRENCY_DB_PASSWORD}
    entrypoint:
      - java
      - -Dspring.profiles.active=production
      - -jar
      - ./currency-rates.jar
    volumes:
      - ./app/currency/backend:/app/storage

  mariadb-currency-service:
    image: mariadb:latest
    container_name: mariadb-currency-service
    restart: always
    env_file:
      - .env
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
      MYSQL_DATABASE: currency_rates
      MYSQL_USER: currency_rates
      MYSQL_PASSWORD: ${CURRENCY_DB_PASSWORD}
    ports:
      - "3307:3306"
    volumes:
      - ./app/currency/mariadb:/var/lib/mysql

  stratum-proxy:
    image: verdox/solar-miner-stratum-proxy:latest-amd64
    container_name: stratum-proxy
    network_mode: "host"
    environment:
      - PROXY_PEARL_ENABLED=${PROXY_PEARL_ENABLED:-true}
    restart: unless-stopped

  core:
    image: verdox/solar-miner-core:latest-amd64
    depends_on:
      - stratum-proxy
    extra_hosts:
      - "host.docker.internal:host-gateway"
    ports:
      - "8082:8080"
    restart: unless-stopped
    environment:
      - PROXY_API_URL=http://host.docker.internal:8090
      - JAVA_TOOL_OPTIONS=-Dio.netty.noUnsafe=true -Djdk.tls.client.protocols=TLSv1.2

  phoenixd:
    image: acinq/phoenixd:latest
    container_name: phoenixd
    restart: unless-stopped
    user: root
    ports:
      - "127.0.0.1:9740:9740"
    volumes:
      - ./app/phoenixd:/root/.phoenix
