Building Custom AI Skills with InstructLab Taxonomy
Create domain-specific AI capabilities using InstructLab's taxonomy system—from writing skill definitions to generating synthetic training data and validating fine-tuned models.
One of the first configuration hurdles with OpenClaw on Azure is understanding the --bind parameter. Unlike a simple IP address (e.g., 0.0.0.0), OpenClaw uses named bind modes:
| Mode | Behavior | Use Case |
|---|---|---|
loopback | Binds to 127.0.0.1 only | SSH tunnel access (most secure) |
lan | Binds to all network interfaces | Direct LAN/public access |
tailnet | Binds to Tailscale interface | Zero-config VPN access |
auto | OpenClaw decides based on environment | Automatic detection |
custom | Custom bind address (requires additional config) | Advanced setups |
In your .env file on the VM:
# For SSH tunnel access (recommended)
OPENCLAW_GATEWAY_BIND=loopback
# For direct public/LAN access
OPENCLAW_GATEWAY_BIND=lanCommon mistake: Setting
OPENCLAW_GATEWAY_BIND=0.0.0.0will fail with:Invalid --bind (use "loopback", "lan", "tailnet", "auto", or "custom")Use
laninstead of0.0.0.0.
When you bind to a non-loopback address (e.g., lan), OpenClaw enforces browser-origin checks on the Control UI. This prevents unauthorized browsers from connecting to your dashboard via DNS rebinding or cross-origin attacks.
Without proper origin configuration, you’ll see this crash loop:
Gateway failed to start: Error: non-loopback Control UI requires
gateway.controlUi.allowedOrigins (set explicit origins), or set
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true
to use Host-header origin fallback modeYou have two options to fix this:
Set a specific list of trusted origins:
cd ~/openclaw
docker compose run --rm openclaw-cli config set \
gateway.controlUi.allowedOrigins \
'["http://<VM_PUBLIC_IP>:18789","http://<VM_PRIVATE_IP>:18789","http://localhost:18789","http://127.0.0.1:18789"]'Replace <VM_PUBLIC_IP> and <VM_PRIVATE_IP> with your actual IPs:
# Get your public IP
curl -s ifconfig.me; echo
# Get your private IP
hostname -IIf you want to get running immediately:
docker compose run --rm openclaw-cli config set \
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback trueThis tells OpenClaw to trust the Host header from the browser request instead of checking against an explicit allowlist.
With this flag enabled, you’ll see:
[gateway] security warning: dangerous config flags enabled:
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true.
Run openclaw security audit.This is expected and serves as a reminder to lock down access through other means.
After any config change, restart the gateway:
docker compose down
docker compose up -d --force-recreate
docker compose ps
docker compose logs --tail=50 openclaw-gatewayVerify the gateway stays Up (not Restarting):
# Check multiple times over ~60 seconds
docker compose ps
# Wait 15 seconds
docker compose ps
# Wait 15 seconds
docker compose ps# .env
OPENCLAW_GATEWAY_BIND=loopback
OPENCLAW_GATEWAY_PORT=18789No origin configuration needed — loopback mode skips the origin check.
Access via SSH tunnel:
# From your laptop
ssh -L 18789:127.0.0.1:18789 azureuser@<VM_PUBLIC_IP>
# Then open http://127.0.0.1:18789# .env
OPENCLAW_GATEWAY_BIND=lan
OPENCLAW_GATEWAY_PORT=18789Plus explicit origins:
docker compose run --rm openclaw-cli config set \
gateway.controlUi.allowedOrigins \
'["http://<VM_PUBLIC_IP>:18789"]'Plus Azure NSG rule restricting TCP 18789 to your IP.
View your current configuration:
docker compose run --rm openclaw-cli config getKey gateway settings:
| Config Key | Default | Description |
|---|---|---|
gateway.controlUi.enabled | true | Enable/disable the Control UI |
gateway.controlUi.basePath | / | URL prefix for the UI (e.g., /openclaw) |
gateway.controlUi.allowedOrigins | [] | Browser-origin allowlist |
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback | false | Host-header fallback mode |
gateway.controlUi.allowInsecureAuth | false | Allow token-only auth over HTTP |
gateway.controlUi.dangerouslyDisableDeviceAuth | false | Disable device identity checks |
With the gateway properly configured, let’s connect a Discord bot: Connecting OpenClaw to Discord on Azure.
AI & Cloud Advisor with 18+ years experience. Author of 8 technical books, creator of Ansible Pilot. Speaker at KubeCon EU & Red Hat Summit 2026.
Create domain-specific AI capabilities using InstructLab's taxonomy system—from writing skill definitions to generating synthetic training data and validating fine-tuned models.
How to access the OpenClaw Control UI dashboard from an Azure VM — via SSH tunnel (secure) or public IP. Covers device pairing, dashboard authentication, and the browser-based management interface.
End-to-end guide to building a complete persistent memory system for your OpenClaw AI agent. Combine memory flush, hybrid search, file-backed notes, SQLite indexing, and session hooks into a cohesive knowledge architecture.