# Compiles new joystream/node and joystream/apps images if local images not found
# and runs a complete joystream development network
# To prevent build of docker images run docker-compose with "--no-build" arg
version: "3.4"
services:
  joystream-node:
    image: joystream/node:latest
    build:
      # context is relative to the compose file
      context: .
      # dockerfile is relative to the context
      dockerfile: joystream-node.Dockerfile
    container_name: joystream-node
    volumes:
      - /data
    command: --dev --alice --validator --unsafe-ws-external --unsafe-rpc-external --rpc-methods Unsafe --rpc-cors=all --log runtime --base-path /data
    ports:
      - "127.0.0.1:9944:9944"
      - "127.0.0.1:9933:9933"

  ipfs:
    image: ipfs/go-ipfs:latest
    ports:
      - '127.0.0.1:5001:5001'
      - '127.0.0.1:8080:8080'
    volumes:
      - /data/ipfs
    entrypoint: ''
    command: |
      /bin/sh -c "
        set -e
        /usr/local/bin/start_ipfs config profile apply lowpower
        /usr/local/bin/start_ipfs config --json Gateway.PublicGateways '{\"localhost\": null }'
        /sbin/tini -- /usr/local/bin/start_ipfs daemon --migrate=true
      "

  colossus:
    image: joystream/apps
    restart: on-failure
    depends_on:
      - "ipfs"
    build:
      context: .
      dockerfile: apps.Dockerfile
    env_file:
      # relative to working directory where docker-compose was run from
      - .env
    environment:
      - WS_PROVIDER_ENDPOINT_URI=${WS_PROVIDER_ENDPOINT_URI}
    ports:
      - '127.0.0.1:3001:3001'
    command: colossus --dev --ws-provider ${WS_PROVIDER_ENDPOINT_URI} --ipfs-host ipfs
    environment:
      - DEBUG=*

  db:
    image: postgres:12
    restart: always
    ports:
      - "127.0.0.1:${DB_PORT}:5432"
    volumes:
      - /var/lib/postgresql/data
    env_file:
      # relative to working directory where docker-compose was run from
      - .env
    environment:
      POSTGRES_USER: ${DB_USER}
      POSTGRES_PASSWORD: ${DB_PASS}
      POSTGRES_DB: ${INDEXER_DB_NAME}

  graphql-server:
    image: joystream/apps
    restart: unless-stopped
    build:
      context: .
      dockerfile: apps.Dockerfile
    env_file:
      # relative to working directory where docker-compose was run from
      - .env
    environment:
      - DB_HOST=db
      - DB_NAME=${DB_NAME}
    ports:
      - "127.0.0.1:8081:${GRAPHQL_SERVER_PORT}"
    depends_on:
      - db
    command: ["workspace", "query-node-root", "query-node:start:prod"]

  processor:
    image: joystream/apps
    restart: unless-stopped
    build:
      context: .
      dockerfile: apps.Dockerfile
    env_file:
      # relative to working directory where docker-compose was run from
      - .env
    environment:
      - INDEXER_ENDPOINT_URL=http://hydra-indexer-gateway:${WARTHOG_APP_PORT}/graphql
      - TYPEORM_HOST=db
      - TYPEORM_DATABASE=${DB_NAME}
      - DEBUG=index-builder:*
      - PROCESSOR_POLL_INTERVAL=1000 # refresh every second
    volumes:
      - ./types/augment/all/defs.json:/joystream/query-node/mappings/lib/generated/types/typedefs.json
    depends_on:
      - graphql-server
      - hydra-indexer-gateway
    command: ["workspace", "query-node-root", "processor:start"]

  indexer:
    image: joystream/hydra-indexer:2.1.0-beta.9
    restart: unless-stopped
    env_file:
      # relative to working directory where docker-compose was run from
      - .env
    environment:
      - DB_HOST=db
      - DB_NAME=${INDEXER_DB_NAME}
      - INDEXER_WORKERS=5
      - REDIS_URI=redis://redis:6379/0
      - DEBUG=index-builder:*
      - WS_PROVIDER_ENDPOINT_URI=${WS_PROVIDER_ENDPOINT_URI}
      - TYPES_JSON=types.json
    depends_on:
      - db
      - redis
    volumes:
      - ./types/augment/all/defs.json:/home/hydra/packages/hydra-indexer/types.json
    command: >
      sh -c "yarn db:bootstrap && yarn start:prod"

  hydra-indexer-gateway:
    image: joystream/hydra-indexer-gateway:2.1.0-beta.5
    restart: unless-stopped
    env_file:
      # relative to working directory where docker-compose was run from
      - .env
    environment:
      - WARTHOG_STARTER_DB_DATABASE=${INDEXER_DB_NAME}
      - WARTHOG_STARTER_DB_HOST=db
      - WARTHOG_STARTER_DB_PASSWORD=${DB_PASS}
      - WARTHOG_STARTER_DB_PORT=${DB_PORT}
      - WARTHOG_STARTER_DB_USERNAME=${DB_USER}
      - WARTHOG_STARTER_REDIS_URI=redis://redis:6379/0
      - WARTHOG_APP_PORT=${WARTHOG_APP_PORT}
      - PORT=${WARTHOG_APP_PORT}
      - DEBUG=*
    ports:
      - "127.0.0.1:4000:4002"
    depends_on:
      - redis
      - db
      - indexer

  redis:
    image: redis:6.0-alpine
    restart: always
    ports:
      - "127.0.0.1:6379:6379"

  pioneer:
    image: joystream/pioneer
    build:
      context: .
      dockerfile: pioneer.Dockerfile
    ports:
      - "127.0.0.1:3000:80"