Eliminates the setInterval(1s) + per-second DB write by storing picksExpiresAt in draft_timers and using a targeted setTimeout per pick. Clients count down locally from the expiresAt timestamp, removing server-pushed timer-update events. Key changes: - database/schema.ts: add picksExpiresAt and picksStartedAt to draft_timers - server/timer.ts: full rewrite — schedulePickForSeason, rescheduleTimer, 30s recovery interval instead of 1s tick, overnight-pause resume scheduling - server/socket.ts: new timer-pick-started / timer-overnight-paused events, updated draft-state-sync to include expiresAt for reconnect recovery - draft.make-pick / draft.force-manual-pick: compute actual remaining from picksExpiresAt at pick time; call rescheduleTimer after the autodraft chain - useDraftSocketEvents: handle new timer events, restore countdown on reconnect - $leagueId.draft.$seasonId: client-side countdown useEffect from expiresAt - plans/zero-downtime-scaling.md: full 4-phase scaling plan for future reference Resolves 2351 unit tests (all passing). https://claude.ai/code/session_019k5J6Ty7uP5HxSx6CsbiBK
43 lines
1.6 KiB
YAML
43 lines
1.6 KiB
YAML
services:
|
|
migrate:
|
|
container_name: brackt-migrate
|
|
image: sjc.vultrcr.com/chrisparsons/brackt:latest
|
|
command: ["node", "/app/scripts/migrate.mjs"]
|
|
networks:
|
|
- internal
|
|
restart: "no"
|
|
|
|
brackt:
|
|
depends_on:
|
|
migrate:
|
|
condition: service_completed_successfully
|
|
deploy:
|
|
restart_policy:
|
|
condition: on-failure
|
|
max_attempts: 5
|
|
container_name: brackt
|
|
image: sjc.vultrcr.com/chrisparsons/brackt:latest
|
|
environment:
|
|
- NODE_ENV=production
|
|
- PGBOUNCER=true
|
|
- SQUIGGLE_CONTACT_EMAIL=chris@brackt.com
|
|
- BETTER_AUTH_URL=https://brackt.com
|
|
- APP_URL=https://brackt.com
|
|
labels:
|
|
- traefik.enable=true
|
|
- traefik.http.routers.brackt.rule=Host(`brackt.com`)
|
|
- traefik.http.routers.brackt.tls=true
|
|
- traefik.http.routers.brackt.tls.certresolver=lets-encrypt
|
|
- traefik.http.routers.brackt.entrypoints=websecure
|
|
- traefik.http.services.brackt.loadbalancer.server.port=3000
|
|
- traefik.http.routers.brackt-www.rule=Host(`www.brackt.com`)
|
|
- traefik.http.routers.brackt-www.tls=true
|
|
- traefik.http.routers.brackt-www.tls.certresolver=lets-encrypt
|
|
- traefik.http.routers.brackt-www.entrypoints=websecure
|
|
- traefik.http.routers.brackt-www.middlewares=redirect-to-nonwww
|
|
- traefik.http.middlewares.redirect-to-nonwww.redirectregex.regex=^https://www\.(.*)
|
|
- traefik.http.middlewares.redirect-to-nonwww.redirectregex.replacement=https://$${1}
|
|
- traefik.http.middlewares.redirect-to-nonwww.redirectregex.permanent=true
|
|
networks:
|
|
- internal
|
|
- web
|