diff --git a/apps/web/next.config.js b/apps/web/next.config.js index d6f7446..82fbe4b 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -3,9 +3,12 @@ const nextConfig = { reactStrictMode: true, eslint: { ignoreDuringBuilds: true }, transpilePackages: ['@coursecraft/shared'], - // Проксируем /api на бэкенд — в браузере запросы идут на тот же хост, без localhost + // Проксируем /api на бэкенд — в браузере запросы идут на тот же хост + // INTERNAL_API_URL используется в Docker (не конфликтует с .env), + // API_URL — fallback для локальной разработки async rewrites() { - const apiUrl = process.env.API_URL || 'http://127.0.0.1:3125'; + const apiUrl = process.env.INTERNAL_API_URL || process.env.API_URL || 'http://127.0.0.1:3125'; + console.log('[next.config] rewrites destination:', apiUrl); return [{ source: '/api/:path*', destination: `${apiUrl}/api/:path*` }]; }, images: { diff --git a/apps/web/src/lib/api.ts b/apps/web/src/lib/api.ts index 5e00760..60a425a 100644 --- a/apps/web/src/lib/api.ts +++ b/apps/web/src/lib/api.ts @@ -1,6 +1,6 @@ // В браузере — относительный URL (запросы на тот же хост, Next проксирует /api на бэкенд) const API_BASE = - typeof window !== 'undefined' ? '' : (process.env.API_URL || 'http://localhost:3125'); + typeof window !== 'undefined' ? '' : (process.env.INTERNAL_API_URL || process.env.API_URL || 'http://localhost:3125'); const API_URL = API_BASE ? `${API_BASE.replace(/\/$/, '')}/api` : '/api'; const STORAGE_KEY = 'coursecraft_api_token'; diff --git a/docker-compose.yml b/docker-compose.yml index 903db9b..a644d4d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -100,15 +100,14 @@ services: context: . dockerfile: docker/Dockerfile.web args: - API_URL: http://api:3125 + INTERNAL_API_URL: http://api:3125 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:-http://localhost:3080} container_name: coursecraft-web restart: unless-stopped - # NB: no env_file here — .env contains API_URL=localhost which breaks Docker networking environment: - API_URL: http://api:3125 + INTERNAL_API_URL: http://api:3125 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:-http://localhost:3080} diff --git a/docker/Dockerfile.web b/docker/Dockerfile.web index 68e7a0b..8fbc986 100644 --- a/docker/Dockerfile.web +++ b/docker/Dockerfile.web @@ -19,12 +19,13 @@ RUN pnpm install --frozen-lockfile COPY . . # These are needed at build time: Next.js inlines NEXT_PUBLIC_* into client bundle -ARG API_URL=http://api:3125 +# INTERNAL_API_URL is used for rewrites (avoids conflict with .env's API_URL) +ARG INTERNAL_API_URL=http://api:3125 ARG NEXT_PUBLIC_SUPABASE_URL ARG NEXT_PUBLIC_SUPABASE_ANON_KEY ARG NEXT_PUBLIC_APP_URL=http://localhost:3080 -ENV API_URL=${API_URL} +ENV INTERNAL_API_URL=${INTERNAL_API_URL} ENV NEXT_PUBLIC_SUPABASE_URL=${NEXT_PUBLIC_SUPABASE_URL} ENV NEXT_PUBLIC_SUPABASE_ANON_KEY=${NEXT_PUBLIC_SUPABASE_ANON_KEY} ENV NEXT_PUBLIC_APP_URL=${NEXT_PUBLIC_APP_URL} diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 1b1ed1f..f049d41 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -97,15 +97,14 @@ services: context: .. dockerfile: docker/Dockerfile.web args: - API_URL: http://api:3125 + INTERNAL_API_URL: http://api:3125 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:-http://localhost:3080} container_name: coursecraft-web restart: unless-stopped - # NB: no env_file here — .env contains API_URL=localhost which breaks Docker networking environment: - API_URL: http://api:3125 + INTERNAL_API_URL: http://api:3125 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:-http://localhost:3080}