Skip to content

Run via docker

Docker standardizes the server environment and makes it easier to get a local development environment set up and running.


Requires docker. Docker desktop should work too.

For development purposes, shared volumes are used in docker-compose.yml to ensure container node_modules are not confused with host level node_modules. This approach also keeps node_modules folders out of the local directory to make it easier to find and grep.

To make adjustments to the way the application runs, edit and review docker-compose.yml.

The UI and API containers have been set to run on start up to install / update dependencies.

Set up the front-end ui client or back-end api server as needed.

.env files

ui/, api/ and workers/ all contain .env.example files. Copy these to a corresponding .env file and update values accordingly.

cp ui/.env.example ui/.env
cp api/.env.example api/.env
cp workers/.env.example workers/.env


cd ui/
mkdir .cert
openssl req -subj '/CN=localhost' -x509 -newkey rsa:4096 -nodes -keyout ./.cert/key.pem -out ./.cert/cert.pem
cd api/keys

Note: when running under Windows, it may be necessary to run the openssl commands via Cygwin

Setup Migration and Seed Database

Run the initial migration:

docker compose exec api bash
npx prisma migrate dev

Add any usernames you need to work with in api/prisma/data.js then seed the db:

npx prisma db seed

Starting / Stopping

Use Docker Compose

Bring up the containers:

docker compose up -d

Make sure everything is running (no Exit 1 States):

docker compose ps

To shut down the containers:

docker compose down -v

To see what is going on in a specific container:

docker compose logs -f api


To use linting with the docker setup you must have the dev dependencies of the api and ui installed locally as well as the VSCode extention ESLint (dbaeumer.vscode-eslint). You will need to run the install command for both api and ui:

npm install --save-dev

You can also install Dev Containers (ms-vscode-remote.remote-containers) to remote into both the api and ui containers separately. You'd have to have two instances of vscode running, but if you don't want to install dependencies locally this is the best way to run with automatic linting.


Try it out how it is. Open a browser and go to:


You may need to specify the https:// prefix manually. You may also have to accept a warning about an insecure connection since it's a self-signed certificate. The default configuration should be enough to get up and running.

Test the API with:

To make more complex requests, use an API development tool like Hoppscotch or Insomnia:

To POST a request, choose POST, specify the URL, and in Body choose application/x-www-form-urlencoded for the Content Type


This application makes use of the Rhythm API for managing worker queues.

Queue folders need to belong to docker group

chown -R ${USER}:docker db/queue/

Quick start

Getting the user permissions set correctly is an important step in making the application run.


Run this script from the project root.

  • It creates a .env file in the project root which has the user id (uid) and group id (gid) of the project root directory's owner. The processes inside the api and worker_api docker containers are run as a user with this UID and GID.
  • It builds both the api and worker_api images
  • It runs all the containers (ui, api, worker_api, queue, postgres, mongo_db)


Most containers have curl available. Connect to one and then try making requests to the service you're having issue with.

docker compose exec web bash
curl -X GET http://api:3030/

(in this case, we don't need the /api suffix since we're behind the nginx proxy that normally adds /api for us)

Also, you can always insert console.log() statements in the code to see what values are at any given point.

You can check which ports are available locally and find something unique.

netstat -panl | grep " LISTEN "



If you have a compose file named something other than docker-compose.yml, you can specify the name with a -f flag:

docker compose -f docker-compose-prod.yml up -d

TIP: Shortcuts

Create bash aliases

The above commands can get tiring to type every time you want to take action with a compose environment. These shortcuts help.

Add the following to your .bashrc file (or equivalent)

alias dcu='docker compose up -d'
alias dcd='docker compose down --remove-orphans'
alias dcp='docker compose ps'
alias dce='docker compose exec'
alias dcl='docker compose logs'