Skip to content
Nominal

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 --show

2. 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