Skip to main content

HR Suit Local Development Runbook

Document status: Source-verified local-development baseline
System of record: SalaryManagement API 1 source repository
Canonical launcher: scripts/start-full-local.ps1
Last source review: 2026-08-03
Uncertainty marker: Requires Confirmation

This page is the single operational reference for running HR Suit locally. It distinguishes the canonical full-local topology from projects that merely exist in the solution. A service is not described as required unless a checked-in launcher, routing configuration, or direct code dependency establishes that requirement.

Overview

HR Suit is a transitional .NET architecture. A Vite/React client portal and a separate Super Admin portal call a public ASP.NET Core Gateway. The Gateway routes extracted capabilities to dedicated services and sends compatibility routes to the legacy SalarySystem application. PostgreSQL provides persistence. RabbitMQ provides integration-event transport. The canonical Windows launcher starts a selected subset of the microservice solution; additional service projects are available for focused development and regression work.

The safest default for cross-module work is the checked-in full-local launcher. For focused work, use the smallest profile in Run Profiles and leave unrelated services stopped.

Repository locations

ConcernVerified location
Backend repository rootD:\Project\Git\SalaryManagement API 1
Microservice solutionmicroservices/HrSuit.Microservices.sln
Legacy applicationSalarySystem.csproj
Frontend workspaceUI/salary-ui
Canonical topologyscripts/full-local-stack.config.psd1
Canonical launcherscripts/start-full-local.ps1
Status commandscripts/status-full-local.ps1
Full smoke commandscripts/smoke-full-local.ps1
Stop commandscripts/stop-full-local.ps1
Docker topologymicroservices/docker-compose.yml

Architecture rules

  1. Browser traffic should use Gateway port 5000 for the canonical topology.
  2. Extracted services own their verified routes when the corresponding Gateway routing switch is enabled.
  3. The monolith remains the compatibility fallback for /api routes not cut over.
  4. Each persistent extracted service uses its own logical PostgreSQL database.
  5. Gateway is started last because it validates and depends on downstream destinations.
  6. Port 5040 is intentionally unused by the canonical scripts; Attendance uses 5041.

Infrastructure

PostgreSQL

PropertyVerified value
PurposePersistence for the monolith and stateful extracted services
Canonical host/portlocalhost:5432
Required forAll canonical backend services except Gateway; Reporting, HR Operations, and Tenant Provisioning persistence is Requires Confirmation
Startup orderFirst
Health checkpsql -h localhost -p 5432 -U postgres -d postgres -tAc "SELECT 1"
Canonical local userpostgres
Password sourceHR_SUIT_POSTGRES_PASSWORD; launcher fallback postgres

The canonical launcher creates missing logical databases but does not drop, recreate, or seed existing databases. Each service retains ownership of its EF Core migration and startup seeding behavior.

RabbitMQ

PropertyVerified value
PurposeIntegration-event transport
AMQP port5672
Management port15672
Required forCanonical full stack and services configured with RabbitMq
Startup orderAfter PostgreSQL, before applications
Health checkhttp://localhost:15672/api/health/checks/alarms with management credentials
Exchangehr-suit.integration-events
Local credentialsHR_SUIT_RABBITMQ_USERNAME / HR_SUIT_RABBITMQ_PASSWORD; launcher fallback guest / guest
Container namehr-suit-microservices-rabbitmq-1

The launcher reuses a reachable broker, starts a local RabbitMQ Windows service when one exists, or delegates to microservices/scripts/start-local-rabbitmq.ps1. The stop script preserves RabbitMQ unless -StopRabbitMq is supplied.

Docker Desktop

Docker Desktop is one supported way to host RabbitMQ and the complete Compose topology. It is required by UI/salary-ui/scripts/run-local-gateway.ps1 and by docker compose; it is not required when using the host-process full-local launcher with PostgreSQL and RabbitMQ already available.

Health check: docker info. Default port: not applicable.

Optional observability

Observability:SeqUrl, Observability:OtlpEndpoint, and Observability:EnableConsoleExporter exist in service configuration. No canonical local Seq, Elasticsearch, Redis, Azurite, or OpenTelemetry Collector process is started by the verified launchers. Their ports, startup order, and health checks are Requires Confirmation.

Frontend Applications

Client HRMS Portal

PropertyVerified value
ApplicationClient HRMS Portal
PathUI/salary-ui/apps/client-hrms-portal
Port / URL5173 / http://localhost:5173/
Required backendGateway for canonical mode; direct monolith is a supported fallback
Installnpm install from UI/salary-ui
Buildnpm run build:client
Runnpm run dev:client -- --host 0.0.0.0 --port 5173
Health verificationHTTP success from http://localhost:5173/
Build outputdist/

Environment variables: VITE_API_BASE_URL, VITE_USE_PLATFORM_SERVICE, VITE_PLATFORM_GATEWAY_BASE_URL, VITE_SUPER_ADMIN_PORTAL_URL, VITE_CLIENT_PORTAL_URL, VITE_WORKSPACE_BASE_DOMAIN, VITE_LEGAL_TERMS_URL, VITE_PRIVACY_POLICY_URL, and VITE_SIGNUP_SUPPORT_EMAIL.

Super Admin Portal

PropertyVerified value
ApplicationSuper Admin Portal
PathUI/salary-ui/apps/super-admin-portal
Port / URL5174 / http://localhost:5174/
Required backendGateway; Platform and Identity for platform administration
Installnpm install from UI/salary-ui
Buildnpm run build:admin
Runnpm run dev:admin -- --host 0.0.0.0 --port 5174
Health verificationHTTP success from http://localhost:5174/
Build outputdist-super-admin/

Frontend modes

ModeVITE_API_BASE_URLNotes
Canonical Gatewayhttp://localhost:5000Shared client normalizes local origin to /api where needed
Gateway with explicit suffixhttp://localhost:5000/apiAlso supported by the shared API client
Direct monolith fallbackhttp://localhost:5223/apiDoes not exercise Gateway or extracted-service routing

Backend Services

Status meanings: Canonical means included by scripts/full-local-stack.config.psd1; Available means an executable project and launch profile exist but the canonical launcher does not start it; Library means it is not an independently runnable service.

