100K+
18 (LTS).env and prisma/.envdocker compose up in a separate terminalnpm inpm run testnpx prisma db pushnpx prisma migrate deploynpm run test:e2enpx prisma db seednpm run start:debugReal-time UI updates are delivered over socket.io. Running more than one API instance requires both of the following — with only one, live updates break:
Redis backplane — set REDIS_URL so every instance shares a socket.io
pub/sub adapter. Without it, an event emitted on one instance never reaches
clients connected to another (events are silently lost and the UI only
updates after a manual refresh).
REDIS_URL=redis://<host>:6379
When REDIS_URL is unset, the default in-memory adapter is used, so a single
instance and local development work with no extra setup.
Reverse proxy with sticky sessions + WebSocket upgrade for /socket.io/.
Without sticky sessions the polling handshake fails with 400 "Session ID unknown" because consecutive requests land on different instances. Example
nginx:
map $http_upgrade $connection_upgrade { default upgrade; '' close; }
upstream vrt_api {
ip_hash; # sticky sessions
server api_1:3000;
server api_2:3000;
}
location /socket.io/ {
proxy_pass http://vrt_api;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_read_timeout 3600s;
}
Confirmed with a 4-replica deployment: nginx ip_hash + WebSocket upgrade fixes
the handshake, but cross-replica event delivery still requires REDIS_URL.
/secrets named ssl.cert and ssl.keydocker compose -f docker-compose.yml -f docker-compose.ldap.yml (see docker docs for multiple-compose-files - merge)curl 'http://localhost:4200/users/login' \
-H 'accept: */*' \
-H 'accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7,fr;q=0.6' \
-H 'content-type: application/json' \
--data-raw '{"email":"[email protected]","password":"password"}'
Content type
Image
Digest
sha256:20d5ff06c…
Size
271.5 MB
Last updated
4 days ago
docker pull visualregressiontracker/api:5.6.1Pulls:
597
Jul 27 to Aug 2