Ak si čítal môj článok o Cloudflare Tunnel, vieš prečo je to elegantnejšie riešenie ako port forward. Tu je kompletný postup — od domény cez Docker sieť až po funkčné routes pre každú tvoju aplikáciu.
Čo potrebuješ
Cloudflare účet (zdarma). Doména — kúpená kdekoľvek (napr. Websupport, Namecheap, GoDaddy) alebo priamo v Cloudflare. Docker a Portainer nainštalované na tvojom serveri/NAS. Spustené Docker kontajnery ktoré chceš sprístupniť zvonka.
1. Prenesenie domény do Cloudflare
Cloudflare Tunnel vyžaduje aby tvoja doména používala Cloudflare nameservery. Ak si doménu ešte len kupuješ, môžeš ju kúpiť priamo v Cloudflare (dash.cloudflare.com → Domain Registration) a tento krok preskočiť. Ak máš doménu inde, postupuj takto:
Krok 1 — Prihlás sa na dash.cloudflare.com → Add a domain → zadaj svoju doménu → Continue.
Krok 2 — Vyber plán Free → Continue.
Krok 3 — Cloudflare naskenuje existujúce DNS záznamy. Skontroluj ich a klikni Continue.
Krok 4 — Cloudflare ti zobrazí dva nameservery, napr. aria.ns.cloudflare.com a ben.ns.cloudflare.com. Skopíruj si ich.
Krok 5 — Prihlás sa k svojmu registrátorovi (Websupport, Namecheap...) a v nastaveniach domény zmeň nameservery na tie od Cloudflare. Každý registrátor to má na inom mieste — zvyčajne v sekcii DNS / Nameservery.
Zmena nameserverov sa šíri globálne — zvyčajne 15-60 minút, výnimočne až 24 hodín. V Cloudflare dashboarde sa doména zobrazí ako Active keď je všetko OK. Kým to neprebehnne, tunnel nastaviť môžeš, ale verejne dostupný nebude.
2. Aktivácia Zero Trust
Cloudflare Tunnel beží pod Zero Trust platformou. Aktivácia je bezplatná.
Choď na one.dash.cloudflare.com → prihlás sa → vyber svoju doménu → prejdi onboarding (vyber Free plan → potvrď).
Ocitneš sa v Zero Trust dashboarde — odtiaľto budeš všetko spravovať.
3. Docker sieť pre tunnel
Toto je krok ktorý sa v návodoch často preskakuje — a potom tunnel nevidí tvoje kontajnery.
Cloudflared kontajner a tvoje aplikácie musia byť v rovnakej Docker sieti, aby spolu mohli komunikovať pomocou container name. Na predvolenej bridge sieti to nefunguje — kontajnery sa navzájom nevidia cez meno. Vlastná sieť (tunnel-net) toto rieši: kontajner vaultwarden je dostupný ako http://vaultwarden:4080, kontajner PlexHW ako http://PlexHW:32400 atď.
Vytvor sieť cez SSH alebo Portainer terminal:
docker network create tunnel-net
Existujúce bežiace kontajnery pripoj do novej siete bez reštartu:
docker network connect tunnel-net vaultwarden
docker network connect tunnel-net AdGuard
docker network connect tunnel-net PlexHW
Prípadne cez Portainer: Networks → tunnel-net → Connected containers → Join.
Aby kontajnery boli v tunnel-net automaticky aj po redeploy, pridaj do každého compose súboru:
# Na konci každého service bloku:
networks:
- tunnel-net
# Na konci compose súboru:
networks:
tunnel-net:
external: true
4. Vytvorenie tunela a konektora
V Zero Trust dashboarde: Networks → Tunnels → Add a tunnel → vyber Cloudflared → Next.
Pomenuj tunel (napr. homelab) → Save tunnel.
Cloudflare zobrazí token — dlhý reťazec začínajúci eyJ.... Skopíruj ho — použiješ ho v nasledujúcom kroku.
5. Docker Compose stack pre cloudflared
V Portainer: Stacks → Add stack → Web editor:
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
command: tunnel --no-autoupdate run
environment:
TUNNEL_TOKEN: SEM_VLOZ_TUNNEL_TOKEN_Z_KROKU_4
networks:
- tunnel-net
restart: unless-stopped
networks:
tunnel-net:
external: true
Nahraď TUNNEL_TOKEN hodnotou z kroku 4. Klikni Deploy the stack.
V Zero Trust dashboarde → Networks → Tunnels — tvoj tunel by mal zmeniť stav na Healthy (zelená bodka). Ak ostáva Inactive, skontroluj logy kontajnera v Portaineri.
6. Public Hostname Routes
Toto je srdce celého tunela — každé pravidlo hovorí: "keď príde request na túto doménu, prepošli ho na tento kontajner".
Zero Trust → Networks → Tunnels → klikni na tvoj tunel → Configure → Public Hostname → Add a public hostname.
Subdomain: napr. vaultwarden
Domain: tvoja doména, napr. tvojadomena.sk
Service Type: HTTP
URL: vaultwarden:4080
V poli URL vždy zadaj container name a port — napr. vaultwarden:4080, AdGuard:3000, PlexHW:32400. Nikdy localhost:port ani 192.168.1.x:port.
Prečo: localhost v kontajneri znamená sám cloudflared kontajner, nie tvoju aplikáciu. IP adresa kontajnera sa mení pri každom reštarte. Container name ostáva stabilné a funguje cez Docker DNS — ale len ak sú oba kontajnery v rovnakej sieti (tunnel-net).
Príklady routes pre bežné aplikácie
vaultwarden.tvojadomena.sk → http://vaultwarden:4080
plex.tvojadomena.sk → http://PlexHW:32400
adguard.tvojadomena.sk → http://AdGuard:9080
portainer.tvojadomena.sk → https://portainer:9443 (Portainer beží na HTTPS)
linkwarden.tvojadomena.sk → http://linkwarden:3000
Pre každú aplikáciu klikni Add a public hostname znovu a pridaj ďalší záznam. Jeden tunel zvládne neobmedzene veľa hostname routes.
Additional settings pre niektoré aplikácie
Pri niektorých aplikáciách treba v Additional application settings zaškrtnúť:
- No TLS Verify — ak aplikácia používa self-signed certifikát (napr. Portainer na HTTPS)
- HTTP2 Connection — pre lepší výkon pri streamovaní
- WebSocket — pre aplikácie ktoré používajú WebSocket (Vaultwarden, Plex)
7. Zabezpečenie citlivých aplikácií (Zero Trust Access)
Portainer, admin panely alebo iné citlivé aplikácie nechceš mať verejne dostupné len s heslom aplikácie. Zero Trust Access pridáva extra vrstvu pred samotnú aplikáciu.
Zero Trust → Access → Applications → Add an application → Self-hosted:
- Application name: napr.
Portainer - Application domain:
portainer.tvojadomena.sk - Add a policy → Policy name → Action: Allow → Include: Emails → zadaj svoju emailovú adresu
Od teraz sa pred Portainerom zobrazí Cloudflare prihlasovacia obrazovka — zadáš email, Cloudflare ti pošle jednorazový kód, a až potom sa dostaneš k aplikácii.
Na Free pláne môžeš chrániť až 50 aplikácií s až 50 používateľmi. Pre domáce použitie viac ako dosť — Portainer, admin panely, dev nástroje.
8. Pridanie aplikácií do tunnel-net v existujúcich stackoch
Ak máš existujúce stacky a chceš ich pridať do tunela bez mazania a prebudovania, stačí upraviť compose súbor:
# Do každého service bloku pridaj:
networks:
- tunnel-net
- default # ak potrebuje aj lokálnu komunikáciu
# Na konci compose súboru:
networks:
tunnel-net:
external: true
default:
driver: bridge
Potom v Portaineri klikni Update the stack — kontajner sa reštartuje a automaticky sa pripojí do tunnel-net.
Troubleshooting
Skontroluj logy: Portainer → Containers → cloudflared → Logs. Najčastejší problém: nesprávny token. Skopíruj token znovu z Zero Trust → Networks → Tunnels → Configure → klikni na ikonu oka pri tokene.
Cloudflare sa nedokáže spojiť s kontajnerom. Skontroluj: (1) container name v route je presne rovnaký ako container_name: v compose, (2) oba kontajnery sú v tunnel-net — over cez docker network inspect tunnel-net, (3) aplikácia beží na správnom porte.
Nameservery sa ešte nepropagovali alebo neboli správne zadané. Skontroluj u registrátora že nameservery sú nastavené na Cloudflare hodnoty. Na overenie propagácie použi dnschecker.org.
V Zero Trust → Tunnels → Configure → Public Hostname → edituj route → Additional application settings → zaškrtni WebSocket.
Portainer beží na HTTPS so self-signed certifikátom. V route nastav Service Type: HTTPS a v Additional settings zaškrtni No TLS Verify.