ServicePortDatabaseDependenciesGateway RouteHealth EndpointSwaggerCanonical OwnerStatus
Gateway API5000NoneCanonical downstream APIs; RabbitMQ/http://localhost:5000/health; dev downstream check /health/downstreamshttp://localhost:5000/swaggerPublic API gatewayCanonical
Platform Service5097hrsuit_platformPostgreSQL, RabbitMQ, Identity for provisioning paths/platform, /api/publichttp://localhost:5097/healthhttp://localhost:5097/swaggerPlatformCanonical
Identity Service5010hrsuit_identityPostgreSQL, RabbitMQ; Platform capability client/identityhttp://localhost:5010/healthhttp://localhost:5010/swaggerIdentityCanonical
SalarySystem5223salarydb; also reads Identity connection in ComposePostgreSQL, RabbitMQ/api compatibility fallbackhttp://localhost:5223/healthhttp://localhost:5223/swagger/index.htmlLegacy workforce and compatibility APIsCanonical
Employee Service5267hrsuit_employeePostgreSQL, RabbitMQ; downstream guards are configuration-dependent/employee, employee-owned /api routeshttp://localhost:5267/healthhttp://localhost:5267/swaggerWorkforce / EmployeeCanonical
Attendance Service5041hrsuit_attendancePostgreSQL, RabbitMQ/attendance-service, /api/time-officehttp://localhost:5041/healthhttp://localhost:5041/swaggerAttendanceCanonical
Leave Service5050hrsuit_leavePostgreSQL, RabbitMQ; Workflow when approval switch is enabled/leave, /api/leave-confighttp://localhost:5050/healthhttp://localhost:5050/swaggerLeaveCanonical
Payroll Service5158hrsuit_payrollPostgreSQL, RabbitMQ; Attendance availability guard/payroll, /api/payroll-confighttp://localhost:5158/healthhttp://localhost:5158/swaggerPayrollCanonical
Workflow Service5251hrsuit_workflowPostgreSQL, RabbitMQ/api/workflow-confighttp://localhost:5251/healthhttp://localhost:5251/swaggerWorkflowCanonical
Document Service5168hrsuit_documentPostgreSQL, RabbitMQ; configured document storage/documents-service, /api/document-confighttp://localhost:5168/healthhttp://localhost:5168/swaggerDocumentCanonical
Notification Service5074hrsuit_notificationPostgreSQL, RabbitMQ/notifications, /api/notification-confighttp://localhost:5074/healthhttp://localhost:5074/swaggerNotification / CommunicationCanonical
Tenant Provisioning Service5014Requires ConfirmationConfiguration-definedRequires Confirmationhttp://localhost:5014/healthhttp://localhost:5014/swaggerTenant provisioningAvailable
HR Operations Service5028Requires ConfirmationConfiguration-definedRequires Confirmationhttp://localhost:5028/healthhttp://localhost:5028/swaggerHR operationsAvailable
Recruitment Service5241hrsuit_recruitmentPostgreSQL; Workflow when approval switch is enabledGateway configuration contains a recruitment destination and routing switchhttp://localhost:5241/healthhttp://localhost:5241/swaggerRecruitmentAvailable
Expense Service5288hrsuit_expensePostgreSQL; Workflow when approval switch is enabledGateway configuration contains an expense destinationhttp://localhost:5288/healthhttp://localhost:5288/swaggerExpenseAvailable
Asset Service5292hrsuit_assetPostgreSQL; Workflow when approval switch is enabledGateway configuration contains an asset destinationhttp://localhost:5292/healthhttp://localhost:5292/swaggerAssetAvailable
Performance Service5296hrsuit_performancePostgreSQL; Workflow when approval switch is enabledGateway configuration contains a performance destinationhttp://localhost:5296/healthhttp://localhost:5296/swaggerPerformanceAvailable
Training Service5307 in launch profile; Gateway default destination is 5321hrsuit_trainingPostgreSQLGateway configuration contains a training destinationhttp://localhost:5307/healthhttp://localhost:5307/swaggerTrainingAvailable; configuration conflict
Helpdesk Service5311hrsuit_helpdeskPostgreSQLGateway configuration contains helpdesk destination and routing switchhttp://localhost:5311/healthhttp://localhost:5311/swaggerHelpdeskAvailable
Reporting Service5116Requires ConfirmationConfiguration-definedRequires Confirmationhttp://localhost:5116/healthhttp://localhost:5116/swaggerReportingAvailable
Integration Service5050hrsuit_integrationPostgreSQLRequires Confirmationhttp://localhost:5050/healthhttp://localhost:5050/swaggerIntegrationAvailable; conflicts with Leave
ContractsNoneNoneNoneNoneNoneNoneShared contractsLibrary
Shared KernelNoneNoneNoneNoneNoneNoneShared implementationLibrary

Swagger is wired in each listed executable Program.cs; the exact UI suffix beyond /swagger is framework-default except where the monolith documentation explicitly specifies /swagger/index.html.

Startup Order

This is the exact order in the canonical configuration array, with Gateway deferred until all non-Gateway entries are healthy.

Canonical commands

cd "D:\Project\Git\SalaryManagement API 1"
.\scripts\start-full-local.ps1
.\scripts\status-full-local.ps1
.\scripts\smoke-full-local.ps1

Stop only processes recorded by the orchestrator:

.\scripts\stop-full-local.ps1
# Include broker only when intentionally stopping it:
.\scripts\stop-full-local.ps1 -StopRabbitMq

Logs are written under run-logs/full-local/services. A healthy process found before startup is reused and not registered for later termination.

Run Profiles

RAM and CPU measurements are not captured in source. Every estimate field therefore remains Requires Confirmation until a repeatable measurement is checked in.

Authentication Profile

ItemValue
PurposeLogin, token issuance, activation, session and authorization cutover
ServicesIdentity; Gateway; Platform when capability/provisioning behavior is exercised; SalarySystem for compatibility smoke
Databaseshrsuit_identity; hrsuit_platform when Platform is used; salarydb for compatibility
InfrastructurePostgreSQL; RabbitMQ where integration behavior is exercised
Estimated RAMRequires Confirmation
Typical scenariosLogin, account activation, identity bootstrap, monolith compatibility
Health endpoints:5010/health, :5097/health, :5223/health, :5000/health
Smoke testssmoke-identity.ps1, smoke-auth-cutover.ps1, smoke-identity-bootstrap.ps1, smoke-identity-monolith-compat.ps1

Core HR Profile

Purpose: employee and legacy workforce development. Services: Employee, SalarySystem, Identity, Gateway, and Client Portal. Database: hrsuit_employee, salarydb, hrsuit_identity. Infrastructure: PostgreSQL and RabbitMQ. Estimated RAM: Requires Confirmation. Typical scenario: employee CRUD and compatibility routing. Health: ports 5267, 5223, 5010, 5000, and 5173. Smoke: microservices/scripts/smoke-employee.ps1 plus the employee route in scripts/smoke-full-local.ps1.

Payroll Profile

Purpose: payroll calculation/configuration and attendance-dependent validation. Services: Payroll, Attendance, Employee or SalarySystem as required by the scenario, Identity, Gateway, Client Portal. Databases: hrsuit_payroll, hrsuit_attendance, plus workforce and identity stores used by the scenario. Infrastructure: PostgreSQL and RabbitMQ. Estimated RAM: Requires Confirmation. Health: ports 5158, 5041, 5267/5223, 5010, 5000, 5173. Smoke: smoke-payroll.ps1, smoke-payroll-cutover.ps1, and scripts/validate-payroll-scenarios.ps1.

Recruitment Profile

Purpose: extracted recruitment development and compatibility validation. Services: Recruitment, Gateway, Identity, Workflow when approvals are enabled, Client Portal; SalarySystem may still own compatibility UI APIs. Database: hrsuit_recruitment, hrsuit_identity, hrsuit_workflow, and possibly salarydb. Infrastructure: PostgreSQL; RabbitMQ dependency for this profile is Requires Confirmation. Estimated RAM: Requires Confirmation. Health: ports 5241, 5000, 5010, 5251, 5173. Smoke: microservices/scripts/smoke-recruitment.ps1. Gateway cutover state defaults to false in checked-in Gateway settings.

Attendance Profile

Purpose: attendance, shift policy, and time-office routes. Services: Attendance, Gateway, Identity, Client Portal; SalarySystem when routing switches are false. Databases: hrsuit_attendance, hrsuit_identity, and salarydb for fallback. Infrastructure: PostgreSQL and RabbitMQ. Estimated RAM: Requires Confirmation. Health: ports 5041, 5000, 5010, 5223, 5173. Smoke: smoke-attendance.ps1 and attendance-shift-cutover-go-no-go.ps1.

Leave Profile

Purpose: leave and leave-configuration flows. Services: Leave, Gateway, Identity, Workflow when approval routing is enabled, Client Portal; SalarySystem for fallback. Databases: hrsuit_leave, hrsuit_identity, hrsuit_workflow, salarydb as applicable. Infrastructure: PostgreSQL and RabbitMQ. Estimated RAM: Requires Confirmation. Health: ports 5050, 5000, 5010, 5251, 5223, 5173. Smoke: smoke-leave.ps1.

Asset Profile

Purpose: extracted asset management and approval parity. Services: Asset, Gateway, Identity, Workflow when enabled, Client Portal; SalarySystem for compatibility. Databases: hrsuit_asset plus identity/workflow/fallback stores. Infrastructure: PostgreSQL; messaging requirement is Requires Confirmation. Estimated RAM: Requires Confirmation. Health: ports 5292, 5000, 5010, 5251, 5173. Smoke: smoke-asset.ps1, compare-asset-parity.ps1, asset-cutover-go-no-go.ps1.

