fix(unifi): MongoDB-versie die op een Raspberry Pi 4 draait
All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 3m22s

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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H9Vcwu7owJZ3nj5dCf4VFT
This commit is contained in:
Ramon 2026-08-07 14:59:06 +02:00
parent 5d97289d74
commit 414324d6e1
4 changed files with 81 additions and 12 deletions

View file

@ -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

View file

@ -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

View file

@ -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",

View file

@ -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