summaryrefslogtreecommitdiff
path: root/gitlab-server/usr/share/gitlab-install/gitlab-remote-restore.sh
blob: 78ff691ae0904e0fd150ee17effededeacbdf007 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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