Skip to content

Application Configuration

Complete guide to configuring environment variables and settings for both frontend and backend applications.

The application configuration is managed through Kubernetes ConfigMaps and Secrets, providing environment-specific settings for both the Laravel backend and Next.js frontend.

Configuration Management:
├── Kubernetes ConfigMaps (Non-sensitive data)
├── Kubernetes Secrets (Sensitive data)
├── Environment-specific files
└── Runtime configuration
iac/config-maps/
├── backend.yaml.example # Backend configuration template
├── frontend.yaml.example # Frontend configuration template
├── backend.yaml # Actual backend config (git-ignored)
├── frontend.yaml # Actual frontend config (git-ignored)
└── README.md # Configuration instructions
Terminal window
# Copy example file
cd iac/config-maps
cp backend.yaml.example backend.yaml
# Edit with your values
nano backend.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: backend-config
namespace: production
data:
# Application basics
APP_NAME: "myproject"
APP_ENV: "production"
APP_KEY: "base64:YOUR_GENERATED_KEY"
APP_DEBUG: "false"
APP_TIMEZONE: "Europe/Berlin"
APP_URL: "https://app.myproject.com"
Terminal window
# Generate Laravel application key
php artisan key:generate --show
# Or use OpenSSL
openssl rand -base64 32 | base64
data:
# Database connection
DB_CONNECTION: "mysql"
DB_HOST: "mariadb-service"
DB_PORT: "3306"
DB_DATABASE: "myproject"
DB_USERNAME: "root"
DB_PASSWORD: "YOUR_SECURE_PASSWORD"

Security Note: In production, move sensitive values to Kubernetes Secrets:

