From 414324d6e1a20036b88f5a49e769546fe66ecf17 Mon Sep 17 00:00:00 2001 From: Ramon Date: Fri, 7 Aug 2026 14:59:06 +0200 Subject: [PATCH] fix(unifi): MongoDB-versie die op een Raspberry Pi 4 draait Het sjabloon pinde 4.4.29, maar vanaf 4.4.19 eist MongoDB ARMv8.2-A. Op een Pi 4 (ARMv8.0-A) stopt mongod met 'Illegal instruction', wordt de container nooit healthy en start UniFi niet. - Standaard mongo:4.4.18, instelbaar via een geavanceerd veld. - De reparatiecontainer draait dezelfde versie. - Healthcheck ruimer: timeout 20s, start_period 90s, tien pogingen. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01H9Vcwu7owJZ3nj5dCf4VFT --- CHANGELOG.md | 20 +++++++++++-- apps/unifi-network/files/compose.yaml | 19 ++++++++---- apps/unifi-network/template.json | 11 ++++++- tests/test_apps.py | 43 +++++++++++++++++++++++++-- 4 files changed, 81 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dbf1bb9..5437453 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,21 @@ -# v0.8.29-beta — In ontwikkeling +# v0.8.29-beta — UniFi start weer op een Raspberry Pi 4 -Nog niets uitgebracht sinds v0.8.28. Wat hier onder komt te staan gaat mee in -de volgende uitgave; bij het uitbrengen wordt deze kop de releaseversie. +Het sjabloon pinde MongoDB op 4.4.29 "voor de Pi", maar juist vanaf 4.4.19 eist +MongoDB ARMv8.2-A. Een Pi 4 is ARMv8.0-A, dus mongod stopte daar meteen met +`Illegal instruction`, de container werd nooit healthy en UniFi startte niet: +`dependency failed to start: container unifi-mongo is unhealthy`. + +- **Standaard 4.4.18**, de laatste versie die op een Pi 4 draait. Dit is een + patch-downgrade binnen 4.4; het datafomaat verandert daar niet mee. +- **De versie is instelbaar** (geavanceerd veld). Op een Pi 5 of een gewone + server kun je hoger — maar alleen bij een nieuwe installatie: een bestaande + 4.4-database gaat niet zomaar naar 7.0. +- **De healthcheck heeft meer lucht.** Op een Pi kost het starten van de + mongo-shell zelf al seconden en duurt de eerste initialisatie op een SD-kaart + langer dan een halve minuut. Op een snelle host verandert er niets: die is na + de eerste controle gezond. +- **De reparatiecontainer volgt dezelfde versie**, zodat die niet alsnog een + image start dat de processor niet aankan. # v0.8.28 — Installeren vanaf een ander adres diff --git a/apps/unifi-network/files/compose.yaml b/apps/unifi-network/files/compose.yaml index 4f8771b..244a82b 100644 --- a/apps/unifi-network/files/compose.yaml +++ b/apps/unifi-network/files/compose.yaml @@ -27,7 +27,10 @@ services: restart: unless-stopped << service_name >>-mongo: - image: mongo:4.4.29 + # Vanaf 4.4.19 eist MongoDB ARMv8.2-A; een Pi 4 (Cortex-A72) heeft dat niet + # en mongod stopt daar met 'Illegal instruction'. Zie SERVER-71772. De + # versie is instelbaar, zodat je op nieuwere hardware hoger kunt. + image: mongo:<< mongo_version >> container_name: << service_name >>-mongo environment: # Dezelfde beheerdersnaam als het allereerste sjabloon gebruikte. Zo @@ -50,14 +53,18 @@ services: test: - CMD-SHELL - 'mongo --quiet --eval "db.adminCommand({ ping: 1 })"' - interval: 10s - timeout: 5s - retries: 12 - start_period: 30s + # Ruim bemeten voor trage hardware: op een Pi kost het starten van de + # mongo-shell zelf al seconden, en de eerste initialisatie op een + # SD-kaart duurt langer dan een halve minuut. Op een snelle host is de + # container gewoon na de eerste controle gezond. + interval: 15s + timeout: 20s + retries: 10 + start_period: 90s restart: unless-stopped << service_name >>-mongo-init: - image: mongo:4.4.29 + image: mongo:<< mongo_version >> container_name: << service_name >>-mongo-init environment: - MONGO_INITDB_ROOT_USERNAME=unifi diff --git a/apps/unifi-network/template.json b/apps/unifi-network/template.json index 16c4090..0272bb5 100644 --- a/apps/unifi-network/template.json +++ b/apps/unifi-network/template.json @@ -24,7 +24,7 @@ "amd64", "arm64" ], - "architecture_note": "Op een Raspberry Pi is een 64-bits besturingssysteem vereist. Voor een Pi 4 is de database bewust vastgezet op MongoDB 4.4.29.", + "architecture_note": "Op een Raspberry Pi is een 64-bits besturingssysteem vereist. Let op de MongoDB-versie: vanaf 4.4.19 (en vanaf 5.0) eist MongoDB ARMv8.2-A, en dat heeft een Pi 4 niet. Op die hardware crasht mongod met 'Illegal instruction'. De standaard 4.4.18 werkt op alle ondersteunde architecturen.", "web": { "scheme": "https", "port": 8443 @@ -114,6 +114,15 @@ { "title": "Database", "items": [ + { + "name": "mongo_version", + "type": "str", + "title": "MongoDB-versie", + "default": "4.4.18", + "required": true, + "description": "4.4.18 is de laatste versie die op een Raspberry Pi 4 draait; nieuwer eist ARMv8.2-A. Op een Pi 5 of een gewone server kun je hoger, maar kies dat alleen bij een nieuwe installatie: een bestaande database gaat niet zomaar van 4.4 naar 7.0.", + "advanced": true + }, { "name": "mongo_password", "type": "str", diff --git a/tests/test_apps.py b/tests/test_apps.py index 7efe429..d288b83 100644 --- a/tests/test_apps.py +++ b/tests/test_apps.py @@ -406,14 +406,13 @@ def test_unifi_heeft_pi_geschikte_en_correct_geinitialiseerde_mongodb(): mongo = doc["services"]["unifi-mongo"] reparatie = doc["services"]["unifi-mongo-init"] unifi = doc["services"]["unifi"] - assert mongo["image"] == "mongo:4.4.29" + assert mongo["image"] == reparatie["image"], "reparatie moet dezelfde versie draaien" assert "./init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh:ro" in mongo["volumes"] assert any(v == "MONGO_AUTHSOURCE=admin" for v in unifi["environment"]) assert any(v == "MONGO_AUTHSOURCE=admin" for v in mongo["environment"]) assert unifi["depends_on"]["unifi-mongo"]["condition"] == "service_healthy" assert unifi["depends_on"]["unifi-mongo-init"]["condition"] == \ "service_completed_successfully" - assert reparatie["image"] == "mongo:4.4.29" assert reparatie["depends_on"]["unifi-mongo"]["condition"] == "service_healthy" assert reparatie["restart"] == "no" assert "./init-mongo.sh:/init-mongo.sh:ro" in reparatie["volumes"] @@ -561,3 +560,43 @@ def test_catalogus_markeert_aantoonbaar_amd64_only_apps(): meta = bp.metadata(WORTEL / "apps" / naam) assert meta["architectures"] == ["amd64"], naam assert "Raspberry Pi" in meta["architecture_note"], naam + + +def test_unifi_pint_mongodb_op_een_versie_die_op_een_pi_4_draait(): + """Vanaf 4.4.19 eist MongoDB ARMv8.2-A. Een Pi 4 is ARMv8.0-A, dus daar + stopt mongod met 'Illegal instruction' — de container wordt nooit healthy + en UniFi start niet ("dependency failed to start"). Het sjabloon zegt Pi's + te ondersteunen, dus de standaardversie moet dat ook echt doen. + + Zie https://jira.mongodb.org/browse/SERVER-71772 + """ + app = WORTEL / "apps" / "unifi-network" + velden = {f["name"]: f for f in bp.fields(app)} + assert "mongo_version" in velden, "de versie hoort instelbaar te zijn" + standaard = str(velden["mongo_version"]["default"]) + + major, minor, patch = (int(x) for x in standaard.split(".")[:3]) + assert (major, minor) == (4, 4), f"{standaard} draait niet op een Pi 4" + assert patch <= 18, ( + f"mongo:{standaard} eist ARMv8.2-A en crasht op een Pi 4; " + "4.4.18 is de laatste die daar werkt") + + assert "arm64" in bp.metadata(app)["architectures"] + assert "ARMv8.2" in bp.metadata(app)["architecture_note"], \ + "leg in de notitie uit waarom de versie zo laag staat" + + +def test_unifi_healthcheck_is_ruim_genoeg_voor_trage_hardware(): + """Op een Pi kost het starten van de mongo-shell zelf al seconden; met een + krappe timeout is de container ongezond terwijl de database prima draait.""" + app = WORTEL / "apps" / "unifi-network" + with tempfile.TemporaryDirectory() as t: + gezond = _render(app, Path(t))["services"]["unifi-mongo"]["healthcheck"] + + def _sec(waarde): + return int(str(waarde).rstrip("s")) + + assert _sec(gezond["timeout"]) >= 15 + assert _sec(gezond["start_period"]) >= 60 + # Genoeg pogingen om een trage eerste initialisatie te overleven. + assert _sec(gezond["interval"]) * gezond["retries"] >= 120