HydraNeck

Getting Started Overview
Onboarding New Venue

New Venue Onboarding

End-to-end walkthrough for bringing a new venue from cold to streaming. Each step links to the component-specific runbook for full detail; this doc is the orchestration order.

Use this when adding any new venue — partner-managed (Citymesh, telco, ISP) or HYDRA-managed (Omada, MikroTik NeckAir, Linux VM gateway).

Inputs

Collect before you start:

Step 1: Pick site type and allocate CIDRs

Read Site Types to decide partner-managed vs HYDRA-managed. The choice determines who installs the WireGuard endpoint at the venue (the partner installs on a MikroTik they own, or we install on an Omada/MikroTik/Linux gateway we control).

CIDR allocation rules are in Address Ranges. For most venues hydraguard's auto-assignment is fine (10.10.X.1/32 tunnel, 10.0.X.0/24 LAN). Override only when the partner requires a specific range — pass --lan <cidr> on hydraguard venue add.

Step 2: Add the venue peer to the mesh

On the district hub (ssh ubuntu@hydraguard.experiencenet.com for Brussels):

hydraguard venue add <venue-name> --location <district> --guard <guard-type> [--lan <cidr>]
hydraguard apply

The add command generates a WireGuard keypair (private key printed once to stdout — save it if you need to recreate the config later). apply regenerates wg0.conf on the hub and hot-reloads without disrupting existing peers.

Then take the branch that matches the guard type — each has its own full runbook:

Guard type Full runbook
citymesh (partner MikroTik) hydraguard/docs/runbooks/citymesh-venue.md
omada (HYDRA TP-Link) hydraguard/docs/runbooks/omada-venue.md
linuxvm / gateway hydraguard runbook.md "Add a Venue" section

Step 3: Install the venue tunnel (varies by guard type)

Partner-managed (citymesh)

Export the partner config and hand it off:

hydraguard venue config <venue-name> > /tmp/<venue-name>.partner.conf

Send to the partner — bundle and copy-pasteable email template are in hydraguard/docs/runbooks/citymesh-venue.md Step 3:

  1. The .partner.conf file (peer profile to install on their MikroTik).
  2. Endpoint: hydraguard.experiencenet.com:51820/udp — their MikroTik needs outbound UDP/51820 reach.
  3. Confirmed CIDR allocation.
  4. Request: allow Head VLAN → Body VLAN locally on the MikroTik (firewall rule), so a local Head streaming from a local Body doesn't round-trip through the hub.
  5. Request: enable a read-only API user on the MikroTik (REST on :443 preferred, legacy binary on :8729 acceptable).

Capture the handover date in the reference table in citymesh-venue.md.

HYDRA-managed (omada)

Configure WireGuard on the Omada controller via its API. Full step-by-step is in hydraguard/docs/runbooks/omada-venue.md including: creating the WG interface (six required fields — name, status, mtu, listenPort, privateKey, localIp), adding the hub as a peer, verifying handshake.

HYDRA-managed (linuxvm / gateway)

Bare WireGuard on a Linux VM. See HydraGuard CLOUD.md or GATEWAY.md per topology.

Verify the tunnel

From the hub, regardless of guard type:

hydraguard status                      # <venue> row shows "Xs ago" handshake
wg show wg0 | grep -A6 <venue-pubkey>  # endpoint + transfer bytes
ping <venue-LAN-gateway>                # e.g. 10.0.X.1

Step 4: Enroll bodies as Air peers

Each Body machine maintains its own independent WireGuard tunnel to the hub, regardless of whether the venue has a site tunnel. This means bodies stay reachable even if the site tunnel is down.

Two paths:

Add Windows firewall rule on each body:

netsh advfirewall firewall add rule name="HydraGuard WG" dir=in action=allow remoteip=10.10.0.0/16 enable=yes

Step 5: Register bodies in hydracluster

Once bodies are on the mesh, they should appear in hydracluster admin. Assign appropriate roles (hydrabody, hydraguard-air). The hydranode agent picks up role assignments on its next poll and installs/starts the body software.

