vercel.json
Rama main · réplica de lectura del repositorio original.
{
"buildCommand": "npm run build",
"outputDirectory": "build",
"rewrites": [
{ "source": "/stats/:match*", "destination": "https://cloud.umami.is/:match*" },
{ "source": "/api/(.*)", "destination": "/api/index" },
{ "source": "/((?!api/).*)", "destination": "/index.html" }
],
"headers": [
{
"source": "/((?!api/|stats/).*)",
"headers": [
{
"key": "Content-Security-Policy",
"value": "default-src 'self'; script-src 'self' https://challenges.cloudflare.com https://s3.tradingview.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: https://coin-images.coingecko.com; connect-src 'self' https://challenges.cloudflare.com https://fonts.googleapis.com https://gateway.umami.is; frame-src https://challenges.cloudflare.com https://s.tradingview.com https://www.tradingview.com; frame-ancestors 'none'; base-uri 'self'; form-action 'self'; object-src 'none'"
},
{ "key": "X-Frame-Options", "value": "DENY" },
{ "key": "X-Content-Type-Options", "value": "nosniff" },
{ "key": "Referrer-Policy", "value": "strict-origin-when-cross-origin" },
{ "key": "Permissions-Policy", "value": "camera=(), microphone=(), geolocation=(), payment=(), usb=()" },
{ "key": "Strict-Transport-Security", "value": "max-age=63072000; includeSubDomains" }
]
}
],
"crons": [
{ "path": "/api/cron/refresh-user-averages", "schedule": "0 3 1 * *" },
{ "path": "/api/cron/delete-users", "schedule": "0 2 * * *" }
],
"functions": {
"api/index.ts": {
"maxDuration": 60
}
}
}