
# Die Version der Docker Compose-Datei. Hier verwenden wir Version 3.9.
version: "3.9"
# Der Beginn des 'services' Abschnitts.
services:
  # Name des Services.
  crowdsec:
    # Der Name des Containers, der aus diesem Service erzeugt wird
    container_name: ${SERVICES_CROWDSEC_CONTAINER_NAME}
    # Umgebungsvariablen für den Container.
    env_file: ./config/crowdsec.env
    # Hostname des CrowdSec-Containers, kann über eine Umgebungsvariable angepasst werden.
    hostname: ${SERVICES_CROWDSEC_HOSTNAME}
    # Gesundheitsüberprüfung für den CrowdSec-Service
    healthcheck:
      test: ["CMD", "cscli", "version"]
      interval: 10s
      timeout: 2s
      retries: 5
      start_period: 10s
    # Docker-Image, das für den Container verwendet wird.
    image: ${SERVICES_CROWDSEC_IMAGE}:${SERVICES_CROWDSEC_IMAGE_VERSION}
    # Netzwerke, zu denen der Container gehört.
    networks:
      crowdsec:
        # Feste IPv4-Adresse vergeben.
        ipv4_address: ${SERVICES_CROWDSEC_NETWORKS_CROWDSEC_IPV4}
    # Restart-Strategie für den Container.
    restart: unless-stopped
    # Sicherheitsoptionen für den Container.
    security_opt:
      - no-new-privileges=true
    # Volumes, die vom Container verwendet werden.
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /var/log/auth.log:/var/log/auth.log:ro
      - ./var/log/traefik:/var/log/traefik:ro
      - ./crowdsec/config:/etc/crowdsec
      - ./crowdsec/data:/var/lib/crowdsec/data
      - ./var/log/crowdsec/:/var/log/
      - ./var/log/ip64net/:/var/log/ip64net

  # Der Name des Service
  traefik:
    # Der Name des Containers, der aus diesem Service erzeugt wird
    container_name: ${SERVICES_TRAEFIK_CONTAINER_NAME}
    # Diese Option sorgt dafür, dass der Traefik-Service erst gestartet wird,
    # nachdem der Crowdsec-Service healthy ist
    depends_on:
      crowdsec:
        condition: service_healthy
    # Umgebungsvariablen für den Container.
    env_file: ./config/traefik.env
    # Hostname des Traefik-Containers, kann über eine Umgebungsvariable angepasst werden.
    hostname: ${SERVICES_TRAEFIK_HOSTNAME}
    # Gesundheitsüberprüfung für den Traefik-Service
    healthcheck:
      test: ["CMD", "traefik", "healthcheck", "--ping"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 10s
    # Das Docker-Image, das für diesen Service verwendet wird
    # Version kann über eine Umgebungsvariable angepasst werden.
    image: ${SERVICES_TRAEFIK_IMAGE}:${SERVICES_TRAEFIK_IMAGE_VERSION}
    # Docker Labels für den Traefik-Service. Diese werden für die Traefik-Konfiguration verwendet
    labels:
      traefik.docker.network: proxy
      traefik.enable: "true"
      traefik.http.routers.traefik.entrypoints: websecure
      traefik.http.routers.traefik.middlewares: default@file,traefikAuth@file
      traefik.http.routers.traefik.rule: Host(${SERVICES_TRAEFIK_LABELS_TRAEFIK_HOST})
      traefik.http.routers.traefik.service: api@internal
      traefik.http.routers.traefik.tls: "true"
      traefik.http.routers.traefik.tls.certresolver: http_resolver
      traefik.http.services.traefik.loadbalancer.sticky.cookie.httpOnly: "true"
      traefik.http.services.traefik.loadbalancer.sticky.cookie.secure: "true"
      traefik.http.routers.pingweb.rule: PathPrefix(`/ping`)
      traefik.http.routers.pingweb.service: ping@internal
      traefik.http.routers.pingweb.entrypoints: websecure
    # Die Netzwerke, zu denen dieser Service gehört
    networks:
      crowdsec:
        # IPv4-Adresse des CrowdSec Containers im Traefik-Netwerk: crowdsec
        ipv4_address: ${SERVICES_TRAEFIK_NETWORKS_CROWDSEC_IPV4}
      proxy:
        # IPv4-Adresse des Traefik Containers im Traefik-Netwerk: proxy
        ipv4_address: ${SERVICES_TRAEFIK_NETWORKS_PROXY_IPV4}
    # Die Ports, die diesem Service zugeordnet sind
    ports:
      - "80:80"  # HTTP
      - "443:443"  # HTTPS
    # Der Restart-Policy dieses Service
    restart: unless-stopped
    # Sicherheitsoptionen für diesen Service
    security_opt:
      - no-new-privileges:true
    # Die Volumes, die diesem Service zugeordnet sind
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./var/log/traefik/:/var/log/traefik/
      - ./traefik/traefik.yml:/traefik.yml:ro
      - ./traefik/acme_letsencrypt.json:/acme_letsencrypt.json
      - ./traefik/tls_letsencrypt.json:/tls_letsencrypt.json
      - ./traefik/dynamic_conf.yml:/dynamic_conf.yml

  # Definition des Traefik CrowdSec Bouncer-Dienstes
  traefik_crowdsec_bouncer:
    # Der Name des Containers, der aus diesem Service erzeugt wird
    container_name: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_CONTAINER_NAME}
    # Abhängigkeitsdefinition: Dieser Service wird erst gestartet, wenn der Crowdsec-Service als "healthy" gekennzeichnet ist
    depends_on:
      crowdsec:
        condition: service_healthy
    # Pfad zur .env-Datei für den Traefik CrowdSec Bouncer-Dienst
    env_file: ./config/traefik-crowdsec-bouncer.env
    # Der Hostname des Containers, kann über eine Umgebungsvariable angepasst werden
    hostname: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_HOSTNAME}
    # Docker-Image, das für den Container verwendet wird. Die Version kann über eine Umgebungsvariable angepasst werden
    image: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_IMAGE}:${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_IMAGE_VERSION}
    # Netzwerke, zu denen der Container gehört
    networks:
      crowdsec:
        # Feste IPv4-Adresse für den Container in diesem Netzwerk
        ipv4_address: ${SERVICES_TRAEFIK_CROWDSEC_BOUNCER_NETWORKS_CROWDSEC_IPV4}
    # Restart-Strategie für den Container. 'unless-stopped' bedeutet, dass der Container immer neu gestartet wird, es sei denn, er wird manuell gestoppt
    restart: unless-stopped

    volumes:
    - ./var/log/crowdsec_bouncer:/var/log

  ipv64:
    build:
      dockerfile: dockerfile_php8
      context: php
    hostname: ${SERVICES_IPV64_HOSTNAME}

    container_name: ${SERVICES_IPV64_CONTAINER_NAME}
    restart: unless-stopped

    depends_on:
      traefik:
        condition: service_healthy
    networks:
      crowdsec:
        # Feste IPv4-Adresse für den Container in diesem Netzwerk
        ipv4_address: ${SERVICES_IPV64_NETWORKS_CROWDSEC_IPV4}

    labels:
      traefik.enable: "true"
      traefik.docker.network: $NETWORKS_CROWDSEC_NAME
      traefik.http.routers.ipv64.entrypoints: websecure
      traefik.http.routers.ipv64.rule: "HOST($SERVICES_IPV64_DOMAIN_DEMO)"

      traefik.http.routers.ipv64.tls.certresolver: http_resolver
      traefik.http.routers.ipv64.tls: "true"

    volumes:
      - ./html/demo:/var/www/html
      - ./var/log/ip64net:/var/log                                                 #log-files

