Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .env.local.example
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,15 @@ ENTRY_HASH_SECRET=replace-with-a-long-random-secret
# ENTRY_HASH_LEGACY_KEY_ID=k2026-07
# ENTRY_HASH_SECRET_K2026_07=

# ── Observabilidade (Sentry) ──────────────────────────────────────────────
# DSN do projeto (PÚBLICO — vai inlinado no bundle client). Sem ele, o Sentry
# fica desligado (init vira no-op). Em produção entra como build-arg no build-image.
NEXT_PUBLIC_SENTRY_DSN=

# Auth token de ORGANIZAÇÃO (SEGREDO) — só usado em build para subir source maps.
# Ausente → o upload é pulado e o build segue normal. Em produção é build secret no CI.
SENTRY_AUTH_TOKEN=

# ── Playwright performance tests ──────────────────────────────────────────
# URL base onde o app está rodando durante os testes
PLAYWRIGHT_BASE_URL=http://localhost:3000
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/build-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ jobs:
NEXT_PUBLIC_SUPABASE_URL=${{ secrets.NEXT_PUBLIC_SUPABASE_URL }}
NEXT_PUBLIC_SUPABASE_ANON_KEY=${{ secrets.NEXT_PUBLIC_SUPABASE_ANON_KEY }}
NEXT_PUBLIC_APP_URL=${{ secrets.NEXT_PUBLIC_APP_URL }}
NEXT_PUBLIC_SENTRY_DSN=${{ secrets.NEXT_PUBLIC_SENTRY_DSN }}
SENTRY_RELEASE=${{ github.sha }}
secrets: |
SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}

# Só na main: avisa o App Service para puxar a nova imagem :latest do ghcr.
# O webhook é o mecanismo de CD do App Service for Containers (sem service
Expand Down
9 changes: 8 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,18 @@ COPY . .
ARG NEXT_PUBLIC_SUPABASE_URL
ARG NEXT_PUBLIC_SUPABASE_ANON_KEY
ARG NEXT_PUBLIC_APP_URL
ARG NEXT_PUBLIC_SENTRY_DSN
ARG SENTRY_RELEASE
ENV NEXT_PUBLIC_SUPABASE_URL=$NEXT_PUBLIC_SUPABASE_URL \
NEXT_PUBLIC_SUPABASE_ANON_KEY=$NEXT_PUBLIC_SUPABASE_ANON_KEY \
NEXT_PUBLIC_APP_URL=$NEXT_PUBLIC_APP_URL \
NEXT_PUBLIC_SENTRY_DSN=$NEXT_PUBLIC_SENTRY_DSN \
SENTRY_RELEASE=$SENTRY_RELEASE \
BUILD_STANDALONE=true
RUN npx prisma generate && npm run build
# O SENTRY_AUTH_TOKEN entra só como build secret (não persiste em layer nem no cache),
# usado pelo withSentryConfig para subir source maps. Ausente → upload é pulado.
RUN --mount=type=secret,id=SENTRY_AUTH_TOKEN,env=SENTRY_AUTH_TOKEN \
npx prisma generate && npm run build

# --- runner: imagem mínima que só roda o server standalone ---
FROM base AS runner
Expand Down
26 changes: 22 additions & 4 deletions next.config.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { withSentryConfig } from '@sentry/nextjs'
import withSerwist from '@serwist/next'
import type { NextConfig } from 'next'

Expand Down Expand Up @@ -51,7 +52,24 @@ const nextConfig: NextConfig = {
},
}

export default withSerwist({
swSrc: 'src/app/sw.ts',
swDest: 'public/sw.js',
})(nextConfig)
export default withSentryConfig(
withSerwist({
swSrc: 'src/app/sw.ts',
swDest: 'public/sw.js',
})(nextConfig),
{
org: 'john-laff',
project: 'archtime',
// Não enviar telemetria de build do plugin do Sentry.
telemetry: false,
// Roteia os eventos pelo próprio domínio (evita ad-blockers e mantém a CSP
// report-only intacta — connect-src 'self' cobre). Ver src/proxy.ts (allowlist).
tunnelRoute: '/monitoring',
// Release determinístico: o .git não entra no contexto do build Docker, então o
// SHA vem por env (SENTRY_RELEASE) no build-image.yml.
release: { name: process.env.SENTRY_RELEASE },
// Só sobe source maps quando o auth token existe (build da imagem); no CI e no dev,
// sem token, o upload é pulado e o build segue.
sourcemaps: { disable: !process.env.SENTRY_AUTH_TOKEN },
}
)
Loading
Loading