diff --git a/group_vars/bdd.yml b/group_vars/postgres.yml
similarity index 78%
rename from group_vars/bdd.yml
rename to group_vars/postgres.yml
index e9bc488af8f68ad237782c06a9af29b8be46d585..0ecc3093eef0d9c702a657e641ae2f74b82c4346 100644
--- a/group_vars/bdd.yml
+++ b/group_vars/postgres.yml
@@ -1,4 +1,4 @@
-glob_psql:
+glob_postgres:
   subnets:
     - 172.16.10.0/24
     - fd00:0:0:10::/64
diff --git a/host_vars/daniel.adm.crans.org.yml b/host_vars/daniel.adm.crans.org.yml
index 2766f75aea578650aba6f677a2f77452f6fb039c..c759e0ab6ff46eda36a25f52eb2d78f6229892a3 100644
--- a/host_vars/daniel.adm.crans.org.yml
+++ b/host_vars/daniel.adm.crans.org.yml
@@ -4,7 +4,7 @@ loc_slapd:
   replica: true
   replica_rid: 2
 
-loc_psql:
+loc_postgres:
   version: 11
   replica: yes
   addresses: "['daniel.adm.crans.org'] + {{ query('ldap', 'ip', 'daniel', 'adm') | ipaddr('address') }}"
diff --git a/host_vars/gulp.cachan-adm.crans.org.yml b/host_vars/gulp.cachan-adm.crans.org.yml
index 7b436efdaa6967cd0e1ae543f190b98a0631393b..f3996168971fc429f1b883dadf318957b627c50d 100644
--- a/host_vars/gulp.cachan-adm.crans.org.yml
+++ b/host_vars/gulp.cachan-adm.crans.org.yml
@@ -10,7 +10,7 @@ glob_ntp_client:
 
 debian_mirror: http://172.17.10.202/debian
 
-loc_psql:
+loc_postgres:
   subnets:
     - 172.17.10.0/24
     - fd00:0:0:3010::/64
@@ -18,6 +18,9 @@ loc_psql:
   hosts:
     - { db: re2o, user: re2o }
   addresses: "['gulp.cachan-adm.crans.org'] + {{ query('ldap', 'ip', 'gulp', 'cachan-adm') | ipaddr('address') }}"
+  backup:
+    dir: /var/local/db-backup
+    frequency: "{{ 60 | random(seed=inventory_hostname) }} {{ ((24 | random(seed=inventory_hostname))+12)%24 }} * * *"
 
 loc_borg:
   remote:
diff --git a/host_vars/jack.adm.crans.org.yml b/host_vars/jack.adm.crans.org.yml
index db3c3b654ac42643d27a8b163cd780d8d3bdaeeb..38e384d9fd3a3a13d268bf4244e9bcb3f4058d0e 100644
--- a/host_vars/jack.adm.crans.org.yml
+++ b/host_vars/jack.adm.crans.org.yml
@@ -4,7 +4,7 @@ loc_slapd:
   replica: true
   replica_rid: 3
 
-loc_psql:
+loc_postgres:
   version: 11
   replica: yes
   addresses: "['jack.adm.crans.org'] + {{ query('ldap', 'ip', 'jack', 'adm') | ipaddr('address') }}"
diff --git a/host_vars/sam.adm.crans.org.yml b/host_vars/sam.adm.crans.org.yml
index a3163e32212d86ba0bbc0fbbe0a9624587be7a96..6128448d754be59b3b8418c935cd4c753d2ebbb7 100644
--- a/host_vars/sam.adm.crans.org.yml
+++ b/host_vars/sam.adm.crans.org.yml
@@ -4,7 +4,7 @@ loc_slapd:
   replica: true
   replica_rid: 1
 
-loc_psql:
+loc_postgres:
   version: 11
   replica: yes
   addresses: "['sam.adm.crans.org'] + {{ query('ldap', 'ip', 'sam', 'adm') | ipaddr('address') }}"
