Synology Bunkerweb : Reverse Proxy WAF OpenSource

Titux

Apprenti
Membre Confirmé
1 Novembre 2023
58
48
33
Non pas besoin de compte.

J'ai un docker-compose qui me lance bunkerweb via container manager.
Par contre, je n'ai toujours pas eu le temps de faire les tests.
J'ai des doutes sur la configuration pour qu'il puisse lire les logs des autres instances docker et donc faire le bon taff.

Voici le docker-compose
YAML:
# =============================================================================
# FICHIER 1/2 : docker-compose.yml
# =============================================================================
# Configuration BunkerWeb pour Synology avec fichier .env séparé
# Documentation: https://docs.bunkerweb.io/latest/web-ui/
# =============================================================================

version: "3.9"

# Variables communes pour éviter les répétitions
x-bw-env: &bw-env
  TZ: ${TZ:-Europe/Paris}
  API_WHITELIST_IP: ${API_WHITELIST_IP}
  DATABASE_URI: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@bw-db:5432/${POSTGRES_DB}

# Configuration des logs (rotation automatique)
x-logging: &default-logging
  driver: json-file
  options:
    max-size: ${LOG_MAX_SIZE:-10m}
    max-file: ${LOG_MAX_FILE:-10}

services:
  # ---------------------------------------------------------------------------
  # BUNKERWEB - Reverse Proxy WAF Principal
  # ---------------------------------------------------------------------------
  bunkerweb:
    container_name: bunkerweb
    image: bunkerity/bunkerweb:1.6.8
    restart: unless-stopped
    networks:
      - bw-universe
      - bw-services
    ports:
      - "${BW_HTTP_PORT}:8080/tcp"
      - "${BW_HTTPS_PORT}:8443/tcp"
      - "${BW_HTTPS_PORT}:8443/udp"
    environment:
      <<: *bw-env
      # Désactive le serveur par défaut pour éviter les conflits
      DISABLE_DEFAULT_SERVER: ${DISABLE_DEFAULT_SERVER:-yes}
      # Autorise les connexions HTTP sans nom de domaine
      SERVER_NAME: ""
      # Sécurité
      USE_MODSECURITY: ${USE_MODSECURITY:-yes}
      USE_MODSECURITY_CRS: ${USE_MODSECURITY_CRS:-yes}
      USE_ANTIBOT: ${USE_ANTIBOT:-cookie}
      USE_CROWDSEC: ${USE_CROWDSEC:-yes}
      CROWDSEC_API: ${CROWDSEC_API}
      USE_DNSBL: ${USE_DNSBL:-yes}
      USE_COUNTRY: ${USE_COUNTRY:-yes}
      WHITELIST_COUNTRY: ${WHITELIST_COUNTRY:-FR}
      USE_LIMIT_REQ: ${USE_LIMIT_REQ:-yes}
      LIMIT_REQ_RATE: ${LIMIT_REQ_RATE:-20r/s}
    volumes:
      - ${BW_DATA_PATH}:/data
      - ${BW_CACHE_PATH}:/cache
      - ${BW_LOGS_PATH}:/var/log/bunkerweb
    logging: *default-logging
    depends_on:
      bw-db:
        condition: service_healthy

  # ---------------------------------------------------------------------------
  # SCHEDULER - Gestion de la configuration
  # ---------------------------------------------------------------------------
  bw-scheduler:
    container_name: bw-scheduler
    image: bunkerity/bunkerweb-scheduler:1.6.8
    restart: unless-stopped
    networks:
      - bw-universe
      - bw-db-net
    environment:
      <<: *bw-env
      BUNKERWEB_INSTANCES: ${BUNKERWEB_INSTANCES}
      MULTISITE: ${MULTISITE:-yes}
       # SERVER_NAME vide = accès par IP
      SERVER_NAME: ""
      UI_HOST: ${UI_HOST}
      SERVE_FILES: ${SERVE_FILES:-no}
      DISABLE_DEFAULT_SERVER: ${DISABLE_DEFAULT_SERVER:-yes}
      USE_CLIENT_CACHE: ${USE_CLIENT_CACHE:-yes}
      USE_GZIP: ${USE_GZIP:-yes}
       # Autorise l'accès sans nom de domaine
      USE_CUSTOM_HTTPS: "yes"
      CUSTOM_HTTPS_CERT: ""
      CUSTOM_HTTPS_KEY: ""
    volumes:
      - ${BW_DATA_PATH}:/data
      - ${BW_CACHE_PATH}:/cache
    logging: *default-logging
    depends_on:
      - bunkerweb
      - bw-db

  # ---------------------------------------------------------------------------
  # WEB UI - Interface d'administration
  # ---------------------------------------------------------------------------
  bw-ui:
    container_name: bw-ui
    image: bunkerity/bunkerweb-ui:1.6.8
    restart: unless-stopped
    networks:
      - bw-universe
      - bw-db-net
    ports:
      - "${UI_PORT}:7000"
    environment:
      <<: *bw-env
      ADMIN_USERNAME: ${ADMIN_USERNAME}
      ADMIN_PASSWORD: ${ADMIN_PASSWORD}
      #TOTP_ENCRYPTION_KEYS: ${TOTP_ENCRYPTION_KEYS}
    volumes:
      - ${BW_DATA_PATH}:/data
      - ${BW_LOGS_PATH}:/var/log/bunkerweb:ro
    logging: *default-logging
    depends_on:
      - bw-db

  # ---------------------------------------------------------------------------
  # POSTGRESQL - Base de données
  # ---------------------------------------------------------------------------
  bw-db:
    container_name: bw-db
    image: postgres:17
    restart: unless-stopped
    networks:
      - bw-db-net
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      PGDATA: /var/lib/postgresql/data/pgdata
      # Locale compatible avec toutes les images PostgreSQL
      LANG: C.UTF-8
      LC_ALL: C.UTF-8
    volumes:
      - ${BW_DB_PATH}:/var/lib/postgresql/data
    logging: *default-logging
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 30s
      timeout: 10s
      retries: 3
    command:
      - postgres
      - -c
      - max_connections=50
      - -c
      - shared_buffers=128MB
      - -c
      - effective_cache_size=512MB

  # ---------------------------------------------------------------------------
  # CROWDSEC - Protection collaborative
  # ---------------------------------------------------------------------------
  crowdsec:
    container_name: crowdsec
    image: crowdsecurity/crowdsec:latest
    restart: unless-stopped
    networks:
      - bw-universe
    environment:
      TZ: ${TZ:-Europe/Paris}
      COLLECTIONS: ${CROWDSEC_COLLECTIONS}
      LEVEL_INFO: ${CROWDSEC_LOG_LEVEL:-info}
    volumes:
      - ${CROWDSEC_CONFIG_PATH}:/etc/crowdsec
      - ${CROWDSEC_DATA_PATH}:/var/lib/crowdsec/data
      - ${BW_LOGS_PATH}:/var/log/bunkerweb:ro
    logging: *default-logging

