Operations
Arquitetura de deployment
Diagramas dos serviços, fluxos de dados e jobs em produção.
Visão alto-nível de como tudo se conecta quando o Geek Social roda em produção (VPS homelab).
Containers (alto-nível)
Detalhamento por serviço
Nginx (proxy reverso)
- Único entrypoint público (portas 80/443)
- TLS termination via Let's Encrypt (Certbot)
- Roteamento por host — sub-domínios pra cada serviço
- Rate limiting básico (anti DoS)
- Compressão gzip/brotli
geek-social-frontend (SPA)
- Build estático (Vite) servido por Nginx interno na porta 8080
entrypoint.shinjetawindow.APP_CONFIG = { apiUrl: ... }em runtime- PWA: service worker cacheado pelo client
- Sem estado server-side
geek-social-api (backend)
- Fastify single process
- 1 container = 1 instância (sem horizontal scaling ainda)
- Connections: pool de 10 com Postgres
- Socket.IO no mesmo HTTP server (sem sticky sessions necessárias com 1 instância)
- pg-boss workers no mesmo process (Steam imports)
geek-social-docs (este portal)
- Next.js 16 com
output: 'standalone' - Static generation (SSG) — 600+ páginas pré-renderizadas
- Sem DB, sem state — só serve HTML/JS estático
PostgreSQL 17
- Single container, single instance
- Volume persistente (
pg_data) montado fora do container - Backups: cron diário com
pg_dump(ver DB Operations) - Migrations aplicadas no boot do API
MinIO
- S3-compatible storage
- Volume persistente (
minio_data) - Bucket
geek-social-mediacom acesso público (URLs diretas no frontend) - Backups: mirror periódico pra outro storage
Fluxo de uma request HTTP
Fluxo de WebSocket
Fluxo de import Steam (jobs)
Volumes persistentes
| Volume | Conteúdo | Backup |
|---|---|---|
postgres_data | Banco completo (todos databases) | pg_dump diário cron |
minio_data | Mídia de users (avatares, posts, chat) | Mirror periódico |
nginx_certs | Certificados Let's Encrypt | Renovação automática (Certbot) |
docs_static | Build estático do docs (opcional) | Re-build qualquer hora |
Variáveis de ambiente sensíveis
Em prod, nunca em arquivo commitado:
| Variável | Valor | Uso |
|---|---|---|
JWT_SECRET | random 64 hex | Sign de access tokens |
GOOGLE_CLIENT_SECRET | do Google Cloud | OAuth |
VAPID_PRIVATE_KEY | random | Web Push |
AWS_SECRET_ACCESS_KEY | minioadmin (dev) ou IAM (prod) | S3 access |
DATABASE_URL | conn string | Postgres |
STORAGE_PUBLIC_URL | CDN url | URLs de mídia retornadas pela API |
Inject via:
docker-compose.ymllendo de.env(no host)- Secrets manager em deploys mais robustos
Resumo do docker-compose de produção
# docker-compose.prod.yml (esquema; ver páginas seguintes pra completo)
services:
api:
image: register.homelab-cloud.com/geek-social-api:1.x.x
environment:
DATABASE_URL: postgresql://dev:dev@postgres:5432/geek_social
# ... outras
depends_on:
postgres: { condition: service_healthy }
minio: { condition: service_started }
networks: [geek-social]
frontend:
image: register.homelab-cloud.com/geek-social-frontend:1.x.x
environment:
API_URL: https://api.geek-social.com.br
networks: [geek-social]
docs:
image: register.homelab-cloud.com/geek-social-docs:1.x.x
networks: [geek-social]
postgres:
image: postgres:17
volumes: [postgres_data:/var/lib/postgresql/data]
environment: { POSTGRES_USER: dev, POSTGRES_PASSWORD: dev }
networks: [geek-social]
minio:
image: minio/minio
volumes: [minio_data:/data]
environment: { MINIO_ROOT_USER: minio, MINIO_ROOT_PASSWORD: ... }
networks: [geek-social]
volumes:
postgres_data: {}
minio_data: {}
networks:
geek-social:
driver: bridge