Step-by-step bring-up of the Observal stack. End state: the core services are healthy, API responding at http://localhost/health, web UI at http://localhost. Prometheus and Grafana are optional.
git clone https://github.com/Observal/Observal.git
cd Observal
cp .env.example .envThe .env.example ships with working direct-value defaults for local source development, including demo account credentials. You do not need to edit it for local development. Production server-package installs use generated files under secrets/ instead; see Configuration.
Note
You need Docker Engine ≥ 24.0 with Compose v2 (docker compose, not docker-compose). Homebrew's Docker formula is outdated. Install Docker Desktop or use your distro's upstream packages. Verify with docker version and docker compose version.
Core stack only:
docker compose -f docker/docker-compose.yml up --build -dWith Prometheus only:
docker compose -f docker/docker-compose.yml -f docker/docker-compose.observability.yml up --build -dWith Prometheus and Grafana:
COMPOSE_PROFILES=grafana docker compose -f docker/docker-compose.yml -f docker/docker-compose.observability.yml up --build -dFirst build takes a few minutes (pulls images, builds observal-api and observal-web). Subsequent starts are fast.
docker compose -f docker/docker-compose.yml psEvery service should show healthy or running. The API waits for Postgres, ClickHouse, and Redis to pass health checks before starting. Expect 15–30 seconds on first boot.
Hit the health endpoint:
curl http://localhost/health
# {"status":"ok"}For local dev, http://localhost is fine. For production, put a TLS-terminating reverse proxy in front of the nginx LB. See Requirements → TLS / HTTPS.
.env.example seeds four demo accounts on first startup:
| Role | Password | |
|---|---|---|
| Super Admin | super@demo.example |
super-changeme |
| Admin | admin@demo.example |
admin-changeme |
| Reviewer | reviewer@demo.example |
reviewer-changeme |
| User | user@demo.example |
user-changeme |
Log in with the CLI:
curl -fsSL https://raw.githubusercontent.com/Observal/Observal/main/install.sh | bash # if you haven't already
observal auth login # Email: super@demo.example, Password: super-changemeRemove demo accounts before real deployment. Unset the DEMO_* env vars in .env and restart. Already-seeded accounts stay until you delete them manually (observal admin delete-user <email>).
Remove DEMO_* from .env and start the stack. Run:
observal auth login
# Server URL: http://localhost
# No users detected - bootstrapping admin account.
# Email: alice@your-company.com
# Password: **************The CLI detects that no users exist and interactively creates the first admin. The /api/v1/auth/bootstrap endpoint is restricted to localhost access for security.
observal auth whoami
observal auth status
observal registry mcp list # empty list - you haven't added anything yet# Stop core and any optional monitoring containers
make down
# Stop and delete all data, including optional monitoring volumes
docker compose -f docker/docker-compose.yml -f docker/docker-compose.observability.yml --profile grafana down -v
# Restart one service
docker compose -f docker/docker-compose.yml restart observal-api
# Rebuild after code changes
docker compose -f docker/docker-compose.yml up --build -d observal-apiMakefile shortcuts from the repo root:
make logs # tail core service logs
make rebuild # rebuild and restart core services
make up-prometheus # start core services with Prometheus
make up-observability # start core services with Prometheus and Grafana
make rebuild-prometheus # rebuild core services with Prometheus
make rebuild-observability # rebuild core services with Prometheus and Grafanadocker compose -f docker/docker-compose.yml logs -f # all
docker compose -f docker/docker-compose.yml logs -f observal-api # one serviceIf docker compose up fails with port is already allocated, remap host ports via env vars:
POSTGRES_HOST_PORT=5433 REDIS_HOST_PORT=6380 \
docker compose -f docker/docker-compose.yml up --build -dEvery host port is configurable. See Ports and volumes for the full list.
→ Configuration: which env vars to change for production.