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.
After deploying OpenClaw on several Azure VMs, I’ve encountered (and fixed) every common error. This guide is a direct result of those real-world deployments — every error message and fix has been verified.
$ docker compose ps
NAME STATUS
openclaw-openclaw-gateway-1 Restarting (1) 6 seconds agoThe container starts, crashes within seconds, and Docker restarts it in an infinite loop.
Always start with logs:
docker compose logs --no-color --tail=200 openclaw-gatewayThe last line before each restart reveals the exact error. Look for lines containing Gateway failed to start: or Invalid --bind.
Invalid --bind (use "loopback", "lan", "tailnet", "auto", or "custom")You set OPENCLAW_GATEWAY_BIND to an IP address like 0.0.0.0 or 127.0.0.1 instead of a named mode.
Edit .env:
cd ~/openclaw
nano .envChange to a valid mode:
# Instead of: OPENCLAW_GATEWAY_BIND=0.0.0.0
OPENCLAW_GATEWAY_BIND=lan
# Instead of: OPENCLAW_GATEWAY_BIND=127.0.0.1
OPENCLAW_GATEWAY_BIND=loopbackRestart:
docker compose down
docker compose up -d --force-recreateGateway 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 modeThe gateway is bound to a non-loopback address (lan, tailnet, etc.) but no browser origins are configured for the Control UI.
docker compose run --rm openclaw-cli config set \
gateway.controlUi.allowedOrigins \
'["http://<VM_PUBLIC_IP>:18789","http://localhost:18789"]'docker compose run --rm openclaw-cli config set \
gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback true# In .env
OPENCLAW_GATEWAY_BIND=loopbackThen access via SSH tunnel. No origin config needed.
After any fix:
docker compose down
docker compose up -d
docker compose ps[openclaw] Uncaught exception: Error: Fatal Gateway error: 4014
at GatewayPlugin.handleReconnectionAttemptDiscord rejected the bot’s connection because it requested privileged intents that aren’t enabled in the Discord Developer Portal.
docker compose down
docker compose up -dIf you just want the gateway stable while you fix Discord:
docker compose run --rm openclaw-cli config set channels.discord.enabled false
docker compose down
docker compose up -dError: Config validation failed: discord: discord config moved
to channels.discord (auto-migrated on load).You tried to set config using the old discord.* namespace.
Use channels.discord.* instead:
# Wrong
docker compose run --rm openclaw-cli config set discord.enabled false
# Correct
docker compose run --rm openclaw-cli config set channels.discord.enabled falseWARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string.
WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string.These are Docker Compose warnings about undefined environment variables referenced in docker-compose.yml. They are harmless — the variables are optional and default to empty strings.
To suppress the warnings, add empty values to your .env:
CLAUDE_AI_SESSION_KEY=
CLAUDE_WEB_SESSION_KEY=
CLAUDE_WEB_COOKIE=$ curl -I http://127.0.0.1:18789
curl: (7) Failed to connect to 127.0.0.1 port 18789: Couldn't connect to server| Cause | How to check | Fix |
|---|---|---|
| Gateway not running | docker compose ps shows “Restarting” | Fix the underlying error (see above) |
| Wrong bind mode | Gateway binds to different interface | Check .env OPENCLAW_GATEWAY_BIND |
| Port conflict | sudo ss -ltnp | grep 18789 | Change port in .env |
| Container just restarted | Timing issue — gateway takes a few seconds | Wait and retry |
When something isn’t working, follow this systematic approach:
docker compose ps# Last 200 lines
docker compose logs --no-color --tail=200 openclaw-gateway
# Live stream
docker compose logs -f openclaw-gatewaydocker compose down
docker compose up openclaw-gateway
# Watch output, Ctrl+C to stopdocker compose run --rm openclaw-cli config get
docker compose run --rm openclaw-cli config get | grep -i "gateway\|discord\|bind"docker compose run --rm openclaw-cli doctor --fixdocker compose run --rm openclaw-cli security auditcd ~/openclaw
git pull
docker compose down
docker compose up -d --build --force-recreateWith troubleshooting covered, let’s look at GitHub Copilot authentication: GitHub Copilot Authentication for OpenClaw.
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.