services:
  nostream:
    build: .
    container_name: nostream
    environment:
      SECRET: changeme
      RELAY_PORT: 8008
      # Master
      NOSTR_CONFIG_DIR: /home/node/.nostr
      DB_HOST: nostream-db
      DB_PORT: 5432
      DB_USER: nostr_ts_relay
      DB_PASSWORD: nostr_ts_relay
      DB_NAME: nostr_ts_relay
      DB_MIN_POOL_SIZE: 16
      DB_MAX_POOL_SIZE: 64
      DB_ACQUIRE_CONNECTION_TIMEOUT: 60000
      # Read Replica
      READ_REPLICA_ENABLED: 'false'
      RR_DB_HOST: db
      RR_DB_PORT: 5432
      RR_DB_USER: nostr_ts_relay
      RR_DB_PASSWORD: nostr_ts_relay
      RR_DB_NAME: nostr_ts_relay
      RR_DB_MIN_POOL_SIZE: 16
      RR_DB_MAX_POOL_SIZE: 64
      RR_DB_ACQUIRE_CONNECTION_TIMEOUT: 10000
      # Redis
      REDIS_HOST: nostream-cache
      REDIS_PORT: 6379
      REDIS_USER: default
      REDIS_PASSWORD: nostr_ts_relay
      TOR_HOST: tor_proxy
      TOR_CONTROL_PORT: 9051
      TOR_PASSWORD: nostr_ts_relay
      HIDDEN_SERVICE_PORT: 80
      # Enable DEBUG for troubleshooting. Examples:
      # DEBUG: "primary:*"
      # DEBUG: "worker:*"
      # DEBUG: "knex:query"
    user: node:node
    volumes:
      - ${PWD}/.nostr:/home/node/.nostr
    ports:
      - 127.0.0.1:8008:8008
    depends_on:
      nostream-cache:
        condition: service_healthy
      nostream-db:
        condition: service_healthy
      nostream-migrate:
        condition: service_completed_successfully
    restart: on-failure
    networks:
      default:
  nostream-db:
    image: postgres
    container_name: nostream-db
    environment:
      POSTGRES_DB: nostr_ts_relay
      POSTGRES_USER: nostr_ts_relay
      POSTGRES_PASSWORD: nostr_ts_relay
    volumes:
      - ${PWD}/.nostr/data:/var/lib/postgresql/data
      - ${PWD}/.nostr/db-logs:/var/log/postgresql
      - ${PWD}/postgresql.conf:/postgresql.conf
    networks:
      default:
    command: postgres -c 'config_file=/postgresql.conf'
    restart: always
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U nostr_ts_relay"]
      interval: 5s
      timeout: 5s
      retries: 5
      start_period: 360s
  nostream-cache:
    image: redis:7.0.5-alpine3.16
    container_name: nostream-cache
    volumes:
      - cache:/data
    command: redis-server --loglevel warning --requirepass nostr_ts_relay
    networks:
      default:
    restart: always
    healthcheck:
      test: [ "CMD", "redis-cli", "ping", "|", "grep", "PONG" ]
      interval: 1s
      timeout: 5s
      retries: 5
  nostream-migrate:
    image: node:18-alpine3.16
    container_name: nostream-migrate
    environment:
      DB_HOST: nostream-db
      DB_PORT: 5432
      DB_USER: nostr_ts_relay
      DB_PASSWORD: nostr_ts_relay
      DB_NAME: nostr_ts_relay
    entrypoint:
      - sh
      - -c
      - 'cd code && npm install --no-save --quiet knex@2.4.0 pg@8.8.0 && npx knex migrate:latest'
    volumes:
      - ./migrations:/code/migrations
      - ./knexfile.js:/code/knexfile.js
    depends_on:
      nostream-db:
        condition: service_healthy
    networks:
      default:
        ipv4_address: 10.10.10.254

networks:
  default:
    name: nostream
    ipam:
      driver: default
      config:
        - subnet: 10.10.10.0/24

volumes:
  cache: