diff --git a/group_vars/reverseproxy.yml b/group_vars/reverseproxy.yml
index 5c8fd0d7cb057d3252abdffb8f3be91e361f2084..6a5d29592870be83d74a9633f9d59aae5f333077 100644
--- a/group_vars/reverseproxy.yml
+++ b/group_vars/reverseproxy.yml
@@ -38,6 +38,7 @@ nginx:
     - {from: roundcube.crans.org, to: 172.16.10.107}
     - {from: hedgedoc.crans.org, to: "172.16.10.128:3000"}
     - {from: owncloud.crans.org, to: 172.16.10.136}
+    - {from: linx.crans.org, to: "172.16.10.119:8080"}
     # - {from: belenios.crans.org, to: 172.16.10.111}
     # - {from: mailman.crans.org, to: 10.231.136.180}
 
diff --git a/hosts b/hosts
index 53dac242f18661f50376bba89dba071d08b3fbd5..cb195e01b4edadde34ab64327e35aa9f6b271caa 100644
--- a/hosts
+++ b/hosts
@@ -151,6 +151,7 @@ jitsi.adm.crans.org
 kenobi.adm.crans.org
 kiwi.adm.crans.org
 kiwijuice.adm.crans.org
+linx.adm.crans.org
 monitoring.adm.crans.org
 owl.adm.crans.org
 owncloud.adm.crans.org
diff --git a/plays/linx.yml b/plays/linx.yml
new file mode 100755
index 0000000000000000000000000000000000000000..80c298640addc04e8497f848001db9f717ae7b13
--- /dev/null
+++ b/plays/linx.yml
@@ -0,0 +1,9 @@
+#!/usr/bin/env ansible-playbook
+---
+- hosts: linx.adm.crans.org
+  vars:
+    linx:
+      ip: "{{ query('ldap', 'ip', 'linx', 'adm') }}"
+      siteurl: "https://linx.crans.org/"
+  roles:
+    - linx
diff --git a/roles/linx/handlers/main.yml b/roles/linx/handlers/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e75657211a22e5985baebd5dae931e840d87974b
--- /dev/null
+++ b/roles/linx/handlers/main.yml
@@ -0,0 +1,5 @@
+---
+- name: Restart linx-server
+  service:
+    name: linx-server
+    state: restarted
diff --git a/roles/linx/tasks/main.yml b/roles/linx/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..60214c5308ffa84aae9ed35ef948e18b4089bd83
--- /dev/null
+++ b/roles/linx/tasks/main.yml
@@ -0,0 +1,37 @@
+---
+#- name: Install linx
+
+- name: Create linx user
+  user:
+    create_home: yes
+    home: /var/lib/linx
+    system: yes
+    state: present
+    password: "!"
+    update_password: always
+    name: linx
+
+- name: Create linx config dir
+  file:
+    path: /etc/linx
+    state: directory
+
+- name: Deploy configuration file
+  template:
+    src: "linx/server.conf.j2"
+    dest: "/etc/linx/server.conf"
+    mode: 0644
+
+- name: Install linx systemd unit
+  template:
+    src: "systemd/system/linx-server.service.j2"
+    dest: "/etc/systemd/system/linx-server.service"
+    mode: 0644
+  notify: Restart linx-server
+
+- name: Load and activate linx systemd unit
+  systemd:
+    name: linx-server.service
+    daemon_reload: true
+    enabled: true
+    state: started
diff --git a/roles/linx/templates/linx/server.conf.j2 b/roles/linx/templates/linx/server.conf.j2
new file mode 100644
index 0000000000000000000000000000000000000000..25af772cf4f6dff9d88be77611dd8503fcef0dcb
--- /dev/null
+++ b/roles/linx/templates/linx/server.conf.j2
@@ -0,0 +1,9 @@
+{{ ansible_header | comment }}
+
+bind = {{ linx.ip }}:8080
+sitename = CRANS Linx
+siteurl = {{ linx.siteurl }}
+maxsize = 10000000
+maxexpiry = 604800
+filespath = /var/lib/linx/files/
+metapath = /var/lib/linx/meta/
diff --git a/roles/linx/templates/systemd/system/linx-server.service.j2 b/roles/linx/templates/systemd/system/linx-server.service.j2
new file mode 100644
index 0000000000000000000000000000000000000000..4ce99e254cc0fb10e93d3932ad54a92ed145228e
--- /dev/null
+++ b/roles/linx/templates/systemd/system/linx-server.service.j2
@@ -0,0 +1,16 @@
+{{ ansible_header | comment }}
+
+[Unit]
+Description=Linx
+After=network.target
+
+[Service]
+Type=simple
+User=linx
+Group=linx
+WorkingDirectory=/var/lib/linx/
+ExecStart=/usr/local/sbin/linx-server -config /etc/linx/server.conf
+Restart=always
+
+[Install]
+WantedBy=multi-user.target