diff --git a/plays/matrix.yml b/plays/matrix.yml
new file mode 100755
index 0000000000000000000000000000000000000000..60543aa83d0a0eb5db4f7d4af57ea5fb52f09cfd
--- /dev/null
+++ b/plays/matrix.yml
@@ -0,0 +1,5 @@
+#!/usr/bin/env ansible-playbook
+---
+- hosts: trinity.adm.crans.org
+  roles:
+    - matrix-synapse
diff --git a/roles/matrix-synapse/handlers/main.yml b/roles/matrix-synapse/handlers/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..aab51dae9452ff960ee5e3d694a2e3a5db4925ee
--- /dev/null
+++ b/roles/matrix-synapse/handlers/main.yml
@@ -0,0 +1,5 @@
+---
+- name: Restart matrix-synapse
+  service:
+    name: matrix-synapse
+    state: restarted
diff --git a/roles/matrix-synapse/tasks/main.yml b/roles/matrix-synapse/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..83a6d6ef65007d6b5b45c65c29ad3a9f7c99edb3
--- /dev/null
+++ b/roles/matrix-synapse/tasks/main.yml
@@ -0,0 +1,29 @@
+---
+- name: Configure Debian backports repository
+  template:
+    src: apt/sources.list.d/backports.list.j2
+    dest: /etc/apt/sources.list.d/backports.list
+
+- name: Install matrix-synapse
+  apt:
+    update_cache: true
+    default_release: "{{ ansible_lsb.codename }}-backports"
+    name: matrix-synapse
+  register: apt_result
+  retries: 3
+  until: apt_result is succeeded
+
+- name: Configure matrix-synapse
+  template:
+    src: "matrix-synapse/conf.d/{{ item }}.j2"
+    dest: "/etc/matrix-synapse/conf.d/{{ item }}"
+    mode: 0640
+    owner: matrix-synapse
+    group: nogroup
+  loop:
+    - app_service_config_files.yaml
+    - database.yaml
+    - listeners.yaml
+    - report_stats.yaml
+    - server_name.yaml
+  notify: Restart matrix-synapse
diff --git a/roles/matrix-synapse/templates/apt/sources.list.d/backports.list.j2 b/roles/matrix-synapse/templates/apt/sources.list.d/backports.list.j2
new file mode 100644
index 0000000000000000000000000000000000000000..6326b3e479e0fdc2fe3f69a4312f06057f4c9d54
--- /dev/null
+++ b/roles/matrix-synapse/templates/apt/sources.list.d/backports.list.j2
@@ -0,0 +1 @@
+deb     {{ debian_mirror }} {{ ansible_lsb.codename }}-backports main contrib non-free
diff --git a/roles/matrix-synapse/templates/matrix-synapse/conf.d/app_service_config_files.yaml.j2 b/roles/matrix-synapse/templates/matrix-synapse/conf.d/app_service_config_files.yaml.j2
new file mode 100644
index 0000000000000000000000000000000000000000..7ed59eac0abef58498177674536c2c3342667433
--- /dev/null
+++ b/roles/matrix-synapse/templates/matrix-synapse/conf.d/app_service_config_files.yaml.j2
@@ -0,0 +1 @@
+app_service_config_files: ["/var/local/matrix-appservice-irc/registration.yaml"]
diff --git a/roles/matrix-synapse/templates/matrix-synapse/conf.d/database.yaml.j2 b/roles/matrix-synapse/templates/matrix-synapse/conf.d/database.yaml.j2
new file mode 100644
index 0000000000000000000000000000000000000000..f03b840a78ccccd8916354a13542132daeac2d70
--- /dev/null
+++ b/roles/matrix-synapse/templates/matrix-synapse/conf.d/database.yaml.j2
@@ -0,0 +1,9 @@
+database:
+  name: "psycopg2"
+  args:
+    user: "{{ matrix_synapse.database_user }}"
+    password: "{{ matrix_synapse.database_password }}"
+    database: "{{ matrix_synapse.database_name }}"
+    host: "{{ matrix_synapse.database_host }}"
+    cp_min: 5
+    cp_max: 10
diff --git a/roles/matrix-synapse/templates/matrix-synapse/conf.d/listeners.yaml.j2 b/roles/matrix-synapse/templates/matrix-synapse/conf.d/listeners.yaml.j2
new file mode 100644
index 0000000000000000000000000000000000000000..a37ad8f6b998051d6b944872eda5d324c4b7724c
--- /dev/null
+++ b/roles/matrix-synapse/templates/matrix-synapse/conf.d/listeners.yaml.j2
@@ -0,0 +1,14 @@
+listeners:
+  - port: 8008
+    tls: false
+    bind_addresses:
+      - '::'
+      - '0.0.0.0'
+    type: http
+    x_forwarded: true
+    resources:
+      - names: [client]
+        compress: true
+      - names: [federation]
+        compress: false
+
diff --git a/roles/matrix-synapse/templates/matrix-synapse/conf.d/report_stats.yaml.j2 b/roles/matrix-synapse/templates/matrix-synapse/conf.d/report_stats.yaml.j2
new file mode 100644
index 0000000000000000000000000000000000000000..47d71ee07b2c6d9121861b20968de92b736ee92e
--- /dev/null
+++ b/roles/matrix-synapse/templates/matrix-synapse/conf.d/report_stats.yaml.j2
@@ -0,0 +1,2 @@
+report_stats: false
+
diff --git a/roles/matrix-synapse/templates/matrix-synapse/conf.d/server_name.yaml.j2 b/roles/matrix-synapse/templates/matrix-synapse/conf.d/server_name.yaml.j2
new file mode 100644
index 0000000000000000000000000000000000000000..0da924aa75324bf2b14e3eb47ecd641cf8324a61
--- /dev/null
+++ b/roles/matrix-synapse/templates/matrix-synapse/conf.d/server_name.yaml.j2
@@ -0,0 +1,2 @@
+server_name: crans.org
+