Helpdesk Profile

Purpose: extracted helpdesk development and parity validation. Services: Helpdesk, Gateway, Identity, Client Portal; SalarySystem for fallback. Databases: hrsuit_helpdesk, identity and fallback stores. Infrastructure: PostgreSQL; messaging requirement is Requires Confirmation. Estimated RAM: Requires Confirmation. Health: ports 5311, 5000, 5010, 5173. Smoke: smoke-helpdesk.ps1, compare-helpdesk-parity.ps1, helpdesk-cutover-go-no-go.ps1.

Notification Profile

Purpose: notifications and notification configuration. Services: Notification, Gateway, Identity, Client Portal. Databases: hrsuit_notification, hrsuit_identity. Infrastructure: PostgreSQL and RabbitMQ. Estimated RAM: Requires Confirmation. Health: ports 5074, 5000, 5010, 5173. Smoke: smoke-notification.ps1.

Workflow Profile

Purpose: workflow configuration and approval integration. Services: Workflow, Gateway, Identity, and the domain service publishing or consuming the approval flow. Databases: hrsuit_workflow, hrsuit_identity, plus domain store. Infrastructure: PostgreSQL and RabbitMQ. Estimated RAM: Requires Confirmation. Health: ports 5251, 5000, 5010 and domain service health. Smoke: smoke-workflow.ps1 plus domain-specific smoke.

Reporting Profile

Purpose: reporting-service development. Services: Reporting on 5116; its Gateway route and required upstream services are Requires Confirmation. Database: Requires Confirmation. Infrastructure: Requires Confirmation. Estimated RAM: Requires Confirmation. Health: http://localhost:5116/health. Smoke test: no smoke-reporting.ps1 was found; Requires Confirmation.

Full Canonical Stack

Purpose: checked-in golden full-access topology. Services: every entry in scripts/full-local-stack.config.psd1. Databases: salarydb, hrsuit_platform, hrsuit_identity, hrsuit_employee, hrsuit_attendance, hrsuit_leave, hrsuit_payroll, hrsuit_workflow, hrsuit_document, hrsuit_notification. Infrastructure: PostgreSQL and RabbitMQ. Estimated RAM: Requires Confirmation. Typical scenarios: end-to-end changes, Gateway routing, cross-module flows, portal regression. Health: all canonical URLs in the inventory. Smoke: scripts/smoke-full-local.ps1.

Complete Regression Stack

Purpose: execute the broadest checked-in microservice regression. Services and databases: determined by microservices/scripts/run-v1-regression.ps1 plus its called smoke scripts. This is not identical to the canonical launcher. Infrastructure: PostgreSQL, RabbitMQ, and any dependencies asserted by the script. Estimated RAM: Requires Confirmation. Typical scenarios: release and cutover verification. Health endpoints: all invoked-service /health endpoints. Smoke: microservices/scripts/run-v1-regression.ps1. A single checked-in launcher for every executable project was not found; exact one-command startup is Requires Confirmation.

Feature → Service Mapping

FeatureFrontendGateway RouteBackend ServiceDatabaseMessagingDependenciesWorkflowNotification
Authentication / activationBoth portals/identity when AuthRouting:UseIdentityAuth=true; otherwise compatibility routeIdentity / SalarySystem fallbackhrsuit_identity / salarydbRabbitMQ configuredPlatform capability clientNo verified direct requirementActivation behavior exists; delivery channel Requires Confirmation
Tenant and SaaS platformSuper Admin/platformPlatformhrsuit_platformRabbitMQ configuredIdentity provisioning clientRequires ConfirmationRequires Confirmation
Public registrationClient/public UI/api/publicPlatformhrsuit_platformRabbitMQ configuredIdentity provisioningRequires ConfirmationVerification behavior exists; channel Requires Confirmation
EmployeesClient/employee and employee-owned /api when cut overEmployee / SalarySystem fallbackhrsuit_employee / salarydbRabbitMQ configuredIdentity; fallback monolithRequires ConfirmationRequires Confirmation
AttendanceClient/attendance-service, /api/time-officeAttendance / SalarySystem fallbackhrsuit_attendance / salarydbRabbitMQ configuredWorkforce identityRequires ConfirmationRequires Confirmation
LeaveClient/leave, /api/leave-configLeave / SalarySystem fallbackhrsuit_leave / salarydbRabbitMQ configuredIdentityOptional via LEAVE_APPROVAL_USE_WORKFLOWRequires Confirmation
PayrollClient/payroll, /api/payroll-configPayroll / SalarySystem fallbackhrsuit_payroll / salarydbRabbitMQ configuredAttendance; workforce dataRequires ConfirmationRequires Confirmation
Workflow configurationClient/admin/api/workflow-configWorkflowhrsuit_workflowRabbitMQ configuredDomain approval servicesOwnerRequires Confirmation
DocumentsClient/documents-service, /api/document-configDocument / SalarySystem fallbackhrsuit_document / salarydbRabbitMQ configuredDocument storage configurationRequires ConfirmationRequires Confirmation
NotificationsBoth portals/notifications, /api/notification-configNotificationhrsuit_notificationRabbitMQ configuredIdentity/tenant contextConsumes workflow-related behavior: exact contract Requires ConfirmationOwner
RecruitmentClientDestination and switch verified; exact public prefix Requires ConfirmationRecruitment / SalarySystem fallbackhrsuit_recruitment / salarydbRequires ConfirmationIdentityOptional via RECRUITMENT_APPROVAL_USE_WORKFLOWRequires Confirmation
ExpenseClientDestination verified; exact prefix Requires ConfirmationExpense / SalarySystem fallbackhrsuit_expense / salarydbRequires ConfirmationIdentityOptional via EXPENSE_APPROVAL_USE_WORKFLOWRequires Confirmation
AssetClientDestination verified; exact prefix Requires ConfirmationAsset / SalarySystem fallbackhrsuit_asset / salarydbRequires ConfirmationIdentityOptional via ASSET_APPROVAL_USE_WORKFLOWRequires Confirmation
PerformanceClientDestination verified; exact prefix Requires ConfirmationPerformance / SalarySystem fallbackhrsuit_performance / salarydbRequires ConfirmationIdentityOptional via PERFORMANCE_APPROVAL_USE_WORKFLOWRequires Confirmation
TrainingClientDestination verified; exact prefix Requires ConfirmationTraininghrsuit_trainingRequires ConfirmationIdentityRequires ConfirmationRequires Confirmation
HelpdeskClientDestination and switch verified; exact prefix Requires ConfirmationHelpdesk / SalarySystem fallbackhrsuit_helpdesk / salarydbRequires ConfirmationIdentityRequires ConfirmationRequires Confirmation
ReportingClient/adminRequires ConfirmationReportingRequires ConfirmationRequires ConfirmationRequires ConfirmationNo verified ownershipNo verified ownership
IntegrationNone verifiedRequires ConfirmationIntegrationhrsuit_integrationRequires ConfirmationRequires ConfirmationRequires ConfirmationRequires Confirmation
HR operationsClientCompatibility routes Requires ConfirmationHR Operations project and SalarySystem compatibilityRequires ConfirmationRequires ConfirmationRequires ConfirmationRequires ConfirmationRequires Confirmation

Module Testing Guides

The following guides use only checked-in projects, health endpoints, and smoke-script names. “Typical APIs” names the verified Gateway boundary where known; it does not assert individual controller actions.

