Skip to content

Commit 4fe5fc1

Browse files
committed
Production security hardening and Docker configuration
Security Fixes: - WebSocket CORS origin validation (production mode enforces AllowedOrigins) - Path traversal prevention via filename sanitization - SSRF protection with URL validation on all endpoints including GraphQL - Request size limits (10MB JSON, 5GB files) - Security headers (X-Frame-Options, CSP, X-Content-Type-Options) - Graceful shutdown with batch job cancellation - Non-leaking error messages in production Docker Improvements: - Dockerfile defaults to CLOUD_MODE=false for production security - Removed weak default passwords from compose files - Added secrets-manager.sh for proper secret generation - Added Prometheus and Grafana monitoring configs - Health checks use environment-based passwords Code Quality: - Added unit tests for config, ffmpeg, middleware - HTTP server timeouts (read: 30s, write: 5min, idle: 120s) - UUID validation on job IDs - Context cancellation for batch processing Repository Cleanup: - Updated .gitignore for public repo (removed internal docs) - Added docker-image configs to version control - Removed sensitive audit/deployment files from tracking
1 parent b706867 commit 4fe5fc1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+12969
-1790
lines changed

.env.production.template

Lines changed: 361 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,361 @@
1+
# Production Environment Configuration for FFprobe API
2+
# CRITICAL: Change all default values before deploying to production!
3+
4+
# =============================================================================
5+
# DEPLOYMENT METADATA
6+
# =============================================================================
7+
VERSION=1.0.0
8+
BUILD_DATE=
9+
VCS_REF=
10+
TARGETPLATFORM=linux/amd64
11+
12+
# =============================================================================
13+
# DOMAIN AND NETWORKING
14+
# =============================================================================
15+
DOMAIN=your-domain.com
16+
API_PORT=8080
17+
EXTERNAL_HTTP_PORT=80
18+
EXTERNAL_HTTPS_PORT=443
19+
20+
# =============================================================================
21+
# SECURITY CONFIGURATION
22+
# =============================================================================
23+
24+
# API Authentication (CRITICAL: Change in production)
25+
# Generate with: openssl rand -hex 32
26+
API_KEY=CHANGE_ME_32_CHARS_MINIMUM_SECRET_KEY_HERE_PROD
27+
28+
# JWT Secret (CRITICAL: Change in production)
29+
# Generate with: openssl rand -hex 32
30+
JWT_SECRET=CHANGE_ME_32_CHARS_MINIMUM_JWT_SECRET_HERE_PROD
31+
32+
# Encryption Key (CRITICAL: Change in production)
33+
# Generate with: openssl rand -hex 32
34+
ENCRYPTION_KEY=CHANGE_ME_32_CHARS_MINIMUM_ENCRYPTION_KEY_PROD
35+
36+
# Security Features
37+
ENABLE_AUTH=true
38+
ENABLE_RATE_LIMIT=true
39+
ENABLE_CSRF=true
40+
ENABLE_CORS=false
41+
CORS_ORIGINS=https://your-domain.com,https://admin.your-domain.com
42+
43+
# SSL/TLS Configuration
44+
SSL_CERT_PATH=/etc/ssl/certs/your-domain.crt
45+
SSL_KEY_PATH=/etc/ssl/private/your-domain.key
46+
SSL_CHAIN_PATH=/etc/ssl/certs/your-domain-chain.crt
47+
48+
# =============================================================================
49+
# DATABASE CONFIGURATION
50+
# =============================================================================
51+
52+
# PostgreSQL Primary
53+
POSTGRES_HOST=postgres
54+
POSTGRES_PORT=5432
55+
POSTGRES_DB=ffprobe_production
56+
POSTGRES_USER=ffprobe_prod
57+
# Generate with: openssl rand -base64 32
58+
POSTGRES_PASSWORD=CHANGE_ME_STRONG_DATABASE_PASSWORD_HERE
59+
60+
# Database Connection Pool
61+
DB_MAX_CONNECTIONS=50
62+
DB_MAX_IDLE_CONNECTIONS=10
63+
DB_CONNECTION_TIMEOUT=30s
64+
DB_IDLE_TIMEOUT=30m
65+
66+
# SSL Mode (require, verify-ca, verify-full)
67+
POSTGRES_SSL_MODE=require
68+
69+
# =============================================================================
70+
# REDIS CONFIGURATION
71+
# =============================================================================
72+
73+
# Redis Primary
74+
REDIS_HOST=redis
75+
REDIS_PORT=6379
76+
REDIS_DB=0
77+
# Generate with: openssl rand -base64 32
78+
REDIS_PASSWORD=CHANGE_ME_STRONG_REDIS_PASSWORD_HERE
79+
80+
# Redis Connection Pool
81+
REDIS_MAX_CONNECTIONS=20
82+
REDIS_MIN_IDLE_CONNECTIONS=5
83+
REDIS_CONNECTION_TIMEOUT=10s
84+
85+
# =============================================================================
86+
# APPLICATION CONFIGURATION
87+
# =============================================================================
88+
89+
# Environment
90+
GO_ENV=production
91+
LOG_LEVEL=warn
92+
LOG_FORMAT=json
93+
DEBUG_MODE=false
94+
95+
# File Processing
96+
MAX_FILE_SIZE=53687091200
97+
MAX_CONCURRENT_UPLOADS=10
98+
UPLOAD_TIMEOUT=3600
99+
PROCESSING_TIMEOUT=7200
100+
CLEANUP_TEMP_FILES=true
101+
102+
# Rate Limiting
103+
RATE_LIMIT_REQUESTS_PER_MINUTE=100
104+
RATE_LIMIT_BURST_SIZE=20
105+
RATE_LIMIT_ENABLE_SLIDING_WINDOW=true
106+
107+
# =============================================================================
108+
# STORAGE AND DATA PATHS
109+
# =============================================================================
110+
111+
# Primary data directory (ensure this exists and has proper permissions)
112+
DATA_PATH=/opt/ffprobe/data
113+
114+
# SSL certificates directory
115+
SSL_PATH=/opt/ffprobe/ssl
116+
117+
# Application directories (auto-created relative to DATA_PATH)
118+
UPLOAD_DIR=/opt/ffprobe/data/uploads
119+
REPORTS_DIR=/opt/ffprobe/data/reports
120+
TEMP_DIR=/opt/ffprobe/data/temp
121+
CACHE_DIR=/opt/ffprobe/data/cache
122+
BACKUP_DIR=/opt/ffprobe/data/backup
123+
LOG_DIR=/opt/ffprobe/data/logs
124+
125+
# =============================================================================
126+
# MONITORING AND OBSERVABILITY
127+
# =============================================================================
128+
129+
# Metrics and Monitoring
130+
ENABLE_METRICS=true
131+
ENABLE_TRACING=true
132+
METRICS_PORT=9090
133+
PROMETHEUS_RETENTION_TIME=30d
134+
PROMETHEUS_RETENTION_SIZE=10GB
135+
136+
# Grafana
137+
GRAFANA_PASSWORD=CHANGE_ME_STRONG_GRAFANA_PASSWORD_HERE
138+
GRAFANA_ADMIN_USER=admin
139+
140+
# Health Checks
141+
HEALTH_CHECK_TIMEOUT=10s
142+
HEALTH_CHECK_INTERVAL=30s
143+
STARTUP_PROBE_TIMEOUT=60s
144+
145+
# Logging
146+
ENABLE_ACCESS_LOGGING=true
147+
ENABLE_AUDIT_LOGGING=true
148+
LOG_RETENTION_DAYS=90
149+
150+
# =============================================================================
151+
# EXTERNAL SERVICES
152+
# =============================================================================
153+
154+
# Email Configuration (for notifications)
155+
SMTP_HOST=smtp.your-provider.com
156+
SMTP_PORT=587
157+
158+
SMTP_PASSWORD=CHANGE_ME_SMTP_PASSWORD
159+
160+
SMTP_TLS=true
161+
162+
# Cloud Storage (if using)
163+
# AWS S3
164+
AWS_REGION=us-east-1
165+
AWS_ACCESS_KEY_ID=
166+
AWS_SECRET_ACCESS_KEY=
167+
S3_BUCKET_NAME=ffprobe-production-storage
168+
169+
# Google Cloud Storage
170+
GCS_PROJECT_ID=
171+
GCS_BUCKET_NAME=ffprobe-production-storage
172+
GOOGLE_APPLICATION_CREDENTIALS=/opt/ffprobe/config/gcs-credentials.json
173+
174+
# Azure Blob Storage
175+
AZURE_STORAGE_ACCOUNT=
176+
AZURE_STORAGE_KEY=
177+
AZURE_CONTAINER_NAME=ffprobe-production
178+
179+
# =============================================================================
180+
# PERFORMANCE TUNING
181+
# =============================================================================
182+
183+
# Go Runtime
184+
GOMAXPROCS=0
185+
GOGC=100
186+
GOMEMLIMIT=8GiB
187+
188+
# Docker Resource Limits (used by compose files)
189+
API_MEMORY_LIMIT=16G
190+
API_CPU_LIMIT=8.0
191+
API_MEMORY_RESERVATION=8G
192+
API_CPU_RESERVATION=4.0
193+
194+
DB_MEMORY_LIMIT=4G
195+
DB_CPU_LIMIT=4.0
196+
DB_MEMORY_RESERVATION=2G
197+
DB_CPU_RESERVATION=2.0
198+
199+
REDIS_MEMORY_LIMIT=2G
200+
REDIS_CPU_LIMIT=2.0
201+
REDIS_MEMORY_RESERVATION=1G
202+
REDIS_CPU_RESERVATION=1.0
203+
204+
# =============================================================================
205+
# BACKUP AND DISASTER RECOVERY
206+
# =============================================================================
207+
208+
# Backup Configuration
209+
ENABLE_AUTO_BACKUP=true
210+
BACKUP_SCHEDULE=0 2 * * *
211+
BACKUP_RETENTION_DAYS=30
212+
BACKUP_COMPRESSION=true
213+
BACKUP_ENCRYPTION=true
214+
215+
# Backup Storage
216+
BACKUP_STORAGE_TYPE=local
217+
BACKUP_S3_BUCKET=ffprobe-backups-production
218+
BACKUP_ENCRYPTION_KEY=CHANGE_ME_BACKUP_ENCRYPTION_KEY_32_CHARS
219+
220+
# =============================================================================
221+
# NOTIFICATIONS AND ALERTS
222+
# =============================================================================
223+
224+
# Slack Notifications
225+
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK
226+
SLACK_CHANNEL=#ffprobe-alerts
227+
ENABLE_SLACK_ALERTS=true
228+
229+
# PagerDuty Integration
230+
PAGERDUTY_INTEGRATION_KEY=
231+
ENABLE_PAGERDUTY_ALERTS=false
232+
233+
# Email Alerts
234+
235+
ENABLE_EMAIL_ALERTS=true
236+
237+
# =============================================================================
238+
# DEVELOPMENT AND DEBUG (Production: Keep disabled)
239+
# =============================================================================
240+
241+
# Debug Features (NEVER enable in production)
242+
ENABLE_PPROF=false
243+
ENABLE_DEBUG_ENDPOINTS=false
244+
ENABLE_COLORS=false
245+
246+
# Development Tools (NEVER enable in production)
247+
ENABLE_HOT_RELOAD=false
248+
ENABLE_MOCK_AUTH=false
249+
SKIP_AUTH_FOR_HEALTH=true
250+
251+
# =============================================================================
252+
# COMPLIANCE AND AUDIT
253+
# =============================================================================
254+
255+
# GDPR Compliance
256+
ENABLE_GDPR_MODE=true
257+
DATA_RETENTION_DAYS=365
258+
ENABLE_RIGHT_TO_DELETE=true
259+
260+
# Audit Logging
261+
AUDIT_LOG_LEVEL=info
262+
AUDIT_LOG_RETENTION_DAYS=2555 # 7 years
263+
ENABLE_DATA_ACCESS_LOGGING=true
264+
265+
# Privacy
266+
ANONYMIZE_IP_ADDRESSES=true
267+
ENABLE_PRIVACY_MODE=true
268+
269+
# =============================================================================
270+
# FEATURE FLAGS
271+
# =============================================================================
272+
273+
# API Features
274+
ENABLE_BATCH_PROCESSING=true
275+
ENABLE_WEBHOOK_CALLBACKS=true
276+
ENABLE_QUALITY_ANALYSIS=true
277+
ENABLE_HLS_ANALYSIS=true
278+
ENABLE_LLM_INTEGRATION=false
279+
280+
# Storage Features
281+
ENABLE_CLOUD_STORAGE=false
282+
ENABLE_CDN_INTEGRATION=false
283+
ENABLE_STORAGE_COMPRESSION=true
284+
285+
# Advanced Features
286+
ENABLE_AI_ANALYSIS=false
287+
ENABLE_VIDEO_THUMBNAILS=true
288+
ENABLE_SUBTITLE_EXTRACTION=true
289+
290+
# =============================================================================
291+
# THIRD-PARTY INTEGRATIONS
292+
# =============================================================================
293+
294+
# Content Delivery Network
295+
CDN_PROVIDER=cloudflare
296+
CDN_API_KEY=
297+
CDN_ZONE_ID=
298+
299+
# Analytics
300+
GOOGLE_ANALYTICS_ID=
301+
ENABLE_USAGE_ANALYTICS=false
302+
303+
# Error Tracking
304+
SENTRY_DSN=
305+
ENABLE_ERROR_TRACKING=false
306+
307+
# =============================================================================
308+
# MAINTENANCE AND OPERATIONS
309+
# =============================================================================
310+
311+
# Maintenance Windows
312+
MAINTENANCE_MODE=false
313+
MAINTENANCE_MESSAGE="System maintenance in progress"
314+
MAINTENANCE_ALLOWED_IPS=127.0.0.1,10.0.0.0/8
315+
316+
# Operational Settings
317+
ENABLE_GRACEFUL_SHUTDOWN=true
318+
SHUTDOWN_TIMEOUT=30s
319+
STARTUP_DELAY=0s
320+
321+
# Resource Cleanup
322+
CLEANUP_INTERVAL=1h
323+
TEMP_FILE_MAX_AGE=24h
324+
CACHE_MAX_AGE=7d
325+
326+
# =============================================================================
327+
# VALIDATION CHECKSUMS (for deployment verification)
328+
# =============================================================================
329+
330+
# Generate these during deployment
331+
DEPLOYMENT_CHECKSUM=
332+
CONFIG_CHECKSUM=
333+
BINARY_CHECKSUM=
334+
335+
# =============================================================================
336+
# DEPLOYMENT NOTES
337+
# =============================================================================
338+
339+
# Required Actions Before Production Deployment:
340+
# 1. Change ALL passwords and secrets above
341+
# 2. Create SSL certificates and place in SSL_PATH
342+
# 3. Create DATA_PATH directory with proper permissions (755, owner: 1001:1001)
343+
# 4. Configure firewall rules for exposed ports
344+
# 5. Set up monitoring alerts
345+
# 6. Configure backup storage
346+
# 7. Test disaster recovery procedures
347+
# 8. Update DNS records
348+
# 9. Configure load balancer health checks
349+
# 10. Validate security scanning results
350+
351+
# Security Checklist:
352+
# [ ] All default passwords changed
353+
# [ ] SSL certificates installed and valid
354+
# [ ] Firewall configured
355+
# [ ] Rate limiting tested
356+
# [ ] Authentication working
357+
# [ ] HTTPS redirects configured
358+
# [ ] Security headers enabled
359+
# [ ] Vulnerability scan completed
360+
# [ ] Penetration testing completed
361+
# [ ] Backup and restore tested

0 commit comments

Comments
 (0)