Online zetten: een nieuwe versie uitrollen
Hier bouw je op verder: Nieuwe commits ophalen met git pull
Weet je dit niet meer zeker? Lees het terug voordat je verdergaat.
- VS Code & Git Nieuwe commits ophalen met git pull
Je site staat online. Nu verander je iets. Je werkt zoals altijd in Ubuntu op je laptop: veranderen, testen met docker compose up -d --build, en een commit naar GitHub. Daarna haalt de server de nieuwe versie op.
Een wijziging: de cookie alleen over https
Nu je site https heeft, kan de sessie-cookie de vlag secure krijgen: dan stuurt de browser hem nooit meer over een onversleutelde verbinding. Wat secure doet, staat in Cookies afschermen: in de praktijk. Zet het bij set_cookie in je /inloggen, en laat de rest staan zoals het was:
antwoord.set_cookie(
key="sessie_id",
value=sessie_id,
max_age=GELDIG,
httponly=True,
samesite="lax",
secure=True,
)
Op je eigen computer blijft het werken: Chrome en Firefox laten een secure-cookie op 127.0.0.1, localhost en gastenboek.localhost toch door. Had je secure=True al uit Cookies afschermen, dan hoef je hier niets te veranderen; kies dan een andere wijziging, zoals een tekst op je homepage. Commit en push het, en zet het daarna op de server.
Twee stappen op de server
cd ~/gastenboek
git pull
docker compose up -d --build
git pullhaalt de nieuwe commits op.docker compose up -d --buildbouwt een nieuw image en vervangt de container. Kwam er niets bij inrequirements.txt, dan staat de pip-stap er alsCACHED(les 15), en is het in een paar seconden klaar.
Kijk daarna of het gelukt is:
docker compose ps
docker compose logs --tail 20
Staat er Up bij de status en geen traceback in het logboek, open dan je site. Of hij ook echt antwoordt, laat Docker je in de volgende stap zelf nakijken.
Werk nooit op de server zelf
Pas je code nooit aan op de server, ook niet "even snel" met nano. De volgende git pull weigert dan, of jouw wijziging staat nergens anders en is bij een nieuwe server weg. De server krijgt alleen code die eerst op GitHub stond.
Een paar bestanden horen niet bij je project maar bij de server zelf: .env met je domeinnaam, en de map ~/traefik met de voordeur. Die maak en verander je wel op de server, en ze staan nergens anders. Daarom gaan ze mee in de back-up van les 37.
Er gaat iets mis
Your local changes would be overwritten
error: Your local changes to the following files would be overwritten by merge:
main.py
Oorzaak: iemand heeft main.py op de server veranderd.
Oplossing: zet de wijziging, als je hem wilt houden, eerst op je laptop en in git. Gooi hem daarna op de server weg, en haal opnieuw op:
git checkout -- main.py
git pull
De site start niet meer na de nieuwe versie
docker compose ps toont Restarting, of de container staat er niet bij.
Oorzaak: er zit een fout in de nieuwe code, of een package ontbreekt in requirements.txt (ModuleNotFoundError in het logboek).
Oplossing: lees de fout in docker compose logs --tail 50. Moet je site snel weer werken, ga dan terug naar de vorige versie en los het daarna op je laptop op:
git checkout HEAD~1
docker compose up -d --build
HEAD~1 is de commit vóór de laatste. Als je fix op GitHub staat, ga je terug naar de nieuwste versie, en doe je daarna weer de twee stappen:
git checkout main
Opdrachten
Opdracht 1: Make - Een script voor het uitrollen
Zet de stappen in een script ~/uitrollen.sh op de server, zodat bash ~/uitrollen.sh alles doet. Laat het script stoppen zodra een stap misgaat, en laat het aan het eind zien wat er draait.
Tip
Een script is een tekstbestand met op elke regel een commando, dat je met nano maakt. Met de regel set -e bovenaan stopt bash bij het eerste commando dat misgaat.
Antwoord
set -e
cd ~/gastenboek
git pull
docker compose up -d --build
docker compose ps
Zonder set -e bouwt het script ook als git pull faalde. Dat gaat meestal goed, maar dan denk je dat er een nieuwe versie staat terwijl het de oude is. Je kunt er docker image prune -f onder zetten: -f slaat de vraag over.
Door naar les 36: draait hij echt?.