From 65eff94f3f05e20485fe2550eeb59229a9b6f72b Mon Sep 17 00:00:00 2001 From: Kuba Orlik Date: Sun, 23 Aug 2026 18:22:12 +0200 Subject: [PATCH] Initial commit --- defaults/main.yml | 81 ++++++++++++++++++++++++++++++++++++ handlers/main.yml | 9 ++++ meta/main.yml | 17 ++++++++ tasks/compose.yml | 54 ++++++++++++++++++++++++ tasks/config.yml | 60 ++++++++++++++++++++++++++ tasks/install.yml | 31 ++++++++++++++ tasks/main.yml | 9 ++++ templates/env.j2 | 50 ++++++++++++++++++++++ templates/systemd.service.j2 | 15 +++++++ 9 files changed, 326 insertions(+) create mode 100644 defaults/main.yml create mode 100644 handlers/main.yml create mode 100644 meta/main.yml create mode 100644 tasks/compose.yml create mode 100644 tasks/config.yml create mode 100644 tasks/install.yml create mode 100644 tasks/main.yml create mode 100644 templates/env.j2 create mode 100644 templates/systemd.service.j2 diff --git a/defaults/main.yml b/defaults/main.yml new file mode 100644 index 0000000..30f0385 --- /dev/null +++ b/defaults/main.yml @@ -0,0 +1,81 @@ +--- +jitsi_version: "stable" + +jitsi_install_dir: /opt/jitsi +jitsi_config_dir: /opt/jitsi-meet-cfg + +jitsi_timezone: UTC + +jitsi_http_port: 8000 +jitsi_https_port: 8443 +jitsi_jvb_port: 10000 + +jitsi_public_url: "" + +# Set this when running behind NAT or on a host with multiple interfaces. +# Example: +# jitsi_jvb_advertise_ips: +# - "203.0.113.10" +jitsi_jvb_advertise_ips: [] + +jitsi_restart_policy: unless-stopped + +jitsi_enable_letsencrypt: false +jitsi_letsencrypt_domain: "" +jitsi_letsencrypt_email: "" + +jitsi_enable_http_redirect: false + +# Authentication +jitsi_enable_auth: false +jitsi_enable_guests: true +jitsi_auth_type: internal +jitsi_enable_auto_login: true + +# Optional components +jitsi_enable_jigasi: false +jitsi_enable_jibri: false +jitsi_enable_transcriber: false +jitsi_enable_etherpad: false +jitsi_enable_whiteboard: false + +# Jitsi passwords. +# +# IMPORTANT: +# Supply these from Ansible Vault in production. +jitsi_jicofo_auth_password: "" +jitsi_jvb_auth_password: "" +jitsi_jigasi_xmpp_password: "" +jitsi_jigasi_transcriber_password: "" +jitsi_jibri_recorder_password: "" +jitsi_jibri_xmpp_password: "" + +# Docker image configuration +jitsi_image_repo: ghcr.io/jitsi +jitsi_image_version: "" + +# Whether the role should install Docker. +jitsi_manage_docker: true + +# Docker packages on Debian/Ubuntu. +jitsi_docker_packages: + - docker-ce + - docker-ce-cli + - containerd.io + - docker-buildx-plugin + - docker-compose-plugin + +# Firewall +jitsi_manage_firewall: false +jitsi_firewall_ports: + - "80/tcp" + - "443/tcp" + - "10000/udp" + +# Additional environment variables to pass to Jitsi. +# +# Example: +# jitsi_extra_env: +# ENABLE_XMPP_WEBSOCKET: "1" +# ENABLE_COLIBRI_WEBSOCKET: "1" +jitsi_extra_env: {} diff --git a/handlers/main.yml b/handlers/main.yml new file mode 100644 index 0000000..c766adf --- /dev/null +++ b/handlers/main.yml @@ -0,0 +1,9 @@ +--- +- name: Restart Jitsi + community.docker.docker_compose_v2: + project_src: "{{ jitsi_install_dir }}" + state: restarted + +- name: Reload systemd + ansible.builtin.systemd: + daemon_reload: true diff --git a/meta/main.yml b/meta/main.yml new file mode 100644 index 0000000..a2f822a --- /dev/null +++ b/meta/main.yml @@ -0,0 +1,17 @@ +--- +galaxy_info: + author: kuba + description: jitsi + license: MIT + min_ansible_version: "2.12" + platforms: + - name: Debian + versions: + - bullseye + - bookworm + - name: Ubuntu + versions: + - focal + - jammy + +dependencies: [] diff --git a/tasks/compose.yml b/tasks/compose.yml new file mode 100644 index 0000000..3afe53c --- /dev/null +++ b/tasks/compose.yml @@ -0,0 +1,54 @@ +--- +- name: Determine Jitsi Compose files + ansible.builtin.set_fact: + jitsi_compose_files: + - docker-compose.yml + +- name: Enable Jigasi + ansible.builtin.set_fact: + jitsi_compose_files: "{{ jitsi_compose_files + ['jigasi.yml'] }}" + when: jitsi_enable_jigasi + +- name: Enable Jibri + ansible.builtin.set_fact: + jitsi_compose_files: "{{ jitsi_compose_files + ['jibri.yml'] }}" + when: jitsi_enable_jibri + +- name: Enable transcriber + ansible.builtin.set_fact: + jitsi_compose_files: "{{ jitsi_compose_files + ['transcriber.yml'] }}" + when: jitsi_enable_transcriber + +- name: Enable Etherpad + ansible.builtin.set_fact: + jitsi_compose_files: "{{ jitsi_compose_files + ['etherpad.yml'] }}" + when: jitsi_enable_etherpad + +- name: Enable whiteboard + ansible.builtin.set_fact: + jitsi_compose_files: "{{ jitsi_compose_files + ['whiteboard.yml'] }}" + when: jitsi_enable_whiteboard + +- name: Pull Jitsi images + community.docker.docker_compose_v2: + project_src: "{{ jitsi_install_dir }}" + files: "{{ jitsi_compose_files }}" + pull: always + state: present + +- name: Start Jitsi + community.docker.docker_compose_v2: + project_src: "{{ jitsi_install_dir }}" + files: "{{ jitsi_compose_files }}" + state: present + +- name: Install Jitsi systemd unit + ansible.builtin.template: + src: systemd.service.j2 + dest: /etc/systemd/system/jitsi.service + owner: root + group: root + mode: "0644" + notify: + - Reload systemd + - Restart Jitsi diff --git a/tasks/config.yml b/tasks/config.yml new file mode 100644 index 0000000..e041757 --- /dev/null +++ b/tasks/config.yml @@ -0,0 +1,60 @@ +--- +- name: Determine latest Jitsi release + ansible.builtin.uri: + url: https://api.github.com/repos/jitsi/docker-jitsi-meet/releases/latest + return_content: true + register: jitsi_release_api + when: jitsi_version == "stable" + +- name: Set release information + ansible.builtin.set_fact: + jitsi_release_tag: >- + {{ + jitsi_version + if jitsi_version != 'stable' + else jitsi_release_api.json.tag_name + }} + +- name: Download Jitsi release + ansible.builtin.get_url: + url: >- + https://github.com/jitsi/docker-jitsi-meet/archive/refs/tags/ + {{ jitsi_release_tag }}.zip + dest: "/tmp/jitsi-{{ jitsi_release_tag }}.zip" + mode: "0644" + +- name: Create temporary extraction directory + ansible.builtin.file: + path: "/tmp/jitsi-{{ jitsi_release_tag }}" + state: directory + mode: "0755" + +- name: Extract Jitsi release + ansible.builtin.unarchive: + src: "/tmp/jitsi-{{ jitsi_release_tag }}.zip" + dest: "/tmp/jitsi-{{ jitsi_release_tag }}" + remote_src: true + +- name: Find extracted Jitsi directory + ansible.builtin.find: + paths: "/tmp/jitsi-{{ jitsi_release_tag }}" + file_type: directory + depth: 1 + register: jitsi_extracted_dirs + +- name: Install Jitsi Compose files + ansible.builtin.copy: + src: "{{ jitsi_extracted_dirs.files[0].path }}/" + dest: "{{ jitsi_install_dir }}/" + remote_src: true + mode: preserve + notify: Restart Jitsi + +- name: Render Jitsi environment + ansible.builtin.template: + src: env.j2 + dest: "{{ jitsi_install_dir }}/.env" + owner: root + group: root + mode: "0600" + notify: Restart diff --git a/tasks/install.yml b/tasks/install.yml new file mode 100644 index 0000000..cb8984d --- /dev/null +++ b/tasks/install.yml @@ -0,0 +1,31 @@ +--- +- name: Create Jitsi installation directory + ansible.builtin.file: + path: "{{ jitsi_install_dir }}" + state: directory + owner: root + group: root + mode: "0755" + +- name: Create Jitsi configuration directories + ansible.builtin.file: + path: "{{ jitsi_config_dir }}/{{ item }}" + state: directory + owner: root + group: root + mode: "{{ '0777' if item.startswith('storage/') or item.startswith('tmp/') else '0755' }}" + loop: + - web + - prosody/config + - prosody/prosody-plugins-custom + - jicofo + - jvb + - jigasi + - jibri + - transcriber + - storage/jibri + - storage/prosody + - storage/transcripts + - storage/web + - tmp/web-crontabs + - tmp/web-load-test diff --git a/tasks/main.yml b/tasks/main.yml new file mode 100644 index 0000000..0b53871 --- /dev/null +++ b/tasks/main.yml @@ -0,0 +1,9 @@ +--- +- name: Install Jitsi + ansible.builtin.import_tasks: install.yml + +- name: Configure Jitsi + ansible.builtin.import_tasks: config.yml + +- name: Configure Docker Compose + ansible.builtin.import_tasks: compose.yml diff --git a/templates/env.j2 b/templates/env.j2 new file mode 100644 index 0000000..e084e8f --- /dev/null +++ b/templates/env.j2 @@ -0,0 +1,50 @@ +CONFIG={{ jitsi_config_dir }} + +HTTP_PORT={{ jitsi_http_port }} +HTTPS_PORT={{ jitsi_https_port }} + +TZ={{ jitsi_timezone }} + +PUBLIC_URL={{ jitsi_public_url }} + +JVB_PORT={{ jitsi_jvb_port }} + +{% if jitsi_jvb_advertise_ips | length > 0 %} +JVB_ADVERTISE_IPS={{ jitsi_jvb_advertise_ips | join(',') }} +{% endif %} + +RESTART_POLICY={{ jitsi_restart_policy }} + +JITSI_IMAGE_REPO={{ jitsi_image_repo }} + +{% if jitsi_image_version %} +JITSI_IMAGE_VERSION={{ jitsi_image_version }} +{% endif %} + +ENABLE_LETSENCRYPT={{ 1 if jitsi_enable_letsencrypt else 0 }} + +{% if jitsi_letsencrypt_domain %} +LETSENCRYPT_DOMAIN={{ jitsi_letsencrypt_domain }} +{% endif %} + +{% if jitsi_letsencrypt_email %} +LETSENCRYPT_EMAIL={{ jitsi_letsencrypt_email }} +{% endif %} + +ENABLE_HTTP_REDIRECT={{ 1 if jitsi_enable_http_redirect else 0 }} + +ENABLE_AUTH={{ 1 if jitsi_enable_auth else 0 }} +ENABLE_GUESTS={{ 1 if jitsi_enable_guests else 0 }} +AUTH_TYPE={{ jitsi_auth_type }} +ENABLE_AUTO_LOGIN={{ 1 if jitsi_enable_auto_login else 0 }} + +JICOFO_AUTH_PASSWORD={{ jitsi_jicofo_auth_password }} +JVB_AUTH_PASSWORD={{ jitsi_jvb_auth_password }} +JIGASI_XMPP_PASSWORD={{ jitsi_jigasi_xmpp_password }} +JIGASI_TRANSCRIBER_PASSWORD={{ jitsi_jigasi_transcriber_password }} +JIBRI_RECORDER_PASSWORD={{ jitsi_jibri_recorder_password }} +JIBRI_XMPP_PASSWORD={{ jitsi_jibri_xmpp_password }} + +{% for key, value in jitsi_extra_env.items() %} +{{ key }}={{ value }} +{% endfor %} \ No newline at end of file diff --git a/templates/systemd.service.j2 b/templates/systemd.service.j2 new file mode 100644 index 0000000..67e4403 --- /dev/null +++ b/templates/systemd.service.j2 @@ -0,0 +1,15 @@ +[Unit] +Description=Jitsi Meet +Requires=docker.service +After=docker.service + +[Service] +Type=oneshot +WorkingDirectory={{ jitsi_install_dir }} +RemainAfterExit=yes + +ExecStart=/usr/bin/docker compose up -d +ExecStop=/usr/bin/docker compose down + +[Install] +WantedBy=multi-user.target \ No newline at end of file