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

# 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