Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# .env.example — Copy to .env and customise for local development
# Used by: docker compose -f docker-compose.development.yml up -d

# MongoDB
MONGO_USER=admin
MONGO_PASSWORD=securepassword123
MONGO_DATABASE=cloudhealthoffice
MONGO_PORT=27017

# Redis
REDIS_PORT=6379
34 changes: 23 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
<div align="center">
# Cloud Health Office

![Cloud Health Office](docs/images/logo-cloudhealthoffice-sentinel-primary.svg)

# Cloud Health Office

**The payer platform that starts where your core admin stops — and grows from there.**

CMS-0057-F compliance, real-time EDI, FHIR R4 APIs, and claims adjudication engines.
Expand Down Expand Up @@ -35,12 +33,8 @@ Start with compliance. Expand into claims. Move at your own pace.

## Platform

<div align="center">

![Platform Overview](src/site/graphics/platform-overview.svg)

</div>

|Component |Count |Details |
|---------------------|---------|-----------------------------------------------------------------------------------------------------------|
|Microservices |23 |C# / .NET 8, multi-tenant, Cosmos + MongoDB dual-repo |
Expand All @@ -56,6 +50,8 @@ Start with compliance. Expand into claims. Move at your own pace.

### Services

![Services Overview](docs/images/services-overview.svg)

|Service |Purpose |X12 Transactions|
|-------------------------|---------------------------------------------|----------------|
|claims-service |Claim lifecycle and adjudication |837P/I/D, 835 |
Expand Down Expand Up @@ -83,6 +79,8 @@ Start with compliance. Expand into claims. Move at your own pace.

### Calculation Engines

![Calculation Engines](docs/images/calculation-engines.svg)

|Engine |Purpose |
|--------------------|------------------------------------------------------------------------------------------------------------|
|BenefitEngine |Cost-sharing calculation (deductible, copay, coinsurance), accumulator tracking, service category resolution|
Expand All @@ -103,12 +101,8 @@ The adjudication pipeline processes each claim through eight stages with sub-sec

### CMS-0057-F Compliance

<div align="center">

![CMS-0057-F Compliance](src/site/graphics/cms-0057f-compliance.svg)

</div>

Cloud Health Office implements the CMS Interoperability and Prior Authorization Final Rule ahead of the January 2027 deadline.

|Requirement |Implementation |
Expand Down Expand Up @@ -174,6 +168,24 @@ docker-compose up -d
curl http://localhost:5000/health
```

### Full Development Stack

To bring up the complete backend (all 11 services + MongoDB + Redis + seed data):

```bash
# Start everything
docker compose -f docker-compose.development.yml up -d

# Wait for health checks to pass
docker compose -f docker-compose.development.yml ps

# Verify seed data loaded
docker compose -f docker-compose.development.yml exec mongodb \
mongosh cloudhealthoffice --eval 'db.Claims.countDocuments()'
```

Services are available at `http://localhost:5001` through `5011` (Swagger UI at `/swagger` on each). See [docker-compose.development.yml](docker-compose.development.yml) for the full port map and configuration. Copy `.env.example` to `.env` to customise credentials.

Or deploy to Azure:

[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Faurelianware%2Fcloudhealthoffice%2Fmain%2Finfrastructure%2Fazure%2Fmain.json)
Expand Down
254 changes: 254 additions & 0 deletions docker-compose.development.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,254 @@
# docker-compose.development.yml
# Complete CHO backend stack for local development and testing.
# NOT for production — this is what a developer runs locally to have
# real services behind the portal.
#
# Usage:
# docker compose -f docker-compose.development.yml up -d
# docker compose -f docker-compose.development.yml ps # check health
# docker compose -f docker-compose.development.yml logs -f # tail all logs
#
# Service URLs:
# Claims service: http://localhost:5001 (Swagger: /swagger)
# Benefit-plan service: http://localhost:5002
# Member service: http://localhost:5003
# Provider service: http://localhost:5004
# Authorization service: http://localhost:5005
# Payment service: http://localhost:5006
# Eligibility service: http://localhost:5007
# Tenant service: http://localhost:5008
# Coverage service: http://localhost:5009
# Enrollment-import service: http://localhost:5010
# FHIR service: http://localhost:5011
# MongoDB: localhost:27017
# Redis: localhost:6379

x-mongo-env: &mongo-env
MongoDb__ConnectionString: mongodb://${MONGO_USER:-admin}:${MONGO_PASSWORD:-securepassword123}@mongodb:27017/?authSource=admin
MongoDb__DatabaseName: ${MONGO_DATABASE:-cloudhealthoffice}

x-common-env: &common-env
ASPNETCORE_ENVIRONMENT: Development
<<: *mongo-env

