Skip to content

Docker-Based Installation

This guide walks you through deploying a local or production-ready instance of Nebula using Docker and Docker Compose.

By containerizing Nebula, you ensure a reproducible environment where services can scale horizontally.


Architecture Overview

The Nebula system is composed of several Dockerized components that communicate over a shared network


Directory Layout

Before starting the containers, prepare a project folder layout based on the example in https://github.com/nebulabroadcast/nebula-tutorial repository

nebula/
├── docker-compose.yml
├── plugins/
│    ├── powerpack/
│    └── dramatica/
├── settings/
│   ├── settings.py
│   ├── storages.py
│   ├── services.py
│   └── folders.py
└── storage/

Docker Compose Configuration

Create a docker-compose.yml file with the following services. This matches the playout OSC settings and local/shared storage mounting criteria.

volumes:
  db: {}

services:
  postgres:
    image: postgres:18
    container_name: nebula-postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: nebula
      POSTGRES_USER: nebula
      POSTGRES_PASSWORD: nebula
    volumes:
      - db:/var/lib/postgresql

  redis:
    image: redis:latest
    container_name: nebula-redis
    restart: unless-stopped

  backend:
    image: nebulabroadcast/nebula:latest
    container_name: nebula-backend
    restart: unless-stopped
    ports:
      - "4455:80"
    volumes:
      - ./settings:/app/settings
      - ./storage:/mnt/nebula_01
    depends_on:
      - postgres
      - redis

  worker:
    image: nebulabroadcast/nebula-worker:latest
    container_name: worker
    restart: unless-stopped
    privileged: true # Grants system admin capacity to handle external storage mounts
    cap_add:
      - SYS_ADMIN
      - DAC_READ_SEARCH
    ports:
      # Expose UDP ports for CasparCG playout controller OSC feedback
      - "6251:6251/udp"
      - "6252:6252/udp"
    volumes:
      - ./storage:/mnt/nebula_01
    depends_on:
      - postgres
      - redis