Skip to content

Deployment Structure

GroupLoop ships with a small Docker Compose stack. Each container is rebuildable locally and portable to any host that supports Docker.

flowchart LR
    Socket[Socket Server\npython /app/app.py]
    Hub[Client Hub\nFlask]
    Docs[Docs\nMkDocs dev server]

    Socket ---|"5003 → WS"| Host
    Hub ---|"5004 → HTTP"| Host
    Docs ---|"5006 → HTTP"| Host

    subgraph docker-compose.yml
      Socket
      Hub
      Docs
    end

Services (see docker-compose.yml)

Service Port (host:container) Context Purpose
socket 5003:5000 ./socket-server WebSocket relay between devices and browsers.
client_hub 5004:5000 ./client-hub Serves all apps under app/static/apps/<name>.
docs 5006:5000 ./documentation Live MkDocs preview with Mermaid enabled.

Volumes

Each service mounts its source folder (./socket-server:/app, ./client-hub:/app, ./documentation:/site) so code edits are reflected without rebuilds during development.

Key Environment Variables

Variable Default Used by Description
WS_DEFAULT_URL wss://ws.grouploop.feib.nl client_hub Default WebSocket endpoint injected via /config.js.
CDN_BASE_URL https://cdn.hitloop.feib.nl client_hub Base URL for shared assets/commands.json.
DEFAULT_APP (empty) client_hub When set, / redirects directly to that app folder.
WS_HOST 0.0.0.0 socket Bind address for WebSocket server.
WS_PORT 5000 socket Container WebSocket port.

Local Bring-up

docker compose up --build
# visit: http://localhost:5004 for client hub
#        http://localhost:5006 for docs
#        ws://localhost:5003 for WebSocket relay

WS URL in browsers

If you expose the socket server over TLS or a reverse proxy, update WS_DEFAULT_URL accordingly to avoid mixed-content errors (browsers block ws:// when the page is served via https://).