# =============================================================================
# RÉSEAUX - Architecture 3 niveaux
# =============================================================================
networks:
  bw-universe:
    driver: bridge
    enable_ipv6: false
    ipam:
      config:
        - subnet: ${BW_UNIVERSE_SUBNET}
    driver_opts:
      com.docker.network.bridge.name: br-bw-universe
      com.docker.network.bridge.enable_ip_masquerade: "true"

  bw-services:
    driver: bridge
    enable_ipv6: false
    ipam:
      config:
        - subnet: ${BW_SERVICES_SUBNET}
    driver_opts:
      com.docker.network.bridge.name: br-bw-services

  bw-db-net:
    driver: bridge
    enable_ipv6: false
    ipam:
      config:
        - subnet: ${BW_DB_SUBNET}
    driver_opts:
      com.docker.network.bridge.name: br-bw-db

Et le fichier ;env
Markdown (GitHub flavored):
# =============================================================================
# FICHIER 2/2 : .env
# =============================================================================
# Créez ce fichier dans le même répertoire que docker-compose.yml
# Documentation: https://docs.docker.com/compose/environment-variables/
# =============================================================================
# ATTENTION : Ne JAMAIS commiter ce fichier dans Git !
# Ajoutez ".env" dans votre .gitignore
# =============================================================================

# -----------------------------------------------------------------------------
# PORTS SYNOLOGY (80 et 443 sont réservés par DSM)
# -----------------------------------------------------------------------------
BW_HTTP_PORT=          # HTTP - Configurer NAT: 80 externe → 9880 NAS
BW_HTTPS_PORT=         # HTTPS/QUIC - Configurer NAT: 443 externe → 9443 NAS
UI_PORT=7000               # Interface Web UI (accès interne uniquement)

