Skip to main content

System Overview

IPFOS is a polyglot microservices platform: independent services, each owning its own PostgreSQL database, fronted by a single Traefik gateway, communicating over REST and RabbitMQ.

Core principles

  1. One database per service, no cross-service foreign keys. Services reference each other's entities only by canonical UUIDs (userId, departmentId, projectId).
  2. One public ingress. Only Traefik publishes an API port (8080). Service and database ports stay internal to the compose network.
  3. Synchronous HTTP is the default for service-to-service needs; RabbitMQ RPC is allowed only for the approved department/project/PMO lookup path.
  4. Events are fire-and-forget on a durable topic exchange (os.events); consumers are idempotent via eventId.
  5. JWT everywhere. The auth service issues platform JWTs; each service enforces auth and permissions itself. (Gateway-level JWT validation is planned but not yet wired into Traefik.)

Bounded contexts

ContextOwnsLives in
Authadmin accounts, external identities, refresh tokens, auth auditos-auth-service
Users (logical)users, roles/permissions, departments + memberships, projects, badges, invitationsco-hosted in os-auth-service in v1, with internal separation preserved for later extraction
Ticketstickets, participants, comments, attachments, SLA policies, action timelineos-tickets-service
Notificationsin-app notificationsos-integration-service
Mealsmeal library, weekly menus, selectionsos-meals-service (designed; domain code still minimal)

Where the truth lives

  • Architecture and design decisions: os-backend/docs/design/architecture-proposal.md, solution-design.md, data-model.md.
  • API contract: os-backend/docs/design/api-spec.yml — the hand-maintained OpenAPI 3.0.3 spec. This is what the API Reference section of this site is generated from, and it is the source of truth when frontend and backend disagree on a data shape.
  • Runtime routing/ports: os-backend/compose.yml and os-backend/traefik/dynamic.yml. Note that docs/design/gateway-and-ports.md predates implementation and lists a stale port for the integration service (8084 vs. the actual 8087) — compose and Traefik config are authoritative.