Compare commits

..

No commits in common. "c50c9b3e54ba452b8b37594ac52bb6672e2be2b5" and "850a80f86b8144afcd5e8d54d498bdeacc19469d" have entirely different histories.

5 changed files with 10 additions and 84 deletions

View file

@ -1,22 +1,3 @@
# v0.8.29 — UniFi start weer op een Raspberry Pi 4
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
De ingebouwde hostnaam in `install.sh` lost niet overal op. Staat je Forgejo

View file

@ -1 +1 @@
0.8.29
0.8.28

View file

@ -27,10 +27,7 @@ services:
restart: unless-stopped
<< service_name >>-mongo:
# 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 >>
image: mongo:4.4.29
container_name: << service_name >>-mongo
environment:
# Dezelfde beheerdersnaam als het allereerste sjabloon gebruikte. Zo
@ -53,18 +50,14 @@ services:
test:
- CMD-SHELL
- 'mongo --quiet --eval "db.adminCommand({ ping: 1 })"'
# 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
interval: 10s
timeout: 5s
retries: 12
start_period: 30s
restart: unless-stopped
<< service_name >>-mongo-init:
image: mongo:<< mongo_version >>
image: mongo:4.4.29
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. 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.",
"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.",
"web": {
"scheme": "https",
"port": 8443
@ -114,15 +114,6 @@
{
"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,13 +406,14 @@ 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"] == reparatie["image"], "reparatie moet dezelfde versie draaien"
assert mongo["image"] == "mongo:4.4.29"
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"]
@ -560,43 +561,3 @@ 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