diff --git a/host_vars/tealc.adm.crans.org.yml b/host_vars/tealc.adm.crans.org.yml
index dce9520d86fbe2877b953da3e884f78ea380a4ef..e169e9e9387a272c52b9b840eca713809ba38939 100644
--- a/host_vars/tealc.adm.crans.org.yml
+++ b/host_vars/tealc.adm.crans.org.yml
@@ -1,4 +1,4 @@
-loc_psql:
+loc_postgres:
   version: 11
   hosts:
     - db: etherpad
@@ -19,11 +19,15 @@ loc_psql:
     - { db: sqlgrey, user: sqlgrey, method: ident }
     - { db: re2o, user: re2o }
     - { db: re2o_test, user: re2o }
+    - { db: constellation-dev, user: constellation-dev }
     - { db: mailman3, user: mailman3 }
     - { db: mailman3web, user: mailman3web }
     - { db: all, user: all, subnets: ['127.0.0.1/32','::1/128'], local: yes }
     - { db: replication, user: replication, local: yes }
   addresses: "['tealc.adm.crans.org'] + {{ query('ldap', 'ip', 'tealc', 'adm') | ipaddr('address') }}"
+  backup:
+    dir: /var/local/db-backup
+    frequency: "{{ 60 | random(seed=inventory_hostname) }} {{ ((24 | random(seed=inventory_hostname))+12)%24 }} * * *"
 
 loc_slapd:
   ip: "{{ query('ldap', 'ip', 'tealc', 'adm') | ipv4 | first }}"
diff --git a/hosts b/hosts
index bcba7db6760b6ed66232c3cefb3c1b34fa6cd54d..0a734fa9fdb86bfa365f29c2ecb1279d96fe3db6 100644
--- a/hosts
+++ b/hosts
@@ -14,13 +14,12 @@ omnomnom.cachan-adm.crans.org
 cameron.adm.crans.org
 tealc.adm.crans.org
 
-[bdd]
+[postgres]
 tealc.adm.crans.org
 gulp.cachan-adm.crans.org
 
 [blackbox]
 monitoring.adm.crans.org
-
 [bdd:children]
 virtu
 
diff --git a/plays/postgresql.yml b/plays/postgresql.yml
index 3c5ab740c67affbae5a7da7ac57d858987194c00..114ce1e7a1ca9ac23209badfa1bf5716aed486c5 100755
--- a/plays/postgresql.yml
+++ b/plays/postgresql.yml
@@ -1,8 +1,8 @@
 #!/usr/bin/env ansible-playbook
 ---
 # Deploy postgresql server
-- hosts: bdd
+- hosts: postgres
   vars:
-    psql: '{{ glob_psql | default({}) | combine(loc_psql | default({})) }}'
+    postgres: '{{ glob_postgres | default({}) | combine(loc_postgres | default({})) }}'
   roles:
     - postgresql
diff --git a/roles/postgresql/handlers/main.yml b/roles/postgresql/handlers/main.yml
index 5c9eb096d28d470545a4e74822721c1cf36bacbf..2081f6e49265b9a2ca6863ec05b9f79142f0b7a3 100644
--- a/roles/postgresql/handlers/main.yml
+++ b/roles/postgresql/handlers/main.yml
@@ -1,3 +1,3 @@
 ---
 - name: reload postgresql
-  command: /usr/bin/pg_ctlcluster {{ psql.version }} main reload
+  command: /usr/bin/pg_ctlcluster {{ postgres.version }} main reload
diff --git a/roles/postgresql/tasks/main.yml b/roles/postgresql/tasks/main.yml
index f40d96541b0e6fae77c1c85c12192b0c3a5c6281..e90aa6a6a87b1c298ca27ca0f2d9e14f3f60b896 100644
--- a/roles/postgresql/tasks/main.yml
+++ b/roles/postgresql/tasks/main.yml
@@ -1,7 +1,7 @@
 ---
 - name: Set postgresql installation directory
   set_fact:
-    psql_dir: '/etc/postgresql/{{ psql.version }}/main/'
+    postgres_dir: '/etc/postgresql/{{ postgres.version }}/main'
 
 - name: Install postgresql
   apt:
