import type { NextConfig } from "next"; // Read at runtime, not baked in. The rewrites below run in the Next server // process, never in the browser, so this never needed the NEXT_PUBLIC_ prefix // that pins a value into the image at build time. NEXT_PUBLIC_API_URL is still // honoured so an existing deployment passing it keeps working. const apiUrl = process.env.API_URL ?? process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:8080"; const nextConfig: NextConfig = { output: "standalone", async redirects() { return [ { // The API keys page briefly lived at /api-keys, which every // raw-prefix proxy in front of this app captures with its /api // rule — nginx's `location /api` matches /api-keys, so the // request reached the Go server and 404'd. The page is at // /tokens now precisely because that cannot happen to it. source: "/api-keys", destination: "/tokens", permanent: true, }, ]; }, async rewrites() { return [ { source: "/api/:path*", destination: `${apiUrl}/api/:path*`, }, { source: "/auth/:path*", destination: `${apiUrl}/auth/:path*`, }, { source: "/install", destination: `${apiUrl}/install`, }, { source: "/install.ps1", destination: `${apiUrl}/install.ps1`, }, { source: "/update", destination: `${apiUrl}/update`, }, { source: "/update.ps1", destination: `${apiUrl}/update.ps1`, }, { // The public status page refreshes itself in the browser, so // the public prefix has to be proxied the same way /api is. source: "/public/:path*", destination: `${apiUrl}/public/:path*`, }, ]; }, }; export default nextConfig;