River includes a graphical user interface, which lets users view and manage jobs without having to resort to manually querying the database, or falling back to the command line.
A live demo of River UI is available to see what it looks like.
Installation
A working River database is required for the UI to start up properly. See running River migrations, and make sure a DATABASE_URL
is exported to env.
go install github.com/riverqueue/river/cmd/river@latestriver migrate-up --database-url "$DATABASE_URL"
Optional Basic Authentication
By default, the River web UI is publicly accessible. To enable basic HTTP authentication, set the environment variables:
export RIVER_BASIC_AUTH_USER=<your-username>export RIVER_BASIC_AUTH_PASS=<your-password>
Alternatively, embed the UI into your own application and handle authentication however you'd like.
From source
River UI is primarily distributed as a packaged Go module and can be installed with go install
:
go install riverqueue.com/riverui/cmd/riverui@latestriverui
From binary
River UI releases include a set of static binaries for a variety of architectures and operating systems. Use one of these links:
Or fetch a binary with cURL:
RIVER_ARCH=arm64 # either 'amd64' or 'arm64'RIVER_OS=darwin # either 'darwin' or 'linux'curl -L https://github.com/riverqueue/riverui/releases/latest/download/riverui_${RIVER_OS}_${RIVER_ARCH}.gz | gzip -d > riveruichmod +x riverui./riverui
From container image
River UI ships container images with each release. Pull and run the latest with:
docker pull ghcr.io/riverqueue/riverui:latestdocker run -p 8080:8080 --env DATABASE_URL ghcr.io/riverqueue/riverui:latest
Embedding into another Go app
River UI can also be embedded into an existing Go app as an http.Handler
. This is useful for adding a UI to an existing service without needing to run a separate process or for placing the UI behind a custom authentication setup.
Add the module to your project:
go get -u riverqueue.com/riverui@latest
Next, create a new riverui.Server
, start it, and mount it to your HTTP mux:
opts := &riverui.ServerOpts{ Client: riverClient, DB: pgxPool, Logger: slogLogger, Prefix: "/riverui", // mount the UI and its APIs under /riverui // ...}server, err := riverui.NewServer(opts)if err != nil { log.Fatal(err)}// Start the server to initialize background processes for caching and periodic queries:server.Start(ctx)
mux := http.NewServeMux()mux.Handle("/riverui", server)
// ... start and run your HTTP server
A complete example can be found in the riverui
executable.