nginx inside the Docker container defaults to 1MB body limit —
base64 image payloads exceed this and return a 413 HTML page,
causing the "Unexpected token '<'" JSON parse error on video_api.php.
Gemini 429 rate limit errors on prompt optimization now fall back
silently instead of surfacing an error to the user.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kling:
- camera_control.type: use preset name directly (down_back etc.), not 'predefined'
- camera_control.config: all 6 integer fields required even for preset types
- duration: cast to integer (API rejects strings)
- I2V images: use image_url/image_tail_url with data URI prefix (not plain base64 in image/image_tail)
Veo:
- image/lastFrame: use inlineData format (Gemini API), not bytesBase64Encoded (Vertex AI)
- durationSeconds: send as string "4"/"6"/"8", not integer
Docker:
- Add uploads.ini: post_max_size=100M, upload_max_filesize=100M, memory_limit=512M
(ini_set cannot override these at runtime in php-fpm)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Vite loads .env.production with higher priority than .env in production
mode — optical URLs were being overridden by ai-sandbox values.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Multi-stage Dockerfile (node:20 builder + php:8.2-fpm-alpine runtime),
nginx serving frontend SPA + PHP-FPM backend at /lux-studio/, supervisord
managing both processes. docker-compose.prod.yml on port 8085, .env.optical
mounted read-only, uploads in a named volume.
Apache include at deploy/apache-lux-studio.conf proxies /lux-studio/ → :8085.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>