Fixed BBB stuff

This commit is contained in:
2025-07-21 15:10:05 +02:00
parent a1643870db
commit b1bf7aaba5
10 changed files with 259 additions and 114 deletions

View File

@@ -0,0 +1,72 @@
import re
import yaml
def compose_mods(yml_text, docker_repository_path, env_file):
yml_text = re.sub(r'\./data/postgres:/var/lib/postgresql/data', 'database:/var/lib/postgresql/data', yml_text)
yml_text = re.sub(r'\./data/bigbluebutton:/var/bigbluebutton', 'bigbluebutton:/var/bigbluebutton', yml_text)
yml_text = re.sub(r'\./data/freeswitch-meetings:/var/freeswitch/meetings', 'freeswitch:/var/freeswitch/meetings', yml_text)
yml_text = re.sub(r'\./data/greenlight:/usr/src/app/storage', 'greenlight:/usr/src/app/storage', yml_text)
yml_text = re.sub(r'\./data/mediasoup:/var/mediasoup', 'mediasoup:/var/mediasoup', yml_text)
yml_text = re.sub(r'\./', docker_repository_path + '/', yml_text)
yml_text = re.sub(
r'(^\s*context:\s*)' + re.escape(docker_repository_path) + r'/mod/(.*)',
r'\1' + docker_repository_path + r'/mod/\2',
yml_text, flags=re.MULTILINE
)
yml_text = re.sub(
r'(^\s*context:\s*)mod/(.*)',
r'\1' + docker_repository_path + r'/mod/\2',
yml_text, flags=re.MULTILINE
)
try:
data = yaml.safe_load(yml_text)
services = data.get('services', {})
for name, svc in services.items():
svc['env_file'] = [env_file]
if name == 'redis':
vols = svc.get('volumes')
if not vols or not isinstance(vols, list):
svc['volumes'] = ['redis:/data']
elif 'redis:/data' not in vols:
svc['volumes'].append('redis:/data')
if name == 'coturn':
vols = svc.get('volumes')
if not vols or not isinstance(vols, list):
svc['volumes'] = ['coturn:/var/lib/coturn']
elif 'coturn:/var/lib/coturn' not in vols:
svc['volumes'].append('coturn:/var/lib/coturn')
if name == 'bbb-graphql-server':
svc['healthcheck'] = {
'test': ['CMD', 'curl', '-f', 'http://localhost:8085/healthz'],
'interval': '30s',
'timeout': '10s',
'retries': 5,
'start_period': '10s'
}
data['services'] = services
# **ADD THIS BLOCK:**
# Only add volumes block if not present
if 'volumes' not in data:
data['volumes'] = {
'database': None,
'greenlight': None,
'redis': None,
'coturn': None,
'freeswitch': None,
'bigbluebutton': None,
'mediasoup': None
}
yml_text = yaml.dump(data, default_flow_style=False, sort_keys=False)
except Exception:
pass
return yml_text
class FilterModule(object):
def filters(self):
return {
'compose_mods': compose_mods,
}

View File

