Ooops, duplicated backup example
[gitorious:ksinkars-mainline.git] / lib / tasks / backup.rake
1 namespace :backup do
2
3   # Full backup snapshot/restore for reasonably standard Gitorious
4   # setups. Saves/restores current production db, local configuration
5   # files and git repositories - in a single tarball.
6
7   # ASSUMPTIONS:
8
9   # 0. Both backup and restore tasks must be started from within
10   # the root of your Gitorious installation.
11
12   # 1 Should be run as root/superuser to preserve file/dir ownerships.
13
14   # 2. Assumes that the gitorious installation is owned by the
15   # "git" user.
16
17   # 3. Leans on the 'mysql' util for the db backup, only
18   # dumps/restores the gitorious_production db (not dev, test etc)
19
20   # 4. Doesn't currently capture queue state, so you may want to shut
21   # down the web frontend first and let the queues settle down before
22   # using these snapshot/restore operations in production systems.
23
24   # 5. Assumes that you have the time and disk-space to slurp down all
25   # repos into a local tarball. Sites with huge amounts of repo data
26   # may need custom backup schemes.
27
28   # 6. Assumes that the location of the gitorious installation
29   # remains the same between taking a snapshot and restoring it, since
30   # repos symlink their hooks to the common hooks in the data/hooks dir.
31
32   # 7. The restore step assumes minor to no changes in versions of
33   # Gitorious between snapshot and subsequent restoration of a
34   # backup. Major version jumps may necessitate a more manual restore
35   # procedure due to changes in configurations, db schema, folder
36   # structure etc.
37   
38   # EXAMPLES:
39   
40   # Simple dump of default tarball file in current directory:
41   # sudo bundle exec rake backup:snapshot
42
43   # Simple restore from default tarball in current directory:
44   # sudo bundle exec rake backup:restore
45
46   # More explicit: specify tarball path
47   # sudo bundle exec env TARBALL_PATH="current_snapshot.sql" rake backup:snapshot
48   # sudo bundle exec env TARBALL_PATH="current_snapshot.sql" rake backup:restore
49
50   DEFAULT_TAR_PATH="snapshot.tar"
51   SQL_DUMP_FILE="db_state.sql"
52   TMP_WORKDIR="tmp-backup-workdir"
53
54   def repo_path
55     require 'yaml'
56     conf = YAML::load(File.open('config/gitorious.yml'))
57     conf['production']['repository_base_path']
58   end
59   
60   desc "Simple state snapshot of the Gitorious instance to a single tarball."
61   task :snapshot do
62     tarball_path = ENV["TARBALL_PATH"] || DEFAULT_TAR_PATH
63
64     puts "Initializing..."
65     puts `rm -f #{tarball_path};rm -f #{SQL_DUMP_FILE}`
66     puts `rm -rf #{TMP_WORKDIR}; mkdir #{TMP_WORKDIR}`
67     puts `mkdir #{TMP_WORKDIR}/repos`
68     puts `mkdir #{TMP_WORKDIR}/config`
69     puts `mkdir -p #{TMP_WORKDIR}/data/hooks`
70     
71     puts "Backing up custom config files..."
72     puts `cp ./config/gitorious.yml #{TMP_WORKDIR}/config`
73     puts `cp ./config/authentication.yml #{TMP_WORKDIR}/config`
74     puts `cp ./config/database.yml #{TMP_WORKDIR}/config`
75
76     puts "Backing up custom hooks..."
77     puts `cp ./data/hooks/custom-pre-receive #{TMP_WORKDIR}/data/hooks`
78     puts `cp ./data/hooks/custom-post-receive #{TMP_WORKDIR}/data/hooks`
79     puts `cp ./data/hooks/custom-update #{TMP_WORKDIR}/data/hooks`
80     
81     puts "Backing up mysql state..."
82     puts `mysqldump gitorious_production > #{TMP_WORKDIR}/#{SQL_DUMP_FILE}`
83
84     puts "Backing up repositories in #{repo_path}..."
85     puts `cp -r #{repo_path}/* #{TMP_WORKDIR}/repos`
86     
87     puts "Archiving it all in #{tarball_path}..."
88     puts `tar -czf #{tarball_path} #{TMP_WORKDIR}`
89     
90     puts "Cleaning up..."
91     puts `rm -rf #{SQL_DUMP_FILE};rm -rf #{TMP_WORKDIR}`
92
93     puts "Done! Backed up current Gitorious state to #{tarball_path}."
94   end
95
96   
97   desc "Restores Gitorious instance to snapshot previously stored in tarball file."
98   task :restore do
99     tarball_path = ENV["TARBALL_PATH"] || DEFAULT_TAR_PATH
100
101     puts "Preparing..."
102     puts `rm -rf #{TMP_WORKDIR};tar -xf #{tarball_path}`
103
104     puts "Restoring custom config files..."
105     puts `cp #{TMP_WORKDIR}/config/* ./config`
106
107     puts "Restoring custom hooks..."
108     puts `cp #{TMP_WORKDIR}/data/hooks/* ./data/hooks`
109
110     puts "Restoring mysql state..."
111     puts `mysql gitorious_production < #{TMP_WORKDIR}/#{SQL_DUMP_FILE}`
112    
113     puts "Restoring repositories in #{repo_path}..."
114     puts `mkdir -p #{repo_path}`
115     puts `cp -r #{TMP_WORKDIR}/repos/* #{repo_path}`
116
117     puts "Rebuilding ~/.ssh/authorized_keys from user keys in database..."
118     puts `sudo su git -c "rm ~/.ssh/authorized_keys; bundle exec script/regenerate_ssh_keys ~/.ssh/authorized_keys"`
119     
120     puts "Cleaning up..."
121     puts `rm -rf #{TMP_WORKDIR}`
122
123     puts "Done restoring Gitorious from #{tarball_path}."
124   end
125 end