# =============================================================================
# barox SecPen - Apache VirtualHost (HTTP-only, hinter Reverse Proxy)
# Ablage: /etc/apache2/sites-available/barox-secpen.conf
# Aktivieren: a2ensite barox-secpen && systemctl reload apache2
#
# TLS/HTTPS wird vom vorgelagerten Reverse Proxy terminiert. Dieser vhost
# lauscht nur auf HTTP und darf ausschliesslich vom Proxy erreichbar sein
# (z. B. Bind an 127.0.0.1 oder per Firewall auf die Proxy-IP beschraenken).
#
# Benoetigte Module: rewrite, headers, expires, remoteip
#   a2enmod rewrite headers expires remoteip
#
# WICHTIG (Laravel): Damit url()/redirect() https erzeugen und die echte
# Client-IP ankommt, muss App\Http\Middleware\TrustProxies den Proxy als
# vertrauenswuerdig fuehren (z. B. protected $proxies = '*'; bzw. die Proxy-IP)
# und die Header X-Forwarded-For / X-Forwarded-Proto auswerten.
# =============================================================================

<VirtualHost *:80>
    ServerName secpen.barox.io
    ServerAdmin secpen@barox.io

    DocumentRoot /var/www/html/barox-secpen/public

    # ---------------------------------------------------------- Reverse Proxy
    # Echte Client-IP aus dem vom Proxy gesetzten Header uebernehmen, damit
    # Logs und Laravel (request()->ip()) die tatsaechliche Herkunft sehen.
    # RemoteIPTrustedProxy auf die IP(s) des Reverse Proxy anpassen!
    <IfModule mod_remoteip.c>
        RemoteIPHeader X-Forwarded-For
        RemoteIPTrustedProxy 192.168.5.246
    </IfModule>

    # ------------------------------------------------------------ Verzeichnis
    <Directory /var/www/html/barox-secpen/public>
        Options -Indexes -MultiViews +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # Anwendungsverzeichnisse sind nie direkt erreichbar. Das DocumentRoot
    # zeigt bereits auf public/; diese Regeln sind eine zweite Absicherung.
    <DirectoryMatch "^/var/www/html/barox-secpen/(app|bootstrap|config|database|resources|routes|storage|tests|vendor|deploy|docs)">
        Require all denied
    </DirectoryMatch>

    <FilesMatch "^(\.env.*|composer\.(json|lock)|package\.json|phpunit\.xml|artisan)$">
        Require all denied
    </FilesMatch>

    # ------------------------------------------------------------- Header ---
    # Die Anwendung setzt CSP, HSTS und die uebrigen Header selbst
    # (App\Http\Middleware\SecurityHeaders). Hier nur ergaenzende Absicherung.
    # HSTS gehoert an den TLS-terminierenden Reverse Proxy, nicht hierher.
    <IfModule mod_headers.c>
        Header always set X-Content-Type-Options "nosniff"
        Header always set X-Frame-Options "DENY"
        Header unset X-Powered-By
        Header always unset Server
        # Statische Assets duerfen zwischengespeichert werden.
        <FilesMatch "\.(css|js|woff2?|otf|png|jpg|svg|ico)$">
            Header set Cache-Control "public, max-age=2592000, immutable"
        </FilesMatch>
    </IfModule>

    # Hinweis: ServerTokens und TraceEnable sind serverweite Direktiven und
    # sind im <VirtualHost> NICHT erlaubt (Syntaxfehler). Debian setzt sie
    # bereits global in /etc/apache2/conf-available/security.conf
    # (ServerTokens Prod, TraceEnable Off) - dort ggf. pruefen/aktivieren.
    ServerSignature Off

    # ---------------------------------------------------------------- PHP ---
    # Empfohlen: PHP-FPM mit eigenem Pool (siehe deploy/php-fpm-barox-secpen.conf).
    # Socket-Pfad an die installierte PHP-Version anpassen (z. B. php8.5-fpm).
    <IfModule proxy_fcgi_module>
        <FilesMatch "\.php$">
            SetHandler "proxy:unix:/run/php/php8.5-fpm-barox-secpen.sock|fcgi://localhost"
        </FilesMatch>
    </IfModule>

    # Uploads begrenzen (zusaetzlich zur Anwendungsvalidierung).
    LimitRequestBody 26214400

    ErrorLog  ${APACHE_LOG_DIR}/barox-secpen-error.log
    CustomLog ${APACHE_LOG_DIR}/barox-secpen-access.log combined
</VirtualHost>
