| @@ -47,6 +47,25 @@ See [Configuring DNS](configuring-dns.md) for details about DNS changes. | |||||
| If you've decided to use the default hostname, you won't need to do any extra DNS configuration. | If you've decided to use the default hostname, you won't need to do any extra DNS configuration. | ||||
| ## Customizing the maubot container image | |||||
| Certain [maubot plugins](https://plugins.mau.bot/) require additional dependencies to be installed. | |||||
| You can customize the default maubot container image and install your own dependencies. | |||||
| Example additional configuration for your `inventory/host_vars/matrix.example.com/vars.yml` file: | |||||
| ```yaml | |||||
| matrix_bot_maubot_container_image_customizations_enabled: true | |||||
| # Adjust the Dockerfile and install ffmpeg. | |||||
| # | |||||
| matrix_bot_maubot_container_image_customizations_dockerfile_body_custom: | | |||||
| RUN apk add --no-cache ffmpeg | |||||
| ``` | |||||
| Consult the [Dockerfile reference](https://docs.docker.com/reference/dockerfile/) for more information about the syntax. | |||||
| ## Installing | ## Installing | ||||
| After configuring the playbook and potentially [adjusting your DNS records](#adjusting-dns-records), run the playbook with [playbook tags](playbook-tags.md) as below: | After configuring the playbook and potentially [adjusting your DNS records](#adjusting-dns-records), run the playbook with [playbook tags](playbook-tags.md) as below: | ||||
| @@ -17,7 +17,6 @@ matrix_bot_maubot_path_prefix: /_matrix/maubot | |||||
| matrix_bot_maubot_container_image_self_build: false | matrix_bot_maubot_container_image_self_build: false | ||||
| matrix_bot_maubot_docker_repo: "https://mau.dev/maubot/maubot.git" | matrix_bot_maubot_docker_repo: "https://mau.dev/maubot/maubot.git" | ||||
| matrix_bot_maubot_docker_src_files_path: "{{ matrix_bot_maubot_base_path }}/docker-src" | |||||
| matrix_bot_maubot_docker_repo_version: "{{ 'master' if matrix_bot_maubot_version == 'latest' else matrix_bot_maubot_version }}" | matrix_bot_maubot_docker_repo_version: "{{ 'master' if matrix_bot_maubot_version == 'latest' else matrix_bot_maubot_version }}" | ||||
| # renovate: datasource=docker depName=dock.mau.dev/maubot/maubot | # renovate: datasource=docker depName=dock.mau.dev/maubot/maubot | ||||
| @@ -26,9 +25,26 @@ matrix_bot_maubot_docker_image: "{{ matrix_bot_maubot_docker_image_name_prefix } | |||||
| matrix_bot_maubot_docker_image_name_prefix: "{{ 'localhost/' if matrix_bot_maubot_container_image_self_build else 'dock.mau.dev/' }}" | matrix_bot_maubot_docker_image_name_prefix: "{{ 'localhost/' if matrix_bot_maubot_container_image_self_build else 'dock.mau.dev/' }}" | ||||
| matrix_bot_maubot_docker_image_force_pull: "{{ matrix_bot_maubot_docker_image.endswith(':latest') }}" | matrix_bot_maubot_docker_image_force_pull: "{{ matrix_bot_maubot_docker_image.endswith(':latest') }}" | ||||
| # matrix_bot_maubot_docker_image_customized is the name of the locally built maubot image | |||||
| # which adds various customizations on top of the original (upstream) maubot image. | |||||
| # This image will be based on the upstream `matrix_bot_maubot_docker_image` image, only if `matrix_bot_maubot_container_image_customizations_enabled: true`. | |||||
| matrix_bot_maubot_docker_image_customized: "localhost/maubot/maubot:{{ matrix_bot_maubot_version }}-customized" | |||||
| # Controls whether the customized image (`matrix_bot_maubot_docker_image_customized`) is to be force-built without layer caching enabled. | |||||
| matrix_bot_maubot_docker_image_customized_build_nocache: false | |||||
| # Controls whether the customized image (`matrix_bot_maubot_docker_image_customized`) is to be built, even if it already exists. | |||||
| # Related to: matrix_bot_maubot_docker_image_customized_build_nocache | |||||
| matrix_bot_maubot_docker_image_customized_force_source: "{{ matrix_bot_maubot_docker_image_customized_build_nocache }}" | |||||
| # matrix_bot_maubot_docker_image_final holds the name of the maubot image to run depending on whether or not customizations are enabled. | |||||
| matrix_bot_maubot_docker_image_final: "{{ matrix_bot_maubot_docker_image_customized if matrix_bot_maubot_container_image_customizations_enabled else matrix_bot_maubot_docker_image }} " | |||||
| matrix_bot_maubot_base_path: "{{ matrix_base_data_path }}/maubot" | matrix_bot_maubot_base_path: "{{ matrix_base_data_path }}/maubot" | ||||
| matrix_bot_maubot_data_path: "{{ matrix_bot_maubot_base_path }}/data" | matrix_bot_maubot_data_path: "{{ matrix_bot_maubot_base_path }}/data" | ||||
| matrix_bot_maubot_config_path: "{{ matrix_bot_maubot_base_path }}/config" | matrix_bot_maubot_config_path: "{{ matrix_bot_maubot_base_path }}/config" | ||||
| matrix_bot_maubot_docker_src_files_path: "{{ matrix_bot_maubot_base_path }}/docker-src" | |||||
| matrix_bot_maubot_customized_docker_src_files_path: "{{ matrix_bot_maubot_base_path }}/customized-docker-src" | |||||
| matrix_bot_maubot_bot_server_public_url: "{{ matrix_bot_maubot_scheme }}://{{ matrix_bot_maubot_hostname }}" | matrix_bot_maubot_bot_server_public_url: "{{ matrix_bot_maubot_scheme }}://{{ matrix_bot_maubot_hostname }}" | ||||
| matrix_bot_maubot_bot_server_base_path: "{{ matrix_bot_maubot_path_prefix }}/v1" | matrix_bot_maubot_bot_server_base_path: "{{ matrix_bot_maubot_path_prefix }}/v1" | ||||
| @@ -87,6 +103,30 @@ matrix_bot_maubot_container_additional_networks: "{{ matrix_bot_maubot_container | |||||
| matrix_bot_maubot_container_additional_networks_auto: [] | matrix_bot_maubot_container_additional_networks_auto: [] | ||||
| matrix_bot_maubot_container_additional_networks_custom: [] | matrix_bot_maubot_container_additional_networks_custom: [] | ||||
| # matrix_bot_maubot_container_image_customizations_enabled controls whether a customized maubot image will be built. | |||||
| # | |||||
| # We toggle this variable to `true` when certain features which require a custom build are enabled. | |||||
| # Feel free to toggle this to `true` yourself and specify build steps in `matrix_bot_maubot_container_image_customizations_dockerfile_body_custom`. | |||||
| # | |||||
| # See: | |||||
| # - `roles/custom/matrix-bot-maubot/templates/maubot/customizations/Dockerfile.j2` | |||||
| # - `matrix_bot_maubot_container_image_customizations_dockerfile_body_custom` | |||||
| # - `matrix_bot_maubot_docker_image_customized` | |||||
| # - `matrix_bot_maubot_docker_image_final` | |||||
| matrix_bot_maubot_container_image_customizations_enabled: false | |||||
| # matrix_bot_maubot_container_image_customizations_dockerfile_body contains your custom Dockerfile steps | |||||
| # for building your customized maubot image based on the original (upstream) image (`matrix_bot_maubot_docker_image`). | |||||
| # A `FROM …` clause is included automatically so you don't have to. | |||||
| # | |||||
| # Example: | |||||
| # matrix_bot_maubot_container_image_customizations_dockerfile_body_custom: | | |||||
| # RUN echo 'This is a custom step for building the customized container image for maubot.' | |||||
| # RUN echo 'You can override matrix_bot_maubot_container_image_customizations_dockerfile_body_custom to add your own steps.' | |||||
| # RUN echo 'You do NOT need to include a FROM clause yourself.' | |||||
| matrix_bot_maubot_container_image_customizations_dockerfile_body_custom: '' | |||||
| # matrix_bot_maubot_container_labels_traefik_enabled controls whether labels to assist a Traefik reverse-proxy will be attached to the container. | # matrix_bot_maubot_container_labels_traefik_enabled controls whether labels to assist a Traefik reverse-proxy will be attached to the container. | ||||
| # See `../templates/labels.j2` for details. | # See `../templates/labels.j2` for details. | ||||
| # | # | ||||
| @@ -15,6 +15,7 @@ | |||||
| - {path: "{{ matrix_bot_maubot_data_path }}/dbs", when: true} | - {path: "{{ matrix_bot_maubot_data_path }}/dbs", when: true} | ||||
| - {path: "{{ matrix_bot_maubot_data_path }}/trash", when: true} | - {path: "{{ matrix_bot_maubot_data_path }}/trash", when: true} | ||||
| - {path: "{{ matrix_bot_maubot_docker_src_files_path }}", when: "{{ matrix_bot_maubot_container_image_self_build }}"} | - {path: "{{ matrix_bot_maubot_docker_src_files_path }}", when: "{{ matrix_bot_maubot_container_image_self_build }}"} | ||||
| - {path: "{{ matrix_bot_maubot_customized_docker_src_files_path }}", when: "{{ matrix_bot_maubot_container_image_customizations_enabled }}"} | |||||
| when: "item.when|bool" | when: "item.when|bool" | ||||
| - name: Ensure maubot configuration file created | - name: Ensure maubot configuration file created | ||||
| @@ -37,28 +38,49 @@ | |||||
| delay: "{{ devture_playbook_help_container_retries_delay }}" | delay: "{{ devture_playbook_help_container_retries_delay }}" | ||||
| until: result is not failed | until: result is not failed | ||||
| - name: Ensure maubot repository is present on self-build | |||||
| ansible.builtin.git: | |||||
| repo: "{{ matrix_bot_maubot_docker_repo }}" | |||||
| version: "{{ matrix_bot_maubot_docker_repo_version }}" | |||||
| dest: "{{ matrix_bot_maubot_docker_src_files_path }}" | |||||
| force: "yes" | |||||
| become: true | |||||
| become_user: "{{ matrix_user_username }}" | |||||
| register: matrix_bot_maubot_git_pull_results | |||||
| when: "matrix_bot_maubot_container_image_self_build|bool" | |||||
| - when: matrix_bot_maubot_container_image_self_build | bool | |||||
| block: | |||||
| - name: Ensure maubot repository is present on self-build | |||||
| ansible.builtin.git: | |||||
| repo: "{{ matrix_bot_maubot_docker_repo }}" | |||||
| version: "{{ matrix_bot_maubot_docker_repo_version }}" | |||||
| dest: "{{ matrix_bot_maubot_docker_src_files_path }}" | |||||
| force: "yes" | |||||
| become: true | |||||
| become_user: "{{ matrix_user_username }}" | |||||
| register: matrix_bot_maubot_git_pull_results | |||||
| - name: Ensure maubot image is built | |||||
| community.docker.docker_image: | |||||
| name: "{{ matrix_bot_maubot_docker_image }}" | |||||
| source: build | |||||
| force_source: "{{ matrix_bot_maubot_git_pull_results.changed if ansible_version.major > 2 or ansible_version.minor >= 8 else omit }}" | |||||
| force: "{{ omit if ansible_version.major > 2 or ansible_version.minor >= 8 else matrix_bot_maubot_git_pull_results.changed }}" | |||||
| build: | |||||
| dockerfile: Dockerfile | |||||
| path: "{{ matrix_bot_maubot_docker_src_files_path }}" | |||||
| pull: true | |||||
| when: "matrix_bot_maubot_container_image_self_build|bool" | |||||
| - name: Ensure maubot image is built | |||||
| community.docker.docker_image: | |||||
| name: "{{ matrix_bot_maubot_docker_image }}" | |||||
| source: build | |||||
| force_source: "{{ matrix_bot_maubot_git_pull_results.changed if ansible_version.major > 2 or ansible_version.minor >= 8 else omit }}" | |||||
| force: "{{ omit if ansible_version.major > 2 or ansible_version.minor >= 8 else matrix_bot_maubot_git_pull_results.changed }}" | |||||
| build: | |||||
| dockerfile: Dockerfile | |||||
| path: "{{ matrix_bot_maubot_docker_src_files_path }}" | |||||
| pull: true | |||||
| - when: "matrix_bot_maubot_container_image_customizations_enabled | bool" | |||||
| block: | |||||
| - name: Ensure customizations Dockerfile is created | |||||
| ansible.builtin.template: | |||||
| src: "{{ role_path }}/templates/customizations/Dockerfile.j2" | |||||
| dest: "{{ matrix_bot_maubot_customized_docker_src_files_path }}/Dockerfile" | |||||
| owner: "{{ matrix_user_username }}" | |||||
| group: "{{ matrix_user_groupname }}" | |||||
| mode: 0640 | |||||
| register: matrix_bot_maubot_container_image_customizations_dockerfile_result | |||||
| - name: Ensure customized Docker image for maubot is built | |||||
| community.docker.docker_image: | |||||
| name: "{{ matrix_bot_maubot_docker_image_customized }}" | |||||
| source: build | |||||
| force_source: "{{ matrix_bot_maubot_container_image_customizations_dockerfile_result.changed or matrix_bot_maubot_docker_image_customized_force_source }}" | |||||
| build: | |||||
| dockerfile: Dockerfile | |||||
| path: "{{ matrix_bot_maubot_customized_docker_src_files_path }}" | |||||
| nocache: "{{ matrix_bot_maubot_docker_image_customized_build_nocache }}" | |||||
| - name: Ensure maubot support files installed | - name: Ensure maubot support files installed | ||||
| ansible.builtin.template: | ansible.builtin.template: | ||||
| @@ -0,0 +1,4 @@ | |||||
| #jinja2: lstrip_blocks: "True" | |||||
| FROM {{ matrix_bot_maubot_docker_image }} | |||||
| {{ matrix_bot_maubot_container_image_customizations_dockerfile_body_custom }} | |||||
| @@ -38,7 +38,7 @@ ExecStartPre={{ devture_systemd_docker_base_host_command_docker }} create \ | |||||
| {% if matrix_bot_maubot_container_management_interface_http_bind_port %} | {% if matrix_bot_maubot_container_management_interface_http_bind_port %} | ||||
| -p {{ matrix_bot_maubot_container_management_interface_http_bind_port }}:{{ matrix_bot_maubot_server_port }} \ | -p {{ matrix_bot_maubot_container_management_interface_http_bind_port }}:{{ matrix_bot_maubot_server_port }} \ | ||||
| {% endif %} | {% endif %} | ||||
| {{ matrix_bot_maubot_docker_image }} \ | |||||
| {{ matrix_bot_maubot_docker_image_final }} \ | |||||
| python3 -m maubot -c /config/config.yaml --no-update | python3 -m maubot -c /config/config.yaml --no-update | ||||
| {% for network in matrix_bot_maubot_container_additional_networks %} | {% for network in matrix_bot_maubot_container_additional_networks %} | ||||