Files
computer-playbook/roles/web-app-bigbluebutton/meta/services.yml
kevinveenbirkenbachandClaude Opus 5.5 b83b361ea9 fix(web-app-bigbluebutton): run BBB v3.0.39 with the shared-notes server
The version-source update in #1146 moved the bigbluebutton/docker ref from
v3.0.23 to v3.0.39. That tag changes three things the role did not
handle, and it exposed a fourth defect in compose_file_args.

1. generate-compose renders etherpad and bbb-pads only behind
   USE_INSECURE_ETHERPAD and otherwise emits bbb-shared-notes-server with
   a `build:` block and no `image:` (upstream adds the image only after
   the tag, in 9a6a9a9a4c). compose_mods drops `build` only where an image
   is set, so the guard "Fail if any service still builds locally" stopped
   every BigBlueButton deploy (main run 39749899667, Nextcloud#11:
   `rc: 0`, `stdout: '    build:'`, bootstrap_compose_project.yml:35).
   meta/services.yml now pins alangecker/bbb-shared-notes-server:v3.0.39,
   compose_mods takes `pinned` (BBB_PINNED_SERVICES, every service the
   role config pins an image for) and drops their `build`, and the
   etherpad leftovers go (ep_redis_publisher patch, etherpad postgres
   entrypoint and initdb hook, etherpad database tasks, ETHERPAD_* env,
   etherpad_api_key secret).

2. The notes server connects to postgres once at start and exits with 2
   when it is not up yet; upstream gives it no restart policy. The
   override sets the role's restart policy, so it retries until postgres
   accepts connections.

3. Greenlight moves from v3.8.0 to v3.9.0.1, which sets
   `config.hosts = URL_HOST`, and the template passes
   `URL_HOST: https://${DOMAIN}`. Rails compares hostnames, so every
   request was blocked (`Blocked hosts: bbb.talk.infinito.test`, 403).
   Greenlight documents URL_HOST as the bare hostname; the override sets
   it to the role domain.

4. compose_file_args decided whether a role ships a compose override by
   templating "{{ application_id | abs_role_path_by_application_id }}"
   through the templar. ansible-core 2.21 does not render an untrusted
   string, so the check saw the literal and always returned False: the CA
   override generation and the pull handler never read BBB's
   compose.override.yml. That was harmless while compose.yml alone was
   valid; with the notes-server image living in the override, `compose
   config` failed ("has neither an image nor a build context"). The check
   now resolves the role path for the application id it is given. BBB is
   the only role that ships an override, so no other role's file list
   changes.

Existing installations drop the etherpad and bbb-pads containers on the
next `compose up --remove-orphans`; the old `etherpad` database stays in
PostgreSQL untouched.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-22 16:56:48 +02:00

270 lines
9.9 KiB
YAML