# -----------------------------------------------------------------------------
# CHEMINS DE VOLUMES SYNOLOGY
# -----------------------------------------------------------------------------
BW_DATA_PATH=/volume2/docker/bunkerweb/data
BW_CACHE_PATH=/volume2/docker/bunkerweb/cache
BW_LOGS_PATH=/volume2/docker/bunkerweb/logs
BW_DB_PATH=/volume2/docker/bunkerweb/db
CROWDSEC_CONFIG_PATH=/volume2/docker/bunkerweb/crowdsec/config
CROWDSEC_DATA_PATH=/volume2/docker/bunkerweb/crowdsec/data

# -----------------------------------------------------------------------------
# CONFIGURATION RÉSEAU
# -----------------------------------------------------------------------------
# Subnets pour les 3 réseaux Docker isolés
BW_UNIVERSE_SUBNET=10.20.30.0/24      # Gestion BunkerWeb
BW_SERVICES_SUBNET=10.20.31.0/24      # Applications web
BW_DB_SUBNET=10.20.32.0/24            # Base de données

# API Whitelist - CRITIQUE : doit inclure le réseau bw-universe
#API_WHITELIST_IP=API_WHITELIST_IP=127.0.0.0/8 10.20.30.0/24

# -----------------------------------------------------------------------------
# POSTGRESQL - BASE DE DONNÉES
# -----------------------------------------------------------------------------
#  CHANGEZ CES VALEURS AVANT LE DÉPLOIEMENT !
POSTGRES_DB=db
POSTGRES_USER=bunkerweb
POSTGRES_PASSWORD=

# -----------------------------------------------------------------------------
# WEB UI - INTERFACE D'ADMINISTRATION
# -----------------------------------------------------------------------------
#  CHANGEZ CES VALEURS AVANT LE DÉPLOIEMENT !
# Le mot de passe doit contenir au moins 8 caractères avec :
# - 1 minuscule, 1 majuscule, 1 chiffre, 1 caractère spécial
ADMIN_USERNAME=
ADMIN_PASSWORD=

# Clé de chiffrement pour 2FA (TOTP)
# Générer avec : python3 -c "from passlib import totp; print(totp.generate_secret())"
#  GÉNÉREZ UNE NOUVELLE CLÉ AVANT LE DÉPLOIEMENT !
#TOTP_ENCRYPTION_KEYS=CHANGEME_GENERATE_WITH_PASSLIB

# -----------------------------------------------------------------------------
# BUNKERWEB - CONFIGURATION
# -----------------------------------------------------------------------------
BUNKERWEB_INSTANCES=bunkerweb
MULTISITE=yes
SERVER_NAME=                           # Défini via l'UI
UI_HOST=http://192.168.*.***:7000
SERVE_FILES=no
DISABLE_DEFAULT_SERVER=yes
USE_CLIENT_CACHE=yes
USE_GZIP=yes

# -----------------------------------------------------------------------------
# SÉCURITÉ - MODSECURITY
# -----------------------------------------------------------------------------
USE_MODSECURITY=yes
USE_MODSECURITY_CRS=yes
USE_ANTIBOT=cookie

# -----------------------------------------------------------------------------
# SÉCURITÉ - CROWDSEC
# -----------------------------------------------------------------------------
USE_CROWDSEC=yes
CROWDSEC_API=http://crowdsec:8080
CROWDSEC_COLLECTIONS=crowdsecurity/nginx crowdsecurity/http-cve bunkerity/bunkerweb Dominic-Wagner/vaultwarden crowdsecurity/base-http-scenarios
CROWDSEC_LOG_LEVEL=info

# -----------------------------------------------------------------------------
# SÉCURITÉ - FILTRES GÉOGRAPHIQUES ET RATE LIMITING
# -----------------------------------------------------------------------------
USE_DNSBL=yes
USE_COUNTRY=yes
WHITELIST_COUNTRY=FR                   # Code ISO pays autorisés (séparés par espaces)
USE_LIMIT_REQ=yes
LIMIT_REQ_RATE=20r/s                   # Taux de requêtes maximum

# -----------------------------------------------------------------------------
# LOGS - ROTATION
# -----------------------------------------------------------------------------
LOG_MAX_SIZE=10m                       # Taille max par fichier de log
LOG_MAX_FILE=10                        # Nombre de fichiers conservés

