From e0d387c4993ccf34521d9b76c57d2ef99272552d Mon Sep 17 00:00:00 2001 From: Ramon Date: Mon, 3 Aug 2026 21:59:49 +0200 Subject: [PATCH] v0.8.02-beta - doctor ziet koppelingen onder BASE_DIR De koppeling van BASE_DIR kan intact zijn terwijl de container er toch niets ziet. Docker bindt met propagation rprivate: een koppeling die op de host na het aanmaken van de container ontstaat komt daar niet doorheen, en dan ziet de container de lege map eronder. - --doctor loopt met findmnt alle koppelingen onder BASE_DIR langs en vergelijkt met de mountlijst van de container - ontbreekt er een, dan staat erbij welke en hoe je hem meekoppelt Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy --- CHANGELOG.md | 23 +++++++++++++++++++++++ VERSION | 2 +- install.sh | 26 ++++++++++++++++++++++++++ tests/test_install_script.py | 15 +++++++++++++++ 4 files changed, 65 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6749c44..dc0ab62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,26 @@ +# v0.8.02-beta — Koppelingen ónder BASE_DIR + +`--doctor` zei dat `/opt/serverup` netjes gekoppeld was, en dat klopte ook. +Alleen zag Server Up er geen enkele app, terwijl er op de host drie stonden. + +De verklaring zit een niveau dieper. Docker bindt met propagation `rprivate`: +een koppeling die op de host **ná** het aanmaken van de container ontstaat, komt +daar niet doorheen. Is `stacks` (of `appdata`, of `backups`) een eigen mount — +een aparte dataset, een tweede schijf, een netwerkmap — dan ziet de container de +lege map eronder. De koppeling van `BASE_DIR` zelf is intact, dus daar valt +niets aan op te merken; het scherm blijft alleen leeg. + +`--doctor` loopt nu met `findmnt` alle koppelingen onder `BASE_DIR` langs en +vergelijkt ze met wat de container in zijn eigen mountlijst heeft. Ontbreekt er +een, dan zegt hij welke, en hoe je hem meekoppelt: + +``` +✖ /opt/serverup/stacks is op de host een eigen koppeling, maar niet in de container + De container ziet daar de lege map eronder. Koppel hem apart mee in + docker-compose.yml: + - /opt/serverup/stacks:/opt/serverup/stacks +``` + # v0.8.01-beta — "Nog 106 tonen" onder een leeg scherm De app store toonde geen enkele kaart, met daaronder een knop die beloofde dat diff --git a/VERSION b/VERSION index 56d8572..cc73fb6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8.01-beta +0.8.02-beta diff --git a/install.sh b/install.sh index 33662d3..22b5438 100755 --- a/install.sh +++ b/install.sh @@ -1200,6 +1200,32 @@ PYEOF fi fi fi + + # Eigen koppelingen ónder BASE_DIR. Docker bindt met propagation + # "rprivate": een koppeling die op de host ná het aanmaken van de + # container ontstaat, komt daar niet doorheen. De container ziet dan de + # lege map eronder, terwijl op de host alles keurig gevuld is — en de + # koppeling van BASE_DIR zelf is intact, dus daar is niets aan te zien. + if heeft findmnt; then + _diep=0 + for _mp in $(findmnt -rno TARGET -R "$_basis" 2>/dev/null); do + [ "$_mp" = "$_basis" ] && continue + _diep=1 + if $SUDO docker exec server-up sh -c \ + "grep -q ' $_mp ' /proc/self/mountinfo" 2>/dev/null; then + dok_ok "$_mp is een eigen koppeling en komt mee" + else + dok_fout "$_mp is op de host een eigen koppeling, maar niet in de container" + log " De container ziet daar de lege map eronder. Koppel hem" + log " apart mee in docker-compose.yml:" + log " - $_mp:$_mp" + log " of zorg dat de koppeling bestaat vóór de container start." + fi + done + [ "$_diep" -eq 0 ] && log "Geen eigen koppelingen onder $_basis" + else + dok_waar "findmnt ontbreekt; kon niet nagaan of er koppelingen onder $_basis liggen" + fi # De app store leest uit de git-cache; is die leeg, dan is de lijst leeg. _apps="$($SUDO docker exec server-up sh -c \ 'find /data/git -name template.json 2>/dev/null | wc -l' \ diff --git a/tests/test_install_script.py b/tests/test_install_script.py index 5b021cb..fc99fc7 100644 --- a/tests/test_install_script.py +++ b/tests/test_install_script.py @@ -1198,3 +1198,18 @@ def test_doctor_onderscheidt_ontbrekend_van_leeg(): assert "test -d" in blok, "er wordt niet gekeken of de map er is" assert "bestaat niet binnen de container" in blok assert "nog geen enkele app" in blok + + +def test_doctor_kijkt_naar_koppelingen_onder_base_dir(): + """Docker bindt met propagation "rprivate". Een koppeling die op de host ná + het aanmaken van de container ontstaat, komt daar niet doorheen: de + container ziet de lege map eronder, terwijl de koppeling van BASE_DIR zelf + intact is en er dus niets aan te zien is.""" + tekst = SCRIPT.read_text(encoding="utf-8") + blok = tekst[tekst.index("Wat Server Up zelf ziet"):] + blok = blok[:blok.index("\n printf ")] + assert "findmnt" in blok, "er wordt niet naar koppelingen gekeken" + assert "/proc/self/mountinfo" in blok, "de containerkant wordt niet vergeleken" + assert "eigen koppeling, maar niet in de container" in blok + # De uitweg hoort erbij te staan, anders weet je nog niets. + assert "docker-compose.yml" in blok