Online zetten: je site achter Traefik
De voordeur uit les 22 staat. Nu zet je je site erachter. Daarna is Traefik de enige deur naar buiten.
Je site achter de voordeur
Verander de compose.yaml van je project. De ports gaan weg: niemand komt nog rechtstreeks bij je site. Er komen een netwerk, labels en een instelling bij:
services:
gastenboek:
build: .
volumes:
- data:/app/data
networks:
- web
environment:
- FORWARDED_ALLOW_IPS=*
labels:
- traefik.enable=true
- traefik.http.routers.gastenboek.rule=Host(`gastenboek.localhost`)
- traefik.http.services.gastenboek.loadbalancer.server.port=8000
restart: unless-stopped
volumes:
data:
networks:
web:
external: true
De labels zijn voor Traefik:
traefik.enable=true: deze container hoort achter de voordeur.…routers.gastenboek.rule=Host(…): stuur een verzoek voor de naamgastenboek.localhostnaar deze container. Rond de naam staan backticks. Dubbele aanhalingstekens mogen ook, enkele niet: die kent Traefik niet.…services.gastenboek.loadbalancer.server.port=8000: in de container luistert je site op poort 8000.
cd ~/gastenboek
docker compose up -d --build
Open http://gastenboek.localhost. Traefik ziet welke naam je typte, en geeft het verzoek aan je site. Zet de veranderde compose.yaml daarna in git:
git add compose.yaml
git commit -m "Achter Traefik"
git push
Wie is de bezoeker?
Voor je site komt elk verzoek nu van Traefik. Traefik zet het adres van de echte bezoeker daarom in een kop van het verzoek, X-Forwarded-For. Een kop die een bezoeker zelf meestuurt, vervangt Traefik door het echte adres.
fastapi run gelooft die kop alleen van 127.0.0.1, en Traefik heeft een adres in het netwerk web. Daarom staat er FORWARDED_ALLOW_IPS=*: geloof de kop van iedereen.
* is hier veilig om één reden: je site heeft geen ports meer. Elk verzoek komt via Traefik, dus elke X-Forwarded-For komt van Traefik. Zet je ports ooit terug, haal dan ook deze regel weg.
Er gaat iets mis
404 page not found
Op http://gastenboek.localhost zegt Traefik 404 page not found.
Oorzaak: Traefik kent geen site voor deze naam. Meestal een tikfout in een label (traefik.enabled in plaats van traefik.enable), een andere naam in Host(…) dan die je typte, of enkele aanhalingstekens rond de naam: Host('gastenboek.localhost'). Dat laatste zie je in het logboek van Traefik:
error while parsing rule Host('gastenboek.localhost'): parsing rule Host('gastenboek.localhost'): 1:6: illegal rune literal
Oplossing: vergelijk je labels letter voor letter met die hierboven, en zet backticks rond de naam. Start opnieuw met docker compose up -d. Het logboek van Traefik lees je met docker compose logs in ~/traefik.
Bad Gateway
Traefik antwoordt met Bad Gateway.
Oorzaak: Traefik weet welke container het is, maar krijgt geen antwoord. Vaak staat er een andere poort in het label dan 8000, of start je site niet.
Oplossing: controleer server.port=8000, en kijk met docker compose logs in je project of je site draait.
Opdrachten
Opdracht 1: Investigate - Eén deur
Open http://127.0.0.1:8000, het adres uit les 21. Wat zie je, en waarom?
Antwoord
Je browser krijgt geen antwoord. Zonder ports is er geen deur van je computer naar de container. Je site luistert op 8000 in de container, maar daar komt alleen Traefik bij, via het netwerk web. Er is nog maar één deur naar buiten, en dat is Traefik. Zo kan niemand om de voordeur heen, en hoef je straks maar één deur te bewaken.
Opdracht 2: Investigate - Een tweede site
Eén voordeur kan meer sites bedienen. Maak een map ~/whoami met deze compose.yaml, en start hem:
services:
whoami:
image: traefik/whoami
networks:
- web
labels:
- traefik.enable=true
- traefik.http.routers.whoami.rule=Host(`whoami.localhost`)
networks:
web:
external: true
Open http://whoami.localhost. Dit kleine programma laat elk verzoek zien zoals het binnenkwam. Welke kop zette Traefik erbij met jouw adres? Waarom staat er geen label met een poort?
Antwoord
Je ziet onder andere X-Forwarded-For en X-Real-Ip, met het adres waarvan jouw browser kwam, en X-Forwarded-Host: whoami.localhost. Dat zijn de koppen die Traefik toevoegt. In WSL is dat adres iets als 172.18.0.1: je browser komt via Windows en het netwerk van Docker binnen. Op de server staat er het adres van de bezoeker op internet. Een label met de poort is hier niet nodig: het image van whoami zegt zelf op welke poort het luistert, en dan vindt Traefik hem. Jouw image zegt dat niet, daarom heeft je gastenboek het label wel. Gooi de tweede site daarna weg met docker compose down in ~/whoami.
Door naar les 24: een server huren.