You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							152 lines
						
					
					
						
							4.0 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							152 lines
						
					
					
						
							4.0 KiB
						
					
					
				| # TimeSafari Docker Compose Configuration | |
| # Author: Matthew Raymer | |
| # Description: Multi-environment Docker Compose setup for TimeSafari | |
| # | |
| # IMPORTANT: Build web assets first using npm scripts before running docker-compose | |
| # | |
| # Usage: | |
| #   Development: npm run build:web:build -- --mode development && docker-compose up dev | |
| #   Test: npm run build:web:build -- --mode test && docker-compose up test | |
| #   Production: npm run build:web:build -- --mode production && docker-compose up production | |
| #   Custom: BUILD_MODE=test npm run build:web:build -- --mode test && docker-compose up custom | |
| # | |
| # Environment Variables: | |
| #   BUILD_MODE: development, test, or production (default: production) | |
| #   NODE_ENV: node environment (default: production) | |
| #   PORT: port to expose (default: 80 for production, 8080 for test) | |
| #   ENV_FILE: environment file to use (default: .env.production) | |
| # | |
| # Note: For development, use npm run build:web directly (no Docker needed) | |
| 
 | |
| version: '3.8' | |
| 
 | |
| # Default values that can be overridden | |
| x-defaults: &defaults | |
|   build: | |
|     context: . | |
|     dockerfile: Dockerfile | |
|     args: | |
|       BUILD_MODE: ${BUILD_MODE:-production} | |
|       NODE_ENV: ${NODE_ENV:-production} | |
|   restart: unless-stopped | |
|   healthcheck: | |
|     test: ["CMD", "curl", "-f", "http://localhost/health"] | |
|     interval: 30s | |
|     timeout: 10s | |
|     retries: 3 | |
|     start_period: 40s | |
| 
 | |
| services: | |
|   # Test service for testing environment | |
|   test: | |
|     <<: *defaults | |
|     build: | |
|       context: . | |
|       dockerfile: Dockerfile | |
|       target: test | |
|       args: | |
|         BUILD_MODE: test | |
|         NODE_ENV: test | |
|     ports: | |
|       - "${TEST_PORT:-8080}:80" | |
|     environment: | |
|       - NODE_ENV=test | |
|       - BUILD_MODE=test | |
|     env_file: | |
|       - ${TEST_ENV_FILE:-.env.test} | |
| 
 | |
|   # Production service | |
|   production: | |
|     <<: *defaults | |
|     build: | |
|       context: . | |
|       dockerfile: Dockerfile | |
|       target: production | |
|       args: | |
|         BUILD_MODE: production | |
|         NODE_ENV: production | |
|     ports: | |
|       - "${PROD_PORT:-80}:80" | |
|     environment: | |
|       - NODE_ENV=production | |
|       - BUILD_MODE=production | |
|     env_file: | |
|       - ${PROD_ENV_FILE:-.env.production} | |
| 
 | |
|   # Production service with SSL (requires certificates) | |
|   production-ssl: | |
|     <<: *defaults | |
|     build: | |
|       context: . | |
|       dockerfile: Dockerfile | |
|       target: production | |
|       args: | |
|         BUILD_MODE: production | |
|         NODE_ENV: production | |
|     ports: | |
|       - "${SSL_PORT:-443}:443" | |
|       - "${HTTP_PORT:-80}:80" | |
|     environment: | |
|       - NODE_ENV=production | |
|       - BUILD_MODE=production | |
|     env_file: | |
|       - ${PROD_ENV_FILE:-.env.production} | |
|     volumes: | |
|       - ./ssl:/etc/nginx/ssl:ro | |
|       - ./docker/nginx-ssl.conf:/etc/nginx/conf.d/default.conf:ro | |
|     healthcheck: | |
|       test: ["CMD", "curl", "-f", "https://localhost/health"] | |
|       interval: 30s | |
|       timeout: 10s | |
|       retries: 3 | |
|       start_period: 40s | |
| 
 | |
|   # Custom service - configurable via environment variables | |
|   custom: | |
|     <<: *defaults | |
|     build: | |
|       context: . | |
|       dockerfile: Dockerfile | |
|       target: ${BUILD_TARGET:-production} | |
|       args: | |
|         BUILD_MODE: ${BUILD_MODE:-production} | |
|         NODE_ENV: ${NODE_ENV:-production} | |
|     ports: | |
|       - "${CUSTOM_PORT:-8080}:${CUSTOM_INTERNAL_PORT:-80}" | |
|     environment: | |
|       - NODE_ENV=${NODE_ENV:-production} | |
|       - BUILD_MODE=${BUILD_MODE:-production} | |
|     env_file: | |
|       - ${CUSTOM_ENV_FILE:-.env.production} | |
|     healthcheck: | |
|       test: ["CMD", "curl", "-f", "http://localhost:${CUSTOM_INTERNAL_PORT:-80}/health"] | |
|       interval: 30s | |
|       timeout: 10s | |
|       retries: 3 | |
|       start_period: 40s | |
| 
 | |
|   # Load balancer for production (optional) | |
|   nginx-lb: | |
|     image: nginx:alpine | |
|     ports: | |
|       - "${LB_PORT:-80}:80" | |
|       - "${LB_SSL_PORT:-443}:443" | |
|     volumes: | |
|       - ./docker/nginx-lb.conf:/etc/nginx/nginx.conf:ro | |
|       - ./ssl:/etc/nginx/ssl:ro | |
|     depends_on: | |
|       - production | |
|     restart: unless-stopped | |
|     healthcheck: | |
|       test: ["CMD", "curl", "-f", "http://localhost/health"] | |
|       interval: 30s | |
|       timeout: 10s | |
|       retries: 3 | |
|       start_period: 40s | |
| 
 | |
| networks: | |
|   default: | |
|     driver: bridge | |
|     ipam: | |
|       config: | |
|         - subnet: 172.20.0.0/16  |