# NEODB Docker Compose File
#
# Note: may not be secure for production usage, use at your own risk
#
# The following env variable are expected from .env or command line
# - NEODB_SECRET_KEY
# - NEODB_SITE_DOMAIN
# - NEODB_SITE_NAME
# - NEODB_DATA

x-shared:
  neodb-service: &neodb-service
    build: .
    image: ${NEODB_IMAGE:-neodb/neodb:latest}
    environment:
      NEODB_DEBUG:
      NEODB_SECRET_KEY:
      NEODB_SITE_NAME:
      NEODB_SITE_DOMAIN:
      NEODB_SITE_INTRO:
      NEODB_SITE_HEAD:
      NEODB_SITE_LOGO:
      NEODB_SITE_ICON:
      NEODB_USER_ICON:
      NEODB_SITE_COLOR:
      NEODB_SITE_LINKS:
      NEODB_SITE_DESCRIPTION:
      NEODB_ALTERNATIVE_DOMAINS:
      NEODB_PREFERRED_LANGUAGES:
      NEODB_INVITE_ONLY:
      NEODB_LOGIN_MASTODON_WHITELIST:
      NEODB_MASTODON_CLIENT_SCOPE:
      NEODB_DISABLE_DEFAULT_RELAY:
      NEODB_DISABLE_CRON_JOBS:
      NEODB_SEARCH_PEERS:
      NEODB_SEARCH_SITES:
      NEODB_MIN_MARKS_FOR_DISCOVER:
      NEODB_DISCOVER_UPDATE_INTERVAL:
      NEODB_DISCOVER_FILTER_LANGUAGE:
      NEODB_DISCOVER_SHOW_LOCAL_ONLY:
      NEODB_DISCOVER_SHOW_POPULAR_POSTS:
      NEODB_SENTRY_DSN:
      TAKAHE_SENTRY_DSN:
      NEODB_SENTRY_SAMPLE_RATE:
      NEODB_DB_URL: ${NEODB_DB_URL:-postgres://neodb:aubergine@neodb-db/neodb}
      TAKAHE_DB_URL: ${TAKAHE_DB_URL:-postgres://takahe:aubergine@takahe-db/takahe}
      NEODB_REDIS_URL: ${NEODB_REDIS_URL:-redis://redis:6379/0}
      NEODB_SEARCH_URL: ${NEODB_SEARCH_URL:-typesense://user:eggplant@typesense:8108/catalog}
      NEODB_EMAIL_URL:
      NEODB_EMAIL_FROM: no-reply@${NEODB_SITE_DOMAIN}
      NEODB_ENABLE_LOCAL_ONLY:
      NEODB_ENABLE_LOGIN_BLUESKY:
      NEODB_ENABLE_LOGIN_THREADS:
      NEODB_EXTRA_APPS:
      NEODB_FANOUT_LIMIT_DAYS:
      TAKAHE_FANOUT_LIMIT_DAYS:
      NEODB_DOWNLOADER_PROXY_LIST:
      NEODB_DOWNLOADER_BACKUP_PROXY:
      NEODB_DOWNLOADER_SAVE_DIR:
      NEODB_MEDIA_ROOT: /www/m
      NEODB_VENV: /neodb-venv
      TAKAHE_ENVIRONMENT: ${ENVIRONMENT:-production}
      TAKAHE_SECRET_KEY: ${NEODB_SECRET_KEY}
      TAKAHE_MAIN_DOMAIN: ${NEODB_SITE_DOMAIN}
      TAKAHE_MEDIA_URL: https://${NEODB_SITE_DOMAIN}/media/
      TAKAHE_EMAIL_FROM: no-reply@${NEODB_SITE_DOMAIN}
      TAKAHE_DATABASE_SERVER: ${TAKAHE_DATABASE_SERVER:-postgres://takahe:aubergine@takahe-db/takahe}
      TAKAHE_CACHES_DEFAULT: ${TAKAHE_CACHES_DEFAULT:-redis://redis:6379/0}
      TAKAHE_MEDIA_BACKEND: local://www/media/
      TAKAHE_MEDIA_ROOT: /www/media
      TAKAHE_USE_PROXY_HEADERS: true
      TAKAHE_STATOR_CONCURRENCY: ${TAKAHE_STATOR_CONCURRENCY:-4}
      TAKAHE_STATOR_CONCURRENCY_PER_MODEL: ${TAKAHE_STATOR_CONCURRENCY_PER_MODEL:-2}
      TAKAHE_VAPID_PUBLIC_KEY:
      TAKAHE_VAPID_PRIVATE_KEY:
      TAKAHE_DEBUG: ${NEODB_DEBUG:-False}
      TAKAHE_VENV: /takahe-venv
      THREADS_APP_ID:
      THREADS_APP_SECRET:
      SPOTIFY_API_KEY:
      TMDB_API_V3_KEY:
      GOOGLE_API_KEY:
      DISCOGS_API_KEY:
      IGDB_API_CLIENT_ID:
      IGDB_API_CLIENT_SECRET:
      DISCORD_WEBHOOKS:
      SLACK_API_TOKEN:
      SSL_ONLY:
    restart: "unless-stopped"
    volumes:
      - ${NEODB_DATA:-../data}/neodb-media:/www/m
      - ${NEODB_DATA:-../data}/takahe-media:/www/media
      - ${NEODB_DATA:-../data}/takahe-cache:/www/cache
      - ${NEODB_DATA:-../data}/www-root:/www/root
      - ./custom/edition.custom.html:/neodb/catalog/templates/edition.html
      - ./custom/_item_card.custom.html:/neodb/catalog/templates/_item_card.html
      - ./custom/album.custom.html:/neodb/catalog/templates/album.html
      - ./custom/common_libs.custom.html:/neodb/common/templates/common_libs.html
    depends_on:
      - redis
      - neodb-db
      - typesense
      - takahe-db
    profiles:
      - production

  dev-neodb-service: &dev-neodb-service
    <<: *neodb-service
    # environment:
    #   NEODB_DEBUG: True
    volumes:
      - ${NEODB_DATA:-../data}/www-root:/www/root
      - ${NEODB_DATA:-../data}/neodb-media:/www/m
      - ${NEODB_DATA:-../data}/takahe-media:/www/media
      - ${NEODB_DATA:-../data}/takahe-cache:/www/cache
      - ${NEODB_DATA:-../data}/nginx-log:/var/log/nginx
      - ${NEODB_SRC:-.}:/neodb
      - ${TAKAHE_SRC:-./neodb-takahe}:/takahe
    profiles:
      - dev

services:
  redis:
    image: redis:alpine
    command: redis-server --save 60 1 --loglevel warning
    volumes:
      - ${NEODB_DATA:-../data}/redis:/data

  typesense:
    image: typesense/typesense:${TYPESENSE_VERSION:-0.25.2}
    restart: "on-failure"
    # healthcheck:
    #   test: ['CMD', 'curl', '-vf', 'http://127.0.0.1:8108/health']
    # ports:
    #   - "18108:8108"
    environment:
      GLOG_minloglevel: 2
    volumes:
      - ${NEODB_DATA:-../data}/typesense:/data
    command: "--data-dir /data --api-key=eggplant"

  neodb-db:
    image: postgres:${POSTGRES_VERSION:-14-alpine}
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "neodb"]
    volumes:
      - ${NEODB_DATA:-../data}/neodb-db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=neodb
      - POSTGRES_USER=neodb
      - POSTGRES_PASSWORD=aubergine

  takahe-db:
    image: postgres:${POSTGRES_VERSION:-14-alpine}
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "takahe"]
    volumes:
      - ${NEODB_DATA:-../data}/takahe-db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=takahe
      - POSTGRES_USER=takahe
      - POSTGRES_PASSWORD=aubergine

  migration:
    <<: *neodb-service
    restart: "no"
    command: /bin/neodb-init
    depends_on:
      neodb-db:
        condition: service_healthy
      typesense:
        condition: service_started
      redis:
        condition: service_started
      takahe-db:
        condition: service_healthy

  neodb-web:
    <<: *neodb-service
    command: ${NEODB_VENV:-/neodb-venv}/bin/gunicorn boofilsic.wsgi -w ${NEODB_WEB_WORKER_NUM:-8} --preload --max-requests 2000 --timeout 60 -b 0.0.0.0:8000
    healthcheck:
      test:
        [
          "CMD",
          "wget",
          "-qO/tmp/test",
          "--header",
          "X-Forwarded-Proto: https",
          "http://127.0.0.1:8000/nodeinfo/2.0/",
        ]
    depends_on:
      migration:
        condition: service_completed_successfully

  neodb-web-api:
    <<: *neodb-service
    command: ${NEODB_VENV:-/neodb-venv}/bin/gunicorn boofilsic.wsgi -w ${NEODB_API_WORKER_NUM:-4} --preload --max-requests 2000 --timeout 30 -b 0.0.0.0:8000
    healthcheck:
      test:
        [
          "CMD",
          "wget",
          "-qO/tmp/test",
          "--header",
          "X-Forwarded-Proto: https",
          "http://127.0.0.1:8000/nodeinfo/2.0/",
        ]
    depends_on:
      migration:
        condition: service_completed_successfully

  neodb-worker:
    <<: *neodb-service
    command: neodb-manage rqworker --with-scheduler import export mastodon fetch crawl ap cron
    depends_on:
      migration:
        condition: service_completed_successfully

  neodb-worker-extra:
    <<: *neodb-service
    command: neodb-manage rqworker-pool --num-workers ${NEODB_RQ_WORKER_NUM:-4} mastodon fetch crawl ap
    depends_on:
      migration:
        condition: service_completed_successfully

  takahe-web:
    <<: *neodb-service
    command: ${TAKAHE_VENV:-/takahe-venv}/bin/gunicorn --chdir /takahe takahe.wsgi -w ${TAKAHE_WEB_WORKER_NUM:-8} --max-requests 2000 --timeout 60 --preload -b 0.0.0.0:8000
    healthcheck:
      test:
        [
          "CMD",
          "wget",
          "-qO/tmp/test",
          "--header",
          "X-Forwarded-Proto: https",
          "http://127.0.0.1:8000/api/v1/instance",
        ]
    depends_on:
      migration:
        condition: service_completed_successfully

  takahe-stator:
    <<: *neodb-service
    command: takahe-manage runstator
    stop_signal: SIGINT
    depends_on:
      migration:
        condition: service_completed_successfully

  nginx:
    <<: *neodb-service
    user: "root:root"
    command: nginx-start
    environment:
      NEODB_WEB_SERVER: neodb-web:8000
      NEODB_API_SERVER: neodb-web-api:8000
      TAKAHE_WEB_SERVER: takahe-web:8000
      NGINX_CONF: /neodb/misc/nginx.conf.d/neodb.conf
    depends_on:
      takahe-web:
        condition: service_started
      neodb-web:
        condition: service_started
    ports:
      - "${NEODB_PORT:-8000}:8000"

  shell:
    <<: *neodb-service
    command: bash
    profiles: ["tools"]

  root:
    <<: *neodb-service
    command: bash
    profiles: ["tools"]
    user: "root:root"

  dev-neodb-web:
    <<: *dev-neodb-service
    command: neodb-manage runserver 0.0.0.0:8000
    stop_signal: SIGINT

  dev-neodb-worker:
    <<: *dev-neodb-service
    # command: neodb-manage rqworker-pool --num-workers 4 import export mastodon fetch crawl ap cron
    command: neodb-manage rqworker --with-scheduler import export mastodon fetch crawl crawl ap cron

  dev-takahe-web:
    <<: *dev-neodb-service
    command: takahe-manage runserver 0.0.0.0:8000
    stop_signal: SIGINT

  dev-takahe-stator:
    <<: *dev-neodb-service
    command: takahe-manage runstator
    stop_signal: SIGINT

  dev-nginx:
    <<: *dev-neodb-service
    user: "root:root"
    command: nginx-start
    environment:
      NEODB_WEB_SERVER: dev-neodb-web:8000
      TAKAHE_WEB_SERVER: dev-takahe-web:8000
      NGINX_CONF: /neodb/misc/nginx.conf.d/neodb-dev.conf
    depends_on:
      dev-takahe-web:
        condition: service_started
      dev-neodb-web:
        condition: service_started
    ports:
      - "${NEODB_PORT:-8000}:8000"

  dev-shell:
    <<: *dev-neodb-service
    command: bash
    profiles: ["tools"]

  dev-root:
    <<: *dev-neodb-service
    command: bash
    profiles: ["tools"]
    user: "root:root"
