trac を構築することになってバックアップを取らなければという ことでバックアップスクリプトを Ruby で書いてみました。
Subversion と trac をそれぞれ複数管理すると想定して、 Subversion を中心に直下の プロジェクトをフルバックアップするようにしています。
こんな感じで svn と trac のバックアップを日ごとにプロジェクト分だけ取れるようになりました。
#!/usr/bin/env ruby
require "fileutils"
repos = "/home/svn/repos"
trac = "/home/trac"
backup = "/mnt/backup"
def remove_last_separator(path)
path.gsub(/\/+\z/, "")
end
def backup(repos, trac, backup)
date = Time.now.strftime("%Y%m%d")
repos_backup = "#{backup}/#{date}/svn"
trac_backup = "#{backup}/#{date}/trac"
FileUtils.mkdir_p(backup) unless File.exists?(backup)
FileUtils.mkdir_p(repos_backup) unless File.exists?(repos_backup)
FileUtils.mkdir_p(trac_backup) unless File.exists?(trac_backup)
Dir.foreach(repos) do |dir|
next if /\A\./ =~ dir
svnadmin = "svnadmin hotcopy #{repos}/#{dir} #{repos_backup}/#{dir}"
puts svnadmin
`#{svnadmin}`
next unless File.exists?("#{trac}/#{dir}")
tracadmin = "trac-admin #{trac}/#{dir} hotcopy #{trac_backup}/#{dir}"
puts tracadmin
`#{tracadmin}`
end
end
backup(
remove_last_separator(repos),
remove_last_separator(trac),
remove_last_separator(backup))
trac の hotcopy は db のディレクトリおよび trac.db に書き込み権限が必要なんですね。面倒な場合は sudo して実行すればいいのかな。
あとは cron で 1 日ごとにバックアップを取って、 rsync でリモートサーバと同期を取っておけば ひとまず大丈夫そうです。バックアップ間の故障を考えれば RAID にするのが一番手っ取り早そうです。
そういえば trac の本が丁度いいときに出てくれて助かりました。
出た当初は購入するつもりは実はありませんでしたが、これから使う ことになるので参考にさせてもらおうと購入しました。