# -----------------------------------------------------------------------------
# FUSEAU HORAIRE
# -----------------------------------------------------------------------------
TZ=Europe/Paris

Mais on est bien hors sujet. Je suis partant pour créer un sujet reverse proxy.
D'autre ici utilise NPMPlus + Crowdsec + Fail2ban + geoipupdate. Je serais curieux de voir comment ils ont fait sur un Synology.
Pok @EVO @PackTu @MilesTEG (et autre) partant pour discuter du sujet ? On le fait dans quelle rubrique ?
 
  • J'aime
Réactions: morgyann
@Titux
Je pense qu’il serait préférable de faire un nouveau sujet.
Je vais déplacer ton message mais tu le veux dans quelle section ? Tu vas mettre bunkerweb sur le Syno ?
 
  • J'aime
Réactions: morgyann
@Titux
J’ai regardé un peu cet outils et je suis intrigué.
Il me paraît hyper puissant mais j’ai peur que la configuration de mes proxy hosts soient une tannées car il semble qu’il y ait pléthore de réglages…

L’as-tu mis en place ?

Autre question : pourquoi ne pas avoir choisi l’image aio qui contient tout ce que tu as mis ?
 
Salut @MilesTEG,
Non, je ne l'ai pas encore mis en production. Le stack est lancé sur mon Synology mais je n'ai pas eu le temps de faire les tests.
Je suis en vacances cette semaine, mais mon temps est déjà pris avec les enfants et madame. Et surtout la neige ⛷️ :cool:😁

Il y a beaucoup de réglage oui, mais beaucoup sont overkill pour du Homelab.
Le principal est là et les options sont acctivables aux besoin.
Ils sont même en train de réfléchir à un prix entre la version gratuite et pro pour le HomeLab.
Ce qui m'a attiré sur le projet :
  • Solution française
  • Gérable via UI
  • Beaucoup d'options
  • Me challenger techniquement
Et pourquoi pas la AIO ? Car j'aime, quand je découvre une nouvelle app, essayer de comprendre tout. Souvent les versions AIO ne permettent pas cette souplesse. J'ai donc commencé sur la version docker et non AIO. Même si aujourd'hui, avec les lectures et recherche que j'ai fait sur BunkerWeb, mon avis a changé sur leur AIO. Vu que tu peux tout faire avec l'UI, elle peut être pratique.

Dans mon contexte perso, où je ne veux travailler que sur mon SYNOLOGY, la version AIO sera surement la solution pour tout faire fonctionner.
Pour des raisons persos, je ne veux pas NUC avec proxmox, de NAS DY. Je peux faire, mais je dois limiter les appareils à la maison et réduire mon temps devant mes PC pour la famille.

Voici des sources sur le projet :
Pour résumer, challenge technique sans obligation de résultat. Et délai de réussite, il sera ce qu'il sera 😋
 
Dernière édition:
  • J'aime
Réactions: MilesTEG
Je pense essayer bunkerweb prochainement.
Là je teste la mise en ouvre de Zitadel + NetBird.
Ensuite viendra bunkerweb.
 
a beaucoup de réglage oui, mais beaucoup sont overkill pour du Homelab.
Le principal est là et les options sont acctivables aux besoin.
Ils sont même en train de réfléchir à un prix entre la version gratuite et pro pour le HomeLab.
Ce qui m'a attiré sur le projet :
  • Solution française
  • Gérable via UI
  • Beaucoup d'options
  • Me challenger techniquement
Ha mais je n’avais pas capté ça 😊sympa que ce service soit français 😀

À voir ce qu’il propose pour du homelab en plus de ce qui est proposé dans la version CE qui me paraît déjà bien suffisant 😇
Je serais près à m’mettre quelques € mais pas en mensuel.
 
Ha mais je n’avais pas capté ça 😊sympa que ce service soit français 😀

À voir ce qu’il propose pour du homelab en plus de ce qui est proposé dans la version CE qui me paraît déjà bien suffisant 😇
Je serais près à m’mettre quelques € mais pas en mensuel.

Oui, ils sont d'Agen : https://www.bunkerity.com/fr#contact

Je pense essayer bunkerweb prochainement.
Là je teste la mise en ouvre de Zitadel + NetBird.
Ensuite viendra bunkerweb.
Yes et en prod tu est toujours sur NPMplus ?