# Definition der Netzwerke, die von den Services verwendet werden
networks:
  # Definition des 'proxy' Netzwerks
  proxy:
    # Der Name des Netzwerks, kann über eine Umgebungsvariable angepasst werden
    name: ${NETWORKS_PROXY_NAME}
    # Der Treiber, der für das Netzwerk verwendet wird, hier ist es 'bridge'
    driver: bridge
    # IP-Adress-Management-Konfiguration (IPAM)
    ipam:
      # Konfiguration des IP-Adress-Subnetzes für das Netzwerk
      config:
      - subnet: ${NETWORKS_PROXY_SUBNET_IPV4}
    # Wenn 'attachable' auf 'true' gesetzt ist, können Standalone-Container an dieses Netzwerk angehängt werden
    attachable: true
  # Definition des 'crowdsec' Netzwerks
  crowdsec:
    # Der Name des Netzwerks, kann über eine Umgebungsvariable angepasst werden
    name: ${NETWORKS_CROWDSEC_NAME}
    # Der Treiber, der für das Netzwerk verwendet wird, hier ist es 'bridge'
    driver: bridge
    # IP-Adress-Management-Konfiguration (IPAM)
    ipam:
      # Konfiguration des IP-Adress-Subnetzes für das Netzwerk
      config:
      - subnet: ${NETWORKS_CROWDSEC_SUBNET_IPV4}
    # Wenn 'attachable' auf 'true' gesetzt ist, können Standalone-Container an dieses Netzwerk angehängt werden
    attachable: true
