やりたかったこと
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を使って本番環境を構築するなら、以下のサービスがおすすめです。