summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <lars.wirzenius@codethink.co.uk>2014-07-24 16:46:33 +0000
committerLars Wirzenius <lars.wirzenius@codethink.co.uk>2014-07-24 16:46:33 +0000
commit56308755c59d8cde87526016bbdec885627e2169 (patch)
tree6642b60a740e47ebb284a27104cb84c9e4709570
parent53e48f5777aa0575c0d0935d9211d49455594cec (diff)
parentc661f1349f44120b3cfcfc718ebb44b72f299cb8 (diff)
downloaddefinitions-56308755c59d8cde87526016bbdec885627e2169.tar.gz
Merge remote-tracking branch 'origin/baserock/liw/gitlab-repoless-backups'
Reviewed-by: Richard Maw Reviewed-by: Adam Coldrick
-rw-r--r--gitlab-server.morph1
-rw-r--r--gitlab-server/usr/share/gitlab-install/backup-gitlab16
-rw-r--r--gitlab-server/usr/share/gitlab-install/gitlab-remote-backup.sh22
-rw-r--r--gitlab-server/usr/share/gitlab-install/gitlab-remote-restore.sh57
-rw-r--r--gitlab-server/usr/share/gitlab-install/systemd-units/gitlab-backup.service4
-rw-r--r--gitlab-server/usr/share/gitlab-install/systemd-units/gitlab-backup.timer2
6 files changed, 88 insertions, 14 deletions
diff --git a/gitlab-server.morph b/gitlab-server.morph
index 6142b8c6..8dc9f3cf 100644
--- a/gitlab-server.morph
+++ b/gitlab-server.morph
@@ -6,6 +6,7 @@ configuration-extensions:
- nfsboot
- install-files
- gitlab
+- fstab
description: system which hosts a gitlab server
kind: system
name: gitlab-server
diff --git a/gitlab-server/usr/share/gitlab-install/backup-gitlab b/gitlab-server/usr/share/gitlab-install/backup-gitlab
index a6c3e3f5..1320df81 100644
--- a/gitlab-server/usr/share/gitlab-install/backup-gitlab
+++ b/gitlab-server/usr/share/gitlab-install/backup-gitlab
@@ -4,19 +4,13 @@
# /home/git/gitlab-backup.tar . A separate backup host will need to
# back that up.
#
-# This script be run as the git user on a GitLab host.
+# This script be run as the postgres user on a Baserock GitLab host.
set -e
export PATH=/usr/local/bin:/usr/bin:/bin
-cd /home/git/gitlab
-mkdir -p /home/git/gitlab/tmp/backups
-bundle exec rake gitlab:backup:create RAILS_ENV=production
-
-ls /home/git/gitlab/tmp/backups/[0-9]*.tar |
-tail -n1 |
-while read filename
-do
- mv "$filename" /home/git/gitlab-backup.tar
-done
+mkdir -p /home/postgres/dumps
+cd /home/postgres/dumps
+pg_dumpall > new.dump
+mv new.dump gitlab.pg_dumpall
diff --git a/gitlab-server/usr/share/gitlab-install/gitlab-remote-backup.sh b/gitlab-server/usr/share/gitlab-install/gitlab-remote-backup.sh
new file mode 100644
index 00000000..85618811
--- /dev/null
+++ b/gitlab-server/usr/share/gitlab-install/gitlab-remote-backup.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+#
+# Copy relevant files of a Baserock Gitlab instance out of the instance.
+#
+# Usage: backup.sh ADDR
+# where ADDR is the address (domain name, IP address) of the instance.
+# The files are copied to the current directory.
+
+set -eux
+
+ADDR="$1"
+
+backup()
+{
+ rsync -ahHS --delete "root@$ADDR:$1" "$2"
+}
+
+mkdir -p dumps repositories uploads
+backup /home/postgres/dumps/. dumps/.
+backup /home/git/repositories/. repositories/.
+backup /home/git/gitlab/public/uploads/. uploads/.
+
diff --git a/gitlab-server/usr/share/gitlab-install/gitlab-remote-restore.sh b/gitlab-server/usr/share/gitlab-install/gitlab-remote-restore.sh
new file mode 100644
index 00000000..78ff691a
--- /dev/null
+++ b/gitlab-server/usr/share/gitlab-install/gitlab-remote-restore.sh
@@ -0,0 +1,57 @@
+#!/bin/sh
+#
+# Restore a Baserock Gitlab system backup to a fresh instance.
+#
+# Usage: restore.sh ADDR
+# where ADDR is the address (domain name, IP address) of the instance.
+#
+# What this does is a) stop services b) copy files over c) reset the Postgres
+# databases.
+
+set -eux
+
+ADDR="$1"
+
+restore()
+{
+ rsync -ahHS --delete "$2" "root@$ADDR:$1"
+}
+
+# Stop services so we don't modify files and databases from underneath
+# them, and also so they don't modify things while restore is happening.
+
+ssh "root@$ADDR" systemctl stop \
+ crond gitlab-backup.service \
+ gitlab-ci-sidekiq.service \
+ gitlab-ci-unicorn.service \
+ gitlab-sidekiq.service \
+ gitlab-unicorn.service \
+ gitlab.target \
+ gitlab-backup.timer \
+ nginx.service \
+ redis.service
+
+# Create the directory where postgres dump files go.
+
+ssh "root@$ADDR" install -d -o postgres -g postgres /home/postgres/dumps
+
+# Restore the various files.
+
+restore /home/postgres/dumps/. dumps/.
+restore /home/git/repositories/. repositories/.
+restore /home/git/gitlab/public/uploads/. uploads/.
+
+# And thier uid/gid
+ssh "root@$ADDR" chown -R git:git /home/git/repositories /home/git/gitlab/public/uploads
+
+# Delete tables and roles from Postgres so that the restore can happen.
+
+ssh "root@$ADDR" sudo -u postgres psql <<EOF
+drop database gitlabhq_production;
+drop database gitlab_ci_production;
+drop role git, gitlab_ci;
+EOF
+
+# Restore the Postgres databases from the latest dump.
+
+ssh "root@$ADDR" sudo -u postgres psql -q -f /home/postgres/dumps/gitlab.pg_dumpall
diff --git a/gitlab-server/usr/share/gitlab-install/systemd-units/gitlab-backup.service b/gitlab-server/usr/share/gitlab-install/systemd-units/gitlab-backup.service
index 967a65e3..8672c36d 100644
--- a/gitlab-server/usr/share/gitlab-install/systemd-units/gitlab-backup.service
+++ b/gitlab-server/usr/share/gitlab-install/systemd-units/gitlab-backup.service
@@ -7,5 +7,5 @@ WantedBy=gitlab.target
[Service]
ExecStart=/usr/share/gitlab-install/backup-gitlab
-User=git
-Group=git
+User=postgres
+Group=postgres
diff --git a/gitlab-server/usr/share/gitlab-install/systemd-units/gitlab-backup.timer b/gitlab-server/usr/share/gitlab-install/systemd-units/gitlab-backup.timer
index 1c2f57ba..1686843f 100644
--- a/gitlab-server/usr/share/gitlab-install/systemd-units/gitlab-backup.timer
+++ b/gitlab-server/usr/share/gitlab-install/systemd-units/gitlab-backup.timer
@@ -5,4 +5,4 @@ Description=GitLab Backup Timer
WantedBy=gitlab.target
[Timer]
-OnCalendar=*-*-* 00/4:00:00
+OnCalendar=*-*-* 00:*:*