Skip to content

Running the River UI

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@latest
$ river migrate-up --database-url "$DATABASE_URL"

River UI does not require authentication

The River UI doesn't currently have any kind of authentication system, and is therefore available to anyone able to connect to where it's hosted. Make sure to only host it in private contexts like an internal VPN so that it's not publicly accessible.

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 > riverui
$ chmod +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:latest
$ docker 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.