Run via docker
Docker standardizes the server environment and makes it easier to get a local development environment set up and running.
Setup
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/.envOpenSSL
cd ui/
mkdir .cert
openssl req -subj '/CN=localhost' -x509 -newkey rsa:4096 -nodes -keyout ./.cert/key.pem -out ./.cert/cert.pemcd api/keys
./genkeys.shNote: 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 devAdd any usernames you need to work with in api/prisma/data.js then seed the db:
npx prisma db seedStarting / Stopping
Use Docker Compose
Bring up the containers:
docker compose up -dMake sure everything is running (no Exit 1 States):
docker compose psTo shut down the containers:
docker compose down -vTo see what is going on in a specific container:
docker compose logs -f apiLinting
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-devYou 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.
Testing
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
Queue
This application makes use of the Rhythm API for managing worker queues.
Queue folders need to belong to docker group
db/queue/
chown -R ${USER}:docker db/queue/Quick start
Getting the user permissions set correctly is an important step in making the application run.
bin/dev.shRun this script from the project root.
- It creates a
.envfile 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)
Troubleshooting
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 "Docker-compose
-f
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 -dTIP: 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'via https://charlesbrandt.com/system/virtualization/docker-compose.html#shell-shortcuts