やりたかったこと

VPSのファイルをローカルにバックアップしたかった。 scpは毎回全ファイルをコピーするので、差分だけ転送できるrsyncを使うことにした。

基本的な使い方

rsync -av ソース/ 宛先/
  • -a: アーカイブモード(パーミッション・タイムスタンプ・シンボリックリンクを保持)
  • -v: 転送ファイルを表示

ローカル間のコピー

rsync -av /var/www/html/ /backup/html/

末尾のスラッシュに注意。ソース/(スラッシュあり)はディレクトリの中身をコピー、ソース(スラッシュなし)はディレクトリごとコピーする。

リモートサーバーとの同期

ローカル → リモート

rsync -av -e ssh /var/www/html/ user@example.com:/var/www/html/

リモート → ローカル(バックアップ)

rsync -av -e ssh user@example.com:/var/www/html/ /backup/html/

よく使うオプション

# 削除も同期する(宛先にしかないファイルを削除)
rsync -av --delete /var/www/html/ /backup/html/

# ドライラン(実際にはコピーせず確認だけ)
rsync -av --dry-run /var/www/html/ /backup/html/

# 圧縮して転送(帯域節約)
rsync -avz -e ssh user@example.com:/var/www/ /backup/

# 特定のファイルを除外
rsync -av --exclude='*.log' --exclude='.git' /var/www/html/ /backup/html/

# 進捗を表示
rsync -av --progress /var/www/html/ /backup/html/

Cronで定期バックアップ

crontab -e
# 毎日午前2時にバックアップ
0 2 * * * rsync -az -e ssh user@example.com:/var/www/html/ /backup/html/ >> /var/log/rsync.log 2>&1

ハマったポイント

  • ソースパスの末尾スラッシュの有無で動作が変わるので必ず確認する
  • --deleteは強力なので、最初は--dry-runで確認してから実行する
  • SSHの公開鍵認証が設定されていないとCronでの自動実行が止まる
  • rsyncはデフォルトで変更のないファイルをスキップするので、自動的に差分転送になる

SSHの公開鍵認証が未設定の場合はLinuxのSSH接続の基本(VPSに接続する方法)~/.ssh/config の設定も合わせて確認してほしい。

関連記事

おすすめのVPS/ドメイン

VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。