Healthcare appointment platform for Ethiopia as a real DevOps learning project.
# Hakimi / ሀኪሜ
Hakimi is a Practo-like healthcare appointment platform for Ethiopia.
This repository starts as a monorepo foundation for the web app, API, shared types, and future DevOps work.
## Workspace Layout
- `apps/web` - React + Vite frontend
- `apps/api` - Node.js + Express API
- `packages/shared` - shared TypeScript types and contracts
- `docs` - project documentation
- `infrastructure` - empty structure for future DevOps configuration
- `.github/workflows` - reserved for future CI/CD
- `compose.yaml` - production-shaped local container stack for the API, worker, migrations, and PostgreSQL
- `apps/api/database/migrations/up` - ordered SQL migration files
- `apps/api/database/migrations/down` - matching rollback SQL files
## Prerequisites
- Node.js 24+
- npm 11+
- Docker Desktop or Docker Engine with Compose v2
## Setup
1. Install dependencies:
```bash
npm install
```
2. Prepare local environment variables:
- Review `.env.example` for development-only placeholders.
- If `.env` already exists, keep it and add only missing values.
- If `.env` does not exist, create it from `.env.example`.
The API expects:
- `PORT`
- `NODE_ENV`
- `POSTGRES_DB`
- `POSTGRES_USER`
- `POSTGRES_PASSWORD`
- `DATABASE_URL`
- `LOG_LEVEL`
- `OIDC_ISSUER`
- `OIDC_AUDIENCE`
- `OIDC_JWKS_URI`
- `OIDC_ALLOWED_ALGORITHMS`
- `OIDC_REQUIRED_ACR_VALUES`
- `OIDC_CLOCK_TOLERANCE_SECONDS`
- `REMINDER_WORKER_ID`
- `REMINDER_POLL_INTERVAL_MS`
- `REMINDER_BATCH_SIZE`
- `REMINDER_LEASE_MS`
- `REMINDER_MAX_ATTEMPTS`
- `REMINDER_BACKOFF_BASE_MS`
- `REMINDER_BACKOFF_CAP_MS`
3. Start PostgreSQL for local development:
```bash
npm run db:up
```
4. Check container health:
```bash
npm run db:status
```
5. Start the development servers:
```bash
npm run dev
```
## Containerized Deployment
The repository now includes a production-shaped container stack built from one reusable application image.
Build the image directly:
```bash
docker build -t hakimi-healthcare-platform:local .
```
The reu …