トップ «前の日記(2008-05-09) 最新 次の日記(2008-05-15)» 編集

Ussy Diary


2008-05-13

[Ruby][trac][subversion]svn trac の hotcopy スクリプト

trac を構築することになってバックアップを取らなければという ことでバックアップスクリプトを Ruby で書いてみました。

Subversion と trac をそれぞれ複数管理すると想定して、 Subversion を中心に直下の プロジェクトをフルバックアップするようにしています。

  • {backupdir}/20080514/svn/{project}
  • {backupdir}/20080514/trac/{project}

こんな感じで svn と trac のバックアップを日ごとにプロジェクト分だけ取れるようになりました。

svn_trac_hotcopy.rb

#!/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 with Subversion―Linux/Windows対応(高山 恭介)

そういえば trac の本が丁度いいときに出てくれて助かりました。

出た当初は購入するつもりは実はありませんでしたが、これから使う ことになるので参考にさせてもらおうと購入しました。