🐳 Sky-view as a Docker container

This section provides instructions for deploying and running the software as a Docker container.

Prerequisites

Ensure Docker is installed on your Linux system. Refer to the Docker documentation for installation instructions specific to your Linux distribution.
If you prefer managing your Docker deployment with Docker Compose, ensure that Docker Compose is also installed.

On Windows, you can use a WSL2 or VM to manage your Docker environment.

Running Docker on a machine that is not connected to the internet

If you are not connected to the internet, you can download the Docker image from the Docker Hub and store it locally.
More information on Docker offline

Docker

docker run -it --rm\
  --device=/dev/dri \
  --cap-add=PERFMON \
  --group-add=video \
  --group-add="${SKY_VIEW_RENDER_GID:-110}" \
  --network host \
  -e SKY_VIEW_SERVER_ADDR=":8100" \
  -e SKY_VIEW_DB_PATH="/data/sky-view.db" \
  -e SKY_VIEW_USERS_DB_PATH="/data/skyview-users.db" \
  -e SKY_VIEW_STREAM_EVENTS_DB_PATH="/data/skyview-stream-events.db" \
  -e SKY_VIEW_LOG_PATH="/data/sky-view.log" \
  -e SKY_VIEW_LOG_MAX_SIZE_MB="10" \
  -e SKY_VIEW_LOG_MAX_BACKUPS="5" \
  -e SKY_VIEW_LOG_MAX_AGE_DAYS="0" \
  -v sky-view-data:/data \
  -v "${SKY_VIEW_HOST_ID_PATH:-/sys/class/dmi/id/product_uuid}:/var/lib/dbus/machine-id:ro" \
  -v "${SKY_VIEW_HOST_ID_PATH:-/sys/class/dmi/id/product_uuid}:/etc/machine-id:ro" \
  impleo/sky-view:1.14.9
  • --device=/dev/dri, --group-add=video, and the numeric render group: Provide access to Intel/AMD DRM devices for hardware acceleration and GPU monitoring. Set SKY_VIEW_RENDER_GID to the numeric GID reported by getent group render on the host.
  • --cap-add=PERFMON: Allows intel_gpu_top to read the Intel i915/xe performance counters without granting broad container privileges.
  • --network=host: Uses the host’s network, allowing the container to listen on all network interfaces of the host. Also required for udp multicast support.
  • -v sky-view-data:/data: Mounts the database volume inside the container.
  • The two machine-ID mounts bind Node Info to the server's DMI hardware UUID, keeping the license stable across container updates but preventing an application/data copy from carrying the license to another server. If /sys/class/dmi/id/product_uuid is unavailable, set SKY_VIEW_HOST_ID_PATH=/etc/machine-id to bind the license to that host OS installation instead.

The image also contains the Linux Flywheel worker and starts its private Xvfb display automatically. No DISPLAY variable or X11 socket mount is required. Flywheel uses a surfaceless EGL renderer and keeps video in GLMemory/DMA-BUF through the hardware encoder. With Prefer hardware acceleration enabled, /dev/dri and a compatible hardware codec are mandatory; the worker fails clearly instead of falling back to CPU copies.

The image includes Intel and AMD monitoring utilities and also reads the kernel's DRM per-process counters. For NVIDIA, install NVIDIA Container Toolkit on the host and add --gpus all to docker run; the host runtime injects the matching driver libraries and nvidia-smi into the image. The image requests the utility, video, graphics, and compute driver capabilities. See NVIDIA GPU monitoring on Linux and Docker for the complete host and container setup.

After running this command, the sky-view service will be accessible at http://localhost:8100.

Docker Compose

Create a docker-compose.yml file in your preferred directory and define the services required for running the sky-view.

Example docker-compose.yml:

services:
  caddy:
    image: caddy:2
    container_name: caddy
    network_mode: host
    # ports:
    #   - "80:80"
    #   - "443:443"
    volumes:
      - ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro
      - ./data:/data
      - ./config:/config
    extra_hosts:
      - "host.docker.internal:host-gateway"
    depends_on:
      - sky-view
    restart: unless-stopped

  sky-view:
    image: impleo/sky-view:1.14.9
    container_name: skyview
    # Host network required for UDP multicast support
    network_mode: host
    depends_on:
      timescaledb:
        condition: service_healthy
        required: false
    environment:
      SKY_VIEW_ANALYTICS_ENABLED: "${SKY_VIEW_ANALYTICS_ENABLED:-false}"
      SKY_VIEW_ANALYTICS_HOST: "${SKY_VIEW_ANALYTICS_HOST:-127.0.0.1}"
      SKY_VIEW_ANALYTICS_PORT: "${SKY_VIEW_ANALYTICS_PORT:-5432}"
      SKY_VIEW_ANALYTICS_DB: "${SKY_VIEW_ANALYTICS_DB:-skyview}"
      SKY_VIEW_ANALYTICS_USER: "${SKY_VIEW_ANALYTICS_USER:-skyview}"
      SKY_VIEW_ANALYTICS_PASSWORD: "${SKY_VIEW_ANALYTICS_PASSWORD:-skyview}"
      SKY_VIEW_SERVER_ADDR: "${SKY_VIEW_SERVER_ADDR}"
      SKY_VIEW_SERVER_NAME: "${SKY_VIEW_SERVER_NAME:-SkyView}"
      SKY_VIEW_SERVER_SHORT_NAME: "${SKY_VIEW_SERVER_SHORT_NAME:-SkyView}"
      SKY_VIEW_DB_PATH: "/data/skyview.db"
      SKY_VIEW_USERS_DB_PATH: "/data/skyview-users.db"
      SKY_VIEW_STREAM_EVENTS_DB_PATH: "/data/skyview-stream-events.db"
      SKY_VIEW_PWA_VAPID_PUBLIC_KEY: "${SKY_VIEW_PWA_VAPID_PUBLIC_KEY}"
      SKY_VIEW_PWA_VAPID_PRIVATE_KEY: "${SKY_VIEW_PWA_VAPID_PRIVATE_KEY}"
      SKY_VIEW_PWA_VAPID_CONTACT: "${SKY_VIEW_PWA_VAPID_CONTACT}"
    volumes:
      - data:/data
      - type: bind
        source: ${SKY_VIEW_HOST_ID_PATH:-/sys/class/dmi/id/product_uuid}
        target: /var/lib/dbus/machine-id
        read_only: true
      - type: bind
        source: ${SKY_VIEW_HOST_ID_PATH:-/sys/class/dmi/id/product_uuid}
        target: /etc/machine-id
        read_only: true
        # mount only the needed CA directory as read-only
      - type: bind
        source: ./data/caddy/pki/authorities/local
        target: /caddy_pki
        read_only: true
    devices:
      - /dev/dri:/dev/dri
    cap_add:
      - PERFMON
    group_add:
      - video
      - "${SKY_VIEW_RENDER_GID:-110}"
    restart: unless-stopped

  timescaledb:
    image: timescale/timescaledb:2.15.2-pg16
    container_name: skyview-timescaledb
    restart: unless-stopped
    profiles:
      - analytics
    environment:
      POSTGRES_DB: "${SKY_VIEW_ANALYTICS_DB:-skyview}"
      POSTGRES_USER: "${SKY_VIEW_ANALYTICS_USER:-skyview}"
      POSTGRES_PASSWORD: "${SKY_VIEW_ANALYTICS_PASSWORD:-skyview}"
      TIMESCALEDB_TELEMETRY: "off"
    ports:
      - "${SKY_VIEW_ANALYTICS_PORT:-5432}:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${SKY_VIEW_ANALYTICS_USER:-skyview} -d ${SKY_VIEW_ANALYTICS_DB:-skyview}"]
      interval: 10s
      timeout: 5s
      retries: 5
    volumes:
      - analytics-data:/var/lib/postgresql/data

volumes:
  data:
  analytics-data:

On an NVIDIA host, start the supplied Compose stack with its NVIDIA overlay:

docker compose -f docker-compose.yml -f docker-compose.nvidia.yml up -d

You can make that selection persistent by setting COMPOSE_FILE=docker-compose.yml:docker-compose.nvidia.yml in .env. NVIDIA Container Toolkit must be installed and configured on the Docker host. Intel and AMD hosts use the base Compose file without the overlay.

For installation, verification, and troubleshooting steps, see NVIDIA GPU monitoring on Linux and Docker.

TimescaleDB is optional and only needed when the Analytics license option is enabled. Set SKY_VIEW_ANALYTICS_ENABLED=true and export COMPOSE_PROFILES=analytics in your .env file (or shell) to start it alongside SkyView:

SKY_VIEW_ANALYTICS_ENABLED=true
COMPOSE_PROFILES=analytics
SKY_VIEW_ANALYTICS_PASSWORD=change-me
docker compose up -d timescaledb sky-view

When Analytics is disabled or unlicensed, SkyView will continue to run without TimescaleDB.