v0.8.03-beta - mappen zonder compose-bestand verdwenen geruisloos
Some checks failed
Deploy server-up (dev) / deploy (push) Has been cancelled

api_stacks sloeg elke map zonder compose-bestand over met een kale continue.
Zo'n map dook daarna nergens meer op: niet in de lijst, en de containers die
erbij horen belandden onder "handmatig gestart" omdat beheerd op datzelfde
compose-bestand afgaat.

De interface heeft er wel een weergave voor - rode stip, streepje in plaats van
een status, geen knoppen - die door dat continue nooit te zien kon zijn.

Ze staan er nu tussen met die waarschuwing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
This commit is contained in:
Ramon 2026-08-03 22:07:23 +02:00
parent e0d387c499
commit 3300d513a6
4 changed files with 60 additions and 5 deletions

View file

@ -1,3 +1,18 @@
# v0.8.03-beta — Mappen zonder compose-bestand verdwenen geruisloos
`GET /api/stacks` sloeg elke map zonder compose-bestand over met een kale
`continue`. Staat er zo'n map in je stacks-map, dan duikt hij nergens meer op:
niet in de lijst, en de containers die erbij horen belanden onder "handmatig
gestart" omdat ook `beheerd` op datzelfde compose-bestand afgaat. Je ziet een
leeg scherm, en nergens staat waarom.
De interface hééft er een weergave voor — rode stip, een streepje in plaats van
een status, geen knoppen — maar die kon door dat `continue` nooit te zien zijn.
Dode weergavecode voor een toestand die de API niet kon opleveren.
Zulke mappen staan er nu gewoon tussen, mét die waarschuwing. Beter een app die
zegt dat er iets mis is dan een app die verdwijnt.
# v0.8.02-beta — Koppelingen ónder BASE_DIR
`--doctor` zei dat `/opt/serverup` netjes gekoppeld was, en dat klopte ook.

View file

@ -1 +1 @@
0.8.02-beta
0.8.03-beta

View file

@ -612,13 +612,20 @@ def api_stacks():
for d in sorted(lib.iterdir()):
if not d.is_dir() or d.name.startswith("."):
continue
if not docker.has_compose(d):
continue
ct = docker.compose_ps(d, name=d.name)
# Een map zonder compose-bestand werd hier stilzwijgend overgeslagen.
# Dan staat er een map in je stacks-map die nergens meer opduikt: niet
# in de lijst, en de containers die erbij horen belanden onder
# "handmatig gestart". Je ziet een leeg scherm en nergens staat waarom.
#
# De interface hééft er een weergave voor — rode stip, een streepje in
# plaats van een status, geen knoppen — die door dit `continue` nooit te
# zien kon zijn. Tonen mét die waarschuwing is beter dan verzwijgen.
heeft_compose = docker.has_compose(d)
ct = docker.compose_ps(d, name=d.name) if heeft_compose else []
logo_url, icon = _stack_logo(d)
meta = _stack_meta(d)
out.append({
"name": d.name, "path": str(d), "has_compose": True,
"name": d.name, "path": str(d), "has_compose": heeft_compose,
"running": any(c["running"] for c in ct),
"containers": ct,
"logo_url": logo_url, "icon": icon,

View file

@ -116,3 +116,36 @@ def test_viewer_mag_geen_containers_bedienen(client, host):
assert client.get("/api/containers").status_code == 200
assert client.post("/api/containers/forgejo/stop",
headers={"X-CSRF-Token": kijker_csrf}).status_code == 403
# ── Een map zonder compose-bestand ───────────────────────────────────────────
# Die werd stilzwijgend overgeslagen: niet in de lijst, en de containers die
# erbij hoorden belandden onder "handmatig gestart". Je zag een leeg scherm en
# nergens stond waarom.
def test_map_zonder_compose_verdwijnt_niet_uit_de_lijst(client, env):
from conftest import login
login(client)
(env["lib"] / "kapotte-app").mkdir(parents=True, exist_ok=True)
d = client.get("/api/stacks").get_json()
namen = [s["name"] for s in d]
assert "kapotte-app" in namen, f"de map is niet zichtbaar: {namen}"
s = next(s for s in d if s["name"] == "kapotte-app")
assert s["has_compose"] is False, "hij doet alsof er compose is"
assert s["containers"] == []
assert s["running"] is False
def test_een_gewone_app_blijft_gewoon_staan(client, env, monkeypatch):
from conftest import login
from core import docker
monkeypatch.setattr(docker, "compose_ps", lambda *a, **k: [])
login(client)
d = env["lib"] / "echte-app"
d.mkdir(parents=True, exist_ok=True)
(d / "docker-compose.yml").write_text("services:\n web:\n image: nginx\n")
uit = client.get("/api/stacks").get_json()
s = next(s for s in uit if s["name"] == "echte-app")
assert s["has_compose"] is True