Get started
Pull the image. Open the admin.
Images live at ghcr.io/returnearly/nominal:latest. One Compose file with Postgres and Reverb. Then open the admin and add a monitor.
services:
app:
image: ghcr.io/returnearly/nominal:latest
ports:
- "8000:8080"
environment: &env
APP_KEY: base64:your-app-key
APP_URL: http://localhost:8000
DB_CONNECTION: pgsql
DB_HOST: postgres
DB_DATABASE: nominal
DB_USERNAME: nominal
DB_PASSWORD: nominal
QUEUE_CONNECTION: database
BROADCAST_CONNECTION: reverb
INTERFACE_AUTH: none
REVERB_APP_ID: nominal
REVERB_APP_KEY: nominal-key
REVERB_APP_SECRET: nominal-secret
REVERB_HOST: reverb
REVERB_PORT: 8080
REVERB_SCHEME: http
REVERB_CLIENT_HOST: localhost
REVERB_CLIENT_PORT: 8080
REVERB_CLIENT_SCHEME: http
healthcheck:
test: ["CMD", "healthcheck-octane"]
start_period: 10s
depends_on:
postgres:
condition: service_healthy
reverb:
condition: service_healthy
worker:
image: ghcr.io/returnearly/nominal:latest
command: ["php", "artisan", "queue:work", "--queue=checks.local,default"]
cap_add: [NET_RAW]
environment: *env
healthcheck:
test: ["CMD", "healthcheck-queue"]
start_period: 10s
depends_on:
postgres:
condition: service_healthy
reverb:
condition: service_healthy
app:
condition: service_healthy
scheduler:
image: ghcr.io/returnearly/nominal:latest
command: ["php", "artisan", "schedule:work"]
environment: *env
healthcheck:
test: ["CMD", "healthcheck-schedule"]
start_period: 10s
depends_on:
postgres:
condition: service_healthy
app:
condition: service_healthy
reverb:
image: ghcr.io/returnearly/nominal:latest
command: ["php", "artisan", "reverb:start", "--host=0.0.0.0", "--port=8080"]
ports:
- "8080:8080"
environment:
<<: *env
REVERB_HOST: localhost
REVERB_SERVER_HOST: 0.0.0.0
REVERB_SERVER_PORT: 8080
healthcheck:
test: ["CMD", "healthcheck-reverb"]
start_period: 10s
depends_on:
postgres:
condition: service_healthy
postgres:
image: postgres:17
environment:
POSTGRES_DB: nominal
POSTGRES_USER: nominal
POSTGRES_PASSWORD: nominal
volumes:
- postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "nominal", "-d", "nominal"]
interval: 10s
timeout: 3s
retries: 3
start_period: 5s
volumes:
postgres:1. Make a key
Generate an APP_KEY and paste it into the Compose file.
docker run --rm ghcr.io/returnearly/nominal:latest php artisan key:generate --show2. Boot it
docker compose up. Admin is at http://localhost:8000/admin. Reverb is on 8080 so the board refreshes as checks finish. Add a monitor from there. INTERFACE_AUTH=none skips the login page.
3. Optional: a token
Need GraphQL or Terraform? Create a token.
docker compose exec app php artisan nominal:token