Files

Prowler Reverse Proxy Configuration

Ready-to-use nginx configuration for running Prowler behind a reverse proxy.

Problem

Prowler's default Docker setup exposes two separate services:

  • UI on port 3000
  • API on port 8080

This causes CORS issues and authentication failures (especially SAML SSO) when accessed through an external reverse proxy, since the proxy typically exposes a single domain.

Solution

This adds an nginx container that unifies both services behind a single port, correctly forwarding headers so that Django generates proper URLs for SAML ACS callbacks and API responses.

Quick Start

From the prowler root directory:

docker compose -f docker-compose.yml \
  -f contrib/reverse-proxy/docker-compose.reverse-proxy.yml \
  up -d

Access Prowler at http://localhost (port 80).

With an External Reverse Proxy

Point your external reverse proxy to the prowler-nginx container on port 80.

Environment Variables

Variable Default Description
PROWLER_PROXY_PORT 80 Port exposed by the nginx proxy

Example: Traefik

services:
  nginx:
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.prowler.rule=Host(`prowler.example.com`)"
      - "traefik.http.routers.prowler.tls.certresolver=letsencrypt"
      - "traefik.http.services.prowler.loadbalancer.server.port=80"

Example: Caddy

prowler.example.com {
    reverse_proxy prowler-nginx:80
}

SAML SSO

If using SAML SSO behind a reverse proxy, also set the SAML_ACS_BASE_URL environment variable:

SAML_ACS_BASE_URL=https://prowler.example.com

Architecture

Internet -> External Reverse Proxy -> prowler-nginx:80
                                        |-- /api/*          -> prowler-api:8080
                                        |-- /accounts/saml/ -> prowler-api:8080
                                        +-- /*              -> prowler-ui:3000