Aller au contenu

Lancer les workers

L’application backend se découpe en 4 processus distincts, chacun avec son propre entrypoint. En production, chaque processus tourne dans son propre conteneur (image Docker multi-stage partagée).

CommandeEntrypointRôle
devsrc/main.tsAPI HTTP (NestJS + Fastify, port 3000)
relaysrc/relay-main.tsOutboxRelay — dépile la table outbox → NATS JetStream
consumersrc/consumer-main.ts17 consumers NATS durables (voir ci-dessous)
night-auditsrc/night-audit-main.tsSchedules Temporal par établissement (ensureAllSchedules au boot)
allotment-cutoffsrc/allotment-cutoff-main.tsWorker cutoff des allotments (Temporal)

Il n’existe pas de commande npm nommée pour purge-traveler-main.ts (RGPD art. 17) — ce processus est lancé directement via tsx src/purge-traveler-main.ts ou dans un job CI dédié.

Ouvrir 4 terminaux (ou utiliser un process manager comme pm2 / overmind) :

Fenêtre de terminal
# Terminal 1 — API HTTP
pnpm --filter @pms/api run dev
# Terminal 2 — OutboxRelay (publie les events domaine vers NATS)
pnpm --filter @pms/api run relay
# Terminal 3 — Consumers NATS (réagit aux events)
pnpm --filter @pms/api run consumer
# Terminal 4 — Night Audit (schedules Temporal, une instance suffit)
pnpm --filter @pms/api run night-audit

Le relay lit la table pms.outbox (entrypoints persistence) et publie les enveloppes Protobuf signées HMAC vers NATS JetStream. Il garantit at-least-once delivery : chaque event est marqué published_at après ACK NATS. En cas de panne, les events non publiés restent dans la table et sont réémis au redémarrage.

Enregistrés dans composition/consumer-worker.ts :

ConsumerSujet d’écouteAction
auditpms.*.>Alimente la chaîne d’audit NF203
révocationidentity.session_revokedInvalide les tokens Redis
payment→foliopayment.capturedPoste le règlement sur le folio
deposit-recognition (ACOMPTE)deposit.recognizedComptabilité acompte (CGI 269-2-c)
deposit-recognition (ARRHES)deposit.recognizedComptabilité arrhes (art. 1590 Cc)
stay→HKstay.checked_inCrée la tâche HK de départ
HK→inventoryhousekeeping.task_completedLibère l’unité OOO
WO→inventorywork_order.closedLibère l’OOO maintenance
cashless-checkoutstay.checked_outSolde le wallet cashless
debtor→dunningaccounts_receivable.overdueDéclenche le workflow Temporal de recouvrement
notification (email)notification.requestedEnvoie via SmtpEmailAdapter
notification (SMS)notification.sms_requestedStub V1
distributionreservation.confirmedPush ARI vers SiteMinder
pos-bridge folio-closedfolio.closedSynchronise OsmoVente
owner-revenue folio-closedfolio.closedCalcule la part propriétaire
reporting (3 consumers)night_audit.completedProjette les KPIs dans pms.reporting_*
webhook-dispatcherwebhook.outbound_requestedDispatche les webhooks signés vers les destinataires
travelerstay.checked_outRecale la rétention RGPD au départ réel

Démarrés et schedulés via le worker night-audit :

WorkflowDéclencheurDescription
cancel-reservationAPI (manual)Saga d’annulation (libération stock, arrhes si applicable)
night-auditSchedule par établissement (3h00 heure locale)Clôture businessDate
dunningConsumer debtor→dunningRelances de recouvrement
allotment-cutoffSchedule quotidienLibère les contingents non utilisés à la date de cutoff
purge-travelerSchedule mensuelPurge RGPD des fiches voyageurs expirées (art. 17)
tenant-provisioningAPI control-planeProvisioning complet d’un nouveau tenant
AppPortCommande
apps/mobile-staff4300pnpm --filter @pms/mobile-staff run start
apps/admin4301pnpm --filter @pms/admin run start
apps/tenant4302pnpm --filter @pms/tenant run start
apps/reception4303pnpm --filter @pms/reception run start
apps/tenant-mobile4304pnpm --filter @pms/tenant-mobile run start
Fenêtre de terminal
# Build image Docker (multi-stage, contient API + tous les workers)
docker build -t logmis-api .
# Ou build pnpm de l'api seule
pnpm --filter @pms/api run build

Le Dockerfile multi-stage produit une image unique pour l’API et tous les workers — l’entrypoint est sélectionné via la variable d’environnement WORKER_ENTRYPOINT ou par override de commande.