Skip to main content

Watchlight AI Beacon — Installer

Self-contained installer for the Watchlight Beacon stack. Deploys all services on any Linux or macOS host with Docker — no repo clone needed.

There are two installers:

InstallerPurpose
Beacon InstallerFull control plane (Registry, Discovery, secret management, TLS)
Standalone Discovery ScannerDeploy additional scanners on remote Docker hosts that report to a central Beacon

Beacon Installer

Services

ServicePurposeDefault Port
caddyTLS reverse proxy (optional — eval and production-caddy profiles only; not used in production profile)8443
openbaoSecret management (optional — eval profile only; production profiles use AWS Secrets Manager or env vars)8200
postgresDatabase (optional — eval profile only; production profiles use BYO database)5432
wl-registryAI Agent & MCP server catalog8080
wl-registry-frontendRegistry dashboard3000
wl-discoverNetwork scanner + agent detector
wl-apdpAgentic Policy Decision Point8081

Use the --services flag to select which services to install (default: all). See Service Selection.

Quick Start

# Download the installer
curl -fsSL https://docs.watchlight.ai/install-beacon.sh -o install-beacon.sh
chmod +x install-beacon.sh

# Install all services (prompts for configuration interactively)
./install-beacon.sh --ghcr-token <token>

# Or with a custom domain
./install-beacon.sh --domain beacon.company.com --ghcr-token <token>

# Install specific services only
./install-beacon.sh --services registry,discover --ghcr-token <token>

Prerequisites

  • Docker 24+ with Compose v2
  • curl and openssl
  • GHCR access token (provided by Watchlight AI)

Deployment Profiles

The installer supports three deployment profiles:

ProfileTLSDatabaseSecretsBest For
eval (default)Caddy auto-TLSEmbedded PostgreSQLOpenBao (embedded)Evaluation, development, demos
productionService-level TLS (BYO certs)BYO PostgreSQLAWS Secrets Manager or env varsEnterprise production
production-caddyCaddy auto-TLSBYO PostgreSQLAWS Secrets Manager or env varsSmaller production deployments
# Evaluation (default)
./install-beacon.sh --ghcr-token ghp_...

# Evaluation with custom domain
./install-beacon.sh --profile eval --domain beacon.company.com --ghcr-token ghp_...

# Production with service-level TLS + AWS Secrets Manager
./install-beacon.sh --profile production --tls-cert cert.pem --tls-key key.pem \
--database-url "postgres://..." --secret-provider aws --ghcr-token ghp_...

# Production with Caddy (smaller production)
./install-beacon.sh --profile production-caddy --database-url "postgres://..." \
--secret-provider env --ghcr-token ghp_...

# Frontend only (standalone dashboard)
./install-beacon.sh --frontend-only --ghcr-token ghp_...

CLI Reference

Install Flags

FlagDefaultDescription
--ghcr-token TOKEN(prompt)GHCR access token
--domain DOMAINsystem hostnameDomain name for TLS cert
--version TAG0.3.0-previewImage version
--license-key KEY(none)Watchlight license key
--log-level LEVELinfoLog level
--registry-port PORT8443Registry dashboard port
--install-dir PATH/opt/watchlight-beaconInstallation directory
--agent-reg-mode MODEopenopen|token_required|disabled
--tls-cert PATH(none)TLS certificate (PEM)
--tls-key PATH(none)TLS private key (PEM)
--frontend-port PORT3000Frontend host port
--api-port PORT8443Registry API TLS port
--postgres-port PORT5432PostgreSQL port

Profile Flags

FlagDefaultDescription
--profile PROFILEevaleval, production, or production-caddy
--database-url URL(none)PostgreSQL connection string (production profiles only)
--secret-provider SP(none)aws or env (production profiles only)
--aws-region REGIONus-east-1AWS region for Secrets Manager
--aws-secret-prefix Pwatchlight/beaconSecret name prefix

Service Flags

FlagDefaultDescription
--services SERVICESallComma-separated list of services to install. Available: registry, discover, apdp
--apdp-port PORT8081WL-APDP HTTP port

Component Flags

FlagDescription
--frontend-onlyInstall only the frontend dashboard (no backend)
--components MODEall or frontend

Operations

FlagDescription
--statusShow container states and URLs
--upgradePull new images and restart (preserves data)
--uninstallStop all containers, remove volumes and install dir

Access

URLDescription
https://<domain>:8443Registry Dashboard
https://<domain>:8443/topologyInteractive Topology Graph
https://<domain>:8443/api/v1/serversRegistry API
http://<host>:8081/healthWL-APDP health check (when apdp service enabled)
http://<host>:8081/authorizeWL-APDP authorization endpoint

Service Selection

By default, all services are installed. Use --services to install a subset:

