Run the pod provider from images with make start, and fix what a fresh stack exposed

- docker-compose-dev.yml: the redis host port is overridable (REDIS_PORT in the root
  .env, 6379 by default as in the sibling apps), and the pod provider, in host network
  mode, follows it for its queue and OIDC redis. All of ./data/fuseki is mounted at the
  image's SEMAPPS_FUSEKI_BASE, so account deletion removes the backups and, 24 h later,
  the secure dataset's files (it answered 500 without the mount).
- backend: GET /app served the app actor snapshot the mixin takes before it creates or
  replaces the access-need group, so a dataset's first boot lacked the link until a
  restart; the app service refreshes the snapshot from the store at the end of started().
- e2e smoke: the post-install poll sends Accept: application/ld+json; the pod answers 500
  to a container read in any other format.
- Docs: cookbook (Redis port, mounts, hot reload, dataset-named accounts, fresh-boot
  note), deployment note, env examples; claims about a parallel race are no longer stated
  as fact.
This commit is contained in:
Sylvain Duchesne
2026-11-02 21:46:37 +01:00
parent 5e3e821e2a
commit 223059c629
9 changed files with 156 additions and 28 deletions
@@ -173,10 +173,14 @@ Given("l'application Festipod est installée sur le Pod de la session", async fu
// Registration is confirmed asynchronously by the app backend (the Pod posts a
// CREATE to the user's outbox), and the registered shape-tree containers come
// with it. Wait for the Event DataRegistration before a scenario writes there.
// The Accept header is required: the pod answers 500 to a container read in any other
// format ("LDP containers can only be returned with JSON-LD format").
const eventContainer = `${pod.storage}/as/event`;
const end = Date.now() + 20000;
while (Date.now() < end) {
const status = await fetch(eventContainer, { headers: { Authorization: `Bearer ${pod.token}` } })
const status = await fetch(eventContainer, {
headers: { Accept: 'application/ld+json', Authorization: `Bearer ${pod.token}` },
})
.then(r => r.status)
.catch(() => 0);
if (status === 200) return;