meldestelle/DOCKER-OPTIMIZATION.md

13 KiB

Docker Configuration Optimization & Security Analysis

Executive Summary

This document outlines the comprehensive analysis, corrections, and optimizations made to all Docker and docker-compose configurations in the Meldestelle project. The optimizations focus on security hardening, performance improvements, and production readiness.

Key Achievements

  • Critical Security Vulnerabilities Fixed: Eliminated hardcoded credentials and exposed secrets
  • Resource Management: Added comprehensive CPU and memory limits for all services
  • Security Hardening: Implemented Docker secrets, non-root users, and security constraints
  • Performance Optimization: Enhanced health checks, startup dependencies, and resource allocation
  • Production Readiness: Added proper volume management, networking, and monitoring

Security Improvements

🔐 Critical Security Issues Resolved

1. Secrets Management

Problem: Hardcoded credentials in environment variables

# BEFORE (INSECURE)
environment:
  POSTGRES_PASSWORD: meldestelle
  KEYCLOAK_CLIENT_SECRET: K5RqonwVOaxPKaXVH4mbthSRbjRh5tOK
  GF_SECURITY_ADMIN_PASSWORD: admin

Solution: Docker secrets with secure file-based management

# AFTER (SECURE)
environment:
  POSTGRES_PASSWORD_FILE: /run/secrets/postgres_password
  KEYCLOAK_CLIENT_SECRET_FILE: /run/secrets/keycloak_client_secret
  GF_SECURITY_ADMIN_PASSWORD__FILE: /run/secrets/grafana_admin_password
secrets:
  - postgres_password
  - keycloak_client_secret
  - grafana_admin_password

2. Container Security Hardening

Added Security Measures:

  • no-new-privileges:true for all containers
  • Non-root user execution where possible
  • Read-only volume mounts for configuration files
  • Secure file permissions (600) for all secrets

3. Network Security

Improvements:

  • Custom isolated network with dedicated subnet (172.20.0.0/16)
  • Proper inter-container communication controls
  • Enhanced CORS and security headers for web applications

🛡️ Security Features Added

Security Feature Implementation Benefit
Docker Secrets File-based secrets management Eliminates hardcoded credentials
Non-root Users Custom user/group for applications Reduces attack surface
Security Options no-new-privileges flag Prevents privilege escalation
Read-only Mounts Config files mounted read-only Prevents runtime tampering
Network Isolation Custom bridge network Isolates container communication
Resource Limits CPU/Memory constraints Prevents resource exhaustion attacks

Performance Optimizations

🚀 Resource Management

Comprehensive Resource Limits

All services now have properly configured resource limits and reservations:

Infrastructure Services:

deploy:
  resources:
    limits:
      cpus: '2.0'
      memory: 2G
    reservations:
      cpus: '0.5'
      memory: 1G

Resource Allocation Summary:

Service CPU Limit Memory Limit CPU Reserved Memory Reserved
PostgreSQL 2.0 2GB 0.5 512MB
Redis 1.0 1GB 0.25 256MB
Keycloak 2.0 2GB 0.5 1GB
API Gateway 2.0 2GB 0.5 1GB
Kafka 2.0 2GB 0.5 512MB
Grafana 1.0 1GB 0.25 256MB
Prometheus 1.0 2GB 0.25 512MB

🔧 Performance Enhancements

1. Optimized Health Checks

# Enhanced health check configuration
healthcheck:
  test: ["CMD", "curl", "--fail", "--max-time", "5", "http://localhost:8080/health/ready"]
  interval: 15s
  timeout: 10s
  retries: 3
  start_period: 60s

2. JVM Optimization

Kafka JVM Settings:

environment:
  KAFKA_HEAP_OPTS: "-Xmx1G -Xms512m"
  KAFKA_JVM_PERFORMANCE_OPTS: "-XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35"

3. Database Performance

PostgreSQL Enhancements:

  • SCRAM-SHA-256 authentication for better security
  • Optimized connection settings
  • Proper data persistence with bind mounts

Redis Optimizations:

  • Memory management with maxmemory and allkeys-lru policy
  • Persistent storage with AOF (Append Only File)
  • Authentication enabled

Configuration Structure

📁 File Organization

The optimized configuration consists of:

├── docker-compose.yml.optimized           # Infrastructure services
├── docker-compose.services.yml.optimized  # Microservices
├── docker-compose.clients.yml.optimized   # Client applications
├── .env.template                          # Environment configuration template
└── docker/
    └── secrets/
        ├── setup-secrets.sh               # Automated secrets generation
        ├── postgres_user.txt              # Database username
        ├── postgres_password.txt          # Database password (generated)
        ├── redis_password.txt             # Redis password (generated)
        ├── keycloak_admin_password.txt    # Keycloak admin password (generated)
        ├── keycloak_client_secret.txt     # API Gateway client secret (generated)
        ├── grafana_admin_user.txt         # Grafana admin username
        ├── grafana_admin_password.txt     # Grafana admin password (generated)
        ├── jwt_secret.txt                 # JWT signing secret (generated)
        └── vnc_password.txt               # VNC access password (generated)

🔄 Profile-based Deployment

The optimized configuration supports selective service deployment:

# Infrastructure only
docker-compose -f docker-compose.yml.optimized up -d

# Infrastructure + Microservices
docker-compose -f docker-compose.yml.optimized \
               -f docker-compose.services.yml.optimized up -d

# Full stack deployment
docker-compose -f docker-compose.yml.optimized \
               -f docker-compose.services.yml.optimized \
               -f docker-compose.clients.yml.optimized up -d

# Selective services with profiles
docker-compose -f docker-compose.services.yml.optimized \
               --profile members --profile horses up -d

Migration Guide

🚀 Quick Start

