From e8c06b36ea15829489f207b0b5f42525108a635f Mon Sep 17 00:00:00 2001
From: Sven-Hendrik Haase <svenstaro@gmail.com>
Date: Sun, 5 Jun 2016 16:10:32 +0200
Subject: [PATCH] borg-client: Propery postgres backup

---
 playbooks/apollo.yml                           |  2 +-
 playbooks/orion.yml                            |  2 +-
 roles/borg-client/tasks/main.yml               | 13 +++++++++++++
 .../templates/backup-postgres.sh.j2            | 18 ++++++++++++++++++
 roles/borg-client/templates/borg-backup.sh.j2  |  2 +-
 5 files changed, 34 insertions(+), 3 deletions(-)
 create mode 100644 roles/borg-client/templates/backup-postgres.sh.j2

diff --git a/playbooks/apollo.yml b/playbooks/apollo.yml
index cd4e6841d..b42303fc1 100644
--- a/playbooks/apollo.yml
+++ b/playbooks/apollo.yml
@@ -8,4 +8,4 @@
     - tools
     - sshd
     - ssh_keys
-    - { role: borg-client, backup_host: "borg@vostok.archlinux.org", backup_dir: "/backup/apollo" }
+    - { role: borg-client, backup_host: "borg@vostok.archlinux.org", backup_dir: "/backup/apollo", postgres_backup_dir: "/var/lib/postgres/backup" }
diff --git a/playbooks/orion.yml b/playbooks/orion.yml
index dc50bced4..7907f4ae7 100644
--- a/playbooks/orion.yml
+++ b/playbooks/orion.yml
@@ -8,7 +8,7 @@
     - tools
     - sshd
     - ssh_keys
-    - { role: borg-client, backup_host: "borg@vostok.archlinux.org", backup_dir: "/backup/orion" }
+    - { role: borg-client, backup_host: "borg@vostok.archlinux.org", backup_dir: "/backup/orion", postgres_backup_dir: None }
     - { role: opendkim, dkim_selector: orion }
     - { role: postfix}
     - archusers
diff --git a/roles/borg-client/tasks/main.yml b/roles/borg-client/tasks/main.yml
index 38f3e0a43..083a51816 100644
--- a/roles/borg-client/tasks/main.yml
+++ b/roles/borg-client/tasks/main.yml
@@ -18,6 +18,19 @@
 - name: install borg backup script
   template: src=borg-backup.sh.j2 dest=/usr/local/bin/borg-backup.sh owner=root group=root mode=755
 
+- name: install postgres backup script
+  template: src=backup-postgres.sh.j2 dest=/usr/local/bin/backup-postgres.sh owner=root group=root mode=755
+  when: postgres_backup_dir != None
+
+- name: check whether postgres user exists
+  command: getent passwd postgres
+  register: check_postgres_user
+  ignore_errors: True
+
+- name: make postgres backup directory
+  file: path=/var/lib/postgres/backup owner=postgres group=postgres state=directory
+  when: check_postgres_user|succeeded and postgres_backup_dir != None
+
 - name: install systemd timers for backup
   copy: src={{ item }} dest=/etc/systemd/system/{{ item }} owner=root group=root mode=644
   with_items:
diff --git a/roles/borg-client/templates/backup-postgres.sh.j2 b/roles/borg-client/templates/backup-postgres.sh.j2
new file mode 100644
index 000000000..4fdd940ee
--- /dev/null
+++ b/roles/borg-client/templates/backup-postgres.sh.j2
@@ -0,0 +1,18 @@
+#!/bin/bash
+#
+# Script to backup all postgres databases individually
+# 
+# Requires local login with `postgres` user and either trusted or peer auth.
+#
+
+DBLIST=($(sudo -u postgres psql -d postgres -qt -c 'SELECT datname from pg_database'))
+for db in "${DBLIST[@]}"; do
+        if [[ $db =~ template[01] ]]; then
+                continue;
+        fi
+        echo "Dumping $db to {{ postgres_backup_dir }}";
+        sudo -u postgres pg_dump --serializable-deferrable -Fc "$db" > "{{ postgres_backup_dir }}/$db.dump"
+done
+
+echo "Dumping globals to {{ postgres_backup_dir }}"
+sudo -u postgres pg_dumpall --globals-only > "{{ postgres_backup_dir }}/globals.sql.dump"
diff --git a/roles/borg-client/templates/borg-backup.sh.j2 b/roles/borg-client/templates/borg-backup.sh.j2
index d587f3a69..2ff08cc60 100644
--- a/roles/borg-client/templates/borg-backup.sh.j2
+++ b/roles/borg-client/templates/borg-backup.sh.j2
@@ -1,7 +1,7 @@
 #!/usr/bin/env bash
 
 # In case there is postgresql running, dump all of it somewhere.
-systemctl status postgresql && pg_dumpall -f /root/postgres_dump.sql
+systemctl status postgresql && /usr/local/bin/backup-postgres.sh
 
 borg create -v --stats -C lz4 -e /proc \
     -e /sys -e /dev -e /run -e /tmp -e /var/cache \
-- 
GitLab