@@ -14,7 +14,7 @@
 
 - name: Ensure main postgresql directory exists
   file:
-    path: '{{ psql_dir }}'
+    path: '{{ postgres_dir }}'
     state: directory
     owner: postgres
     group: postgres
@@ -22,26 +22,26 @@
 
 - name: Ensure configuration directory exists
   file:
-    path: '{{ psql_dir }}/conf.d'
+    path: '{{ postgres_dir }}/conf.d'
     state: directory
     owner: postgres
     group: postgres
     mode: 0755
 
-- name: Configuration of postgresql {{ psql.version }}
+- name: Configuration of postgresql {{ postgres.version }}
   template:
     src: postgresql/postgresql.conf.j2
-    dest: '{{ psql_dir }}/postgresql.conf'
+    dest: '{{ postgres_dir }}/postgresql.conf'
     mode: 0640
     owner: postgres
     group: postgres
   notify:
     - reload postgresql
 
-- name: Master of configuration of postgresql {{ psql.version }}
+- name: Master of configuration of postgresql {{ postgres.version }}
   template:
     src: 'postgresql/{{ item }}.j2'
-    dest: '{{ psql_dir }}/{{ item }}'
+    dest: '{{ postgres_dir }}/{{ item }}'
     mode: 0640
     owner: postgres
     group: postgres
@@ -50,4 +50,19 @@
    - pg_ident.conf
   notify:
     - reload postgresql
-  when: 'not(psql.replica | default(False))'
+  when: 'not(postgres.replica | default(False))'
+
+- name: Create backup directory
+  file:
+    path: "{{ postgres.backup.dir }}"
+    owner: postgres
+    group: postgres
+    state: directory
+    mode: 0770
+  when: postgres.backup is defined
+
+- name: Create backup cron
+  template:
+    src: cron.d/pg_dump.j2
+    dest: /etc/cron.d/pg_dump
+  when: postgres.backup is defined
diff --git a/roles/postgresql/templates/cron.d/pg_dump.j2 b/roles/postgresql/templates/cron.d/pg_dump.j2
new file mode 100644
index 0000000000000000000000000000000000000000..312197b186d3df574526190f60e390e2f92e88d9
--- /dev/null
+++ b/roles/postgresql/templates/cron.d/pg_dump.j2
@@ -0,0 +1,5 @@
+{{ ansible_header | comment }}
+
+PATH=$PATH:/usr/sbin:/usr/bin:/usr/local/bin:/sbin:/bin
+
+{{ postgres.backup.frequency }} postgres pg_dumpall  -f {{ postgres.backup.dir }}/all.sql
diff --git a/roles/postgresql/templates/postgresql/pg_hba.conf.j2 b/roles/postgresql/templates/postgresql/pg_hba.conf.j2
index 5e877e0aebf7009973586a1f98733d601a4a880c..ca41345722a60feb3a28c0b911de5ec131d9da38 100644
--- a/roles/postgresql/templates/postgresql/pg_hba.conf.j2
+++ b/roles/postgresql/templates/postgresql/pg_hba.conf.j2
@@ -88,12 +88,12 @@ local   all             postgres                                peer
 
 # TYPE  DATABASE        USER            ADDRESS                 METHOD
 
-{% for host in psql.hosts %}
+{% for host in postgres.hosts %}
 {% if host.local | default(False) %}
 # "local" is for Unix domain socket connections only
 local  {{ host.db }} {{ host.user }} peer
 {% endif %}
-{% for subnet in host.subnets | default(psql.subnets) %}
+{% for subnet in host.subnets | default(postgres.subnets) %}
 host   {{ host.db }}    {{ host.user }}    {{ subnet }}    {% if host.map is defined %}ident map={{ host.map.name }}{% else %}{{ host.method | default('md5') }}{% endif %}
 
 {% endfor %}
