Files
seguidorDeLotes/nuxt4-app/nuxt.config.ts
josedario87 db4a79e617
All checks were successful
build-and-deploy / build (push) Successful in 7s
build-and-deploy / deploy (push) Successful in 3s
Add internal Authentik URL for server-to-server communication
This fixes ETIMEDOUT errors when exchanging OAuth tokens. The container
now uses the Docker internal service name (authentiknucleo-server-1:9000)
for server-to-server API calls while keeping the public URL for browser
redirects.

Changes:
- Add NUXT_OAUTH_AUTHENTIK_SERVER_URL_INTERNAL env var
- Use internal URL for token exchange and userinfo endpoints
- Update docker-compose.yml and Gitea workflow
2025-10-11 18:47:41 -06:00

155 lines
3.7 KiB
TypeScript

// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
compatibilityDate: '2025-07-15',
devtools: { enabled: true },
modules: [
'@nuxt/ui',
'nuxt-auth-utils',
'@vite-pwa/nuxt'
],
// Runtime config para variables de entorno
runtimeConfig: {
// Variables privadas (solo servidor)
oauth: {
authentik: {
clientId: process.env.NUXT_OAUTH_AUTHENTIK_CLIENT_ID || '',
clientSecret: process.env.NUXT_OAUTH_AUTHENTIK_CLIENT_SECRET || '',
serverUrl: process.env.NUXT_OAUTH_AUTHENTIK_SERVER_URL || '',
serverUrlInternal: process.env.NUXT_OAUTH_AUTHENTIK_SERVER_URL_INTERNAL || '',
redirectURL: process.env.NUXT_OAUTH_AUTHENTIK_REDIRECT_URL || ''
}
},
// Variables públicas (cliente y servidor)
public: {
appUrl: process.env.NUXT_PUBLIC_APP_URL || ''
}
},
// Configuración PWA
pwa: {
registerType: 'autoUpdate',
manifest: {
name: 'Seguidor de Lotes',
short_name: 'Lotes',
description: 'Aplicación para seguimiento y gestión de lotes',
start_url: '/',
display: 'standalone',
background_color: '#1f2730',
theme_color: '#1f2730',
icons: [
{
src: 'icon-16x16.png',
sizes: '16x16',
type: 'image/png'
},
{
src: 'icon-32x32.png',
sizes: '32x32',
type: 'image/png'
},
{
src: 'icon-48x48.png',
sizes: '48x48',
type: 'image/png'
},
{
src: 'icon-64x64.png',
sizes: '64x64',
type: 'image/png'
},
{
src: 'icon-96x96.png',
sizes: '96x96',
type: 'image/png'
},
{
src: 'icon-128x128.png',
sizes: '128x128',
type: 'image/png'
},
{
src: 'icon-144x144.png',
sizes: '144x144',
type: 'image/png'
},
{
src: 'icon-152x152.png',
sizes: '152x152',
type: 'image/png'
},
{
src: 'icon-167x167.png',
sizes: '167x167',
type: 'image/png'
},
{
src: 'icon-180x180.png',
sizes: '180x180',
type: 'image/png'
},
{
src: 'icon-192x192.png',
sizes: '192x192',
type: 'image/png'
},
{
src: 'icon-256x256.png',
sizes: '256x256',
type: 'image/png'
},
{
src: 'icon-384x384.png',
sizes: '384x384',
type: 'image/png'
},
{
src: 'icon-512x512.png',
sizes: '512x512',
type: 'image/png'
},
{
src: 'icon-1024x1024.png',
sizes: '1024x1024',
type: 'image/png'
},
{
src: 'icon-512x512-maskable.png',
sizes: '512x512',
type: 'image/png',
purpose: 'maskable'
},
{
src: 'icon-1024x1024-maskable.png',
sizes: '1024x1024',
type: 'image/png',
purpose: 'maskable'
}
]
},
workbox: {
// Estrategia de caché para navegación offline
navigateFallback: '/',
navigateFallbackDenylist: [/^\/api\//],
runtimeCaching: [
{
urlPattern: /^\/api\/.*/,
handler: 'NetworkFirst',
options: {
cacheName: 'api-cache',
expiration: {
maxEntries: 50,
maxAgeSeconds: 60 * 60 * 24 // 24 horas
},
networkTimeoutSeconds: 10
}
}
]
},
devOptions: {
enabled: true,
type: 'module'
}
}
})