# Create secret for sensitive data
apiVersion: v1
kind: Secret
metadata:
name: backend-secrets
namespace: production
type: Opaque
data:
DB_PASSWORD: <base64-encoded-password>
STRIPE_SECRET: <base64-encoded-stripe-secret>
data:
# Cache settings
CACHE_STORE: "redis"
SESSION_DRIVER: "redis"
SESSION_LIFETIME: "2880"
SESSION_ENCRYPT: "false"
SESSION_DOMAIN: ".myproject.com"
# Redis connection
REDIS_CLIENT: "phpredis"
REDIS_HOST: "redis-service"
REDIS_PASSWORD: "null"
REDIS_PORT: "6379"
data:
# Queue settings
QUEUE_CONNECTION: "redis"
BROADCAST_CONNECTION: "reverb"
# Queue processing
QUEUE_FAILED_DRIVER: "database"
data:
# Email service (AWS SES)
MAIL_MAILER: "smtp"
MAIL_HOST: "email-smtp.eu-west-1.amazonaws.com"
MAIL_PORT: "587"
MAIL_USERNAME: "YOUR_SES_USERNAME"
MAIL_PASSWORD: "YOUR_SES_PASSWORD"
MAIL_ENCRYPTION: "tls"
MAIL_FROM_ADDRESS: "[email protected]"
MAIL_FROM_NAME: "myproject"
data:
# File storage
FILESYSTEM_DISK: "r2"
# Cloudflare R2 or MinIO
CLOUDFLARE_R2_ACCESS_KEY_ID: "YOUR_ACCESS_KEY"
CLOUDFLARE_R2_SECRET_ACCESS_KEY: "YOUR_SECRET_KEY"
CLOUDFLARE_R2_BUCKET: "myproject-storage"
CLOUDFLARE_R2_ENDPOINT: "https://ACCOUNT.r2.cloudflarestorage.com"
CLOUDFLARE_R2_URL: "https://static.myproject.com"
data:
# Stripe payment processing
STRIPE_KEY: "pk_live_YOUR_PUBLISHABLE_KEY"
STRIPE_SECRET: "sk_live_YOUR_SECRET_KEY"
STRIPE_WEBHOOK_SECRET: "whsec_YOUR_WEBHOOK_SECRET"
data:
# Google Services
GOOGLE_API_KEY: "YOUR_GOOGLE_API_KEY"
# Twilio SMS
TWILIO_SID: "YOUR_TWILIO_SID"
TWILIO_AUTH_TOKEN: "YOUR_TWILIO_TOKEN"
TWILIO_FROM_NUMBER: "+1234567890"
TWILIO_ENABLED: "true"
# Exchange rates
FXRATESAPI_TOKEN: "YOUR_FX_API_TOKEN"
data:
# Laravel Reverb WebSocket
REVERB_APP_ID: "935239"
REVERB_APP_KEY: "YOUR_REVERB_KEY"
REVERB_APP_SECRET: "YOUR_REVERB_SECRET"
REVERB_HOST: "app.myproject.com"
REVERB_PORT: "443"
REVERB_SCHEME: "https"
Terminal window
# Copy example file
cp frontend.yaml.example frontend.yaml
# Edit with your values
nano frontend.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: frontend-config
namespace: production
data:
# Application URLs
NEXT_PUBLIC_APP_URL: "https://myproject.com"
NEXT_PUBLIC_BACKEND_URL: "https://app.myproject.com"
# Environment
NODE_ENV: "production"
data:
# Third-party APIs
NEXT_PUBLIC_GOOGLE_API_KEY: "YOUR_GOOGLE_API_KEY"
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: "pk_live_YOUR_STRIPE_KEY"
# Analytics
NEXT_PUBLIC_GA_MEASUREMENT_ID: "G-XXXXXXXXXX"
data:
# WebSocket connection
NEXT_PUBLIC_REVERB_HOST: "app.myproject.com"
NEXT_PUBLIC_REVERB_APP_KEY: "YOUR_REVERB_KEY"
NEXT_PUBLIC_REVERB_PORT: "443"
NEXT_PUBLIC_REVERB_SCHEME: "https"
data:
# Feature toggles
NEXT_PUBLIC_ENABLE_PWA: "true"
NEXT_PUBLIC_ENABLE_ANALYTICS: "true"
NEXT_PUBLIC_MAINTENANCE_MODE: "false"
backend-production.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: backend-config
namespace: production
data:
APP_ENV: "production"
APP_DEBUG: "false"
LOG_LEVEL: "error"
# ... other production settings
backend-staging.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: backend-config
namespace: staging
data:
APP_ENV: "staging"
APP_DEBUG: "true"
LOG_LEVEL: "debug"
# ... other staging settings
backend-development.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: backend-config
namespace: development
data:
APP_ENV: "local"
APP_DEBUG: "true"
LOG_LEVEL: "debug"
# ... other development settings
Terminal window
# Create secret from command line
kubectl create secret generic backend-secrets \
--from-literal=DB_PASSWORD=your-secure-password \
--from-literal=STRIPE_SECRET=sk_live_your_secret \
--namespace=production
# Create secret from file
kubectl create secret generic backend-secrets \
--from-file=.env.secrets \
--namespace=production
backend-secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: backend-secrets
namespace: production
type: Opaque
data:
DB_PASSWORD: <base64-encoded-value>
STRIPE_SECRET: <base64-encoded-value>
MAIL_PASSWORD: <base64-encoded-value>
Terminal window
# Encode values for secrets
echo -n "your-password" | base64
# Decode for verification
echo "eW91ci1wYXNzd29yZA==" | base64 -d
Terminal window
# Navigate to config directory
cd iac/config-maps
# Copy example files
cp backend.yaml.example backend.yaml
cp frontend.yaml.example frontend.yaml
# Edit configuration files
nano backend.yaml
nano frontend.yaml
Terminal window
# Validate YAML syntax
kubectl apply --dry-run=client -f backend.yaml
kubectl apply --dry-run=client -f frontend.yaml
# Check for required fields
grep -E "(APP_KEY|DB_PASSWORD|STRIPE)" backend.yaml
Terminal window
# Create namespace if it doesn't exist
kubectl create namespace production
# Apply configuration
kubectl apply -f backend.yaml
kubectl apply -f frontend.yaml
# Verify deployment
kubectl get configmaps -n production
Terminal window
# Restart deployments to pick up new config
kubectl rollout restart deployment/backend-web -n production
kubectl rollout restart deployment/frontend -n production
Terminal window
# Check if config is loaded
kubectl exec -it deployment/backend-web -c php -n production -- \
php artisan config:show
# Test database connection
kubectl exec -it deployment/backend-web -c php -n production -- \
php artisan tinker --execute="DB::connection()->getPdo();"
# Test cache connection
kubectl exec -it deployment/backend-web -c php -n production -- \
php artisan tinker --execute="Cache::put('test', 'value'); echo Cache::get('test');"
Terminal window
# Check environment variables
kubectl exec -it deployment/frontend -n production -- \
env | grep NEXT_PUBLIC
# Test application startup
kubectl logs deployment/frontend -n production
Terminal window
# Update ConfigMap
kubectl patch configmap backend-config -n production \
--patch='{"data":{"LOG_LEVEL":"info"}}'
# Rolling restart to apply changes
kubectl rollout restart deployment/backend-web -n production
Terminal window
# Edit ConfigMap directly
kubectl edit configmap backend-config -n production
# Apply updated configuration file
kubectl apply -f backend-updated.yaml
# Verify changes
kubectl get configmap backend-config -o yaml -n production
Terminal window
# Check for missing environment variables
kubectl exec -it deployment/backend-web -c php -n production -- \
php artisan config:show | grep -i null
# Verify ConfigMap content
kubectl describe configmap backend-config -n production
Terminal window
# Test configuration
kubectl exec -it deployment/backend-web -c php -n production -- \
php artisan config:cache
# Check application logs
kubectl logs deployment/backend-web -c php -n production | grep -i error
Terminal window
# Test database connectivity
kubectl exec -it deployment/backend-web -c php -n production -- \
php artisan migrate:status
# Check database host resolution
kubectl exec -it deployment/backend-web -c php -n production -- \
nslookup mariadb-service
Terminal window
# View all environment variables
kubectl exec -it deployment/backend-web -c php -n production -- env | sort
# Check specific configuration
kubectl exec -it deployment/backend-web -c php -n production -- \
php -r "echo getenv('APP_KEY');"
# Validate JSON configuration
kubectl get configmap backend-config -o json -n production | jq .data
  • Application key generated and set
  • Database credentials configured
  • Redis connection settings verified
  • Email service credentials added
  • Storage access keys configured
  • Payment gateway keys set
  • Domain names updated
  • SSL certificates configured
  • API keys added
  • WebSocket configuration set
  • Applications start successfully
  • Database connections working
  • Cache operations functional
  • Email sending operational
  • File uploads working
  • Payment processing active
  • WebSocket connections established
  • All health checks passing
  1. Never commit sensitive data to version control
  2. Use Kubernetes Secrets for sensitive values
  3. Rotate credentials regularly
  4. Audit configuration access with RBAC
  5. Encrypt sensitive ConfigMaps when possible
# RBAC for configuration access
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: config-reader
rules:
- apiGroups: [""]
resources: ["configmaps", "secrets"]
verbs: ["get", "list"]
Terminal window
# Backup all ConfigMaps
kubectl get configmaps -n production -o yaml > backup-configmaps.yaml
# Backup specific configuration
kubectl get configmap backend-config -n production -o yaml > backup-backend-config.yaml
# Backup secrets (be careful with this)
kubectl get secrets -n production -o yaml > backup-secrets.yaml
Terminal window
# Restore from backup
kubectl apply -f backup-configmaps.yaml
# Verify restoration
kubectl get configmaps -n production

Proper configuration is essential for secure and reliable application deployment.