Setting up with docker-compose#

Install docker-compose#

Easiest is to use pip

pip install docker-compose

Define docker-compose file#

Create a new docker-compose.yaml file

touch docker-compose.yaml

Define all services with environment variables and volumes if needed.

Note

We are using docker containers for Postgres and RabbitMQ just to show the system as a whole. You don't need to run them in containers, as we except just the connection string as input to the other services.

# Example docker compose containers for Utiltarian
version: '3'
services:
  rabbitmq:
    image: rabbitmq:3-management
    restart: unless-stopped
    ports:
      - "5672:5672"
      - "15672:15672"

  postgres:
    image: postgres:10.7-apline
    restart: unless-stopped
    ports:
      - "15432:5432"

    volumes:
      - postgres_data:/var/lib/postgresql/data/

  utilitarian-api:
    image: quay.io/pwit/utilitarian:vx.x.x
    restart: unless-stopped
    ports:
      - "8000:8000"
    depends_on:
      - rabbitmq
      - postgres
    environment: &utilitarian_env
      # Debug
      # SECURITY WARNING: Don't use in production
      - UTILITARIAN_DEBUG=false
      - UTILITARIAN_LOGLEVEL=debug
      - 
      # General settings
      - DATABASE_URL=postgres://postgres/dbname
      - SECRET_KEY=verysecretkey  
      - ALLOWED_HOSTS=utilitarian-api

      - AMQP_CONNECTION_STRING=amqp://guest:guest@rabbitmq:5672/

  utilitarian-worker:
    image: quay.io/pwit/utilitarian:version
    restart: unless-stopped
    command: celery -A utilitarian worker --loglevel=INFO
    environment: *utilitarian_env  # anchor it to api to only define once.

  utilitarian-beat:
    image: quay.io/pwit/utilitarian:version
    restart: unless-stopped
    command: celery -A utilitarian beat --loglevel=INFO
    environment: *utilitarian_env  # anchor it to api to only define once.

  dlms-processor:
    image: quay.io/pwit/utilitarian-dlms-processor:vX.X.X
    restart: unless-stopped
    depends_on: 
      - rabbitmq
      - utilitarian-api
    environment:
      - DLMS_CONSUMER_DEBUG=false
      - AMQP_CONNECTION_STRING=amqp://guest:guest@rabbitmq:5672/
      - DLMS_CONSUMER_CONSUME_FROM=utilitarian.dlms_push_messages
      - DLMS_CONSUMER_PREFETCH_COUNT=100
      - DLMS_CONSUMER_PUBLISH_TO=utilitarian
      - UTILITARIAN_BASE_URL=http://utilitarian-api:8000
      - UTILITARIAN_AUTH_TOKEN=024281a8c6a12b5fb5a8445439bb9236555975fe
      - UTILITARIAN_REQUEST_TIMEOUT=15

  dlms-udp-server:
    image: quay.io/pwit/utilitarian-dlms-udp-server:vX.X.X
    restart: unless-stopped
    ports:
      # You need to specify that it is an UDP port and not TCP!
      - '4059:4059/udp'
    depends_on: 
      - rabbitmq
    environment:
      - DLMS_UDP_SERVER_DEBUG=false
      - AMQP_CONNECTION_STRING=amqp://guest:guest@rabbitmq:5672/
      - AMQP_EXCHANGE_NAME=utilitarian
      - AMQP_DEFAULT_QUEUE_NAME=utilitarian.dlms_push_messages
      - AMQP_DEFAULT_QUEUE_ROUTING_KEY="new_dlms_push_message.#"
      - UTILITARIAN_APPLICATION_CONTEXT=units11291

  utilitarian-poster:
    image: quay.io/pwit/utilitarian-poster:vX.X.X
    restart: unless-stopped
    depends_on: 
      - rabbitmq
      - utilitarian-api
    environment:
      - POSTER_DEBUG=false
      - AMQP_CONNECTION_STRING=amqp://guest:guest@rabbitmq:5672/
      - POSTER_CONSUME_FROM=utilitarian.new_meter_readings
      - POSTER_PREFETCH_COUNT=100
      - UTILITARIAN_BASE_URL=http://utilitarian-api:8000
      - UTILITARIAN_AUTH_TOKEN=024281a8c6a12b5fb5a8445439bb9236555975fe
      - UTILITARIAN_REQUEST_TIMEOUT=15


volumes:
  - postgres_data:

Note

Do not name your service names using underscores. For example the host for making HTTP requests will become something_something and having underscore in HTTP_HOST header is not valid according to RFC 1034/1035. It will result in an error.