517aefcd9b
Error tracking centralisé (ticket INFRA #146) : remontée des erreurs back (Symfony) et front (Nuxt) vers l'instance GlitchTip auto-hébergée. Backend : - sentry/sentry-symfony ^5.10, bundle enregistré prod-only - config/packages/sentry.yaml : handler Monolog niveau ERROR+, ignore les 4xx/AccessDenied, pas d'APM, release = %app.version% - services.yaml importe version.yaml pour exposer app.version au container - .env : bloc SENTRY_DSN documenté (vide => SDK inerte) Frontend : - @sentry/nuxt ^10.61, module chargé uniquement si NUXT_PUBLIC_SENTRY_DSN défini - runtimeConfig.public.sentry + source maps (hidden) + options d'upload - sentry.client.config.ts : init côté client gardée par if (dsn) DSN vides par défaut : aucune erreur n'est envoyée tant que les projets GlitchTip inventory-api / inventory-front et leurs DSN ne sont pas configurés en prod. Aucun secret commité. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
105 lines
3.4 KiB
TypeScript
105 lines
3.4 KiB
TypeScript
import tailwindcss from '@tailwindcss/vite'
|
|
import { readFileSync } from 'node:fs'
|
|
import { dirname, resolve } from 'node:path'
|
|
import { fileURLToPath } from 'node:url'
|
|
|
|
// Lire la version depuis config/version.yaml à la racine du projet parent
|
|
const getAppVersion = (): string => {
|
|
try {
|
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
const versionPath = resolve(__dirname, '..', 'config', 'version.yaml')
|
|
const content = readFileSync(versionPath, 'utf-8')
|
|
const match = content.match(/app\.version:\s*'([^']+)'/)
|
|
return match ? match[1] : '0.0.0'
|
|
} catch {
|
|
return '0.0.0'
|
|
}
|
|
}
|
|
|
|
const appVersion = process.env.NUXT_PUBLIC_APP_VERSION || getAppVersion()
|
|
|
|
export default defineNuxtConfig({
|
|
compatibilityDate: '2025-07-15',
|
|
components: {
|
|
dirs: [
|
|
{ path: '~/components', pathPrefix: false },
|
|
],
|
|
},
|
|
ssr: false, // Désactive le SSR pour un mode SPA pur (Client-Side Rendering uniquement)
|
|
devtools: { enabled: true },
|
|
devServer: {
|
|
host: '0.0.0.0',
|
|
port: 3000
|
|
},
|
|
modules: [
|
|
[
|
|
'unplugin-icons/nuxt',
|
|
{
|
|
componentPrefix: 'Icon',
|
|
warn: process.env.NODE_ENV === 'development',
|
|
collections: {
|
|
lucide: () => import('@iconify-json/lucide/icons.json').then(i => i.default)
|
|
}
|
|
}
|
|
],
|
|
// Error tracking → GlitchTip. Module chargé uniquement si un DSN est fourni
|
|
// (build prod) ; en dev sans DSN, aucun overhead Sentry. Les options d'upload des
|
|
// source maps sont passées en ligne (fournies au build via secrets CI).
|
|
...(process.env.NUXT_PUBLIC_SENTRY_DSN
|
|
? [['@sentry/nuxt/module', {
|
|
sourceMapsUploadOptions: {
|
|
url: process.env.SENTRY_URL,
|
|
org: process.env.SENTRY_ORG,
|
|
project: process.env.SENTRY_PROJECT,
|
|
authToken: process.env.SENTRY_AUTH_TOKEN
|
|
}
|
|
}] as [string, Record<string, unknown>]]
|
|
: [])
|
|
],
|
|
runtimeConfig: {
|
|
apiBaseUrl: process.env.NUXT_API_BASE_URL
|
|
|| process.env.NUXT_PUBLIC_API_BASE_URL
|
|
|| 'http://localhost/api',
|
|
public: {
|
|
apiBaseUrl: process.env.NUXT_PUBLIC_API_BASE_URL || '/api',
|
|
appUrl: process.env.NUXT_PUBLIC_APP_URL || 'http://localhost:3001',
|
|
appName: process.env.NUXT_PUBLIC_APP_NAME || 'Inventory Management System',
|
|
appVersion: appVersion,
|
|
apiTimeout: process.env.NUXT_PUBLIC_API_TIMEOUT || '30000',
|
|
requestTimeout: process.env.NUXT_PUBLIC_REQUEST_TIMEOUT || '10000',
|
|
enableDebug: process.env.NUXT_PUBLIC_ENABLE_DEBUG || 'false',
|
|
enableAnalytics: process.env.NUXT_PUBLIC_ENABLE_ANALYTICS || 'false',
|
|
csrfToken: process.env.NUXT_PUBLIC_CSRF_TOKEN || '',
|
|
logLevel: process.env.NUXT_PUBLIC_LOG_LEVEL || 'warn',
|
|
sentry: {
|
|
// DSN du projet GlitchTip "inventory-front" (vide => SDK inerte).
|
|
dsn: process.env.NUXT_PUBLIC_SENTRY_DSN || '',
|
|
environment: process.env.NODE_ENV || 'development'
|
|
}
|
|
}
|
|
},
|
|
// Source maps "hidden" : générées et uploadées vers GlitchTip pour des stacktraces
|
|
// lisibles, sans exposer les .map au navigateur.
|
|
sourcemap: { client: 'hidden' },
|
|
vite: {
|
|
plugins: [tailwindcss()],
|
|
server: {
|
|
proxy: {
|
|
'/api': {
|
|
target: 'http://localhost',
|
|
changeOrigin: true,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
css: ['~/assets/app.css'],
|
|
router: {
|
|
options: {
|
|
strict: false
|
|
}
|
|
},
|
|
experimental: {
|
|
payloadExtraction: false
|
|
}
|
|
})
|