8.1 KiB
8.1 KiB
Environment Variables for AI Image Generation
This document lists all environment variables needed for the AI image generation system.
Required Variables
Add these to your .env.local file:
# =============================================================================
# AI IMAGE GENERATION CONFIGURATION
# =============================================================================
# n8n Webhook Configuration
# The base URL where your n8n instance is running
N8N_WEBHOOK_URL=http://localhost:5678/webhook
# Secret token for authenticating webhook requests
# Generate a secure random token: openssl rand -hex 32
N8N_SECRET_TOKEN=your-secure-random-token-here
# Stable Diffusion API Configuration
# The URL where your Stable Diffusion WebUI is running
SD_API_URL=http://localhost:7860
# Optional: API key if your SD instance requires authentication
# SD_API_KEY=your-sd-api-key-here
# =============================================================================
# IMAGE GENERATION SETTINGS
# =============================================================================
# Automatically generate images when new projects are created
# Set to 'true' to enable, 'false' to disable
AUTO_GENERATE_IMAGES=true
# Directory where generated images will be saved
# Should be inside your public directory for web access
GENERATED_IMAGES_DIR=/app/public/generated-images
# Maximum time to wait for image generation (in milliseconds)
# Default: 180000 (3 minutes)
IMAGE_GENERATION_TIMEOUT=180000
# =============================================================================
# STABLE DIFFUSION SETTINGS (Optional - Overrides n8n workflow defaults)
# =============================================================================
# Default image dimensions
SD_DEFAULT_WIDTH=1024
SD_DEFAULT_HEIGHT=768
# Generation quality settings
SD_DEFAULT_STEPS=30
SD_DEFAULT_CFG_SCALE=7
# Sampler algorithm
# Options: "Euler a", "DPM++ 2M Karras", "DDIM", etc.
SD_DEFAULT_SAMPLER=DPM++ 2M Karras
# Default model checkpoint
# SD_DEFAULT_MODEL=sd_xl_base_1.0.safetensors
# =============================================================================
# FEATURE FLAGS (Optional)
# =============================================================================
# Enable/disable specific features
ENABLE_IMAGE_REGENERATION=true
ENABLE_BATCH_GENERATION=false
ENABLE_IMAGE_OPTIMIZATION=true
# =============================================================================
# LOGGING & MONITORING (Optional)
# =============================================================================
# Log all image generation requests
LOG_IMAGE_GENERATION=true
# Send notifications on generation success/failure
# DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...
# SLACK_WEBHOOK_URL=https://hooks.slack.com/services/...
# =============================================================================
# ADVANCED SETTINGS (Optional)
# =============================================================================
# Custom prompt prefix for all generations
# SD_CUSTOM_PROMPT_PREFIX=professional tech illustration, modern design,
# Custom negative prompt suffix for all generations
# SD_CUSTOM_NEGATIVE_SUFFIX=low quality, blurry, pixelated, text, watermark
# Image file naming pattern
# Available variables: {projectId}, {timestamp}, {title}
IMAGE_FILENAME_PATTERN=project-{projectId}-{timestamp}.png
# Maximum concurrent image generation requests
MAX_CONCURRENT_GENERATIONS=2
# Retry failed generations
AUTO_RETRY_ON_FAILURE=true
MAX_RETRY_ATTEMPTS=3
Production Environment
For production deployments, adjust these settings:
# Production n8n (if using cloud/dedicated instance)
N8N_WEBHOOK_URL=https://n8n.yourdomain.com/webhook
# Production Stable Diffusion (if using dedicated GPU server)
SD_API_URL=https://sd-api.yourdomain.com
# Production image storage (use absolute path)
GENERATED_IMAGES_DIR=/var/www/portfolio/public/generated-images
# Disable auto-generation in production (manual only)
AUTO_GENERATE_IMAGES=false
# Enable logging
LOG_IMAGE_GENERATION=true
# Set timeouts appropriately
IMAGE_GENERATION_TIMEOUT=300000
# Limit concurrent generations
MAX_CONCURRENT_GENERATIONS=1
Docker Environment
If running in Docker, use these paths:
# Docker-specific paths
N8N_WEBHOOK_URL=http://n8n:5678/webhook
SD_API_URL=http://stable-diffusion:7860
GENERATED_IMAGES_DIR=/app/public/generated-images
Add to docker-compose.yml:
services:
portfolio:
environment:
- N8N_WEBHOOK_URL=http://n8n:5678/webhook
- N8N_SECRET_TOKEN=${N8N_SECRET_TOKEN}
- SD_API_URL=http://stable-diffusion:7860
- AUTO_GENERATE_IMAGES=true
- GENERATED_IMAGES_DIR=/app/public/generated-images
volumes:
- ./public/generated-images:/app/public/generated-images
n8n:
image: n8nio/n8n
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=${N8N_PASSWORD}
stable-diffusion:
image: your-sd-webui-image
ports:
- "7860:7860"
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
Cloud GPU Configuration
If using cloud GPU services (RunPod, vast.ai, etc.):
# Remote GPU URL with authentication
SD_API_URL=https://your-runpod-instance.com:7860
SD_API_KEY=your-api-key-here
# Longer timeout for network latency
IMAGE_GENERATION_TIMEOUT=300000
Security Best Practices
-
Never commit
.env.localto version control# Add to .gitignore echo ".env.local" >> .gitignore -
Generate secure tokens
# Generate N8N_SECRET_TOKEN openssl rand -hex 32 # Or using Node.js node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" -
Restrict API access
- Use firewall rules to limit SD API access
- Enable authentication on n8n webhooks
- Use HTTPS in production
-
Environment-specific files
.env.local- local development.env.production- production (server-side only).env.test- testing environment
Verifying Configuration
Test your environment variables:
# Check if variables are loaded
npm run dev
# In another terminal
node -e "
const envFile = require('fs').readFileSync('.env.local', 'utf8');
console.log('✓ .env.local exists');
console.log('✓ Variables found:', envFile.split('\\n').filter(l => l && !l.startsWith('#')).length);
"
# Test n8n connection
curl -f $N8N_WEBHOOK_URL/health || echo "n8n not reachable"
# Test SD API connection
curl -f $SD_API_URL/sdapi/v1/sd-models || echo "SD API not reachable"
Troubleshooting
Variables not loading
# Ensure .env.local is in the project root
ls -la .env.local
# Restart Next.js dev server
npm run dev
Wrong paths in Docker
# Check volume mounts
docker-compose exec portfolio ls -la /app/public/generated-images
# Fix permissions
docker-compose exec portfolio chmod 755 /app/public/generated-images
n8n webhook unreachable
# Check n8n is running
docker ps | grep n8n
# Check network connectivity
docker-compose exec portfolio ping n8n
# Verify webhook URL in n8n UI
Example Complete Configuration
# .env.local - Complete working example
# Database (required for project data)
DATABASE_URL=postgresql://user:password@localhost:5432/portfolio
# NextAuth (if using authentication)
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=your-nextauth-secret
# AI Image Generation
N8N_WEBHOOK_URL=http://localhost:5678/webhook
N8N_SECRET_TOKEN=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6
SD_API_URL=http://localhost:7860
AUTO_GENERATE_IMAGES=true
GENERATED_IMAGES_DIR=/Users/dennis/code/gitea/portfolio/public/generated-images
# Image settings
SD_DEFAULT_WIDTH=1024
SD_DEFAULT_HEIGHT=768
SD_DEFAULT_STEPS=30
SD_DEFAULT_CFG_SCALE=7
SD_DEFAULT_SAMPLER=DPM++ 2M Karras
# Optional features
ENABLE_IMAGE_REGENERATION=true
LOG_IMAGE_GENERATION=true
IMAGE_GENERATION_TIMEOUT=180000
MAX_CONCURRENT_GENERATIONS=2
Note: Always keep your .env.local file secure and never share tokens publicly!