Geek Social — Documentação
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.sh injeta window.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-media com 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

VolumeConteúdoBackup
postgres_dataBanco completo (todos databases)pg_dump diário cron
minio_dataMídia de users (avatares, posts, chat)Mirror periódico
nginx_certsCertificados Let's EncryptRenovação automática (Certbot)
docs_staticBuild estático do docs (opcional)Re-build qualquer hora

Variáveis de ambiente sensíveis

Em prod, nunca em arquivo commitado:

VariávelValorUso
JWT_SECRETrandom 64 hexSign de access tokens
GOOGLE_CLIENT_SECRETdo Google CloudOAuth
VAPID_PRIVATE_KEYrandomWeb Push
AWS_SECRET_ACCESS_KEYminioadmin (dev) ou IAM (prod)S3 access
DATABASE_URLconn stringPostgres
STORAGE_PUBLIC_URLCDN urlURLs de mídia retornadas pela API

Inject via:

  • docker-compose.yml lendo 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

Próximas páginas

On this page