x-healthcheck: &service-healthcheck
test: ["CMD-SHELL", "curl -f http://localhost:8080/health/live || exit 1"]
interval: 10s
timeout: 5s
retries: 10
start_period: 15s

services:
# ---------------------------------------------------------------------------
# Infrastructure
# ---------------------------------------------------------------------------
mongodb:
image: mongo:7
ports:
- "${MONGO_PORT:-27017}:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER:-admin}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD:-securepassword123}
volumes:
- mongo-data:/data/db
healthcheck:
test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
interval: 5s
timeout: 5s
retries: 10

redis:
image: redis:7-alpine
ports:
- "${REDIS_PORT:-6379}:6379"
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 10

# ---------------------------------------------------------------------------
# Core Services
# ---------------------------------------------------------------------------
claims-service:
build:
context: .
dockerfile: src/services/claims-service/Dockerfile
ports:
- "5001:8080"
environment:
<<: *common-env
Redis__ConnectionString: redis:6379
depends_on:
mongodb:
condition: service_healthy
redis:
condition: service_healthy
healthcheck: *service-healthcheck

benefit-plan-service:
build:
context: .
dockerfile: src/services/benefit-plan-service/Dockerfile
ports:
- "5002:8080"
environment:
<<: *common-env
Redis__ConnectionString: redis:6379
Services__ClaimsServiceUrl: http://claims-service:8080
depends_on:
mongodb:
condition: service_healthy
redis:
condition: service_healthy
claims-service:
condition: service_healthy
healthcheck: *service-healthcheck

member-service:
build:
context: .
dockerfile: src/services/member-service/Dockerfile
ports:
- "5003:8080"
environment:
<<: *common-env
depends_on:
mongodb:
condition: service_healthy
healthcheck: *service-healthcheck

provider-service:
build:
context: .
dockerfile: src/services/provider-service/Dockerfile
ports:
- "5004:8080"
environment:
<<: *common-env
depends_on:
mongodb:
condition: service_healthy
healthcheck: *service-healthcheck

authorization-service:
build:
context: .
dockerfile: src/services/authorization-service/Dockerfile
ports:
- "5005:8080"
environment:
<<: *common-env
depends_on:
mongodb:
condition: service_healthy
healthcheck: *service-healthcheck

payment-service:
build:
context: .
dockerfile: src/services/payment-service/Dockerfile
ports:
- "5006:8080"
environment:
<<: *common-env
ClaimsService__BaseUrl: http://claims-service:8080
depends_on:
mongodb:
condition: service_healthy
claims-service:
condition: service_healthy
healthcheck: *service-healthcheck

eligibility-service:
build:
context: .
dockerfile: src/services/eligibility-service/Dockerfile
ports:
- "5007:8080"
environment:
<<: *common-env
depends_on:
mongodb:
condition: service_healthy
healthcheck: *service-healthcheck

tenant-service:
build:
context: .
dockerfile: src/services/tenant-service/Dockerfile
ports:
- "5008:8080"
environment:
<<: *common-env
depends_on:
mongodb:
condition: service_healthy
healthcheck: *service-healthcheck

coverage-service:
build:
context: .
dockerfile: src/services/coverage-service/Dockerfile
ports:
- "5009:8080"
environment:
<<: *common-env
depends_on:
mongodb:
condition: service_healthy
healthcheck: *service-healthcheck

enrollment-import-service:
build:
context: .
dockerfile: src/services/enrollment-import-service/Dockerfile
ports:
- "5010:8080"
environment:
<<: *common-env
depends_on:
mongodb:
condition: service_healthy
healthcheck: *service-healthcheck

fhir-service:
build:
context: .
dockerfile: src/services/fhir-service/Dockerfile
ports:
- "5011:8080"
environment:
<<: *common-env
Services__MemberServiceUrl: http://member-service:8080
Services__ClaimsServiceUrl: http://claims-service:8080
Services__ProviderServiceUrl: http://provider-service:8080
depends_on:
mongodb:
condition: service_healthy
member-service:
condition: service_healthy
claims-service:
condition: service_healthy
provider-service:
condition: service_healthy
healthcheck: *service-healthcheck

# ---------------------------------------------------------------------------
# Seed Data (runs once, then exits)
# ---------------------------------------------------------------------------
seed-data:
image: mongo:7
depends_on:
mongodb:
condition: service_healthy
volumes:
- ./scripts/setup:/scripts:ro
command: >
mongosh mongodb://${MONGO_USER:-admin}:${MONGO_PASSWORD:-securepassword123}@mongodb:27017/${MONGO_DATABASE:-cloudhealthoffice}?authSource=admin
/scripts/seed-demo-data.js
--eval 'var tenantId="dev-tenant", groupNumber="GRP-DEV-2026"'
restart: "no"

volumes:
mongo-data:
Loading
Loading