Identity

  • Purpose: authentication, activation, bootstrap, session identity, and cutover from legacy authentication.
  • Required services: Identity; add Platform for capability/provisioning; add SalarySystem for compatibility; Gateway for public-path testing.
  • Required databases: hrsuit_identity; add hrsuit_platform and salarydb for those scenarios.
  • Required queues: exact queues Requires Confirmation; exchange is hr-suit.integration-events.
  • Frontend: both portals.
  • Smoke tests: smoke-identity.ps1, smoke-auth-cutover.ps1, smoke-identity-bootstrap.ps1, smoke-identity-monolith-compat.ps1.
  • Health: http://localhost:5010/health.
  • Typical API boundary: /identity.
  • Known dependencies: Platform capabilities and shared JWT issuer/audience/key.
  • Known issues: the checked-in Gateway default keeps identity auth routing disabled; enable deliberately for cutover testing.
  • Recommended profile: Authentication.

Employee

  • Purpose: extracted employee/workforce capability.
  • Required services: Employee, Identity, Gateway; SalarySystem for fallback/parity.
  • Database: hrsuit_employee; salarydb for fallback.
  • Queues: exact names Requires Confirmation.
  • Frontend: Client HRMS Portal.
  • Smoke: smoke-employee.ps1.
  • Health: http://localhost:5267/health.
  • Typical boundary: /employee plus employee-owned /api routes.
  • Dependencies: tenant and identity context; other downstream guards are configuration-dependent.
  • Known issue: EmployeeRouting:UseEmployeeService defaults false in Gateway appsettings.
  • Profile: Core HR.

Attendance

  • Purpose: attendance, time office, and shift-policy extraction.
  • Services: Attendance, Identity, Gateway, Client Portal; SalarySystem for parity/fallback.
  • Database: hrsuit_attendance.
  • Queues: Requires Confirmation.
  • Smoke: smoke-attendance.ps1, compare-attendance-shift-parity.ps1, attendance-shift-cutover-go-no-go.ps1.
  • Health: http://localhost:5041/health.
  • Typical boundaries: /attendance-service, /api/time-office.
  • Dependencies: workforce identity; Payroll reads attendance in payroll scenarios.
  • Known issue: port 5040 is intentionally avoided; routing switches default false outside the canonical Compose overrides.
  • Profile: Attendance.

Leave

  • Purpose: leave transactions and leave configuration.
  • Services: Leave, Identity, Gateway; Workflow when approvals use it; SalarySystem for fallback.
  • Database: hrsuit_leave.
  • Queues: Requires Confirmation.
  • Smoke: smoke-leave.ps1.
  • Health: http://localhost:5050/health.
  • Typical boundaries: /leave, /api/leave-config.
  • Dependencies: optional Workflow through LEAVE_APPROVAL_USE_WORKFLOW.
  • Known issue: conflicts with Integration Service on 5050.
  • Profile: Leave.

Payroll

  • Purpose: payroll operations and configuration.
  • Services: Payroll, Attendance, workforce owner, Identity, Gateway, Client Portal.
  • Database: hrsuit_payroll.
  • Queues: Requires Confirmation.
  • Smoke: smoke-payroll.ps1, smoke-payroll-cutover.ps1, compare-payroll-parity.ps1, payroll-cutover-go-no-go.ps1, scripts/validate-payroll-scenarios.ps1.
  • Health: http://localhost:5158/health.
  • Typical boundaries: /payroll, /api/payroll-config.
  • Dependencies: Attendance and workforce data; availability relaxation is controlled by PayrollGuard__RelaxWhenPayrollUnavailableInDevelopment.
  • Known issue: routing switch defaults false in Gateway appsettings.
  • Profile: Payroll.

