rsync は何をしますか?
概要
rsync は効率的なファイル同期のための標準ツールです。ファイルの変更部分のみを転送し(デルタ転送)、SSH をサポートし、パーミッションを保持し、バックアップ、デプロイ、ディレクトリミラーリングに使用できます。
手順
手順1: 基本的な使い方
# ローカルディレクトリの同期
rsync -avz source/ destination/
# -a = アーカイブ(パーミッション、タイムスタンプ、シンボリックリンクを保持)
# -v = 詳細表示
# -z = 転送中に圧縮
# リモートサーバーに同期
rsync -avz ./dist/ deploy@server:/var/www/myapp/
# リモートから同期
rsync -avz deploy@server:/var/log/myapp/ ./logs/
# ドライラン(実際に実行せずに変更内容を表示)
rsync -avzn source/ destination/
手順2: よく使うパターン
# ウェブサイトのデプロイ(送信元にないファイルを送信先から削除)
rsync -avz --delete ./build/ deploy@server:/var/www/site/
# 除外してバックアップ
rsync -avz --exclude='node_modules' --exclude='.git' --exclude='.env' \
/opt/myapp/ /backups/myapp/
# ハードリンクを使った増分バックアップ(容量効率が良い)
rsync -avz --link-dest=/backups/latest \
/opt/myapp/ /backups/$(date +%Y%m%d)/
ln -snf /backups/$(date +%Y%m%d) /backups/latest
# 帯域制限(大規模転送に便利)
rsync -avz --bwlimit=5000 source/ destination/ # 5000 KB/s
手順3: デプロイスクリプト
#!/bin/bash
# scripts/deploy.sh — rsync でアプリをデプロイ
SERVER="[email protected]"
REMOTE_DIR="/var/www/myapp"
echo "ビルド中..."
npm run build
echo "ファイルを同期中..."
rsync -avz --delete \
--exclude='node_modules' \
--exclude='.env' \
--exclude='.git' \
./dist/ ${SERVER}:${REMOTE_DIR}/
echo "サービスを再起動中..."
ssh ${SERVER} "sudo systemctl restart myapp"
echo "デプロイ完了!"
ガイドライン
--deleteを使用する場合は、誤ったデータ消失を防ぐために必ず最初に-n(ドライラン)を使用してください。- 末尾のスラッシュは重要です:
source/は内容を同期し、sourceはディレクトリ自体を同期します。 - 大規模転送の場合は
--progressを追加してファイルごとの進捗を表示してください。 - SSH 経由の rsync はデフォルトで暗号化されているため、インターネット転送でも安全です。