Verify:

# From hydracluster admin UI: body shows "online" with handshake recent
# Or via API:
curl -sk https://hydracluster.experiencenet.com/api/v1/nodes/<node-id>

Step 6: Install heads

Heads (kiosk displays) are the visitor-facing devices. For each head:

Register each head in hydracluster admin with type flatscreen (or samsungtv once available), assign district/venue, generate bearer token.

Verify: head's status PUT shows up in the cluster log every 30s with status:idle.

Step 7: Add venue to hydraneck for monitoring

If hydraneck is not yet a mesh peer for this district, do the one-time enrollment first — see Mesh Participation.

7a. Register in HydraVenues

The venue must exist in the HydraVenues API before hydraneck can scan it. Check first:

curl -s https://hydravenues.experiencenet.com/api/v1/venues | jq '.[].id'

If missing, create it:

curl -s https://hydravenues.experiencenet.com/api/v1/venues \
  -X POST \
  -H "Authorization: Bearer <hydravenues-admin-token>" \
  -H "Content-Type: application/json" \
  -d '{"id":"<venue-name>","name":"<Display Name>","district_id":"bxl1","organization_id":"visit-flanders","status":"active"}'

The admin token is in ~/.hydravenues/config.yaml on the hydravenues server.

7b. Add router to hydraneck config

Edit /root/.hydraneck/config.yaml on hydraneck.experiencenet.com. The routers: block is keyed by venue ID:

routers:
  <venue-name>:
    - name: mikrotik-<venue-name>
      type: mikrotik
      address: "10.10.X.1:8729"    # WG tunnel IP:port — NOT public WAN. Port is required.
      username: <readonly-user-from-partner>
      protocol: api                 # binary protocol on 8728/8729 — use this when partner opens API-SSL
      # protocol: rest              # default; HTTPS+JSON on :443; requires RouterOS v7.1+
      tier: partner
      wan_interface: ether1         # the WAN-facing interface name on the MikroTik

Protocol selection:

Address format: always host:port (e.g. 10.10.2.1:8729). The port is required for the api protocol; without it the dial fails with missing port in address.

7c. Store the password in secrets

Never put the password inline in config.yaml. Add it to /root/.hydraneck/secrets.yaml (mode 0600) keyed by <venue>/<router-name>:

secrets:
    <venue-name>/mikrotik-<venue-name>:
        password: '<password-from-partner>'

7d. Verify TCP connectivity before restarting

Before restarting hydraneck, confirm the API port is actually reachable from hydraneck:

ssh root@hydraneck.experiencenet.com
ping -c3 10.10.X.1                          # ICMP must work first (proves WG tunnel)
nc -zv -w5 10.10.X.1 8729                   # TCP port must also be reachable

If ping works but TCP times out — the MikroTik has a two-layer access control problem. Both must allow the connection:

  1. /ip firewall filter INPUT chain — needs a rule allowing TCP from 10.10.100.14 (hydraneck's WG IP) to port 8728/8729.
  2. /ip service settings — API/API-SSL service must not restrict available-from in a way that excludes the WG interface.

Ask the partner to check both layers. Diagnostic command for them to run from MikroTik terminal:

/ip service print
/ip firewall filter print chain=input

7e. Restart and scan

ssh root@hydraneck.experiencenet.com "systemctl restart hydraneck && hydraneck scan <venue-name>"

A working scan shows non-zero clients and the router status as live rather than unreachable.

Step 8: End-to-end verification

A new venue is "live" when all of the following pass:

  1. Mesh handshakehydraguard status shows recent handshake for the venue peer and every body's air peer.
  2. LAN reach from hubping <venue-LAN-gateway> succeeds.
  3. Hydracluster — every body and head registered, status online, no agent-down.
  4. Hydraneck/admin/venues/<venue-name> correlation table green for all bodies, bandwidth chart populating.
  5. Streaming smoke — assign a head a body in cluster admin, confirm visible video + audio + input on the head device.

Day-2 handover

Common gotchas

See also