# All services (default)
./install-beacon.sh --services all --ghcr-token <token>

# Registry + Discovery only (no authorization)
./install-beacon.sh --services registry,discover --ghcr-token <token>

# Registry + Authorization only (no discovery)
./install-beacon.sh --services registry,apdp --ghcr-token <token>

# All three services explicitly
./install-beacon.sh --services registry,discover,apdp --ghcr-token <token>
ServiceFlag ValueWhat It Installs
registryregistrywl-registry + wl-registry-frontend
discoverdiscoverwl-discover (network scanner + agent detector)
apdpapdpwl-apdp (Agentic Policy Decision Point)

The service selection is persisted in the state file and preserved across --upgrade operations.

note

WL-APDP shares the same PostgreSQL database as wl-registry (in eval mode) and runs its own migrations on startup. No additional database setup is required.

How It Works

  1. Self-contained — all configuration files (Docker Compose, Caddyfile, entrypoint) are embedded in the script as heredocs
  2. Secret management — generates secrets via openssl rand, stores in OpenBao (eval) or AWS Secrets Manager / env vars (production)
  3. Resume-safe — re-running detects existing containers and recovers secrets automatically
  4. TLS by default — Caddy or service-level TLS for all external access; internal traffic uses host networking with loopback binding
  5. No repo required — download the single script and run it
  6. Auto-detect hostname — defaults domain to system FQDN (e.g., EC2 instance hostname)
  7. Host networking — all services use network_mode: host for host-level network visibility (enables eBPF-based discovery)

Network Architecture

All services run with network_mode: host:

  • Internal services (OpenBao, PostgreSQL) bind to 127.0.0.1 only
  • Caddy (eval/production-caddy) or wl-registry (production) terminates TLS on the registry port
  • Host networking enables eBPF-based discovery via kprobes on tcp_connect/inet_csk_accept

Security Model

Secret Management (OpenBao — Eval Profile)

OpenBao runs in production mode with file-backed persistent storage:

  • Encryption at rest: Secrets are stored encrypted on a persistent Docker volume
  • Auto-unseal: Unseal key stored at ${INSTALL_DIR}/.openbao-unseal-key (chmod 600, root-only)
  • AppRole authentication: Services authenticate using non-secret role_id identifiers — no tokens in env vars or on disk
  • Per-service policies: Each service has a scoped policy with least-privilege access
  • Root token: Used only during installation, then deleted from the container

Secret Management (Production Profiles)

Production profiles support two secret providers:

  • AWS Secrets Manager (--secret-provider aws): Secrets stored in AWS with IAM-based access
  • Environment variables (--secret-provider env): Customer manages secrets externally

Credential Security

  • Secrets are generated at install time and never written to disk (except the unseal key backup in eval mode)
  • No secrets in container environment variables — docker inspect reveals only non-secret role_id values
  • The .beacon-env file stores only non-secret config (domain, version, log level)

Docker Socket

Required for container discovery by wl-discover:

  • Read-only mount (/var/run/docker.sock:ro)
  • Process inspection: Configurable (default: true)
  • Package inspection: Configurable (default: false)
  • Network filter: Only inspects containers on the beacon network

Image Verification

After pulling images, the installer verifies each image:

  1. Digest verification: Confirms each image has a valid repository digest (sha256)
  2. Cosign signature verification: Verifies the cryptographic signature on each image using cosign. If cosign is not installed, verification is skipped with a warning.

Installed Files

FilePurpose
docker-compose.ymlService definitions
CaddyfileTLS reverse proxy configuration (eval/production-caddy)
docker-entrypoint.shStartup script — AppRole auth + secret fetch
openbao-config.hclOpenBao production mode configuration (eval)
openbao-entrypoint.shOpenBao init/auto-unseal script (eval)
bao-server.crt/keyOpenBao TLS certificate (eval)
pg-server.crt/keyPostgreSQL TLS certificate (eval)
beacon-ca.crtCaddy TLS CA certificate (auto-generated)
.beacon-envSaved non-secret configuration
.openbao-unseal-keyOpenBao unseal key backup (chmod 600, eval only)
.image-digestsPulled image digest verification

All files are required for the stack to function. Install directory is chmod 700 (root-only).

Troubleshooting

IssueSolution
Services won't startCheck Docker is running and has enough resources (2GB RAM minimum)
GHCR auth failsVerify your token has read:packages scope
TLS errorsTrust the CA cert or use curl -k
Port conflictsUse --registry-port to change the default port
Clean restart./install-beacon.sh --uninstall && ./install-beacon.sh --ghcr-token <token>

Standalone Discovery Scanner

Deploy additional discovery scanners on remote Docker hosts. Each scanner reports to your central Beacon registry.

Standalone Discovery Scanner

