Files
computer-playbook/roles/web-app-bigbluebutton/templates/compose.override.yml.j2
kevinveenbirkenbachandClaude Opus 5.5 c1ff8e5d11 fix(web-app-bigbluebutton): pin apps-akka's transaction isolation
At BBB boot, bbb-graphql-server's start.sh runs pg_terminate_backend and
drops bbb_graphql. When that kills apps-akka's first HikariCP connection
while the pool detects the driver's default transaction isolation,
HikariCP 4.0.3 swallows the 08xxx error, marks detection as done and
keeps isolation -1 for the pool's lifetime. Every later connection setup
then calls setTransactionIsolation(-1), which pgjdbc rejects with
"Transaction isolation level -1 not supported", so meetings never reach
the database and the client shows "Oops" (about 1 in 8 boots).

Pin the isolation explicitly so HikariCP never falls back to the
detected value: slick-hikaricp reads postgres.transactionIsolation,
prepends TRANSACTION_ and hands it to HikariCP, hence the value must be
exactly READ_COMMITTED (the PostgreSQL default, so normal boots behave
as before). The flag goes into apps-akka's own compose environment as
JAVA_OPTS, which the sbt-native-packager start script honours, instead
of env.j2, because compose_mods pins env.j2 onto every bbb service and
would hand the flag to bbb-web and fsesl-akka as well.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 08:57:32 +01:00

114 lines
4.6 KiB
Django/Jinja

services:
{% set service_name = 'bbb-web' %}
{{ service_name }}:
{{ lookup('container_image', application_id, service_name) }}
{{ lookup('container_volumes', service_name) | indent(4) }}
{{ lookup('container_extra_hosts') | indent(4) }}
{% if BBB_COLLABORA_ENABLED | bool %}
{{ lookup('depends_on', ['redis']) }}
{% endif %}
{% set service_name = 'freeswitch' %}
{{ service_name }}:
{{ lookup('container_image', application_id, service_name) }}
{{ lookup('container_volumes', service_name) | indent(4) }}
{% set service_name = 'nginx' %}
{{ service_name }}:
{{ lookup('container_image', application_id, service_name) }}
{{ lookup('container_volumes', service_name) | indent(4) }}
{% set service_name = 'bbb-shared-notes-server' %}
{{ service_name }}:
{{ lookup('container_image', application_id, service_name) }}
{{ lookup('compose_restart') }}
{% set service_name = 'bbb-export-annotations' %}
{{ service_name }}:
{{ lookup('container_image', application_id, service_name) }}
{{ lookup('container_volumes', service_name) | indent(4) }}
{% set service_name = 'fsesl-akka' %}
{{ service_name }}:
{{ lookup('container_image', application_id, service_name) }}
{% set service_name = 'apps-akka' %}
{{ service_name }}:
{{ lookup('container_image', application_id, service_name) }}
{{ lookup('container_volumes', service_name) | indent(4) }}
environment:
JAVA_OPTS: "-Dpostgres.transactionIsolation=READ_COMMITTED"
{% set service_name = 'bbb-graphql-server' %}
{{ service_name }}:
{{ lookup('container_image', application_id, service_name) }}
{{ lookup('container_healthcheck', service_name) | indent(4) }}
{% set service_name = 'bbb-graphql-actions' %}
{{ service_name }}:
{{ lookup('container_image', application_id, service_name) }}
{% set service_name = 'bbb-graphql-middleware' %}
{{ service_name }}:
{{ lookup('container_image', application_id, service_name) }}
{% set service_name = 'periodic' %}
{{ service_name }}:
{{ lookup('container_image', application_id, service_name) }}
{{ lookup('container_volumes', service_name) | indent(4) }}
{% set service_name = 'redis' %}
{{ service_name }}:
{{ lookup('container_volumes', service_name) | indent(4) }}
{% set service_name = 'postgres' %}
{{ service_name }}:
{{ lookup('container_volumes', service_name) | indent(4) }}
{% if lookup('config', application_id, 'services.prometheus.enabled') | bool %}
{% set service_name = 'prometheus-exporter' %}
{{ service_name }}:
{{ lookup('container_volumes', service_name) | indent(4) }}
{% endif %}
{% if BBB_GREENLIGHT_ENABLED | bool %}
{% set service_name = 'greenlight' %}
{{ service_name }}:
{{ lookup('container_volumes', service_name) | indent(4) }}
environment:
URL_HOST: "{{ domain }}"
{% endif %}
{% if BBB_RECORDING_ENABLED | bool %}
{% set service_name = 'recordings' %}
{{ service_name }}:
{{ lookup('container_image', application_id, service_name) }}
{{ lookup('container_volumes', service_name) | indent(4) }}
{% set service_name = 'bbb-webrtc-recorder' %}
{{ service_name }}:
{{ lookup('container_image', application_id, service_name) }}
{% endif %}
{% set service_name = 'webrtc-sfu' %}
{{ service_name }}:
{{ lookup('container_image', application_id, service_name) }}
{{ lookup('container_volumes', service_name) | indent(4) }}
environment:
MS_WORKERS: "1"
MS_ENABLE_IPV6: "{{ BBB_IP6_ENABLED | bool | lower }}"
MS_WEBRTC_LISTEN_IPS: >-
[{"ip":"0.0.0.0","announcedIp":"${EXTERNAL_IPv4}"}]
{% if BBB_COTURN_LOCAL_ENABLED | bool %}
{% set service_name = 'coturn' %}
{{ service_name }}:
{{ lookup('container_volumes', service_name) | indent(4) }}
{{ lookup('container_ports',
{'service': 'bigbluebutton', 'protocol': 'stun_turn',
'transport': ['udp', 'tcp'], 'container': 'same'},
{'service': 'bigbluebutton', 'protocol': 'relay',
'transport': 'udp', 'container': 'same',
'publish': 'ephemeral'}) | indent(4) }}
command: >-
--use-auth-secret
--static-auth-secret=${TURN_SECRET}
--lt-cred-mech
--realm=${DOMAIN}
--fingerprint
--no-multicast-peers
--no-cli
--external-ip=${EXTERNAL_IPv4}
--min-port={{ BBB_RELAY_PORT_START }}
--max-port={{ BBB_RELAY_PORT_END }}
{% if BBB_IP6_ENABLED %}--external-ip=${EXTERNAL_IPv6}{% endif %}
{% if lookup('tls', application_id, 'enabled') | bool %}
--cert=${COTURN_TLS_CERT_PATH}
--pkey=${COTURN_TLS_KEY_PATH}
{% endif %}
{% endif %}
{{ lookup('compose_volumes') }}