Target: UAT / Local deployment on Mac Mini Stack: Go backend · SolidStart frontend · Redis Transport: Docker Compose (Docker for Mac / Podman Desktop)

Architecture

All three containers run on a private clawui bridge network. Only ports 3000, 8080, and 6379 are exposed on the host.

Prerequisites

Quick Start

1. Configure environment

Key variables:

2. Deploy

This will:
  1. Build the Go binary (multi-stage Docker build)
  2. Build the SolidStart frontend (node:22-alpine)
  3. Start Redis, wait for it to be healthy
  4. Start the backend, wait for /health to return 200
  5. Start the frontend

3. Verify

Expected output:
Open your browser at http://localhost:3000

Startup Sequence

Services start in this strict order (Docker depends_on + condition: service_healthy):
The backend will not start until Redis is healthy. The frontend will not start until the backend is healthy. This prevents the frontend from serving a broken UI on first load.

Health Check Endpoints

Common Commands

Updating the Application

Images are rebuilt from source on every up call. Docker layer cache makes rebuilds fast for unchanged layers.

Data Persistence

Redis data is stored in a named Docker volume redis_data. It persists across container restarts and docker compose down. To wipe all data:

Local Development (without Docker)

For active development, run services individually: Redis (if not using system Redis):
Backend:
Frontend:
Note: Dev mode runs on port 3001. The app.config.ts proxies /api to http://localhost:8080 automatically.

Troubleshooting

Backend won’t start — “redis: connection refused”

Redis isn’t healthy yet. Wait 10–15 seconds, or check:

Frontend build fails — “Cannot find module”

Node dependencies may be stale. The Docker build handles this, but for local dev:

Backend returns 500 — “openclaw: connection refused”

OPENCLAW_ENDPOINT is unreachable. Verify the gateway is running and the endpoint URL in .env is correct.

CORS errors in browser

Ensure CORS_ALLOWED_ORIGINS in .env matches the origin your browser uses (e.g., http://localhost:3000).

Port conflict

If port 3000, 8080, or 6379 is in use:
Override ports in .env:

Known Issues

UAT note: The deployment is functional for testing the UI, content rendering, pinning, and session persistence. Real AI responses require OPENCLAW_TOKEN to point to a working gateway.