Plataforma de reservas de imóveis (estilo Airbnb) em microsserviços, construída como projeto de estudo/portfólio para explorar, com profundidade real e não só de nome: DDD tático, prevenção de double-booking sob concorrência, e autenticação JWT distribuída sem gateway central.
O projeto está em andamento — o núcleo de disponibilidade e reservas é a parte mais madura; outras áreas (busca, pricing, reviews) ainda não existem. Veja Estado do projeto antes de assumir que algo está pronto.
A pergunta que ele tenta responder não é "dá pra fazer um clone de Airbnb", mas "onde complexidade de domínio real justifica DDD, e onde isso é só cerimônia". As respostas para essa pergunta, com as alternativas descartadas em cada caso, estão documentadas como ADRs — não como opinião solta.
docs/c4-arquitetura.md — diagramas C4 de Contexto e Container
(quem usa o sistema, como ele se decompõe em serviços/bancos de dados reais).docs/deep-dive-disponibilidade.md — como o sistema
evita reservar o mesmo imóvel duas vezes, incluindo o fluxo dinâmico de criação de reserva.apps/property-management/adr/ — modelagem de
disponibilidade (intervalos, HOLD, janela de 12 meses, constraint transacional), guards de
autorização por rota, e por que DDD tático é aplicado seletivamente.apps/users-management/adr/ — estratégia de autenticação
JWT (RS256 + JWKS, refresh token rotation).Monorepo gerenciado com Turborepo + npm workspaces.
Cada serviço em apps/ segue Clean Architecture (domain/ → application/ →
infrastructure/), mas com profundidades de modelagem diferentes — isso é deliberado, não
inconsistência. Ver
apps/property-management/adr/ADR-0007.
users-management | property-management | |
|---|---|---|
| HTTP | Fastify 5 | Fastify 5 |
| ORM | Drizzle ORM | Drizzle ORM |
| Banco | PostgreSQL 16 (users_db) | PostgreSQL 16 (property_db) |
| Auth | jose (JWT RS256) + @node-rs/argon2 (hash de senha) | valida JWT via JWKS remoto |
| OAuth social | arctic (Google, Facebook) | — |
| Cache/estado | Redis (ioredis) — refresh tokens, estado OAuth, rate limit | — |
Infra: Nginx como reverse proxy (apps/barrier-wall), Docker Compose para os bancos e Redis,
Turborepo para orquestrar build/test/lint no monorepo.
Pré-requisitos: Node ≥ 18, Docker.
npm run dev roda todos os serviços via Turborepo (cada um com tsx --watch). O Nginx
(apps/barrier-wall/nginx.conf) espera os serviços em hostnames de container
(ms-booking-instance-*, ms-auth-instance-*); para rodar tudo atrás do proxy é preciso
containerizar os apps ou ajustar o upstream do Nginx para localhost — hoje o
docker-compose.yml só sobe os bancos, o Redis e o Nginx, não os serviços Node (ver
Estado do projeto).
Comandos úteis (rodam em todos os workspaces via Turborepo):
docs/deep-dive-disponibilidade.md.
Este documento também é honesto sobre o que ainda é lacuna de infraestrutura, não só o que
já funciona.apps/users-management/adr/ADR-0001.test_<hex>) e o descarta ao final, permitindo runs paralelos sem
conflito. Detalhado em REPORT-schema-isolation.md.Em andamento. Pendências conhecidas:
booking-module (reservas) tem domínio e casos de uso implementados e testados, mas
ainda não tem camada HTTP — não é possível criar uma reserva via API hoje.PENDENCIAS-INFRA.md.docker-compose.yml sobe bancos, Redis e Nginx, mas não os serviços Node — eles rodam via
npm run dev fora de container por enquanto.issues.md.| Docs de API | Scalar (@scalar/fastify-api-reference) | Scalar |
| Testes | Vitest (unit + e2e com schema isolado por run) | Vitest (unit + e2e) |
apps/
barrier-wall/ Configuração do Nginx (reverse proxy, roteamento por path)
property-management/ Propriedades, listings, disponibilidade e reservas
users-management/ Autenticação, perfis de Guest/Host/Admin
packages/
core/ Building blocks compartilhados (Result, Class, EventBus, geradores de ID, logging)
shared/ Contratos/DTOs/eventos compartilhados entre serviços
system-settings-manager/ Configuração dinâmica persistida (settings com cache + refresh)# 1. Instalar dependências do monorepo
npm install
# 2. Subir Postgres (x2) e Redis
docker compose up -d postgres-property-management postgres-users-management redis
# 3. Criar apps/property-management/.env e apps/users-management/.env
# Não há .env.example no repo — a lista de variáveis exigidas está no schema zod
# de cada serviço: apps/<serviço>/src/config/env/index.ts
# property-management: NODE_ENV, PORT, AUTH_JWKS_URL, DATABASE_URL
# users-management: NODE_ENV, PORT, JWT_PRIVATE_KEY, JWT_PUBLIC_KEY, DATABASE_URL, REDIS_URL
# users-management exige um par de chaves RSA em formato PEM (JWT RS256, PKCS8/SPKI):
openssl genrsa -out /tmp/jwt-private.pem 2048
openssl rsa -in /tmp/jwt-private.pem -pubout -out /tmp/jwt-public.pem
# cole o conteúdo dos arquivos em JWT_PRIVATE_KEY / JWT_PUBLIC_KEY no .env
# 4. Rodar as migrations de cada serviço (drizzle-kit)
# 5. Subir os serviços em modo dev
npm run devnpm run test # testes unitários
npm run test:e2e # testes de integração (schema Postgres isolado por run — ver REPORT-schema-isolation.md)
npm run lint
npm run check-types