Tech Handbook Null Yard

Architektura małych aplikacji webowych

Dla małych aplikacji najważniejsza jest przewidywalność, nie liczba technologii. Prosty monolit z jedną bazą i jasnym deploymentem zwykle daje mniej punktów awarii i łatwiejszą diagnostykę niż przedwczesne mikroserwisy.

Powiązane tematy: nginx i reverse proxy, SQL i PostgreSQL, Docker, API i integracje systemów oraz Testowanie oprogramowania.

1. Cel

Mały projekt nie potrzebuje mikroserwisów, Kubernetesa i pięciu baz.

Najczęściej wystarczy:

Browser
  ↓
nginx
  ↓
backend
  ↓
PostgreSQL

2. Monolit

Monolit to jedna aplikacja zawierająca większość logiki.

Zalety: - prosty deployment, - mniej infrastruktury, - prostszy debugging, - łatwiejsze transakcje.

Dla małych i średnich projektów często jest najlepszym wyborem.

3. Frontend

Może być: - server-rendered HTML, - statyczne HTML/CSS/JS, - SPA React/Vue.

Nie wybieraj SPA automatycznie.

4. Backend

Odpowiada za: - logikę, - auth, - API, - bazę, - integracje, - walidację.

5. Reverse proxy

nginx: - TLS, - routing domen, - static, - proxy do backendu.

6. Baza

PostgreSQL: - dane trwałe, - constraints, - transakcje, - indeksy.

7. Cache

Redis przydaje się dopiero, gdy masz konkretny powód: - cache, - sessions, - queues, - rate limiting.

Nie dodawaj go „bo wypada”.

8. Config

Kod:

repo

Konfiguracja środowiska:

env / config

Sekrety:

secret store / env

Nigdy nie mieszaj ich bez potrzeby.

9. Przykład struktury Go

cmd/
internal/
  http/
  service/
  repository/
  config/
migrations/
web/
Dockerfile
README.md

10. Layers

Praktyczny podział:

handler
 ↓
service
 ↓
repository
 ↓
database

Nie musisz robić 12 warstw.

11. Request flow

GET /orders/42
  ↓
nginx
  ↓
router
  ↓
handler
  ↓
service
  ↓
repository
  ↓
PostgreSQL
  ↓
JSON/HTML response

12. Background jobs

Jeśli coś trwa długo:

request
 ↓
enqueue
 ↓
worker

Ale nie dodawaj kolejki, jeśli zwykły cron wystarcza.

13. Cron / scheduler

Dobre do: - raportów, - synchronizacji, - okresowych kontroli, - cleanup.

14. External API

Oddziel logikę integracji:

internal/integrations/openrouter
internal/integrations/github

Dzięki temu łatwiej testować i zmieniać dostawcę.

15. Error handling

Rozróżniaj: - błąd użytkownika, - brak zasobu, - konflikt, - błąd systemowy.

Nie zwracaj wszystkiego jako HTTP 500.

16. Logging

Logi powinny zawierać: - timestamp, - level, - event, - request ID, - istotny kontekst.

17. Request ID

Przydatny do śledzenia jednej operacji przez kilka warstw.

request_id=abc123

18. Deployment

Prosty wariant:

GitHub
  ↓
CI
  ↓
Docker image
  ↓
VPS
  ↓
docker compose
  ↓
nginx

19. Backup

Backupuj: - bazę, - uploady, - ewentualnie konfigurację.

Kod masz w Git.

20. Skalowanie

Najpierw mierz.

Typowa kolejność: 1. lepsze zapytania, 2. indeksy, 3. cache tam, gdzie ma sens, 4. więcej zasobów, 5. dopiero później bardziej złożona architektura.

21. Mikroserwisy

Mają sens, gdy istnieją realne powody: - niezależne zespoły, - osobne skalowanie, - niezależny cykl wdrożeń, - wyraźne granice domen.

Nie są automatycznym „wyższym poziomem”.

22. MVP

Dobre MVP: - jedna aplikacja, - jedna baza, - prosty deployment, - monitoring, - backup.

23. Co trzeba umieć

  • rozrysować request flow,
  • dobrać prostą architekturę,
  • oddzielić config od kodu,
  • rozumieć rolę nginx/backend/db,
  • unikać overengineeringu,
  • zaplanować deployment i backup.

Źródła i dalsza dokumentacja

  • The Twelve-Factor App: https://12factor.net/
  • PostgreSQL documentation: https://www.postgresql.org/docs/current/
  • nginx documentation: https://nginx.org/en/docs/