Skip to content

Services

Notifyzr is a set of small services behind one Traefik proxy. Each has its own subdomain of DOMAIN.

URLServiceWhat it is
api.<domain>apiPublic REST API. API-key auth, rate limited.
app.<domain>appDashboard SPA
app.<domain>/apiapp-apiDashboard auth (JWT) and organization/key management. The only issuer of sessions.
admin.<domain>adminSite-admin SPA
admin.<domain>/apiadmin-apiSite-admin API — users, organizations, plans, announcements
docs.<domain>docsThis documentation
mcp.<domain>mcp-serverMCP server for AI assistants
unsubscribe.<domain>unsubscribeHosted opt-out page
<domain>landingMarketing site
workerConsumes every queue: sending, webhooks, automations, fan-out
toolboxCron-scheduled maintenance (key expiry, quota warnings, message pruning)

Infrastructure

URLWhat it is
status.<domain>Public status page (Gatus). No auth.
grafana.<domain>Dashboards, pre-provisioned
prometheus.<domain>Metrics
pgadmin.<domain>Database admin (development)
mailpit.<domain>Captured mail (development)
:15672RabbitMQ management UI
:8090Traefik dashboard

Datastores

  • PostgreSQL — everything persistent. Nearly every table is organization-scoped.
  • RabbitMQ — jobs, delayed sends, events, dead letters.
  • Redis — API rate limiting, and MCP session state.

Scaling

Services are stateless and can be replicated:

bash
docker compose up --scale api=3 --scale worker=2

Prometheus discovers replicas through Docker DNS, so each new container is scraped automatically with its own instance label — metrics are stored per instance and aggregated at query time, so scaling never double-counts.

Observability

Every PHP service exposes Prometheus metrics at /metrics. That endpoint is blocked at the Traefik edge and scraped container-direct on the Docker network, so it is never reachable from outside.

Released under the Apache 2.0 License.