Run locally like the sibling apps: fixed ports, the pod provider in Docker, the app outside

Festipod now follows the local convention of welcometomyplace, mutual-aid.app
and portejunes: one fixed port pair per app (Festipod defaults: backend 3005,
app 4005; pod provider 3000/5000), overridable in backend/.env and .env.
`make start` runs docker-compose-dev.yml (the local pod provider from images,
Fuseki, Redis, mailcatcher, Arena); the backend and the app run outside Docker
with `cd backend && pnpm dev` and `pnpm dev`. pnpm stays the package manager.

The old docker-compose.yml, which containerized Festipod's own frontend and
backend and could not reach the host's Fuseki and Redis, is gone; portless is
dropped from the dev script, since the backend declares a single OIDC redirect
URI. The local backend runs without a Redis cache, as the sibling apps do. The
e2e suites and validate read the app, backend and pod provider URLs from the
env files instead of hardcoding them.

The deployment and local cookbook leaves record the traps met while resetting
datasets: a dataset re-created under the same name needs a Fuseki restart
(ClosedException otherwise), the anonymous WebACL probe at boot is expected,
and a change of the backend's URL leaves persistent accounts with a
participations collection the new app identity cannot control.
This commit is contained in:
Sylvain Duchesne
2026-11-01 11:40:27 +01:00
parent 908f7ea973
commit 5e3e821e2a
33 changed files with 280 additions and 129 deletions
+79
View File
@@ -0,0 +1,79 @@
services:
fuseki:
image: semapps/jena-fuseki-webacl
container_name: fuseki
volumes:
- ./data/fuseki:/fuseki:z
ports:
- '3030:3030'
expose:
- '3030'
environment:
ADMIN_PASSWORD: admin
activitypods-backend:
image: activitypods/backend
container_name: activitypods-backend
depends_on:
- fuseki
- redis
restart: always
expose:
- '3000'
volumes:
- ./data/backend/logs:/app/backend/logs:z
- ./data/backend/jwt:/app/backend/jwt:z
- ./data/backend/uploads:/app/backend/uploads:z
environment:
SEMAPPS_JENA_PASSWORD: admin
SEMAPPS_DEFAULT_LOCALE: en
# Allow the Pod backend to access the app backend
# See https://docs.docker.com/network/drivers/host/
network_mode: 'host'
activitypods-frontend:
image: activitypods/frontend
container_name: activitypods-frontend
depends_on:
- activitypods-backend
restart: always
ports:
- '5000:5000'
expose:
- '5000'
environment:
REACT_APP_CONFIG_URL: 'http://localhost:3000/.well-known/config.js'
mailcatcher:
image: dockage/mailcatcher:0.7.1
container_name: mailcatcher
ports:
- '1080:1080'
- '1025:1025'
restart: on-failure
redis:
image: redis
container_name: redis
expose:
- '6379'
ports:
- '6379:6379'
volumes:
- ./data/redis:/data:z
command: ['redis-server', '--appendonly', 'yes']
arena:
image: activitypods/arena
container_name: arena
restart: always
volumes:
- ./docker/arena-dev.json:/opt/arena/src/server/config/index.json:z
depends_on:
- redis
expose:
- '4567'
ports:
- '4567:4567'
environment:
REDIS_HOST: 'redis'