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.