871 B
871 B
ADR 0001: Monolith over microservices
- Status: accepted
- Date: 2026-09
Context
The messenger serves a single family (tens of users) on a home-lab mini PC with ~8 GB RAM. A microservice split would add operational overhead (networking, service discovery, per-service containers) with zero benefit at this scale.
Decision
Build a single Go process exposing REST, WebSocket, media serving and static
files, with PostgreSQL as the only external state. Internal packages
(store, auth, realtime, api, media) are cleanly separated with
explicit interfaces, so extraction later is mechanical.
Consequences
- One container, trivial
docker compose up. - In-process WebSocket hub gives O(1) presence checks for push decisions.
- If the service ever needs horizontal scaling,
realtimeandstorealready hide their implementations behind interfaces.