Skip to main content

Prerequisites

  • Node.js 20+ on the hub machine
  • Raspberry Pi 4/5 (recommended) or any ARM64/AMD64 Linux machine
  • Network: Hub and terminals must be on the same LAN
  • Odoo: Accessible from the hub (for token validation and event forwarding)

Option 1: Bare-metal install (systemd)

Best for dedicated Raspberry Pi deployments.
1

Copy the source to the hub machine

2

Run the installer (as root)

The installer:
  • Checks Node.js 20+
  • Creates a pos-hub system user
  • Creates /var/lib/pos-hub/ data directory
  • Builds the protocol and hub packages
  • Creates /etc/pos-hub/env with default config
  • Installs and starts a systemd service
3

Edit the configuration

Required changes:
4

Restart the service

Service management

Security hardening

The systemd unit includes:
  • NoNewPrivileges=true
  • ProtectSystem=strict (read-only root filesystem)
  • ReadWritePaths=/var/lib/pos-hub (only writable path)
  • ProtectHome=true, PrivateTmp=true
  • Runs as dedicated pos-hub user (no shell, no home)

Option 2: Docker

Best for testing or multi-service deployments.

Build

From the repository root (not nu_pos_hub/):
Supports both ARM64 (Raspberry Pi) and AMD64 (x86 servers).

Run

Docker Compose

The Docker image includes a built-in health check (30s interval, 5s timeout, 3 retries).

CLI tool

During development:

Example output: pos-hub stats

Hub dashboard

Access at http://<hub-ip>:8766/ — a self-contained HTML page with:
  • Stats grid: Connected terminals, active leases, total orders, pending/forwarded events
  • Terminals table: ID, device, role, last seen
  • Leases table: Order reference, terminal, role, expiry
  • Event log: Last 50 events with type, reference, status, timestamp
  • Reset All Data button: Clears all SQLite data with confirmation
Auto-refreshes every 3 seconds. No external dependencies (all CSS/JS inline).

mDNS discovery

When HUB_MDNS_ENABLED=true (default), the hub advertises itself on the local network:
  • Service type: _pos-hub._tcp
  • Name: “POS Hub”
  • Port: value of HUB_HTTP_PORT
mDNS doesn’t work well in Docker. Disable it with HUB_MDNS_ENABLED=false for container deployments.

Enabling hub mode in Odoo

These values are included in the bootstrap payload and read by createTransport() on the frontend.

Data persistence

Monitoring checklist