VPS 上のデータを自宅 PC にバックアップ (rsync, OpenVPN)

後から調べてみるとかなりの力技みたい。復元の際はご注意を。

まあ、緊急時のサルベージ用に。

環境
----

### 共通

- Ubuntu 15.04
- OpenVPN 2.3.2
- rsync 3.1.1


### VPS

- バックアップ元。
- VPN サーバー。

### 自宅 PC

- バックアップ先。
- VPN クライアント。
- 回線の IP アドレスは固定されていない。
- バックアップ先の OS 環境は VirtualBox 上で起動している。

準備 (OpenVPN)
----

- VPN を繋げておく。
- クライアント側の IP アドレスを固定しておく。

準備 (rsync - バックアップ先)
----

### rsyncd.conf

```text:/etc/rsyncd.conf
uid           = root
gid           = backup
log file      = /var/log/rsyncd.log
pid file      = /var/run/rsyncd.pid
hosts deny    = *
dont compress = *.gz *.tgz *.zip *.pdf *.sit *.sitx *.lzh *.bz2 *.jpg *.gif *.png

[backup-module-hostname]
comment      = rsync server for backup
path         = /mnt/backup/sakuravps/archive
use chroot   = yes
hosts allow  = 10.8.0.1
auth users   = backup-user1
secrets file = /etc/rsyncd.secrets
read only    = no
```

#### 補足とメモ

- []
  - モジュール名。
  - :point_up: 上記モジュール名の _hostname_ の部分はバックアップ元のホスト名に変えておく。
      - 必須の設定ではないが、 rsync を使ったバックアップでは少しのミスで全てが消し飛んでしまう可能性がある。これと _auth users_ の設定を組み合わせることで、そういう事故を起こしづらくする狙い。
- hosts deny / allow
  - バックアップ元 (今回の場合は OpenVPN サーバー) のみ許可。
- path
  - パスに含まれるディレクトリは自動で作成されない。バックアップの実行前に作っておく。
  - 今回のような規模の大きなバックアップの場合、バックアップ専用にディスク、または仮想ディスクを用意した方が切り離しやすい。
- auth users
  - アクセスを許可する rsync 用のユーザー。
  - Linux 上のユーザーとは別に管理される。
  - 設定は後述 _rsyncd.secrets_ にて。

### rsyncd.secrets

```text:/etc/rsyncd.secrets
backup-user1:password1
```

- 所有者は _/etc/rsyncd.conf_ の設定と同じ _uid_ 。
- 権限は _600_ 。
- パスワードは平文。

### デーモンの起動

```bash
rsync --daemon
```

- 起動中も、設定ファイルが変更されると自動的に反映される。

準備 (rsync - バックアップ元)
----

各ファイルをバックアップ元サーバーの、同じディレクトリに設置。

### 実行スクリプト

```bash:backup.sh
#!/bin/bash

MY_DIR="`readlink -f "$0" | sed 's!/[^/]*$!!'`"
REMOTE_ADDRESS=10.8.0.5
REMOTE_MODULE="backup-module-`hostname`"
REMOTE_PASSWORD=password1
REMOTE_USER=backup-user1
LOCAL_DIR=/

RSYNC_PASSWORD=$REMOTE_PASSWORD \
rsync \
    -aAHXv \
    --bwlimit=20m \
    --delete \
    --delete-excluded \
    --exclude-from="$MY_DIR/exclude.list" \
    --human-readable \
    --progress \
    "$LOCAL_DIR" \
    "rsync://${REMOTE_USER}@${REMOTE_ADDRESS}/${REMOTE_MODULE}"
```

- 状態の出力なんて要らない、という場合は _-v_ と _--human-readable_ と _--progress_ を削除。

#### 除外ファイル

```text:exclude.list
/dev/*
/etc/fstab
/etc/network/interfaces
/lost+found
/media/*
/mnt/*
/proc/*
/ramdisk/*
/run/*
/sys/*
/tmp/*
/var/lib/apt/lists/*
```

Ubuntu 環境のバックアップとしては、基本は上記を除外しておけば大丈夫だと思う。

SSH 経由で復元したい場合は以下を書き足しておいた方がいいかも。ただし rsync による強制復元は危なげなので非推奨。

```text:exclude.list
/etc/ssh/ssh_host_*
```

その他、全体バックアップに頼らず別で管理したいものがある場合は書き足す。

実行
----

バックアップ元で稼働しているサーバーを一旦落として、バックアップ元のスクリプトを実行。

最初はスクリプトを書き換えて _--dry-run_ で実行することを推奨。

参考
----

### OpenVPN

- [How To | OpenVPN.JP](http://www.openvpn.jp/document/how-to/) 
- [VPNサーバー構築(OpenVPN) - Fedoraで自宅サーバー構築](http://fedorasrv.com/openvpn.shtml)

### rsync

- [さくらのVPSで上位プランに移行するための手順 - さくらインターネット創業日記](http://tanaka.sakura.ad.jp/2011/03/sakura-vps-upgrade.html)
- [rsync でディレクトリの同期（バックアップ） - maruko2 Note.](http://www.maruko2.com/mw/rsync_%E3%81%A7%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E5%90%8C%E6%9C%9F%EF%BC%88%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%EF%BC%89)
- [Full system backup with rsync - ArchWiki](https://wiki.archlinux.org/index.php/Full_system_backup_with_rsync)