@@ -6,107 +6,14 @@
COMPOSE_HTTP_TIMEOUT: 600
DOCKER_CLIENT_TIMEOUT: 600
- name: Copy docker-compose.yml from origin to final location
- name: Slurp docker-compose.yml from remote host
slurp:
src: "{{ docker_compose_file_origine }}"
register: compose_slurp
- name: Transform docker-compose.yml with compose_mods
copy:
src: "{{ docker_compose_file_origine }}"
content: "{{ compose_slurp.content | b64decode | compose_mods(docker_repository_path, docker_compose.files.env) }}"
dest: "{{ docker_compose_file_final }}"
remote_src: yes
- name: Replace bind mounts by named volume mounts
replace:
path: "{{ docker_compose_file_final }}"
regexp: "{{ item.regexp }}"
replace: "{{ item.replace }}"
loop:
- { regexp: '\./data/postgres:/var/lib/postgresql/data', replace: 'database:/var/lib/postgresql/data' }
- { regexp: '\./data/bigbluebutton:/var/bigbluebutton', replace: 'bigbluebutton:/var/bigbluebutton' }
- { regexp: '\./data/freeswitch-meetings:/var/freeswitch/meetings', replace: 'freeswitch:/var/freeswitch/meetings' }
- { regexp: '\./data/greenlight:/usr/src/app/storage', replace: 'greenlight:/usr/src/app/storage' }
- { regexp: '\./data/mediasoup:/var/mediasoup', replace: 'mediasoup:/var/mediasoup' }
- name: add volume to redis
lineinfile:
path: "{{ docker_compose_file_final }}"
insertafter: "^\\s*redis:"
line: " volumes:\n - redis:/data"
firstmatch: yes
- name: add volume to coturn
lineinfile:
path: "{{ docker_compose_file_final }}"
insertafter: "- ./mod/coturn/turnserver.conf:/etc/coturn/turnserver.conf"
line: " - coturn:/var/lib/coturn"
# Implemented due to etherpad health bug.
# @todo Remove when health check is working fine
# @see https://chatgpt.com/c/67a0fc7e-5104-800f-bb6b-3731e2f83b7b
#- name: "Update docker-compose.yml for Etherpad health check"
# lineinfile:
# line: " healthcheck:\n test: [\"CMD\", \"curl\", \"-f\", \"http://127.0.0.1:9001\"]\n interval: 30s\n timeout: 10s\n retries: 5\n start_period: 10s"
# path: "{{docker_compose_file_final}}"
# insertafter: "etherpad:"
# listen: setup bigbluebutton
- name: Add volumes block after services in docker compose
blockinfile:
path: "{{ docker_compose_file_final }}"
block: |
volumes:
database:
greenlight:
redis:
coturn:
freeswitch:
bigbluebutton:
mediasoup:
marker: "# {mark} ANSIBLE MANAGED BLOCK FOR VOLUMES"
insertbefore: "^services:"
- name: Replace all './' with '/services/' in docker-compose.yml
ansible.builtin.replace:
path: "{{ docker_compose_file_final }}"
regexp: '\./'
replace: '{{ docker_repository_path }}/'
- name: Prefix build context with docker_repository_path
ansible.builtin.replace:
path: "{{ docker_compose_file_final }}"
regexp: '(^\s*context:\s*)mod/(.*)'
replace: '\1{{ docker_repository_path }}/mod/\2'
- name: "Update healthcheck for bbb-graphql-server"
# This is neccessary because the healthcheck doesn't listen to the correct port
lineinfile:
line: " healthcheck:\n test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:8085/healthz\"]\n interval: 30s\n timeout: 10s\n retries: 5\n start_period: 10s"
path: "{{docker_compose_file_final}}"
insertafter: "bbb-graphql-server:"
- name: Add env_file to each service in docker-compose.yml
blockinfile:
path: "{{ docker_compose_file_final }}"
insertafter: '^ {{ service }}:$'
marker: "# {mark} ANSIBLE MANAGED BLOCK FOR ENV_FILE"
block: |
env_file:
- "{{ docker_compose.files.env }}"
loop:
- bbb-web
- freeswitch
- nginx
- etherpad
- bbb-pads
- bbb-export-annotations
- redis
- webrtc-sfu
- fsesl-akka
- apps-akka
- bbb-graphql-server
- bbb-graphql-actions
- bbb-graphql-middleware
- collabora
- periodic
- coturn
- greenlight
- postgres
loop_control:
loop_var: service
notify:
- docker compose just up

View File

@@ -35,15 +35,29 @@
- name: "Setup docker-compose.yml file"
include_tasks: "docker-compose.yml"
- name: Ensure all containers in instance are running
include_tasks: "{{ playbook_dir }}/roles/docker-compose/tasks/04_ensure_up.yml"
- name: flush docker service
meta: flush_handlers
- name: Wait for BigBlueButton
wait_for:
host: "{{ domains | get_domain('web-app-bigbluebutton') }}"
port: 80
delay: 5
timeout: 300
- name: "Get greenlight container name"
shell: |
docker compose ps -q greenlight
args:
chdir: "{{ docker_compose.directories.instance }}"
register: greenlight_id
- name: "Wait until BigBlueButton (greenlight) is running"
shell: |
docker inspect --format='{{'{{'}}.State.Status{{'}}'}}' {{ greenlight_id.stdout }}
args:
chdir: "{{ docker_compose.directories.instance }}"
register: bbb_state
until: bbb_state.stdout.strip() == "running"
retries: 30
delay: 5
changed_when: false
- name: create admin
command: