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