Compare commits
3 commits
850a80f86b
...
c50c9b3e54
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c50c9b3e54 | ||
|
|
414324d6e1 | ||
|
|
5d97289d74 |
5 changed files with 84 additions and 10 deletions
19
CHANGELOG.md
19
CHANGELOG.md
|
|
@ -1,3 +1,22 @@
|
||||||
|
# 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
|
# v0.8.28 — Installeren vanaf een ander adres
|
||||||
|
|
||||||
De ingebouwde hostnaam in `install.sh` lost niet overal op. Staat je Forgejo
|
De ingebouwde hostnaam in `install.sh` lost niet overal op. Staat je Forgejo
|
||||||
|
|
|
||||||
2
VERSION
2
VERSION
|
|
@ -1 +1 @@
|
||||||
0.8.28
|
0.8.29
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,10 @@ services:
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
<< service_name >>-mongo:
|
<< 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
|
container_name: << service_name >>-mongo
|
||||||
environment:
|
environment:
|
||||||
# Dezelfde beheerdersnaam als het allereerste sjabloon gebruikte. Zo
|
# Dezelfde beheerdersnaam als het allereerste sjabloon gebruikte. Zo
|
||||||
|
|
@ -50,14 +53,18 @@ services:
|
||||||
test:
|
test:
|
||||||
- CMD-SHELL
|
- CMD-SHELL
|
||||||
- 'mongo --quiet --eval "db.adminCommand({ ping: 1 })"'
|
- 'mongo --quiet --eval "db.adminCommand({ ping: 1 })"'
|
||||||
interval: 10s
|
# Ruim bemeten voor trage hardware: op een Pi kost het starten van de
|
||||||
timeout: 5s
|
# mongo-shell zelf al seconden, en de eerste initialisatie op een
|
||||||
retries: 12
|
# SD-kaart duurt langer dan een halve minuut. Op een snelle host is de
|
||||||
start_period: 30s
|
# container gewoon na de eerste controle gezond.
|
||||||
|
interval: 15s
|
||||||
|
timeout: 20s
|
||||||
|
retries: 10
|
||||||
|
start_period: 90s
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
<< service_name >>-mongo-init:
|
<< service_name >>-mongo-init:
|
||||||
image: mongo:4.4.29
|
image: mongo:<< mongo_version >>
|
||||||
container_name: << service_name >>-mongo-init
|
container_name: << service_name >>-mongo-init
|
||||||
environment:
|
environment:
|
||||||
- MONGO_INITDB_ROOT_USERNAME=unifi
|
- MONGO_INITDB_ROOT_USERNAME=unifi
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
"amd64",
|
"amd64",
|
||||||
"arm64"
|
"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": {
|
"web": {
|
||||||
"scheme": "https",
|
"scheme": "https",
|
||||||
"port": 8443
|
"port": 8443
|
||||||
|
|
@ -114,6 +114,15 @@
|
||||||
{
|
{
|
||||||
"title": "Database",
|
"title": "Database",
|
||||||
"items": [
|
"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",
|
"name": "mongo_password",
|
||||||
"type": "str",
|
"type": "str",
|
||||||
|
|
|
||||||
|
|
@ -406,14 +406,13 @@ def test_unifi_heeft_pi_geschikte_en_correct_geinitialiseerde_mongodb():
|
||||||
mongo = doc["services"]["unifi-mongo"]
|
mongo = doc["services"]["unifi-mongo"]
|
||||||
reparatie = doc["services"]["unifi-mongo-init"]
|
reparatie = doc["services"]["unifi-mongo-init"]
|
||||||
unifi = doc["services"]["unifi"]
|
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 "./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 unifi["environment"])
|
||||||
assert any(v == "MONGO_AUTHSOURCE=admin" for v in mongo["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"]["condition"] == "service_healthy"
|
||||||
assert unifi["depends_on"]["unifi-mongo-init"]["condition"] == \
|
assert unifi["depends_on"]["unifi-mongo-init"]["condition"] == \
|
||||||
"service_completed_successfully"
|
"service_completed_successfully"
|
||||||
assert reparatie["image"] == "mongo:4.4.29"
|
|
||||||
assert reparatie["depends_on"]["unifi-mongo"]["condition"] == "service_healthy"
|
assert reparatie["depends_on"]["unifi-mongo"]["condition"] == "service_healthy"
|
||||||
assert reparatie["restart"] == "no"
|
assert reparatie["restart"] == "no"
|
||||||
assert "./init-mongo.sh:/init-mongo.sh:ro" in reparatie["volumes"]
|
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)
|
meta = bp.metadata(WORTEL / "apps" / naam)
|
||||||
assert meta["architectures"] == ["amd64"], naam
|
assert meta["architectures"] == ["amd64"], naam
|
||||||
assert "Raspberry Pi" in meta["architecture_note"], 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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue