Architecture notes — 2025
Internal writing, published here for candidates and partners who ask how things fit together.
Where we landed
- Edge: Nginx terminates TLS and routes by hostname.
api.acmepay.duckdns.org→ API pods;www→ the React build on object storage. - API: one FastAPI app today (
acmepay/backend), being pulled apart into payments, payouts and reporting services. - Data: PostgreSQL 15 primary + read replica. Redis for idempotency keys and rate limits.
- GraphQL: a thin read-only resolver over the same models, behind
/graphql. - Runtime: Kubernetes in
eu-west-1. Images built in CI, pushed toregistry.acmepay.duckdns.org, deployed toacmepay-prod/acmepay-stagingnamespaces.
Environments
| Production | api.acmepay.duckdns.org, www.acmepay.duckdns.org |
|---|---|
| Staging | staging.acmepay.duckdns.org, staging-api.acmepay.duckdns.org — same images, seeded data |
| Sandbox | sandbox.acmepay.duckdns.org — customer-facing test environment |
Still on the list
- Re-enable basic auth on staging after the load-test window.
- Finish removing
X-AcmePay-Keyhandling once v1 is gone. - Give staging its own certificate and stop serving it from the production edge under
/staging/. - Decommission
apigw.acmepay.duckdns.organd the oldlegacy.acmepay.duckdns.orgdashboard host.