# Compass NHS — Configuration and Environment

## Rules for Agents

1. Never write a credential, token, cookie or session value into a document.
2. Keep every secret in `environment.d/school-service.env`. The file is gitignored.
3. Copy the shape from `environment.d/school-service.env.example`. Never copy a value.
4. Docker Compose interpolates `$VAR` inside `env_file`. Escape each bcrypt `$` as `$$`.

## Paths

| Item | Path |
| :--- | :--- |
| Real env file | `environment.d/school-service.env` |
| Env example | `environment.d/school-service.env.example` |
| Config code | `internal/config/` |
| SQLite schema | `internal/store/migrations/` |
| Service binary | `/app/school` inside the container |
| Database | `/data/school.db` inside the container |
| Docker volume | `compass-teams-nhs-data` |

## Ports

| Port | System | Host |
| :--- | :--- | :--- |
| 8792 | This service | `.13` |
| 8210 | Apprise API | `.35` |
| 8788 | Hub inbound API | `.13` |
| 8123 | Home Assistant | `.30` |
| 5678 | n8n | `.13` |

Caddy on `.35` publishes `school.lab.audasmedia.com.au` and proxies to
`192.168.20.13:8792`.

## Variables

### Service

| Variable | Meaning |
| :--- | :--- |
| `SCHOOL_ADDR` | Listen address. Default `:8792`. |
| `SCHOOL_DB_PATH` | SQLite path. Container value `/data/school.db`. |
| `SCHOOL_SESSION_SECRET` | Signs the session cookie. Secret. Minimum 16 characters. |
| `SCHOOL_ADMIN_USERNAME` | The single dashboard login. |
| `SCHOOL_ADMIN_PASSWORD_HASH` | Bcrypt hash. Prefer this over the plaintext. |
| `SCHOOL_ADMIN_PASSWORD` | Plaintext fallback. |
| `SCHOOL_COOKIE_SECURE` | `true` behind HTTPS. |
| `SCHOOL_SESSION_TTL` | Session life. Default `12h`. |
| `SCHOOL_TIMEZONE` | Family timezone for due dates. |
| `SCHOOL_LOG_LEVEL` | Log level. |
| `SCHOOL_APP_ENV` | Environment name. |

### Home Assistant Calendar

| Variable | Meaning |
| :--- | :--- |
| `SCHOOL_HA_URL` | Home Assistant base URL. |
| `SCHOOL_HA_TOKEN` | Long-lived access token. Secret. |
| `SCHOOL_HA_CALENDAR_ENTITY` | Calendar entity. Default `calendar.school`. |
| `SCHOOL_HA_INSECURE` | Skips TLS verification. Use only for the internal `.lab` URL. |
| `SCHOOL_HA_TIMEOUT` | Per-request timeout. Default `20s`. |

### Apprise

| Variable | Meaning |
| :--- | :--- |
| `SCHOOL_APPRISE_URL` | Apprise API base. Default `http://192.168.20.35:8210`. |
| `SCHOOL_APPRISE_KEY` | Stored configuration key. Secret. |
| `SCHOOL_APPRISE_TOKEN` | Optional bearer token. |
| `SCHOOL_APPRISE_TIMEOUT` | Per-request timeout. Default `15s`. |
| `SCHOOL_APPRISE_CHANNELS` | `email,whatsapp`. |
| `SCHOOL_APPRISE_TAGS` | Recipients as `Name=tag-base`. |
| `SCHOOL_APPRISE_PARENTS` | Who receives the combined brief. `Jo,Sam`. |
| `SCHOOL_NOTIFY_TOKEN` | Bearer token for `POST /notify/morning`. Secret. |

### Hub API

| Variable | Meaning |
| :--- | :--- |
| `SCHOOL_HUB_TOKEN` | Shared bearer token. Secret. Empty turns the Hub endpoints off with `503`. |

The Hub holds the same token as `HUB_PROJECT_COMPASS_NHS_TOKEN`. The Hub reaches
this service through `HUB_PROJECTS=compass_nhs=http://192.168.20.13:8792`.

## Secrets Outside This Repo

| Secret | Location |
| :--- | :--- |
| Apprise destinations (address, number, SMTP) | Apprise stored configuration on `.35` |
| Hub token copy | `~/.config/environment.d/10-secrets.conf` on `.13` |
| Compass account and password | Paperclip secret or the env file |
| n8n trigger SSH key | `/home/sam/.ssh/id_ed25519_school_scan` |

The Apprise destinations stay outside this repo on purpose. This service names a
tag such as `harry_email` only.

## Environment Access for an Agent

The service does not scan the school. n8n runs `scripts/morning-brief.sh`
through a restricted SSH key. The key has a forced command and `restrict`. It
cannot open a shell.
