Skip to main content

🏗️ Kompletní instalace Nginx Proxy Manageru (NPM) s Cloudflare certifikátem

Tento návod popisuje instalaci reverzní proxy na Raspberry Pi 5 s využitím 15letého SSL certifikátu přímo od Cloudflare.

1. Příprava systému (Terminál)

Nejdříve vytvoříme strukturu složek v /opt/ a nastavíme správná oprávnění, aby kontejner mohl zapisovat data.

sudo mkdir -p /opt/nginx-proxy-manager/data
sudo mkdir -p /opt/nginx-proxy-manager/letsencrypt
sudo chown -R $USER:$USER /opt/nginx-proxy-manager
sudo chmod -R 775 /opt/nginx-proxy-manager
🔑 2. Cloudflare Origin Certifikát

Tento certifikát slouží výhradně pro šifrování trasy mezi Cloudflare a tvým RPi5.

  1. V Cloudflare: SSL/TLS -> Origin Server -> Create Certificate.

  2. Nastavení: RSA 2048, platnost 15 let.

  3. Zkopíruj si text Origin Certificate a Private Key.

[!CAUTION] BEZPEČNOSTNÍ VAROVÁNÍ: Cloudflare Origin certifikát není veřejně důvěryhodný pro prohlížeče. Pokud se na server pokusíš připojit přímo (mimo Cloudflare), prohlížeč nahlásí chybu zabezpečení.

📦 3. Konfigurace Portainer Stack (YAML)

Vytvoř nový stack. Používáme SQLite (vhodné pro homelab, šetří RAM, nepoužívat pro HA/produkční nasazení s vysokou zátěží).

🌐 Nginx Proxy Manager (NPM) Stack

Tento stack přidej do Portaineru. NPM poběží ve stejné síti jako tvůj DNS stack (dns_net), aby na sebe kontejnery viděly přímo přes názvy.

version: "3"
services:
  npm:
    image: 'jc21/nginx-proxy-manager:latest'
    container_name: nginx-proxy-manager
    restart: unless-stopped
    ports:
      - '80:80'   # HTTP provoz
      - '443:443' # HTTPS provoz
      - '8181:81' # Administrace NPM (přesunuto na 8181 kvůli Pi-hole)
    environment:
      - TZ=Europe/Prague
      # NPM nepotřebuje mnoho proměnných, zbytek se řeší v UI
    volumes:
      - /opt/npm/data:/data
      - /opt/npm/letsencrypt:/etc/letsencrypt
    networks:
      dns_net:
        ipv4_address: 172.20.0.4 # Fixní IP v naší síti
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
4. Nastavení Environment Variables (Portainer UI)

Pod YAML kódem přidej proměnnou:

Name Value
TZ Europe/Prague

2. Jak to všechno propojit (Workflow)

Aby ti vše fungovalo hladce, postupuj takto:

  1. V Pi-hole (Local DNS):

    • Vytvoř záznamy pro všechny své služby.

    • Např. pihole.doma -> IP tvého Raspberry Pi.

    • Např. npm.doma -> IP tvého Raspberry Pi.

    • Všechny domény směřuj na stejnou IP (RPi), NPM už si je přebere.

  2. V Nginx Proxy Manageru (Web UI na portu 8181):

    • Přihlas se (výchozí: admin@example.com / changeme).

    • Jdi na Proxy Hosts -> Add Proxy Host.

    • Domain Names: pihole.doma

    • Forward Hostname / IP: pihole (Díky společné síti dns_net stačí název kontejneru).

    • Forward Port: 80 (Interní port v kontejneru).

    • Zapni Block Common Exploits a ulož.

 
🔒 4. Zabezpečení přímého přístupu

Aby nedošlo k obejití Cloudflare (WAF, rate-limiting), je kriticky důležité zajistit, aby server nebyl přístupný napřímo z internetu.

  • Doporučené řešení: Použij Cloudflare Tunnel (z předchozího návodu), který porty 80/443 do internetu vůbec neotevírá.

  • Alternativa: Pokud nepoužíváš tunel, nastav na routeru/firewallu (UFW) povolení pouze pro IP rozsahy Cloudflare.

⚙️ 5. Konfigurace NPM a SSL

  1. Přihlas se na http://IP-ADRESA-RPI:81.

  2. LOGIN: admin@example.com / changeme.

  3. [!IMPORTANT] POVINNÝ KROK: Okamžitě po prvním přihlášení změň administrátorský e-mail a heslo!

  4. Jdi na SSL Certificates -> Add SSL Certificate -> Custom.

  5. Vlož Private Key a Origin Certificate z bodu 2.

🛡️ 6. Nastavení Cloudflare SSL Režimu

V Cloudflare dashboardu v sekci SSL/TLS -> Overview přepni režim na Full (strict).

  • Proč? Režim Flexible je nebezpečný, protože komunikace mezi Cloudflare a tvým serverem by nebyla šifrovaná. Full (strict) vyžaduje tvůj nahraný certifikát.


Výhody tohoto řešení:
  • Bezúdržbovost: Certifikát expiruje až za 15 let (odpadá starost o Let's Encrypt).

  • Konzistence: Všechna data jsou v /opt/ a proměnné v Portainer UI.

  • Výkon: SQLite na RPi5 reaguje okamžitě a je méně náchylná k poškození při tvrdém restartu než velká DB.