1. Generate Secrets

# Generate all required secrets
./docker/secrets/setup-secrets.sh --all

# Or generate individually
./docker/secrets/setup-secrets.sh --generate
./docker/secrets/setup-secrets.sh --validate

2. Configure Environment

# Copy template and customize
cp .env.template .env

# Edit configuration values
nano .env

3. Create Data Directories

# Create persistent data directories
mkdir -p ./data/{postgres,redis,prometheus,grafana,keycloak,consul,monitoring,desktop-app}

4. Deploy Services

# Start infrastructure
docker-compose -f docker-compose.yml.optimized up -d

# Verify all services are healthy
docker-compose -f docker-compose.yml.optimized ps

# Add microservices
docker-compose -f docker-compose.yml.optimized \
               -f docker-compose.services.yml.optimized up -d

# Add client applications
docker-compose -f docker-compose.yml.optimized \
               -f docker-compose.services.yml.optimized \
               -f docker-compose.clients.yml.optimized up -d

🔄 Migration from Original Configuration

Step 1: Backup Current Setup

# Stop existing services
docker-compose down

# Backup current data (optional)
cp -r data/ data.backup/

Step 2: Update Configuration

# Generate secrets first
./docker/secrets/setup-secrets.sh --all

# Update environment configuration
cp .env.template .env
# Edit .env as needed

Step 3: Deploy Optimized Configuration

# Deploy with new configuration
docker-compose -f docker-compose.yml.optimized up -d

Security Best Practices

🛡️ Production Security Checklist

  • Secrets Generated: Run secrets setup script
  • File Permissions: Ensure secret files have 600 permissions
  • Network Isolation: Use custom Docker networks
  • Resource Limits: All services have CPU/memory limits
  • Non-root Users: Applications run as non-privileged users
  • Read-only Mounts: Configuration mounted read-only
  • Security Options: no-new-privileges enabled
  • Health Checks: All critical services have health checks
  • Backup Strategy: Regular data backups configured
  • Monitoring: Prometheus and Grafana configured
  • Log Management: Centralized logging configured

🔐 Security Monitoring

Access URLs (Default Configuration)

Security Metrics to Monitor

  • Failed authentication attempts
  • Resource usage patterns
  • Container restart frequency
  • Network connection anomalies
  • Secret access patterns

Troubleshooting

🔍 Common Issues and Solutions

Issue 1: Secret File Permissions

Problem: Containers cannot read secret files Solution:

# Fix permissions
chmod 600 docker/secrets/*.txt

# Or regenerate with correct permissions
./docker/secrets/setup-secrets.sh --force

Issue 2: Resource Constraints

Problem: Services failing due to resource limits Solution:

# Check resource usage
docker stats

# Adjust limits in docker-compose files or increase system resources

Issue 3: Network Connectivity

Problem: Services cannot communicate Solution:

# Check network configuration
docker network inspect meldestelle_meldestelle-network

# Verify service health
docker-compose -f docker-compose.yml.optimized ps

Issue 4: Volume Mount Issues

Problem: Data not persisting or permission errors Solution:

# Create data directories with correct permissions
mkdir -p ./data/{postgres,redis,prometheus,grafana,keycloak,consul}
chown -R 999:999 ./data/postgres  # PostgreSQL user
chown -R 472:0 ./data/grafana     # Grafana user

📊 Health Check Commands

# Check all service status
docker-compose -f docker-compose.yml.optimized ps

# View service logs
docker-compose -f docker-compose.yml.optimized logs [service-name]

# Check resource usage
docker stats

# Validate secrets
./docker/secrets/setup-secrets.sh --validate

# Test connectivity
docker exec meldestelle-api-gateway curl -f http://postgres:5432

Performance Tuning

🎯 Resource Optimization Guidelines

Memory Allocation Strategy

  1. Infrastructure Services: Higher memory allocation for databases and messaging
  2. Application Services: Balanced CPU/memory for microservices
  3. Client Applications: Lower resource requirements

CPU Allocation Strategy

  1. I/O Bound Services (Database, Redis): Moderate CPU, high memory
  2. Compute Bound Services (Application logic): Higher CPU allocation
  3. Static Content Services (Web apps): Lower overall resources

JVM Tuning for Java Services

environment:
  JAVA_OPTS: |
    -XX:MaxRAMPercentage=75.0
    -XX:+UseG1GC
    -XX:+UseStringDeduplication
    -XX:+UseContainerSupport
    -Djava.security.egd=file:/dev/./urandom    

Monitoring and Observability

📈 Metrics Collection

Prometheus Metrics

  • Container resource usage
  • Application performance metrics
  • Health check status
  • Network traffic patterns

Grafana Dashboards

  • Infrastructure overview
  • Application performance
  • Security events
  • Resource utilization trends

Logging Strategy

  • Centralized logging via Docker logs
  • Structured JSON logging for applications
  • Log rotation and retention policies
  • Security event logging

Conclusion

The Docker configuration optimization provides:

  1. Enhanced Security: Complete elimination of hardcoded credentials and implementation of Docker secrets
  2. Production Readiness: Comprehensive resource limits, health checks, and monitoring
  3. Improved Performance: Optimized resource allocation and container configurations
  4. Operational Excellence: Automated secret management, comprehensive documentation, and troubleshooting guides
  5. Scalability: Profile-based deployment and modular service architecture

Next Steps

  1. Deploy optimized configuration in development environment
  2. Validate all security measures are properly implemented
  3. Monitor performance metrics and adjust resource limits as needed
  4. Implement backup and recovery procedures for persistent data
  5. Set up automated monitoring and alerting for production deployment

For questions or issues with the optimized configuration, refer to the troubleshooting section or consult the detailed configuration comments in the docker-compose files.