Prerequisites

  • Docker 20+ running on the host
  • Network access to the Beacon registry endpoint (HTTPS)
  • Scanner credentials — created by an admin via the Registry UI or admin API

Quick Start

1. Create a Scanner (Admin)

In the Registry UI, go to Scanners → Add Scanner. Copy the scanner_id and api_key.

Or via the admin API:

curl -X POST https://beacon.company.com:8443/api/v1/admin/scanners \
-H "Content-Type: application/json" \
-H "x-admin-key: YOUR_ADMIN_KEY" \
-d '{"name": "prod-host-01", "description": "Production host scanner"}'

2. Install the Scanner

# Download
curl -fsSL https://docs.watchlight.ai/install-wl-discover.sh -o install-wl-discover.sh
chmod +x install-wl-discover.sh

# Install
./install-wl-discover.sh \
--registry-url https://beacon.company.com:8443 \
--scanner-id "UUID_FROM_STEP_1" \
--api-key "API_KEY_FROM_STEP_1" \
--ghcr-token "YOUR_GITHUB_PAT"

Or run ./install-wl-discover.sh with no flags for interactive mode.

3. Verify

Check the Registry UI — your scanner should appear under the Scanners tab within 60 seconds.

./install-wl-discover.sh --status

CLI Reference

Install Flags

FlagRequiredDefaultDescription
--registry-urlYes(prompt)Central registry HTTPS endpoint
--scanner-idYes(prompt)Scanner UUID from admin registration
--api-keyYes(prompt)Scanner API key from admin registration
--ghcr-tokenYes*(prompt)GitHub PAT for pulling image (*skipped if cached)
--scanner-nameNo$(hostname)Human-readable name for this host
--ca-certNosystem CAsCustom CA cert for registry TLS
--versionNo0.3.0-previewImage version tag
--docker-socketNo/var/run/docker.sockDocker socket path
--network-scanNoCIDR/hostname targets (see below)
--schema-modeNohash_onlyhash_only or full
--log-levelNoinfoLog level
--dry-runNoPrint docker run command only

Operations

# Check scanner status
./install-wl-discover.sh --status

# Upgrade to new version
./install-wl-discover.sh --upgrade --version 0.3.0 --ghcr-token "ghp_..."

# Uninstall (remove container + data volume)
./install-wl-discover.sh --uninstall

Network Scanning

By default, the scanner discovers MCP servers and agents running in Docker containers on the same host. To also scan remote network targets:

./install-wl-discover.sh \
--registry-url https://beacon.company.com:8443 \
--scanner-id "..." --api-key "..." --ghcr-token "..." \
--network-scan "10.0.1.0/24,10.0.2.0/24,mcp.internal:3000-3010"

Target formats:

  • CIDR range: 10.0.1.0/24 — scans all hosts on default MCP ports
  • Host + port: mcp.internal:3000 — scans specific host and port
  • Host + port range: mcp.internal:3000-3010 — scans port range on host
  • Comma-separated: combine multiple targets

Custom CA Certificates

If your registry uses a private CA (e.g., Caddy's internal CA), provide the CA certificate:

./install-wl-discover.sh \
--registry-url https://beacon.internal:8443 \
--ca-cert /path/to/ca.crt \
...

How It Works

  • No config files: The scanner uses environment variables only ("remote-first" mode)
  • Docker discovery: Monitors Docker containers via the socket for MCP servers and AI agent frameworks (LangGraph, CrewAI, AutoGen, LangChain)
  • Container security metadata: Collects privileged mode, capabilities, user/UID, read-only rootfs, volumes, network mode, PID mode, image digest, and lifecycle timestamps
  • Multi-tier agent detection: 4-tier configurable model — (1) static metadata, (2) process inspection, (3) package inspection, (4) generic AI detection via LLM API credentials
  • Remote-first config: Scan parameters, detection tier toggles, and thresholds are fetched from the registry's Config Presets API
  • Non-root: The container runs as UID 10001 with no-new-privileges

Credential Security

Scanner credentials (scanner_id + api_key) are never stored in Docker volume labels or container environment variables:

  1. Credentials are written to a file inside the Docker volume (/app/data/.credentials) with mode 0400, owned by UID 10001
  2. A volume-embedded entrypoint reads the file and exports credentials as process-level env vars at startup
  3. docker inspect and docker volume inspect will not reveal the API key
  4. Upgrades recover credentials from the volume file automatically

Troubleshooting

IssueSolution
Docker socket permission deniedEnsure user is in the docker group: sudo usermod -aG docker $USER
TLS certificate errorsProvide registry CA cert with --ca-cert /path/to/ca.crt
Cannot reach registryCheck URL, network connectivity, and firewall rules
Scanner credentials rejectedVerify scanner was created in Registry UI and credentials match
Container crashes on startupCheck logs: docker logs wl-discover

Support