diff --git a/roles/postgresql/templates/postgresql/pg_ident.conf.j2 b/roles/postgresql/templates/postgresql/pg_ident.conf.j2
index ed359311863adc56792867f46b01095192daecee..8c0dd01c12caf1c96744b6c90f1b035b75deb71b 100644
--- a/roles/postgresql/templates/postgresql/pg_ident.conf.j2
+++ b/roles/postgresql/templates/postgresql/pg_ident.conf.j2
@@ -42,7 +42,7 @@
 # ----------------------------------
 
 # MAPNAME       SYSTEM-USERNAME         PG-USERNAME
-{% for host in psql.hosts %}
+{% for host in postgres.hosts %}
 {% if host.map is defined %}
 {{ host.map.name }}		{{ host.map.system }}		{{ host.map.pg }}
 {% endif %}
diff --git a/roles/postgresql/templates/postgresql/postgresql.conf.j2 b/roles/postgresql/templates/postgresql/postgresql.conf.j2
index 991ed2b834e560dd8a9c3791e87c0f69c1363c59..24da99c9e4485161e69f9af1c4bb56a4615332e9 100644
--- a/roles/postgresql/templates/postgresql/postgresql.conf.j2
+++ b/roles/postgresql/templates/postgresql/postgresql.conf.j2
@@ -40,15 +40,15 @@
 # The default values of these variables are driven from the -D command-line
 # option or PGDATA environment variable, represented here as ConfigDir.
 
-data_directory = '/var/lib/postgresql/{{ psql.version }}/main'		# use data in another directory
+data_directory = '/var/lib/postgresql/{{ postgres.version }}/main'		# use data in another directory
 					# (change requires restart)
-hba_file = '/etc/postgresql/{{ psql.version }}/main/pg_hba.conf'	# host-based authentication file
+hba_file = '/etc/postgresql/{{ postgres.version }}/main/pg_hba.conf'	# host-based authentication file
 					# (change requires restart)
-ident_file = '/etc/postgresql/{{ psql.version }}/main/pg_ident.conf'	# ident configuration file
+ident_file = '/etc/postgresql/{{ postgres.version }}/main/pg_ident.conf'	# ident configuration file
 					# (change requires restart)
 
 # If external_pid_file is not explicitly set, no extra PID file is written.
-external_pid_file = '/var/run/postgresql/{{ psql.version }}-main.pid'			# write an extra PID file
+external_pid_file = '/var/run/postgresql/{{ postgres.version }}-main.pid'			# write an extra PID file
 					# (change requires restart)
 
 
@@ -57,7 +57,7 @@ external_pid_file = '/var/run/postgresql/{{ psql.version }}-main.pid'			# write
 #------------------------------------------------------------------------------
 
 # - Connection Settings -
-listen_addresses = '{{ (psql.addresses | default([]) + ['localhost']) | join(',') }}'		# what IP address(es) to listen on;
+listen_addresses = '{{ (postgres.addresses | default([]) + ['localhost']) | join(',') }}'		# what IP address(es) to listen on;
 					# comma-separated list of addresses;
 					# defaults to 'localhost'; use '*' for all
 					# (change requires restart)
@@ -261,7 +261,7 @@ max_replication_slots = 10	# max number of replication slots
 
 # These settings are ignored on a master server.
 
-{% if psql.replica | default(False) %}
+{% if postgres.replica | default(False) %}
 hot_standby = on			# "off" disallows queries during recovery
 					# (change requires restart)
 {% else %}
@@ -491,7 +491,7 @@ log_timezone = 'Europe/Paris'
 # PROCESS TITLE
 #------------------------------------------------------------------------------
 
-cluster_name = '{{ psql.version }}/main'			# added to process titles if nonempty
+cluster_name = '{{ postgres.version }}/main'			# added to process titles if nonempty
 					# (change requires restart)
 #update_process_title = on
 
@@ -507,7 +507,7 @@ cluster_name = '{{ psql.version }}/main'			# added to process titles if nonempty
 #track_io_timing = off
 #track_functions = none			# none, pl, all
 #track_activity_query_size = 1024	# (change requires restart)
-stats_temp_directory = '/var/run/postgresql/{{ psql.version }}-main.pg_stat_tmp'
+stats_temp_directory = '/var/run/postgresql/{{ postgres.version }}-main.pg_stat_tmp'
 
 
 # - Monitoring -