| @@ -1,5 +1,12 @@ | |||||
| # 2018-08-17 | # 2018-08-17 | ||||
| ## REST auth support via matrix-synapse-rest-auth | |||||
| The playbook can now install and configure [matrix-synapse-rest-auth](https://github.com/kamax-io/matrix-synapse-rest-auth) for you. | |||||
| Additional details are available in [Setting up the REST authentication password provider module](docs/configuring-playbook-rest-auth.md). | |||||
| ## Compression improvements | ## Compression improvements | ||||
| Shifted Matrix Synapse compression from happening in the Matrix Synapse, | Shifted Matrix Synapse compression from happening in the Matrix Synapse, | ||||
| @@ -26,6 +26,8 @@ Using this playbook, you can get the following services configured on your serve | |||||
| - (optional default) an [nginx](http://nginx.org/) web server, listening on ports 80 and 443 - standing in front of all the other services. Using your own webserver [is possible](#using-your-own-webserver-instead-of-this-playbooks-nginx-proxy-optional) | - (optional default) an [nginx](http://nginx.org/) web server, listening on ports 80 and 443 - standing in front of all the other services. Using your own webserver [is possible](#using-your-own-webserver-instead-of-this-playbooks-nginx-proxy-optional) | ||||
| - (optional) the [matrix-synapse-rest-auth](https://github.com/kamax-io/matrix-synapse-rest-auth) REST authentication password provider module | |||||
| Basically, this playbook aims to get you up-and-running with all the basic necessities around Matrix, without you having to do anything else. | Basically, this playbook aims to get you up-and-running with all the basic necessities around Matrix, without you having to do anything else. | ||||
| @@ -0,0 +1,15 @@ | |||||
| # Setting up the REST authentication password provider module | |||||
| The playbook can now install and configure [matrix-synapse-rest-auth](https://github.com/kamax-io/matrix-synapse-rest-auth) for you. | |||||
| See that project's documentation to learn what it does and why it might be useful to you. | |||||
| If you decide that you'd like to let this playbook install it for you, you need soem configuration like this: | |||||
| ```yaml | |||||
| matrix_synapse_ext_password_provider_rest_auth_enabled: true | |||||
| matrix_synapse_ext_password_provider_rest_auth_endpoint: "http://change.me.example.com:12345" | |||||
| matrix_synapse_ext_password_provider_rest_auth_registration_enforce_lowercase: false | |||||
| matrix_synapse_ext_password_provider_rest_auth_registration_profile_name_autofill: true | |||||
| matrix_synapse_ext_password_provider_rest_auth_login_profile_name_autofill: false | |||||
| ``` | |||||
| @@ -31,4 +31,6 @@ When you're done with all the configuration you'd like to do, continue with [Ins | |||||
| - [Adjusting mxisd Identity Server configuration](configuring-playbook-mxisd.md) (optional) | - [Adjusting mxisd Identity Server configuration](configuring-playbook-mxisd.md) (optional) | ||||
| - [Using your own webserver, instead of this playbook's nginx proxy](configuring-playbook-own-webserver.md) (optional) | |||||
| - [Using your own webserver, instead of this playbook's nginx proxy](configuring-playbook-own-webserver.md) (optional) | |||||
| - [Setting up the REST authentication password provider module](configuring-playbook-rest-auth.md) (optional) | |||||
| @@ -33,6 +33,7 @@ matrix_synapse_config_dir_path: "{{ matrix_synapse_base_path }}/config" | |||||
| matrix_synapse_run_path: "{{ matrix_synapse_base_path }}/run" | matrix_synapse_run_path: "{{ matrix_synapse_base_path }}/run" | ||||
| matrix_synapse_storage_path: "{{ matrix_synapse_base_path }}/storage" | matrix_synapse_storage_path: "{{ matrix_synapse_base_path }}/storage" | ||||
| matrix_synapse_media_store_path: "{{ matrix_synapse_storage_path }}/media-store" | matrix_synapse_media_store_path: "{{ matrix_synapse_storage_path }}/media-store" | ||||
| matrix_synapse_ext_path: "{{ matrix_synapse_base_path }}/ext" | |||||
| # Specifies which template files to use when configuring Synapse. | # Specifies which template files to use when configuring Synapse. | ||||
| # If you'd like to have your own different configuration, feel free to copy and paste | # If you'd like to have your own different configuration, feel free to copy and paste | ||||
| @@ -60,6 +61,29 @@ matrix_synapse_max_upload_size_mb: 10 | |||||
| matrix_synapse_max_log_file_size_mb: 100 | matrix_synapse_max_log_file_size_mb: 100 | ||||
| matrix_synapse_max_log_files_count: 10 | matrix_synapse_max_log_files_count: 10 | ||||
| # A list of additional "volumes" to mount in the container. | |||||
| # This list gets populated dynamically based on Synapse extensions that have been enabled. | |||||
| # Contains definition objects like this: `{"src": "/outside", "dst": "/inside", "options": "rw|ro|slave|.."} | |||||
| matrix_synapse_container_additional_volumes: [] | |||||
| # A list of additional loggers to register in synapse.log.config. | |||||
| # This list gets populated dynamically based on Synapse extensions that have been enabled. | |||||
| # Contains definition objects like this: `{"name": "..", "level": "DEBUG"} | |||||
| matrix_synapse_additional_loggers: [] | |||||
| # This is set dynamically during execution depending on whether | |||||
| # any password providers have been enabled or not. | |||||
| matrix_synapse_password_providers_enabled: false | |||||
| # Enable this to activate the REST auth password provider module | |||||
| # See: https://github.com/kamax-io/matrix-synapse-rest-auth | |||||
| matrix_synapse_ext_password_provider_rest_auth_enabled: false | |||||
| matrix_synapse_ext_password_provider_rest_auth_download_url: "https://raw.githubusercontent.com/kamax-io/matrix-synapse-rest-auth/v0.1.1/rest_auth_provider.py" | |||||
| matrix_synapse_ext_password_provider_rest_auth_endpoint: "" | |||||
| matrix_synapse_ext_password_provider_rest_auth_registration_enforce_lowercase: false | |||||
| matrix_synapse_ext_password_provider_rest_auth_registration_profile_name_autofill: true | |||||
| matrix_synapse_ext_password_provider_rest_auth_login_profile_name_autofill: false | |||||
| matrix_postgres_data_path: "{{ matrix_base_data_path }}/postgres" | matrix_postgres_data_path: "{{ matrix_base_data_path }}/postgres" | ||||
| matrix_nginx_proxy_data_path: "{{ matrix_base_data_path }}/nginx-proxy" | matrix_nginx_proxy_data_path: "{{ matrix_base_data_path }}/nginx-proxy" | ||||
| matrix_nginx_proxy_confd_path: "{{ matrix_nginx_proxy_data_path }}/conf.d" | matrix_nginx_proxy_confd_path: "{{ matrix_nginx_proxy_data_path }}/conf.d" | ||||
| @@ -159,4 +183,4 @@ matrix_ssl_renew_cron_time_definition: "15 4 */5 * *" | |||||
| # Specifies when to reload the matrix-nginx-proxy service so that | # Specifies when to reload the matrix-nginx-proxy service so that | ||||
| # a new SSL certificate could go into effect. | # a new SSL certificate could go into effect. | ||||
| matrix_nginx_proxy_reload_cron_time_definition: "20 4 */5 * *" | |||||
| matrix_nginx_proxy_reload_cron_time_definition: "20 4 */5 * *" | |||||
| @@ -1,99 +1,7 @@ | |||||
| --- | --- | ||||
| - name: Fail if Macaroon key is missing | |||||
| fail: | |||||
| msg: "You need to set a secret in the matrix_synapse_macaroon_secret_key variable" | |||||
| when: "matrix_synapse_macaroon_secret_key == ''" | |||||
| - include: tasks/setup_synapse_pre.yml | |||||
| - name: Ensure Matrix Synapse paths exist | |||||
| file: | |||||
| path: "{{ item }}" | |||||
| state: directory | |||||
| mode: 0750 | |||||
| owner: "{{ matrix_user_username }}" | |||||
| group: "{{ matrix_user_username }}" | |||||
| with_items: | |||||
| - "{{ matrix_synapse_config_dir_path }}" | |||||
| - "{{ matrix_synapse_run_path }}" | |||||
| - "{{ matrix_synapse_storage_path }}" | |||||
| # We handle matrix_synapse_media_store_path below, not here, | |||||
| # because if it's using S3fs and it's already mounted (from before), | |||||
| # trying to chown/chmod it here will cause trouble. | |||||
| - include: tasks/setup_synapse_ext.yml | |||||
| # This will throw a Permission Denied error if already mounted using fuse | |||||
| - name: Check Matrix Synapse media store path | |||||
| stat: path="{{ matrix_synapse_media_store_path }}" | |||||
| register: local_path_media_store_stat | |||||
| ignore_errors: yes | |||||
| # This is separate and conditional, to ensure we don't execute it | |||||
| # if the path already exists or we failed to check, because it's mounted using fuse. | |||||
| - name: Ensure Matrix media store path exists | |||||
| file: | |||||
| path: "{{ matrix_synapse_media_store_path }}" | |||||
| state: directory | |||||
| mode: 0750 | |||||
| owner: "{{ matrix_user_username }}" | |||||
| group: "{{ matrix_user_username }}" | |||||
| when: "not local_path_media_store_stat.failed and not local_path_media_store_stat.stat.exists" | |||||
| - name: Ensure Matrix Docker image is pulled | |||||
| docker_image: | |||||
| name: "{{ matrix_docker_image_synapse }}" | |||||
| - name: Check if a Matrix Synapse configuration exists | |||||
| stat: | |||||
| path: "{{ matrix_synapse_config_dir_path }}/homeserver.yaml" | |||||
| register: matrix_synapse_config_stat | |||||
| # We do this mostly so that the keys would get generated. | |||||
| # We'll replace the rest of the configuration with our own templates below. | |||||
| - name: Generate initial Matrix config | |||||
| docker_container: | |||||
| name: matrix-config | |||||
| image: "{{ matrix_docker_image_synapse }}" | |||||
| detach: no | |||||
| cleanup: yes | |||||
| command: generate | |||||
| env: | |||||
| SYNAPSE_CONFIG_PATH: "/data/homeserver.yaml" | |||||
| SYNAPSE_SERVER_NAME: "{{ hostname_matrix }}" | |||||
| SYNAPSE_REPORT_STATS: "no" | |||||
| user: "{{ matrix_user_uid }}:{{ matrix_user_gid }}" | |||||
| volumes: | |||||
| - "{{ matrix_synapse_config_dir_path }}:/data" | |||||
| when: "not matrix_synapse_config_stat.stat.exists" | |||||
| - name: Ensure Matrix homeserver config installed | |||||
| template: | |||||
| src: "{{ matrix_synapse_template_synapse_homeserver }}" | |||||
| dest: "{{ matrix_synapse_config_dir_path }}/homeserver.yaml" | |||||
| mode: 0644 | |||||
| - name: Ensure Matrix log config installed | |||||
| template: | |||||
| src: "{{ matrix_synapse_template_synapse_log }}" | |||||
| dest: "{{ matrix_synapse_config_dir_path }}/{{ hostname_matrix }}.log.config" | |||||
| mode: 0644 | |||||
| - name: Ensure matrix-synapse.service installed | |||||
| template: | |||||
| src: "{{ role_path }}/templates/systemd/matrix-synapse.service.j2" | |||||
| dest: "/etc/systemd/system/matrix-synapse.service" | |||||
| mode: 0644 | |||||
| - name: Ensure matrix-synapse-register-user script created | |||||
| template: | |||||
| src: "{{ role_path }}/templates/usr-local-bin/matrix-synapse-register-user.j2" | |||||
| dest: "/usr/local/bin/matrix-synapse-register-user" | |||||
| mode: 0750 | |||||
| - name: Allow access to Matrix ports in firewalld | |||||
| firewalld: | |||||
| port: "{{ item }}" | |||||
| state: enabled | |||||
| immediate: yes | |||||
| permanent: yes | |||||
| with_items: | |||||
| - '8448/tcp' # Matrix federation | |||||
| when: ansible_os_family == 'RedHat' | |||||
| - include: tasks/setup_synapse_main.yml | |||||
| @@ -0,0 +1,3 @@ | |||||
| --- | |||||
| - include: tasks/setup_synapse_ext_rest_auth.yml | |||||
| @@ -0,0 +1,45 @@ | |||||
| --- | |||||
| # | |||||
| # Tasks related to setting up matrix-synapse-rest-auth | |||||
| # | |||||
| - name: Download matrix-synapse-rest-auth | |||||
| get_url: | |||||
| url: "{{ matrix_synapse_ext_password_provider_rest_auth_download_url }}" | |||||
| dest: "{{ matrix_synapse_ext_path }}/rest_auth_provider.py" | |||||
| mode: 0440 | |||||
| owner: "{{ matrix_user_username }}" | |||||
| group: "{{ matrix_user_username }}" | |||||
| - set_fact: | |||||
| matrix_synapse_password_providers_enabled: true | |||||
| when: "matrix_synapse_ext_password_provider_rest_auth_enabled" | |||||
| - set_fact: | |||||
| matrix_synapse_container_additional_volumes: > | |||||
| {{ matrix_synapse_container_additional_volumes }} | |||||
| + | |||||
| {{ [{'src': '{{ matrix_synapse_ext_path }}/rest_auth_provider.py', 'dst': '/usr/local/lib/python2.7/site-packages/rest_auth_provider.py', 'options': 'ro'}] }} | |||||
| when: "matrix_synapse_ext_password_provider_rest_auth_enabled" | |||||
| - set_fact: | |||||
| matrix_synapse_additional_loggers: > | |||||
| {{ matrix_synapse_additional_loggers }} | |||||
| + | |||||
| {{ [{'name': 'rest_auth_provider', 'level': 'DEBUG'}] }} | |||||
| when: "matrix_synapse_ext_password_provider_rest_auth_enabled" | |||||
| - debug: var="matrix_synapse_container_additional_volumes" | |||||
| - debug: var="matrix_synapse_additional_loggers" | |||||
| # | |||||
| # Tasks related to getting rid of matrix-synapse-rest-auth (if it was previously enabled) | |||||
| # | |||||
| - name: Ensure matrix-synapse-rest-auth doesn't exist | |||||
| file: | |||||
| path: "{{ matrix_synapse_ext_path }}/rest_auth_provider.py" | |||||
| state: absent | |||||
| when: "not matrix_synapse_ext_password_provider_rest_auth_enabled" | |||||
| @@ -0,0 +1,84 @@ | |||||
| --- | |||||
| - name: Fail if Macaroon key is missing | |||||
| fail: | |||||
| msg: "You need to set a secret in the matrix_synapse_macaroon_secret_key variable" | |||||
| when: "matrix_synapse_macaroon_secret_key == ''" | |||||
| # This will throw a Permission Denied error if already mounted using fuse | |||||
| - name: Check Matrix Synapse media store path | |||||
| stat: path="{{ matrix_synapse_media_store_path }}" | |||||
| register: local_path_media_store_stat | |||||
| ignore_errors: yes | |||||
| # This is separate and conditional, to ensure we don't execute it | |||||
| # if the path already exists or we failed to check, because it's mounted using fuse. | |||||
| - name: Ensure Matrix media store path exists | |||||
| file: | |||||
| path: "{{ matrix_synapse_media_store_path }}" | |||||
| state: directory | |||||
| mode: 0750 | |||||
| owner: "{{ matrix_user_username }}" | |||||
| group: "{{ matrix_user_username }}" | |||||
| when: "not local_path_media_store_stat.failed and not local_path_media_store_stat.stat.exists" | |||||
| - name: Ensure Matrix Docker image is pulled | |||||
| docker_image: | |||||
| name: "{{ matrix_docker_image_synapse }}" | |||||
| - name: Check if a Matrix Synapse configuration exists | |||||
| stat: | |||||
| path: "{{ matrix_synapse_config_dir_path }}/homeserver.yaml" | |||||
| register: matrix_synapse_config_stat | |||||
| # We do this mostly so that the keys would get generated. | |||||
| # We'll replace the rest of the configuration with our own templates below. | |||||
| - name: Generate initial Matrix config | |||||
| docker_container: | |||||
| name: matrix-config | |||||
| image: "{{ matrix_docker_image_synapse }}" | |||||
| detach: no | |||||
| cleanup: yes | |||||
| command: generate | |||||
| env: | |||||
| SYNAPSE_CONFIG_PATH: "/data/homeserver.yaml" | |||||
| SYNAPSE_SERVER_NAME: "{{ hostname_matrix }}" | |||||
| SYNAPSE_REPORT_STATS: "no" | |||||
| user: "{{ matrix_user_uid }}:{{ matrix_user_gid }}" | |||||
| volumes: | |||||
| - "{{ matrix_synapse_config_dir_path }}:/data" | |||||
| when: "not matrix_synapse_config_stat.stat.exists" | |||||
| - name: Ensure Matrix homeserver config installed | |||||
| template: | |||||
| src: "{{ matrix_synapse_template_synapse_homeserver }}" | |||||
| dest: "{{ matrix_synapse_config_dir_path }}/homeserver.yaml" | |||||
| mode: 0644 | |||||
| - name: Ensure Matrix log config installed | |||||
| template: | |||||
| src: "{{ matrix_synapse_template_synapse_log }}" | |||||
| dest: "{{ matrix_synapse_config_dir_path }}/{{ hostname_matrix }}.log.config" | |||||
| mode: 0644 | |||||
| - name: Ensure matrix-synapse.service installed | |||||
| template: | |||||
| src: "{{ role_path }}/templates/systemd/matrix-synapse.service.j2" | |||||
| dest: "/etc/systemd/system/matrix-synapse.service" | |||||
| mode: 0644 | |||||
| - name: Ensure matrix-synapse-register-user script created | |||||
| template: | |||||
| src: "{{ role_path }}/templates/usr-local-bin/matrix-synapse-register-user.j2" | |||||
| dest: "/usr/local/bin/matrix-synapse-register-user" | |||||
| mode: 0750 | |||||
| - name: Allow access to Matrix ports in firewalld | |||||
| firewalld: | |||||
| port: "{{ item }}" | |||||
| state: enabled | |||||
| immediate: yes | |||||
| permanent: yes | |||||
| with_items: | |||||
| - '8448/tcp' # Matrix federation | |||||
| when: ansible_os_family == 'RedHat' | |||||
| @@ -0,0 +1,17 @@ | |||||
| --- | |||||
| - name: Ensure Matrix Synapse paths exist | |||||
| file: | |||||
| path: "{{ item }}" | |||||
| state: directory | |||||
| mode: 0750 | |||||
| owner: "{{ matrix_user_username }}" | |||||
| group: "{{ matrix_user_username }}" | |||||
| with_items: | |||||
| - "{{ matrix_synapse_config_dir_path }}" | |||||
| - "{{ matrix_synapse_run_path }}" | |||||
| - "{{ matrix_synapse_storage_path }}" | |||||
| - "{{ matrix_synapse_ext_path }}" | |||||
| # We handle matrix_synapse_media_store_path elsewhere (in setup_synapse.yml), | |||||
| # because if it's using S3fs and it's already mounted (from before), | |||||
| # trying to chown/chmod it here will cause trouble. | |||||
| @@ -580,7 +580,23 @@ email: | |||||
| # #bind_dn: | # #bind_dn: | ||||
| # #bind_password: | # #bind_password: | ||||
| # #filter: "(objectClass=posixAccount)" | # #filter: "(objectClass=posixAccount)" | ||||
| {% if matrix_synapse_password_providers_enabled %} | |||||
| password_providers: | |||||
| {% if matrix_synapse_ext_password_provider_rest_auth_enabled %} | |||||
| - module: "rest_auth_provider.RestAuthProvider" | |||||
| config: | |||||
| endpoint: "{{ matrix_synapse_ext_password_provider_rest_auth_endpoint }}" | |||||
| policy: | |||||
| registration: | |||||
| username: | |||||
| enforceLowercase: {{ matrix_synapse_ext_password_provider_rest_auth_registration_enforce_lowercase }} | |||||
| profile: | |||||
| name: {{ matrix_synapse_ext_password_provider_rest_auth_registration_profile_name_autofill }} | |||||
| login: | |||||
| profile: | |||||
| name: {{ matrix_synapse_ext_password_provider_rest_auth_login_profile_name_autofill }} | |||||
| {% endif %} | |||||
| {% endif %} | |||||
| # Clients requesting push notifications can either have the body of | # Clients requesting push notifications can either have the body of | ||||
| @@ -32,6 +32,11 @@ loggers: | |||||
| # information such as access tokens. | # information such as access tokens. | ||||
| level: INFO | level: INFO | ||||
| {% for logger in matrix_synapse_additional_loggers %} | |||||
| {{ logger.name }}: | |||||
| level: {{ logger.level }} | |||||
| {% endfor %} | |||||
| root: | root: | ||||
| level: INFO | level: INFO | ||||
| handlers: [file, console] | handlers: [file, console] | ||||
| @@ -34,6 +34,9 @@ ExecStart=/usr/bin/docker run --rm --name matrix-synapse \ | |||||
| -v {{ matrix_synapse_config_dir_path }}:/data \ | -v {{ matrix_synapse_config_dir_path }}:/data \ | ||||
| -v {{ matrix_synapse_run_path }}:/matrix-run \ | -v {{ matrix_synapse_run_path }}:/matrix-run \ | ||||
| -v {{ matrix_synapse_storage_path }}:/matrix-storage:slave \ | -v {{ matrix_synapse_storage_path }}:/matrix-storage:slave \ | ||||
| {% for volume in matrix_synapse_container_additional_volumes %} | |||||
| -v {{ volume.src }}:{{ volume.dst }}:{{ volume.options }} \ | |||||
| {% endfor %} | |||||
| -e SYNAPSE_CONFIG_PATH=/data/homeserver.yaml \ | -e SYNAPSE_CONFIG_PATH=/data/homeserver.yaml \ | ||||
| {{ matrix_docker_image_synapse }} | {{ matrix_docker_image_synapse }} | ||||
| ExecStop=-/usr/bin/docker kill matrix-synapse | ExecStop=-/usr/bin/docker kill matrix-synapse | ||||