# documentation: https://github.com/amancevice/docker-superset
# slogan: Modern data exploration and visualization platform (unofficial community docker image)
# category: analytics
# tags: analytics,bi,dashboard,database,sql,unofficial
# logo: svgs/superset.svg
# port: 8088

services:
  superset:
    image: amancevice/superset:latest
    environment:
      - SERVICE_URL_SUPERSET_8088
      - SECRET_KEY=${SERVICE_BASE64_64_SUPERSETSECRETKEY}
      - MAPBOX_API_KEY=${MAPBOX_API_KEY}
      - POSTGRES_USER=${SERVICE_USER_POSTGRES}
      - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}
      - POSTGRES_DB=${POSTGRES_DB:-superset-db}
      - REDIS_PASSWORD=${SERVICE_PASSWORD_REDIS}
    volumes:
      - type: bind
        source: ./superset/superset_config.py
        target: /etc/superset/superset_config.py
        content: |
          """
          For more configuration options, see:
          - https://superset.apache.org/docs/configuration/configuring-superset
          """

          import os

          SECRET_KEY = os.getenv("SECRET_KEY")
          MAPBOX_API_KEY = os.getenv("MAPBOX_API_KEY", "")

          CACHE_CONFIG = {
            "CACHE_TYPE": "RedisCache",
            "CACHE_DEFAULT_TIMEOUT": 300,
            "CACHE_KEY_PREFIX": "superset_",
            "CACHE_REDIS_HOST": "redis",
            "CACHE_REDIS_PORT": 6379,
            "CACHE_REDIS_DB": 1,
            "CACHE_REDIS_URL": f"redis://:{os.getenv('REDIS_PASSWORD')}@redis:6379/1",
          }

          FILTER_STATE_CACHE_CONFIG = {**CACHE_CONFIG, "CACHE_KEY_PREFIX": "superset_filter_"}
          EXPLORE_FORM_DATA_CACHE_CONFIG = {**CACHE_CONFIG, "CACHE_KEY_PREFIX": "superset_explore_form_"}

          SQLALCHEMY_TRACK_MODIFICATIONS = True
          SQLALCHEMY_DATABASE_URI = f"postgresql+psycopg2://{os.getenv('POSTGRES_USER')}:{os.getenv('POSTGRES_PASSWORD')}@postgres:5432/{os.getenv('POSTGRES_DB')}"

          # Uncomment if you want to load example data (using "superset load_examples") at the
          # same location as your metadata postgresql instance. Otherwise, the default sqlite
          # will be used, which will not persist in volume when restarting superset by default.
          #SQLALCHEMY_EXAMPLES_URI = SQLALCHEMY_DATABASE_URI
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1:8088/health"]
      interval: 5s
      timeout: 20s
      retries: 10

  postgres:
    image: postgres:17-alpine
    environment:
      - POSTGRES_USER=${SERVICE_USER_POSTGRES}
      - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}
      - POSTGRES_DB=${POSTGRES_DB:-superset-db}
    volumes:
      - superset_postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 5s
      timeout: 20s
      retries: 10

  redis:
    image: redis:8-alpine
    volumes:
      - superset_redis_data:/data
    command: redis-server --requirepass ${SERVICE_PASSWORD_REDIS}
    healthcheck:
      test: redis-cli ping
      interval: 5s
      timeout: 20s
      retries: 10
