feat: add frontend, nginx reverse proxy and monitoring/reports extras
- apps/frontend: Next.js 15 (App Router) + Tailwind v4 + componentes estilo shadcn/ui sobre Radix UI + TanStack Query. Tema light/dark, logo processada. Menu completo (secao 52) com gating por permissao real. Todas as telas do checklist de aceite (secao 90) conectadas a endpoints reais (nao mockup): login, usuarios, perfis/permissoes, ramais/troncos, dialplan, filas/agentes, console do agente, campanhas (CPS/CSV/ iniciar/pausar), monitoramento ao vivo (polling, nao WebSocket real), TME/TMA, busca/export de chamadas, administracao do Asterisk, auditoria - infrastructure/nginx: reverse proxy colocando frontend+API na mesma origem (porta 80), antecipado da Fase 9 pois a API nao publica porta propria - apps/api: GET /api/monitoring/agents (estado corrente real via agent_state_events em aberto) e filtro queueId em GET /api/reports/calls Pendencia registrada: tela de Callbacks nao implementada (schema existe desde a Fase 6, mas nunca houve controller/service — construir a tela sem API real seria mockup). Verificacao visual em navegador nao foi possivel neste ambiente headless; validado via tsc/eslint/next build limpos + curl reproduzindo as chamadas do navegador (middleware de auth, 24 paginas protegidas via Nginx, endpoints de dados com cookie de sessao).
This commit is contained in:
36
infrastructure/docker/frontend.Dockerfile
Normal file
36
infrastructure/docker/frontend.Dockerfile
Normal file
@@ -0,0 +1,36 @@
|
||||
# apps/frontend — Next.js (App Router), monorepo pnpm, output standalone.
|
||||
FROM node:24-slim AS build
|
||||
|
||||
RUN corepack enable && corepack prepare pnpm@11.24.0 --activate
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
|
||||
COPY apps/frontend/package.json apps/frontend/package.json
|
||||
|
||||
RUN pnpm install --frozen-lockfile --filter @b2bcall/frontend...
|
||||
|
||||
COPY apps/frontend apps/frontend
|
||||
|
||||
RUN pnpm --filter @b2bcall/frontend build
|
||||
|
||||
# --- runtime -------------------------------------------------------------
|
||||
FROM node:24-slim AS runtime
|
||||
ENV NODE_ENV=production
|
||||
ENV PORT=3000
|
||||
ENV HOSTNAME=0.0.0.0
|
||||
WORKDIR /app
|
||||
|
||||
RUN groupadd -r b2bcall && useradd -r -g b2bcall b2bcall
|
||||
|
||||
# next.config.ts com output:"standalone" produz uma árvore mínima com só o
|
||||
# necessário para rodar. Em monorepo pnpm o resultado preserva a estrutura
|
||||
# apps/frontend + node_modules na raiz com symlinks relativos para o pnpm
|
||||
# store — por isso a árvore inteira é copiada sem "achatar" os diretórios,
|
||||
# senão os symlinks (../../../node_modules/.pnpm/...) apontam para fora.
|
||||
COPY --from=build /app/apps/frontend/.next/standalone ./
|
||||
COPY --from=build /app/apps/frontend/.next/static ./apps/frontend/.next/static
|
||||
COPY --from=build /app/apps/frontend/public ./apps/frontend/public
|
||||
|
||||
USER b2bcall
|
||||
EXPOSE 3000
|
||||
CMD ["node", "apps/frontend/server.js"]
|
||||
59
infrastructure/nginx/nginx.conf
Normal file
59
infrastructure/nginx/nginx.conf
Normal file
@@ -0,0 +1,59 @@
|
||||
# Reverse proxy único (agente.md seção 87): expõe frontend + API na mesma
|
||||
# origem para o navegador, o que também elimina CORS e problemas de cookie
|
||||
# cross-origin — frontend e API nunca ficam expostos diretamente ao host.
|
||||
worker_processes 1;
|
||||
|
||||
events {
|
||||
worker_connections 512;
|
||||
}
|
||||
|
||||
http {
|
||||
include mime.types;
|
||||
default_type application/octet-stream;
|
||||
sendfile on;
|
||||
client_max_body_size 55m;
|
||||
|
||||
log_format main '$remote_addr - [$time_local] "$request" $status $body_bytes_sent "$http_referer"';
|
||||
access_log /dev/stdout main;
|
||||
error_log /dev/stderr warn;
|
||||
|
||||
upstream frontend_upstream {
|
||||
server frontend:3000;
|
||||
}
|
||||
|
||||
upstream api_upstream {
|
||||
server api:3000;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
|
||||
location /api/ {
|
||||
proxy_pass http://api_upstream;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
location /_next/webpack-hmr {
|
||||
proxy_pass http://frontend_upstream;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
}
|
||||
|
||||
location / {
|
||||
proxy_pass http://frontend_upstream;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user