Recruitment

  • Purpose: positions, candidates, interviews, offers, and extracted recruitment parity.
  • Services: Recruitment, Identity, Gateway, Workflow for enabled approvals, Client Portal; SalarySystem fallback.
  • Database: hrsuit_recruitment; legacy recruitment data also exists in salarydb compatibility storage.
  • Queues: Requires Confirmation.
  • Smoke: smoke-recruitment.ps1.
  • Health: http://localhost:5241/health.
  • Typical API: exact extracted Gateway prefix Requires Confirmation; legacy source documents /api/hr-suite/recruitment/*.
  • Dependencies: optional Workflow via RECRUITMENT_APPROVAL_USE_WORKFLOW.
  • Known issue: routing switch defaults false.
  • Profile: Recruitment.

Performance

  • Purpose: extracted performance capability and parity validation.
  • Services: Performance, Identity, Gateway, optional Workflow, Client Portal, SalarySystem fallback.
  • Database: hrsuit_performance.
  • Queues and exact Gateway prefix: Requires Confirmation.
  • Smoke: smoke-performance.ps1, compare-performance-parity.ps1, performance-cutover-go-no-go.ps1.
  • Health: http://localhost:5296/health.
  • Dependencies: optional Workflow via PERFORMANCE_APPROVAL_USE_WORKFLOW.
  • Known issue: not started by the canonical full-local launcher.
  • Profile: Complete Regression or a focused manual profile.

Training

  • Purpose: extracted training capability.
  • Services: Training, Identity, Gateway, Client Portal.
  • Database: hrsuit_training.
  • Queues: Requires Confirmation.
  • Smoke: smoke-training.ps1.
  • Health: launch profile http://localhost:5307/health.
  • Typical API and dependencies: Requires Confirmation.
  • Known issue: Gateway defaults to port 5321 while the service launch profile uses 5307.
  • Profile: focused manual profile after overriding TRAINING_SERVICE_BASE_URL to the actual service URL.

Asset

  • Purpose: asset lifecycle and approval extraction.
  • Services: Asset, Identity, Gateway, optional Workflow, Client Portal, SalarySystem fallback.
  • Database: hrsuit_asset.
  • Queues and exact Gateway prefix: Requires Confirmation.
  • Smoke: smoke-asset.ps1, compare-asset-parity.ps1, asset-cutover-go-no-go.ps1.
  • Health: http://localhost:5292/health.
  • Dependency: optional Workflow via ASSET_APPROVAL_USE_WORKFLOW.
  • Known issue: not canonical-launcher managed.
  • Profile: Asset.

Expense

  • Purpose: expense lifecycle and approval extraction.
  • Services: Expense, Identity, Gateway, optional Workflow, Client Portal, SalarySystem fallback.
  • Database: hrsuit_expense.
  • Queues and exact Gateway prefix: Requires Confirmation.
  • Smoke: smoke-expense.ps1, compare-expense-parity.ps1, expense-cutover-go-no-go.ps1.
  • Health: http://localhost:5288/health.
  • Dependency: optional Workflow via EXPENSE_APPROVAL_USE_WORKFLOW.
  • Known issue: not canonical-launcher managed.
  • Profile: focused manual profile.

Helpdesk

  • Purpose: ticket/helpdesk extraction and parity.
  • Services: Helpdesk, Identity, Gateway, Client Portal, SalarySystem fallback.
  • Database: hrsuit_helpdesk.
  • Queues and exact Gateway prefix: Requires Confirmation.
  • Smoke: smoke-helpdesk.ps1, compare-helpdesk-parity.ps1, helpdesk-cutover-go-no-go.ps1.
  • Health: http://localhost:5311/health.
  • Dependencies: identity and tenant context.
  • Known issue: routing switch defaults false and service is not canonical-launcher managed.
  • Profile: Helpdesk.

Workflow

  • Purpose: workflow configuration and shared approval behavior.
  • Services: Workflow, Identity, Gateway, and selected domain service.
  • Database: hrsuit_workflow.
  • Queues: exact names Requires Confirmation.
  • Smoke: smoke-workflow.ps1.
  • Health: http://localhost:5251/health.
  • Typical boundary: /api/workflow-config.
  • Dependencies: domain services opt in through approval environment switches.
  • Known issues: end-to-end verification must include the participating domain service.
  • Profile: Workflow.

Notification

  • Purpose: notification delivery state and configuration.
  • Services: Notification, Identity, Gateway, Client Portal.
  • Database: hrsuit_notification.
  • Queues: exact names Requires Confirmation.
  • Smoke: smoke-notification.ps1.
  • Health: http://localhost:5074/health.
  • Typical boundaries: /notifications, /api/notification-config.
  • Dependencies: RabbitMQ and tenant/identity context.
  • Known issues: channel-specific external delivery prerequisites are Requires Confirmation.
  • Profile: Notification.

Reporting

  • Purpose: reporting API project.
  • Services: Reporting; all upstream data dependencies Requires Confirmation.
  • Database and queues: Requires Confirmation.
  • Frontend: reporting views exist in the Client portal; binding to this extracted service is Requires Confirmation.
  • Smoke: no dedicated checked-in reporting smoke script found.
  • Health: http://localhost:5116/health.
  • Typical APIs, dependencies, and known issues: Requires Confirmation.
  • Profile: Reporting.

Platform

  • Purpose: tenants, licensing, features, branding, subscriptions, provisioning, public registration, and SaaS administration.
  • Services: Platform, Identity for provisioning, Gateway, Super Admin Portal; Client Portal for public signup scenarios.
  • Database: hrsuit_platform; tenant provisioning has a second EF model snapshot in the Platform project.
  • Queues: exact names Requires Confirmation; RabbitMQ is configured.
  • Smoke: smoke-platform.ps1 and the checked-in smoke-platform-* suite, smoke-registration.ps1, smoke-customer-lifecycle.ps1.
  • Health: http://localhost:5097/health.
  • Typical boundaries: /platform, /api/public.
  • Dependencies: Identity provisioning token and shared JWT settings.
  • Known issue: provisioning worker defaults false in .env.example.
  • Profile: Authentication or Full Canonical Stack.

CRM

  • Purpose: sales CRM behavior is represented by smoke-sales-crm.ps1 and Super Admin UI code.
  • Required services, database owner, queues, Gateway route, health endpoint, typical APIs, and extracted canonical owner: Requires Confirmation.
  • Frontend: Super Admin Portal.
  • Smoke: microservices/scripts/smoke-sales-crm.ps1.
  • Known issue: no crm-service project exists in the microservice solution.
  • Profile: Full Canonical Stack, with prerequisites read from the smoke script before execution.

Integration

  • Purpose: integration service project.
  • Services: Integration; other dependencies Requires Confirmation.
  • Database: hrsuit_integration.
  • Queues and frontend: Requires Confirmation.
  • Smoke: smoke-integration.ps1.
  • Health: http://localhost:5050/health.
  • Typical APIs: Requires Confirmation.
  • Known issue: its launch port conflicts with Leave.
  • Profile: focused manual profile with a port override.

Environment Variables

The tables cover variables verified in canonical examples, launch scripts, or runtime source. Values containing secrets are development examples only and must not be committed with real credentials.

Canonical host launcher

NameDefaultUsed byRequiredSecurity considerations
HR_SUIT_POSTGRES_PASSWORDpostgresFull-local scriptsOptional locallySecret; local fallback only
HR_SUIT_RABBITMQ_USERNAMEguestFull-local scriptsOptional locallyDo not reuse outside localhost
HR_SUIT_RABBITMQ_PASSWORDguestFull-local scriptsOptional locallySecret; do not reuse outside localhost
JWT_KEYChecked-in development fallbackFull-local servicesOptional only for local launcherSecret; replace outside development
ASPNETCORE_ENVIRONMENTLauncher sets Development.NET servicesYes for expected dev behaviorDevelopment may expose Swagger/tokens
ASPNETCORE_URLSSet per process by --urls or Compose http://+:8080.NET servicesSupplied by launcherAvoid public binding on untrusted networks

Compose ports and origins

NameDefault/exampleUsed byRequiredSecurity considerations
GATEWAY_HTTP_PORT5000Compose GatewayYes in .env.exampleLocal HTTP only
IDENTITY_HTTP_PORT5010Compose IdentityYesLocal HTTP only
PLATFORM_HTTP_PORT5097Compose PlatformYesLocal HTTP only
MONOLITH_HTTP_PORT5223Compose monolithOptional default existsLocal HTTP only
EMPLOYEE_HTTP_PORT5267Compose EmployeeOptional default existsLocal HTTP only
ATTENDANCE_HTTP_PORT5041Compose AttendanceOptional default existsLocal HTTP only
LEAVE_HTTP_PORT5050Compose LeaveOptional default existsConflicts with Integration host profile
PAYROLL_HTTP_PORT5158Compose PayrollOptional default existsLocal HTTP only
WORKFLOW_HTTP_PORT5251Compose WorkflowOptional default existsLocal HTTP only
DOCUMENT_HTTP_PORT5168Compose DocumentOptional default existsLocal HTTP only
NOTIFICATION_HTTP_PORT5074Compose NotificationOptional default existsLocal HTTP only
CLIENT_ORIGINhttp://localhost:5173Gateway CORSYes in ComposeRestrict outside development
ADMIN_ORIGINhttp://localhost:5174Gateway CORSYes in ComposeRestrict outside development

Service discovery and routing

NameDefault/exampleUsed byRequiredSecurity considerations
MONOLITH_BASE_URLCompose http://monolith:8080; host http://localhost:5223GatewayYesInternal URL
IDENTITY_SERVICE_BASE_URLCompose http://identity-service:8080GatewayCanonical ComposeInternal URL
PLATFORM_SERVICE_BASE_URLCompose http://platform-service:8080GatewayCanonical ComposeInternal URL
EMPLOYEE_SERVICE_BASE_URLCompose service URLGatewayWhen destination usedInternal URL
ATTENDANCE_SERVICE_BASE_URLCompose service URLGatewayWhen destination usedInternal URL
LEAVE_SERVICE_BASE_URLCompose service URLGatewayWhen destination usedInternal URL
PAYROLL_SERVICE_BASE_URLCompose service URLGatewayWhen destination usedInternal URL
WORKFLOW_SERVICE_BASE_URLCompose service URLGatewayWhen destination usedInternal URL
DOCUMENT_SERVICE_BASE_URLCompose service URLGatewayWhen destination usedInternal URL
NOTIFICATION_SERVICE_BASE_URLCompose service URLGatewayWhen destination usedInternal URL
RECRUITMENT_SERVICE_BASE_URLHost default http://localhost:5241GatewayWhen destination usedInternal URL
HELPDESK_SERVICE_BASE_URLHost default http://localhost:5311GatewayWhen destination usedInternal URL
EXPENSE_SERVICE_BASE_URLHost default http://localhost:5288GatewayWhen destination usedInternal URL
ASSET_SERVICE_BASE_URLHost default http://localhost:5292GatewayWhen destination usedInternal URL
PERFORMANCE_SERVICE_BASE_URLHost default http://localhost:5296GatewayWhen destination usedInternal URL
TRAINING_SERVICE_BASE_URLGateway default http://localhost:5321GatewayWhen destination usedMust reconcile with launch profile 5307

Routing switches verified in source are EMPLOYEE_ROUTING_USE_EMPLOYEE_SERVICE, ATTENDANCE_ROUTING_USE_ATTENDANCE_SERVICE, ATTENDANCE_ROUTING_USE_SHIFT_POLICY_SERVICE, LEAVE_ROUTING_USE_LEAVE_SERVICE, PAYROLL_ROUTING_USE_PAYROLL_SERVICE, DOCUMENT_ROUTING_USE_DOCUMENT_SERVICE, NOTIFICATION_ROUTING_USE_NOTIFICATION_SERVICE, RECRUITMENT_ROUTING_USE_RECRUITMENT_SERVICE, HELPDESK_ROUTING_USE_HELPDESK_SERVICE, EXPENSE_ROUTING_USE_EXPENSE_SERVICE, ASSET_ROUTING_USE_ASSET_SERVICE, PERFORMANCE_ROUTING_USE_PERFORMANCE_SERVICE, and AUTH_ROUTING_USE_IDENTITY_AUTH. Checked-in Gateway JSON defaults the core cutover switches to false; canonical Compose explicitly enables several extracted destinations.

Database variables

Name/groupDefault/exampleUsed byRequiredSecurity considerations
ConnectionStrings__DefaultConnectionLocal value in appsettingsSalarySystemYesContains database credentials
ConnectionStrings__PlatformDbhrsuit_platform connectionPlatformYesSecret-bearing
ConnectionStrings__IdentityDbhrsuit_identity connectionIdentityYesSecret-bearing
ConnectionStrings__EmployeeDbhrsuit_employee connectionEmployeeYesSecret-bearing
ConnectionStrings__AttendanceDbhrsuit_attendance connectionAttendanceYesSecret-bearing
ConnectionStrings__LeaveDbhrsuit_leave connectionLeaveYesSecret-bearing
ConnectionStrings__PayrollDbhrsuit_payroll connectionPayrollYesSecret-bearing
ConnectionStrings__WorkflowDbhrsuit_workflow connectionWorkflowYesSecret-bearing
ConnectionStrings__DocumentDbhrsuit_document connectionDocumentYesSecret-bearing
ConnectionStrings__NotificationDbhrsuit_notification connectionNotificationYesSecret-bearing
ConnectionStrings__RecruitmentDbhrsuit_recruitment connectionRecruitmentYes when runSecret-bearing
ConnectionStrings__ExpenseDbhrsuit_expense connectionExpenseYes when runSecret-bearing
ConnectionStrings__AssetDbhrsuit_asset connectionAssetYes when runSecret-bearing
ConnectionStrings__PerformanceDbhrsuit_performance connectionPerformanceYes when runSecret-bearing
ConnectionStrings__TrainingDbhrsuit_training connectionTrainingYes when runSecret-bearing
ConnectionStrings__HelpdeskDbhrsuit_helpdesk connectionHelpdeskYes when runSecret-bearing
ConnectionStrings__IntegrationDbhrsuit_integration connectionIntegrationYes when runSecret-bearing
PLATFORM_DB_*, IDENTITY_DB_*, MONOLITH_DB_*, LEAVE_DB_*, MODULE_DB_*See microservices/.env.exampleCompose PostgreSQL servicesYes for relevant containersPassword values are secrets

JWT, messaging, provisioning, behavior, and frontend

Name/groupDefault/exampleUsed byRequiredSecurity considerations
JWT_ISSUERhr-suit.identityCompose servicesYesMust match all validators
JWT_AUDIENCEhr-suit.servicesCompose servicesYesMust match all validators
JWT_KEYChange-me exampleAll authenticating servicesYesHigh-value secret; minimum length enforced by context
IDENTITY_BOOTSTRAP_PLATFORM_TOKENLocal example tokenPlatform/Identity provisioningRequired for provisioningService credential; rotate and protect
RABBITMQ_DEFAULT_USER, RABBITMQ_DEFAULT_PASSguest / guestCompose RabbitMQ/appsYes in ComposeLocal-only defaults
RABBITMQ_AMQP_PORT, RABBITMQ_MANAGEMENT_PORT5672, 15672ComposeYesDo not expose publicly
RABBITMQ_EXCHANGE_NAMEhr-suit.integration-eventsServicesYes when messaging enabledNot secret
PLATFORM_PROVISIONING_WORKER_ENABLEDfalsePlatformOptionalEnabling causes background mutations
PLATFORM_TENANT_DATABASE_PREFIXhrsuit_tenantPlatformRequired when provisioningValidate generated DB names
Growth__Provisioning__*Source-definedPlatformScenario-dependentService token is secret
Growth__Verification__ExposeCodeInDevelopmentSource-definedPlatformOptionalNever enable outside development
IdentityBootstrap__ExposeActivationTokenInDevelopmentSource-definedIdentityOptionalNever expose outside development
*_APPROVAL_USE_WORKFLOWSource-definedDomain servicesOptionalChanges write/approval behavior
OutboxRelay__Transport, OutboxRelay__MaxRetriesSource-definedOutbox-enabled servicesOptionalTransport changes delivery semantics
VITE_API_BASE_URLhttp://localhost:5000Both portalsYesPublic build-time value; never put secrets in Vite vars
VITE_USE_PLATFORM_SERVICEfalse in .env.example; true in Gateway exampleFrontendOptionalPublic build-time value
VITE_PLATFORM_GATEWAY_BASE_URLhttp://localhost:5000FrontendScenario-dependentPublic value
VITE_SUPER_ADMIN_PORTAL_URLhttp://localhost:5174Client portalOptionalPublic value
VITE_CLIENT_PORTAL_URLhttp://localhost:5173Portal handoffOptionalPublic value
VITE_WORKSPACE_BASE_DOMAINlocalhostSignup/workspace flowOptionalPublic value
VITE_LEGAL_TERMS_URL, VITE_PRIVACY_POLICY_URL, VITE_SIGNUP_SUPPORT_EMAILExample.com valuesPublic signup UIOptionalReplace examples before release

Additional deployment-only variables found in scripts (SECRET_ARN_*, VPC_CONNECTOR_ARN, OBSERVABILITY_CONFIG_ARN, REGION, ACCOUNT_ID, IMAGE_TAG, DOCUMENTS_BUCKET, ROOT_DOMAIN) are not local-development prerequisites. Their local defaults and use are Requires Confirmation.

Ports

ServicePortProtocolHealth URLSwagger URL
Gateway5000HTTPhttp://localhost:5000/healthhttp://localhost:5000/swagger
Identity5010HTTPhttp://localhost:5010/healthhttp://localhost:5010/swagger
Tenant Provisioning5014HTTPhttp://localhost:5014/healthhttp://localhost:5014/swagger
HR Operations5028HTTPhttp://localhost:5028/healthhttp://localhost:5028/swagger
Attendance5041HTTPhttp://localhost:5041/healthhttp://localhost:5041/swagger
Leave5050HTTPhttp://localhost:5050/healthhttp://localhost:5050/swagger
Integration5050HTTPhttp://localhost:5050/healthhttp://localhost:5050/swagger
Notification5074HTTPhttp://localhost:5074/healthhttp://localhost:5074/swagger
Platform5097HTTPhttp://localhost:5097/healthhttp://localhost:5097/swagger
Reporting5116HTTPhttp://localhost:5116/healthhttp://localhost:5116/swagger
Payroll5158HTTPhttp://localhost:5158/healthhttp://localhost:5158/swagger
Document5168HTTPhttp://localhost:5168/healthhttp://localhost:5168/swagger
Client Portal5173HTTPhttp://localhost:5173/Not applicable
Super Admin Portal5174HTTPhttp://localhost:5174/Not applicable
SalarySystem5223HTTPhttp://localhost:5223/healthhttp://localhost:5223/swagger/index.html
Recruitment5241HTTPhttp://localhost:5241/healthhttp://localhost:5241/swagger
Workflow5251HTTPhttp://localhost:5251/healthhttp://localhost:5251/swagger
Employee5267HTTPhttp://localhost:5267/healthhttp://localhost:5267/swagger
Expense5288HTTPhttp://localhost:5288/healthhttp://localhost:5288/swagger
Asset5292HTTPhttp://localhost:5292/healthhttp://localhost:5292/swagger
Performance5296HTTPhttp://localhost:5296/healthhttp://localhost:5296/swagger
Training launch profile5307HTTPhttp://localhost:5307/healthhttp://localhost:5307/swagger
Training Gateway default5321HTTPDepends on overrideDepends on override
PostgreSQL5432PostgreSQLAuthenticated SELECT 1Not applicable
RabbitMQ5672AMQPUse management health checkNot applicable
RabbitMQ Management15672HTTPhttp://localhost:15672/api/health/checks/alarmsNot applicable

Databases

DatabaseOwnerConnection nameMigration project/locationSeederPurposeRequired services
salarydbSalarySystemDefaultConnectionSalarySystem.csproj; exact migrations path Requires ConfirmationApplication startup behavior; exact seeder Requires ConfirmationLegacy and compatibility persistenceSalarySystem
hrsuit_platformPlatformPlatformDbplatform-service/Data/MigrationsDevelopment startup seeding is documented in microservice README; class Requires ConfirmationPlatform/SaaS statePlatform
hrsuit_identityIdentityIdentityDbidentity-service/Data/MigrationsDevelopment startup seeding is documented; class Requires ConfirmationAuthentication/identityIdentity
hrsuit_employeeEmployeeEmployeeDbemployee-service/Infrastructure/MigrationsRequires ConfirmationEmployee/workforceEmployee
hrsuit_attendanceAttendanceAttendanceDbattendance-service/Infrastructure/MigrationsRequires ConfirmationAttendance/time officeAttendance
hrsuit_leaveLeaveLeaveDbleave-service/Infrastructure/MigrationsRequires ConfirmationLeaveLeave
hrsuit_payrollPayrollPayrollDbpayroll-service/Infrastructure/MigrationsRequires ConfirmationPayrollPayroll
hrsuit_workflowWorkflowWorkflowDbworkflow-service/Infrastructure/MigrationsRequires ConfirmationWorkflowWorkflow
hrsuit_documentDocumentDocumentDbdocument-service/Infrastructure/MigrationsRequires ConfirmationDocument metadata/stateDocument
hrsuit_notificationNotificationNotificationDbnotification-service/Infrastructure/MigrationsRequires ConfirmationNotification state/configurationNotification
hrsuit_recruitmentRecruitmentRecruitmentDbrecruitment-service/Infrastructure/MigrationsRequires ConfirmationRecruitmentRecruitment
hrsuit_expenseExpenseExpenseDbexpense-service/Infrastructure/MigrationsRequires ConfirmationExpensesExpense
hrsuit_assetAssetAssetDbasset-service/Infrastructure/MigrationsRequires ConfirmationAssetsAsset
hrsuit_performancePerformancePerformanceDbperformance-service/Infrastructure/MigrationsRequires ConfirmationPerformancePerformance
hrsuit_trainingTrainingTrainingDbtraining-service/Infrastructure/MigrationsRequires ConfirmationTrainingTraining
hrsuit_helpdeskHelpdeskHelpdeskDbhelpdesk-service/Infrastructure/MigrationsRequires ConfirmationHelpdeskHelpdesk
hrsuit_integrationIntegrationIntegrationDbintegration-service/Infrastructure/MigrationsRequires ConfirmationIntegration stateIntegration

Platform also contains Provisioning/Migrations/TenantProvisioningDbContextModelSnapshot.cs. Its physical database placement is configuration-dependent and therefore Requires Confirmation.

Messaging

ItemVerified value
BrokerRabbitMQ
Host / AMQP portlocalhost:5672 for host processes; rabbitmq:5672 in Compose
Managementlocalhost:15672
Virtual host/
Exchangehr-suit.integration-events
PublishersMultiple services reference shared RabbitMQ/outbox configuration; authoritative event-by-event publisher list Requires Confirmation
ConsumersAuthoritative queue binding and consumer list Requires Confirmation
Queue namesRequires Confirmation
Retry/dead-letter topologyRequires Confirmation

Do not create queue names from event class names. Verify broker declarations or consumer registration code before extending this section.

Health Checks

Canonical group

http://localhost:5000/health
http://localhost:5000/health/downstreams # Development only
http://localhost:5097/health
http://localhost:5010/health
http://localhost:5223/health
http://localhost:5267/health
http://localhost:5041/health
http://localhost:5050/health
http://localhost:5158/health
http://localhost:5251/health
http://localhost:5168/health
http://localhost:5074/health
http://localhost:5173/
http://localhost:5174/

Optional service group

http://localhost:5014/health # Tenant Provisioning
http://localhost:5028/health # HR Operations
http://localhost:5116/health # Reporting
http://localhost:5241/health # Recruitment
http://localhost:5288/health # Expense
http://localhost:5292/health # Asset
http://localhost:5296/health # Performance
http://localhost:5307/health # Training launch profile
http://localhost:5311/health # Helpdesk
http://localhost:5050/health # Integration; cannot coexist with Leave on same host port

An HTTP 200 on a service /health proves the registered health checks pass. It does not prove Gateway routing or authorization. Use scripts/smoke-full-local.ps1 after direct health checks.

Smoke Testing

ModuleMinimum servicesVerificationExpected result
IdentityIdentity; add Gateway for route testRun smoke-identity.ps1; query health firstScript exits 0; health is 2xx
PlatformPlatform, Identity for provisioning, GatewayRun appropriate smoke-platform-*.ps1Script exits 0 and assertions pass
EmployeeEmployee, Gateway, IdentityRun smoke-employee.ps1No missing route/5xx; assertions pass
AttendanceAttendance, Gateway, IdentityRun smoke-attendance.ps1Attendance assertions pass
LeaveLeave, Gateway, Identity; Workflow if enabledRun smoke-leave.ps1Leave assertions pass
PayrollPayroll, Attendance, Gateway, Identity/workforceRun smoke-payroll.ps1Payroll assertions pass
WorkflowWorkflow, Gateway, IdentityRun smoke-workflow.ps1Workflow assertions pass
DocumentDocument, Gateway, IdentityRun smoke-documents.ps1; sync scenario uses smoke-document-sync.ps1Document assertions pass
NotificationNotification, Gateway, IdentityRun smoke-notification.ps1Notification assertions pass
RecruitmentRecruitment plus script prerequisitesRun smoke-recruitment.ps1Recruitment assertions pass
ExpenseExpense plus script prerequisitesRun smoke-expense.ps1Expense assertions pass
AssetAsset plus script prerequisitesRun smoke-asset.ps1Asset assertions pass
PerformancePerformance plus script prerequisitesRun smoke-performance.ps1Performance assertions pass
TrainingTraining plus script prerequisitesReconcile port, then run smoke-training.ps1Training assertions pass
HelpdeskHelpdesk plus script prerequisitesRun smoke-helpdesk.ps1Helpdesk assertions pass
IntegrationIntegration, with Leave stopped or port overriddenRun smoke-integration.ps1Integration assertions pass
ReportingReportingCheck /health; dedicated smoke Requires ConfirmationHealth is 2xx; functional expected result Requires Confirmation
Full stackCanonical stackRun scripts/smoke-full-local.ps1All direct health checks and Gateway route probes pass

The full smoke permits 401 or 403 on protected routes without a token but treats 404, 502, 503, connection failures, and timeouts as failures. This verifies route existence without weakening authorization.

Troubleshooting

Port conflict

  1. Run Get-NetTCPConnection -State Listen -LocalPort <port>.
  2. Resolve the owning PID with Get-Process -Id <pid>.
  3. If it is a healthy HR Suit service, reuse it. The canonical launcher already does this.
  4. If it is unrelated, stop it through its normal application/service controls or choose an explicit URL override.
  5. Never terminate an unknown process solely by port number.

Gateway not routing

  1. Verify http://localhost:5000/health.
  2. In Development, verify http://localhost:5000/health/downstreams.
  3. Verify the target service directly at its /health URL.
  4. Check the relevant *_SERVICE_BASE_URL and routing switch.
  5. In containers, use Compose DNS names, not localhost, for service-to-service URLs.
  6. Run scripts/smoke-full-local.ps1 and inspect Gateway logs under run-logs/full-local/services.

Identity unavailable

Verify PostgreSQL, hrsuit_identity, :5010/health, shared JWT_ISSUER, JWT_AUDIENCE, and JWT_KEY. If testing extracted auth, verify AUTH_ROUTING_USE_IDENTITY_AUTH. Do not change signing keys in only one service.

RabbitMQ unavailable

Verify ports 5672 and 15672 and call the management alarm health endpoint with configured credentials. Run microservices/scripts/start-local-rabbitmq.ps1 or start the installed RabbitMQ service. Do not delete broker data or queues as a first-line fix.

Migration failure

  1. Confirm the service uses the intended connection string and database.
  2. Read the complete service log and identify the failing migration.
  3. Use the owning project/context. Platform uses PlatformDbContext; Identity uses IdentityDbContext.
  4. Back up any non-disposable database before update or rollback.
  5. Do not use EnsureCreated to bypass migrations.
  6. Do not delete a database unless the user has explicitly confirmed it is disposable.

Database unavailable

Run the authenticated SELECT 1, verify port 5432, then verify the logical database exists. The launcher can create a missing database but will not repair credentials or destructive schema drift.

Frontend cannot log in

Verify the portal is using http://localhost:5000 in canonical mode, Gateway CORS contains ports 5173 and 5174, Identity is healthy, and the login is attempted in the correct portal. Super Admin accounts belong in the Super Admin portal.

Swagger unavailable

Verify the service is running in Development and /health succeeds. Try /swagger and /swagger/index.html. Swagger middleware is registered in the executable services, but environment gating and exact UI suffix should be read from that service's Program.cs before changing configuration.

Health endpoint failing

Inspect the service stderr/stdout logs. A port listener is not sufficient: the launcher requires a successful HTTP health response. Check its database first, then RabbitMQ and configured downstream clients.

Frontend health succeeds but APIs fail

Vite serving / only proves the UI process is live. Inspect VITE_API_BASE_URL, browser network requests, CORS, Gateway health, and the target downstream health.

Known Port Conflicts

ConflictEvidenceSafe resolution
Leave and Integration both use 5050Both Properties/launchSettings.json files specify http://localhost:5050Keep Leave on canonical 5050; start Integration with dotnet run --project ... --urls http://localhost:<free-port> and update its caller. Recommended exact override: Requires Confirmation
Training launch profile 5307 vs Gateway destination 5321Training launch settings and Gateway appsettings disagreeOverride TRAINING_SERVICE_BASE_URL=http://localhost:5307 or deliberately launch on 5321; select one per session
Port 5040 reserved on accepted dev machinedocs/full-local-stack.md and canonical config use Attendance 5041Keep Attendance on 5041

Performance Recommendations

No repeatable resource benchmark is checked in. The following are topology recommendations, not numerical capacity claims.

ProfileRecommended useServicesEstimated RAMEstimated CPU
MinimalSingle-module implementationInfrastructure plus Identity/Gateway and one domain service; add portal only when neededRequires ConfirmationRequires Confirmation
MediumCross-module featureInfrastructure, Platform, Identity, SalarySystem fallback, affected services, Gateway, one portalRequires ConfirmationRequires Confirmation
FullEnd-to-end and pre-PR smokeCanonical full-local stackRequires ConfirmationRequires Confirmation
RegressionCutover/release verificationServices required by run-v1-regression.ps1Requires ConfirmationRequires Confirmation

Prefer reusing healthy services. Use dotnet run --no-build only after a successful build and when source has not changed. Keep databases and RabbitMQ running between sessions if local policy permits; stop application processes with the orchestrator.

Daily Developer Checklist

Before coding

  • Pull the intended branch and inspect local changes before modifying files.
  • Confirm .NET SDK, Node/npm, PostgreSQL, psql, and RabbitMQ/Docker availability.
  • Select the smallest adequate run profile.
  • Verify environment files contain no production secrets.
  • Run scripts/status-full-local.ps1 if reusing a previous stack.

Before debugging

  • Confirm direct /health for every service in the selected profile.
  • Confirm Gateway /health/downstreams when using Gateway.
  • Confirm the portal's VITE_API_BASE_URL.
  • Confirm routing switches match the service under test.
  • Record relevant stdout/stderr and reproduce with the smallest smoke script.

Before creating a PR

  • Build changed .NET projects and affected portal(s).
  • Run unit tests for affected projects.
  • Run the module smoke test and any cutover/parity script relevant to routing changes.
  • Run scripts/smoke-full-local.ps1 for cross-module or Gateway changes.
  • Update this runbook when ports, dependencies, routes, databases, health checks, commands, or profiles changed.
  • Confirm no real secrets, local logs, or generated build output are included unintentionally.

Before merge

  • Resolve review feedback and rerun affected checks.
  • Confirm migration ownership and rollback notes for schema changes.
  • Confirm routing defaults are intentional.
  • Confirm new services are represented in the canonical config or explicitly marked non-canonical.
  • Confirm this page contains no guessed values.

AI Assistant Notes

Future AI assistants maintaining this page must follow these rules:

  1. Never invent a service, endpoint, route, port, queue, exchange, database, variable, command, dependency, owner, resource estimate, or startup relationship.
  2. Verify runtime facts from source. Prefer launch settings, Program.cs, appsettings, Compose, project files, scripts, and migration snapshots over prose documentation.
  3. Prefer an extracted service over a legacy implementation only when routing/cutover configuration proves ownership for the described profile.
  4. Preserve the distinction between “project exists” and “canonical launcher starts project.”
  5. Write Requires Confirmation for any field that cannot be verified.
  6. Never expose secrets from .env, user-secret stores, deployment configuration, or logs. Document variable names and safe examples only.
  7. Treat current working-tree changes as user-owned. Do not revert unrelated edits.
  8. When a routing switch changes, update the service inventory, feature map, relevant profile, smoke guidance, and troubleshooting section together.
  9. When a port changes, search launch settings, appsettings, scripts, Compose, UI env examples, and documentation for drift.
  10. Do not claim a smoke test passed unless it was executed successfully in the current environment.

Future Maintenance Rules

Whenever a service is added, removed, renamed, extracted, merged, or assigned a new route, update all of the following in the same change:

  • Overview architecture diagram.
  • Infrastructure requirements.
  • Frontend dependency descriptions.
  • Backend inventory and canonical status.
  • Startup order and launcher configuration.
  • Every affected run profile.
  • Feature-to-service matrix.
  • Module testing guide.
  • Environment-variable inventory.
  • Port table and known conflicts.
  • Database ownership, connection name, migrations, and seeding.
  • Messaging publishers, consumers, exchanges, and queues when verified.
  • Direct and Gateway health checks.
  • Smoke-test matrix and troubleshooting instructions.

Verification procedure for maintenance

  1. List solution projects with dotnet sln microservices/HrSuit.Microservices.sln list.
  2. Enumerate microservices/src/*/Properties/launchSettings.json.
  3. Enumerate appsettings*.json, Compose variables, and runtime environment-variable reads.
  4. Inspect every executable Program.cs for health, Swagger, controllers/minimal routes, clients, messaging, migrations, and seeders.
  5. Inspect Gateway destinations, transforms, route switches, and downstream checks.
  6. Inspect scripts/full-local-stack.config.psd1 and all start/status/stop/smoke scripts.
  7. Enumerate EF model snapshots and context registration.
  8. Inspect both portal Vite configurations, package scripts, and .env*.example files.
  9. Search for duplicate ports.
  10. Build the documentation site and fix broken Markdown, Mermaid, or links.

Source precedence

When sources disagree, use this order and record the discrepancy instead of hiding it:

  1. Executable runtime code and explicit command-line arguments.
  2. Canonical launcher configuration.
  3. Environment-specific appsettings and launch profiles.
  4. Docker Compose and example environment files for container mode.
  5. Smoke/status scripts.
  6. Existing prose documentation.

Verification record

This revision was derived from the following checked-in source categories: the root and microservice solutions, all service launch profiles, service appsettings, Gateway configuration, microservices/docker-compose.yml, microservices/.env.example, scripts/full-local-stack.config.psd1, canonical start/status/stop/smoke scripts, frontend package.json and example environment files, executable Program.cs health/Swagger registration, EF Core model snapshots, and the available smoke/cutover script inventory.

The requested rendered-page count cannot be verified from Markdown alone because it depends on the renderer, theme, page size, and print settings. Content completeness is governed by verified source coverage, not padding. Rendered length: Requires Confirmation.