---
# nocheck: seaweedfs-required — object storage not implemented for this role
sso:
bond: 1
enabled: "{{ 'web-app-keycloak' in group_names }}"
shared: "{{ 'web-app-keycloak' in group_names }}"
flavor: oidc
logout:
bond: 1
enabled: "{{ 'web-svc-logout' in group_names }}"
shared: "{{ 'web-svc-logout' in group_names }}"
# nocheck: dynamic-flag
ldap:
enabled: false
dashboard:
bond: 1
enabled: "{{ 'web-app-dashboard' in group_names }}"
shared: "{{ 'web-app-dashboard' in group_names }}"
matomo:
bond: 1
enabled: "{{ 'web-app-matomo' in group_names }}"
shared: "{{ 'web-app-matomo' in group_names }}"
email:
bond: 1
enabled: "{{ MAIL_PROVIDER in group_names }}"
shared: "{{ MAIL_PROVIDER in group_names }}"
# nocheck: playwright-service-flag: shared provider entity; the app itself is covered by this role's own Playwright spec
bigbluebutton:
modes:
compose:
enabled: true
swarm:
enabled: true
bond: 1
enabled: true
shared: true
repository: https://github.com/bigbluebutton/docker.git
ref: v3.0.39
update:
key: ref
type: http_regex
url: https://raw.githubusercontent.com/bigbluebutton/docker/develop/repos/tags
pattern: "repos/bigbluebutton (v[0-9.]+)"
recording:
enabled: false
cleanup: true
max_age_days: 30
min_storage: 50GB
api_suffix: /bigbluebutton/
upstream_host: "10.7.7.1"
ports:
local:
http: 48087
internal:
http: 48087
public:
stun_turn: 3478
stun_turn_tls: 5349
relay:
start: 40000
end: 49999
run_after:
- web-app-keycloak
lifecycle: beta
cpus: "4.0"
mem_reservation: "2g"
mem_limit: "6g"
pids_limit: 4096
# nocheck: dynamic-flag
# nocheck: playwright-service-flag — DB engine, covered by role-local integration tests
postgres:
name: bigbluebutton-postgres-1
shared: false
enabled: true
# nocheck: dynamic-flag
# nocheck: playwright-service-flag — internal sub-component (multi-entity role)
greenlight:
name: bigbluebutton-greenlight-1
enabled: true
shared: false
cpus: "0.5"
mem_reservation: 256m
mem_limit: 1g
pids_limit: 512
# nocheck: playwright-service-flag — infrastructural sub-component (TURN/STUN)
coturn:
bond: 1
shared: "{{ 'web-svc-coturn' in group_names }}"
enabled: "{{ 'web-svc-coturn' in group_names }}"
# nocheck: playwright-service-flag — infrastructural sub-component (collaborative editing)
collabora:
bond: 1
shared: "{{ 'web-svc-collabora' in group_names }}"
enabled: "{{ 'web-svc-collabora' in group_names }}"
# nocheck: playwright-service-flag — css consumer, no Playwright surface (provider: web-svc-css)
css:
bond: 1
enabled: "{{ 'web-svc-css' in group_names }}"
shared: "{{ 'web-svc-css' in group_names }}"
prometheus:
bond: 1
enabled: "{{ 'web-app-prometheus' in group_names }}"
shared: "{{ 'web-app-prometheus' in group_names }}"
# nocheck: playwright-service-flag: prebuilt upstream-compose image, mirror pre-pull only
# nocheck: dynamic-flag: fixed upstream-compose sub-service, not group-gated
bbb-web:
image: alangecker/bbb-docker-web
version: "v3.0.39"
update:
type: http_regex
url: https://raw.githubusercontent.com/bigbluebutton/docker/develop/repos/tags
pattern: "repos/bigbluebutton (v[0-9.]+)"
enabled: false
# nocheck: playwright-service-flag: prebuilt upstream-compose image, mirror pre-pull only
# nocheck: dynamic-flag: fixed upstream-compose sub-service, not group-gated
freeswitch:
image: alangecker/bbb-docker-freeswitch
version: "v1.11.3-v3.0.39"
update:
type: http_regex
url: https://raw.githubusercontent.com/bigbluebutton/docker/develop/repos/tags
pattern: "repos/bigbluebutton (?P<bbb>v[0-9.]+)\\nrepos/freeswitch (?P<freeswitch>v[0-9.]+)"
template: "{freeswitch}-{bbb}"
enabled: false
# nocheck: playwright-service-flag: prebuilt upstream-compose image, mirror pre-pull only
# nocheck: dynamic-flag: fixed upstream-compose sub-service, not group-gated
nginx:
image: alangecker/bbb-docker-nginx
version: "v3.0.39-v5.4.8-1.29"
update:
type: http_regex
url:
- https://raw.githubusercontent.com/bigbluebutton/docker/develop/repos/tags
- https://raw.githubusercontent.com/bigbluebutton/docker/develop/docker-compose.tmpl.yml
pattern: "repos/bbb-playback (?P<playback>v[0-9.]+)\\n(?:.*\\n)*?repos/bigbluebutton (?P<bbb>v[0-9.]+)\\n(?:.*\\n)*?.*bbb-docker-nginx:.*-(?P<base>[0-9.]+)\\n"
template: "{bbb}-{playback}-{base}"
enabled: false
# nocheck: playwright-service-flag: prebuilt upstream-compose image, mirror pre-pull only
# nocheck: dynamic-flag: fixed upstream-compose sub-service, not group-gated
bbb-shared-notes-server:
image: alangecker/bbb-shared-notes-server
version: "v3.0.39"
update:
type: http_regex
url: https://raw.githubusercontent.com/bigbluebutton/docker/develop/repos/tags
pattern: "repos/bigbluebutton (v[0-9.]+)"
enabled: false
# nocheck: playwright-service-flag: prebuilt upstream-compose image, mirror pre-pull only
# nocheck: dynamic-flag: fixed upstream-compose sub-service, not group-gated
bbb-export-annotations:
image: alangecker/bbb-docker-bbb-export-annotations
version: "v3.0.39"
update:
type: http_regex
url: https://raw.githubusercontent.com/bigbluebutton/docker/develop/repos/tags
pattern: "repos/bigbluebutton (v[0-9.]+)"
enabled: false
# nocheck: playwright-service-flag: prebuilt upstream-compose image, mirror pre-pull only
# nocheck: dynamic-flag: fixed upstream-compose sub-service, not group-gated
webrtc-sfu:
image: alangecker/bbb-docker-webrtc-sfu
version: "v2.24.0"
update:
type: http_regex
url: https://raw.githubusercontent.com/bigbluebutton/docker/develop/repos/tags
pattern: "repos/bbb-webrtc-sfu (v[0-9.]+)"
enabled: false
# nocheck: playwright-service-flag: prebuilt upstream-compose image, mirror pre-pull only
# nocheck: dynamic-flag: fixed upstream-compose sub-service, not group-gated
fsesl-akka:
image: alangecker/bbb-docker-fsesl-akka
version: "v3.0.39"
update:
type: http_regex
url: https://raw.githubusercontent.com/bigbluebutton/docker/develop/repos/tags
pattern: "repos/bigbluebutton (v[0-9.]+)"
enabled: false
# nocheck: playwright-service-flag: prebuilt upstream-compose image, mirror pre-pull only
# nocheck: dynamic-flag: fixed upstream-compose sub-service, not group-gated
apps-akka:
image: alangecker/bbb-docker-apps-akka
version: "v3.0.39"
update:
type: http_regex
url: https://raw.githubusercontent.com/bigbluebutton/docker/develop/repos/tags
pattern: "repos/bigbluebutton (v[0-9.]+)"
enabled: false
# nocheck: playwright-service-flag: prebuilt upstream-compose image, mirror pre-pull only
# nocheck: dynamic-flag: fixed upstream-compose sub-service, not group-gated
bbb-graphql-server:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8085/healthz"]
# nocheck: healthcheck-timing-override curl against the graphql server, which does not answer inside the 5s default while it is still building its schema
timeout: 10s
retries: 5
image: alangecker/bbb-docker-graphql-server
version: "v3.0.39"
update:
type: http_regex
url: https://raw.githubusercontent.com/bigbluebutton/docker/develop/repos/tags
pattern: "repos/bigbluebutton (v[0-9.]+)"
enabled: false
# nocheck: playwright-service-flag: prebuilt upstream-compose image, mirror pre-pull only
# nocheck: dynamic-flag: fixed upstream-compose sub-service, not group-gated
bbb-graphql-actions:
image: alangecker/bbb-docker-graphql-actions
version: "v3.0.39"
update:
type: http_regex
url: https://raw.githubusercontent.com/bigbluebutton/docker/develop/repos/tags
pattern: "repos/bigbluebutton (v[0-9.]+)"
enabled: false
# nocheck: playwright-service-flag: prebuilt upstream-compose image, mirror pre-pull only
# nocheck: dynamic-flag: fixed upstream-compose sub-service, not group-gated
bbb-graphql-middleware:
image: alangecker/bbb-docker-graphql-middleware
version: "v3.0.39"
update:
type: http_regex
url: https://raw.githubusercontent.com/bigbluebutton/docker/develop/repos/tags
pattern: "repos/bigbluebutton (v[0-9.]+)"
enabled: false
# nocheck: playwright-service-flag: prebuilt upstream-compose image, mirror pre-pull only
# nocheck: dynamic-flag: fixed upstream-compose sub-service, not group-gated
periodic:
image: alangecker/bbb-docker-periodic
version: "v3.0.0"
update:
type: http_regex
url: https://raw.githubusercontent.com/bigbluebutton/docker/develop/docker-compose.tmpl.yml
pattern: "bbb-docker-periodic:(v[0-9.]+)"
enabled: false
# nocheck: playwright-service-flag: prebuilt upstream-compose image, mirror pre-pull only
# nocheck: dynamic-flag: fixed upstream-compose sub-service, not group-gated
recordings:
image: alangecker/bbb-docker-recordings
version: "v3.0.39"
update:
type: http_regex
url: https://raw.githubusercontent.com/bigbluebutton/docker/develop/repos/tags
pattern: "repos/bigbluebutton (v[0-9.]+)"
enabled: false
# nocheck: playwright-service-flag: prebuilt upstream-compose image, mirror pre-pull only
# nocheck: dynamic-flag: fixed upstream-compose sub-service, not group-gated
bbb-webrtc-recorder:
image: alangecker/bbb-docker-webrtc-recorder
version: "v0.14.0"
update:
type: http_regex
url: https://raw.githubusercontent.com/bigbluebutton/docker/develop/repos/tags
pattern: "repos/bbb-webrtc-recorder (v[0-9.]+)"
enabled: false
# nocheck: playwright-service-flag: script-time helper of upstream generate-compose, mirror pre-pull only
# nocheck: dynamic-flag: fixed upstream-compose helper, not group-gated
dockerize:
image: ghcr.io/jwilder/dockerize
version: "v0.16.0"
enabled: false
# nocheck: playwright-service-flag, dynamic-flag infrastructure backup consumer
container_backup: # nocheck: bond-baseline backup host joins outside the variant topology
bond: 1
enabled: "{{ 'svc-bkp-volume-2-local' in group_names }}"
shared: true
# nocheck: playwright-service-flag
tor:
enabled: false # nocheck: dynamic-flag
shared: false # nocheck: dynamic-flag