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.
210 lines
5.6 KiB
210 lines
5.6 KiB
# TimeSafari Docker Compose Configuration
|
|
# Author: Matthew Raymer
|
|
# Description: Multi-environment Docker Compose setup for TimeSafari
|
|
#
|
|
# Usage:
|
|
# Development: docker-compose up dev
|
|
# Staging: docker-compose up staging
|
|
# Production: docker-compose up production
|
|
# Custom: BUILD_MODE=staging docker-compose up custom
|
|
#
|
|
# Environment Variables:
|
|
# BUILD_MODE: development, staging, or production (default: production)
|
|
# NODE_ENV: node environment (default: production)
|
|
# VITE_PLATFORM: vite platform (default: web)
|
|
# VITE_PWA_ENABLED: enable PWA (default: true)
|
|
# VITE_DISABLE_PWA: disable PWA (default: false)
|
|
# PORT: port to expose (default: 80 for production, 5173 for dev)
|
|
# ENV_FILE: environment file to use (default: .env.production)
|
|
#
|
|
# See .env files for application-specific configuration
|
|
# VITE_APP_SERVER: Application server URL
|
|
# VITE_DEFAULT_ENDORSER_API_SERVER: Endorser API server URL
|
|
|
|
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}
|
|
VITE_PLATFORM: ${VITE_PLATFORM:-web}
|
|
VITE_PWA_ENABLED: ${VITE_PWA_ENABLED:-true}
|
|
VITE_DISABLE_PWA: ${VITE_DISABLE_PWA:-false}
|
|
restart: unless-stopped
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost/health"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 40s
|
|
|
|
services:
|
|
# Development service with hot reloading
|
|
dev:
|
|
<<: *defaults
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile
|
|
target: development
|
|
args:
|
|
BUILD_MODE: development
|
|
NODE_ENV: development
|
|
VITE_PLATFORM: web
|
|
VITE_PWA_ENABLED: true
|
|
VITE_DISABLE_PWA: false
|
|
ports:
|
|
- "${DEV_PORT:-5173}:5173"
|
|
volumes:
|
|
- .:/app
|
|
- /app/node_modules
|
|
environment:
|
|
- NODE_ENV=development
|
|
- VITE_PLATFORM=web
|
|
- VITE_PWA_ENABLED=true
|
|
- VITE_DISABLE_PWA=false
|
|
env_file:
|
|
- ${DEV_ENV_FILE:-.env.development}
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:5173"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 40s
|
|
|
|
# Staging service for testing
|
|
staging:
|
|
<<: *defaults
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile
|
|
target: staging
|
|
args:
|
|
BUILD_MODE: staging
|
|
NODE_ENV: staging
|
|
VITE_PLATFORM: web
|
|
VITE_PWA_ENABLED: true
|
|
VITE_DISABLE_PWA: false
|
|
ports:
|
|
- "${STAGING_PORT:-8080}:80"
|
|
environment:
|
|
- NODE_ENV=staging
|
|
- VITE_PLATFORM=web
|
|
- VITE_PWA_ENABLED=true
|
|
- VITE_DISABLE_PWA=false
|
|
env_file:
|
|
- ${STAGING_ENV_FILE:-.env.staging}
|
|
|
|
# Production service
|
|
production:
|
|
<<: *defaults
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile
|
|
target: production
|
|
args:
|
|
BUILD_MODE: production
|
|
NODE_ENV: production
|
|
VITE_PLATFORM: web
|
|
VITE_PWA_ENABLED: true
|
|
VITE_DISABLE_PWA: false
|
|
ports:
|
|
- "${PROD_PORT:-80}:80"
|
|
environment:
|
|
- NODE_ENV=production
|
|
- VITE_PLATFORM=web
|
|
- VITE_PWA_ENABLED=true
|
|
- VITE_DISABLE_PWA=false
|
|
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
|
|
VITE_PLATFORM: web
|
|
VITE_PWA_ENABLED: true
|
|
VITE_DISABLE_PWA: false
|
|
ports:
|
|
- "${SSL_PORT:-443}:443"
|
|
- "${HTTP_PORT:-80}:80"
|
|
environment:
|
|
- NODE_ENV=production
|
|
- VITE_PLATFORM=web
|
|
- VITE_PWA_ENABLED=true
|
|
- VITE_DISABLE_PWA=false
|
|
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}
|
|
VITE_PLATFORM: ${VITE_PLATFORM:-web}
|
|
VITE_PWA_ENABLED: ${VITE_PWA_ENABLED:-true}
|
|
VITE_DISABLE_PWA: ${VITE_DISABLE_PWA:-false}
|
|
ports:
|
|
- "${CUSTOM_PORT:-8080}:${CUSTOM_INTERNAL_PORT:-80}"
|
|
environment:
|
|
- NODE_ENV=${NODE_ENV:-production}
|
|
- VITE_PLATFORM=${VITE_PLATFORM:-web}
|
|
- VITE_PWA_ENABLED=${VITE_PWA_ENABLED:-true}
|
|
- VITE_DISABLE_PWA=${VITE_DISABLE_PWA:-false}
|
|
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
|