前の記事では、VPS で Python と n8n を24時間動かしました。動き始めたサーバーを長く安心して使うために欠かせないのが、バックアップと更新(アップデート)です。Lv4 の最後の記事です。
もし、半年かけて作った n8n のワークフローが、ある日全部消えてしまったら…。バックアップを「そのうち取ろう」と思ったまま一度も取っていなければ、元に戻す方法はありません。逆に、更新をこわがって何か月も放っておくと、古いソフトの弱点をねらわれるおそれがあります。
この記事では、rsync と tar でバックアップを取り、本当に戻せるかまで確かめます。そのあと、Debian の自動アップデートのしくみを、設定を変えずに見るだけで確かめます。
- バックアップの基本の考え方(3-2-1 ルールと「戻せるか」の確認)
-
rsyncでフォルダを丸ごとコピーする方法と、末尾の/のちがい -
-n(下見)と--deleteの安全な使い方 -
tarで日付つきのバックアップを作り、別の場所に戻して確かめる方法 - Debian の自動アップデート(unattended-upgrades)のしくみの確かめ方
-
tarで圧縮・展開ができる -
diffでファイルを比べたことがある - systemd timer と cron で定期実行ができる
まだの方は、前の記事「PCを閉じても自動化を止めない|VPSでPythonとn8nを24時間動かす入門」と、Lv4 の systemd timer の記事から読むのがおすすめです。
- apt:Debian・Ubuntu で、ソフトを入れる・更新する・消すための道具
- VPS:大きな物理サーバーを区切って作った、自分専用の仮想サーバーを、月額などで借りられるサービス。root 権限で自由に設定できます
- n8n:画面上で「ノード」というブロックをつないで、自動化の流れ(ワークフロー)を作れるツール。自分のサーバーでも動かせます
- 圧縮:ファイルの中身を工夫して、サイズを小さくすること
用語で迷ったら、連載のまとめ記事の「よく出てくる用語ミニ辞典」でも確かめられます。
結論:バックアップは「取る・戻す・自動にする」、更新は「こまめに・記録を見る」
| やること | 道具 | ポイント |
|---|---|---|
| フォルダを丸ごと写す | rsync -av | 2回目からは変わった分だけ写すので速い |
| 日付つきで固めて残す | tar -czf | 世代(何日分か)を残せる |
| 戻せるか確かめる | tar -xzf + diff -r | 取っただけで終わらせない |
| 自動にする | systemd timer・cron | Lv3・Lv4 で学んだ方法 |
| 更新を確かめる | apt list --upgradable | 何が古いかを見る |
| 自動で安全な更新を入れる | unattended-upgrades | ログで何が入ったかを見る |
バックアップは「3つのコピーを、2種類の場所に、そのうち1つは別の建物(サーバーの外)に」が理想です。同じサーバーの中だけにバックアップがあると、サーバーごと消えたときに一緒に消えてしまいます。
準備:練習用のデータを作る
- 1
- 2
- 3
- 4
- 5
- 6
mkdir -p ~/linux-practice/backup-test/src/data
cd ~/linux-practice/backup-test
echo "顧客リスト(ダミー)" > src/data/customers.csv
echo "設定ファイル(ダミー)" > src/config.txt
echo "毎朝のメモ" > src/memo.txt
find srcここから先の出力例は、Debian 13での実行例です(ユーザー名 kaito・パソコン名 demo のダミー環境)。UbuntuやWSL(=Windows の中で Linux を動かせる、Microsoft のしくみ)では、表示が少し違うことがあります。
(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
kaito@demo:~/linux-practice$ mkdir -p ~/linux-practice/backup-test/src/data
kaito@demo:~/linux-practice$ cd ~/linux-practice/backup-test
kaito@demo:~/linux-practice/backup-test$ echo "顧客リスト(ダミー)" > src/data/customers.csv
kaito@demo:~/linux-practice/backup-test$ echo "設定ファイル(ダミー)" > src/config.txt
kaito@demo:~/linux-practice/backup-test$ echo "毎朝のメモ" > src/memo.txt
kaito@demo:~/linux-practice/backup-test$ find src
src
src/data
src/data/customers.csv
src/config.txt
src/memo.txtrsync が入っていない場合は、入れておきます。
- 1
- 2
sudo apt install rsync
rsync --version | head -n 1(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
kaito@demo:~/linux-practice/backup-test$ sudo apt install rsync
Installing:
rsync
Suggested packages:
python3-braceexpand
Summary:
Upgrading: 0, Installing: 1, Removing: 0, Not Upgrading: 0
Download size: 502 kB
Space needed: 978 kB / 107 GB available
Get:1 http://deb.debian.org/debian-security trixie-security/main amd64 rsync amd64 3.5.0+ds1-0+deb13u1 [502 kB]
Fetched 502 kB in 0s (20.5 MB/s)
Selecting previously unselected package rsync.
(Reading database ... 31161 files and directories currently installed.)
Preparing to unpack .../rsync_3.5.0+ds1-0+deb13u1_amd64.deb ...
Unpacking rsync (3.5.0+ds1-0+deb13u1) ...
Setting up rsync (3.5.0+ds1-0+deb13u1) ...
rsync.service is a disabled or a static unit, not starting it.
Processing triggers for man-db (2.13.1-1) ...
Scanning processes...
No services need to be restarted.
No containers need to be restarted.
No user sessions are running outdated binaries.
No VM guests are running outdated hypervisor (qemu) binaries on this host.
kaito@demo:~/linux-practice/backup-test$ rsync --version | head -n 1
rsync version 3.5.0 protocol version 32検証環境(Debian 13)では、rsync は最初は入っていませんでした。入るのが1つだけだったので、[Y/n] の確認は出ずに、そのまま入りました。最後の Scanning processes... からの数行は、Lv4 の Docker 入門の記事で docker.io といっしょに入った needrestart の表示で、「再起動が必要なサービスはありません」という意味です。
STEP 1:rsync でフォルダを丸ごと写す
- 1
- 2
rsync -av src/ dest/
find dest(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
kaito@demo:~/linux-practice/backup-test$ rsync -av src/ dest/
sending incremental file list
created directory dest
./
config.txt
memo.txt
data/
data/customers.csv
sent 400 bytes received 115 bytes 1,030.00 bytes/sec
total size is 81 speedup is 0.16
kaito@demo:~/linux-practice/backup-test$ find dest
dest
dest/data
dest/data/customers.csv
dest/config.txt
dest/memo.txtcreated directory dest は「dest がなかったので作りました」という意味です。
-
-a:パーミッション(=ファイルごとの権限の設定)や日時も含めて、そのまま写す -
-v:写したファイルの名前を表示する
もう一度同じコマンドを打つと、変わったものがないので、何も写されません。1つだけ書きかえてから打つと、そのファイルだけが写されます。
- 1
- 2
- 3
rsync -av src/ dest/
echo "追記しました" >> src/memo.txt
rsync -av src/ dest/(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
kaito@demo:~/linux-practice/backup-test$ rsync -av src/ dest/
sending incremental file list
sent 172 bytes received 13 bytes 370.00 bytes/sec
total size is 81 speedup is 0.44
kaito@demo:~/linux-practice/backup-test$ echo "追記しました" >> src/memo.txt
kaito@demo:~/linux-practice/backup-test$ rsync -av src/ dest/
sending incremental file list
memo.txt
sent 253 bytes received 36 bytes 578.00 bytes/sec
total size is 100 speedup is 0.352回目はファイル名が1つも出ず、3回目は書きかえた memo.txt だけが写されました。
末尾の / で結果が変わる
- 1
- 2
rsync -av src dest2/
find dest2(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
kaito@demo:~/linux-practice/backup-test$ rsync -av src dest2/
sending incremental file list
created directory dest2
src/
src/config.txt
src/memo.txt
src/data/
src/data/customers.csv
sent 426 bytes received 113 bytes 1,078.00 bytes/sec
total size is 100 speedup is 0.19
kaito@demo:~/linux-practice/backup-test$ find dest2
dest2
dest2/src
dest2/src/data
dest2/src/data/customers.csv
dest2/src/config.txt
dest2/src/memo.txt| 書き方 | 結果 |
|---|---|
rsync -av src/ dest/ | src の中身が dest に入る |
rsync -av src dest2/ | src というフォルダごと dest2 の中に入る |
STEP 2:-n で下見してから --delete を使う
--delete をつけると、「コピー元で消したファイルは、コピー先でも消す」という意味になります。便利ですが、向きをまちがえると大事なほうを消してしまうので、必ず -n(下見)をつけて確かめてから使います。
- 1
- 2
- 3
rm src/config.txt
rsync -avn --delete src/ dest/
ls dest(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
kaito@demo:~/linux-practice/backup-test$ rm src/config.txt
kaito@demo:~/linux-practice/backup-test$ rsync -avn --delete src/ dest/
sending incremental file list
deleting config.txt
./
sent 152 bytes received 41 bytes 386.00 bytes/sec
total size is 66 speedup is 0.34 (DRY RUN)
kaito@demo:~/linux-practice/backup-test$ ls dest
config.txt data memo.txt最後に (DRY RUN)(下見)と出ているので、まだ何も消えていません。ls dest にも config.txt が残っています。
下見の結果が思ったとおりなら、-n を外して本番を実行します。
- 1
- 2
rsync -av --delete src/ dest/
ls dest(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
kaito@demo:~/linux-practice/backup-test$ rsync -av --delete src/ dest/
sending incremental file list
deleting config.txt
./
sent 152 bytes received 41 bytes 386.00 bytes/sec
total size is 66 speedup is 0.34
kaito@demo:~/linux-practice/backup-test$ ls dest
data memo.txtrsync --delete は、コピー元とコピー先を逆に書くと、本物のデータのほうを消してしまいます。末尾の / のつけ忘れでも、思わぬ消え方をします。サーバーやホームディレクトリなど、練習用のフォルダ以外で使うときは、必ず -n で下見をして、消される名前を1つずつ確かめてから実行してください。この記事では、~/linux-practice/backup-test の中だけで試します。
STEP 3:tar で日付つきのバックアップを作り、戻して確かめる
rsync は「最新の1つ」を写すのが得意です。何日か前の状態に戻したいときのために、tar で日付つきの箱を作って残します。
- 1
- 2
- 3
mkdir -p archives
tar -czf archives/backup-$(date +%Y%m%d-%H%M%S).tar.gz src
ls -lh archives(例)
- 1
- 2
- 3
- 4
- 5
kaito@demo:~/linux-practice/backup-test$ mkdir -p archives
kaito@demo:~/linux-practice/backup-test$ tar -czf archives/backup-$(date +%Y%m%d-%H%M%S).tar.gz src
kaito@demo:~/linux-practice/backup-test$ ls -lh archives
total 4.0K
-rw-rw-r-- 1 kaito kaito 313 Nov 1 06:09 backup-20261101-060940.tar.gzファイル名の数字は、作った日時(2026年11月1日 6時09分40秒)です。
バックアップは、戻せて初めて意味があります。別の場所に展開して、元と同じかを比べます。
- 1
- 2
- 3
mkdir -p restore-test
tar -xzf archives/backup-*.tar.gz -C restore-test
diff -r src restore-test/src && echo "同じです:戻せることを確認しました"(例)
- 1
- 2
- 3
- 4
kaito@demo:~/linux-practice/backup-test$ mkdir -p restore-test
kaito@demo:~/linux-practice/backup-test$ tar -xzf archives/backup-*.tar.gz -C restore-test
kaito@demo:~/linux-practice/backup-test$ diff -r src restore-test/src && echo "同じです:戻せることを確認しました"
同じです:戻せることを確認しましたdiff -r はちがいがないと何も表示しないので、&& の後ろの echo だけが表示されました。
backup-*.tar.gz の * は、箱が1つのときだけ使える ここで archives/backup-*.tar.gz と書けたのは、archives の中の箱が、まだ1つだけだったからです。下の「古いバックアップの整理」で箱を増やしたあとに同じコマンドを打つと、* が全部の箱の名前に広がり(ワイルドカードの記事を参照)、tar は「2つ目からの名前を、1つ目の箱の中から探せ」という意味に受け取ります。その結果、「Not found in archive」というエラーになって失敗します。実際の表示は、このあとの「箱が増えたあとに、同じ tar を打つとどうなるか」で見てみます。
箱が増えたあとは、戻したい箱の名前を ls archives で確かめて、名前をそのまま書きましょう。いちばん新しい箱を選ぶなら、tar -xzf "$(ls -t archives/backup-*.tar.gz | head -n 1)" -C restore-test のように、ls -t の1行目だけを渡す書き方もあります。
古いバックアップの整理は、まず「表示するだけ」
箱が増えすぎたら、新しいほうから3つだけ残して、古いものを消したくなります。まず、消す候補を表示するだけにして確かめます。
- 1
- 2
- 3
for i in 1 2 3 4; do sleep 1; tar -czf archives/backup-$(date +%Y%m%d-%H%M%S).tar.gz src; done
ls -t archives
ls -t archives/backup-*.tar.gz | tail -n +4(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
kaito@demo:~/linux-practice/backup-test$ for i in 1 2 3 4; do sleep 1; tar -czf archives/backup-$(date +%Y%m%d-%H%M%S).tar.gz src; done
kaito@demo:~/linux-practice/backup-test$ ls -t archives
backup-20261101-060952.tar.gz backup-20261101-060950.tar.gz backup-20261101-060940.tar.gz
backup-20261101-060951.tar.gz backup-20261101-060949.tar.gz
kaito@demo:~/linux-practice/backup-test$ ls -t archives/backup-*.tar.gz | tail -n +4
archives/backup-20261101-060949.tar.gz
archives/backup-20261101-060940.tar.gzls -t archives は、画面の幅に合わせて、新しい順に上から下・左から右へ並べます(1列目の上が最新です)。消す候補には、いちばん古い2つ(060949 と 060940)が表示されました。
ls -t は新しい順、tail -n +4 は「4行目から後ろ」です。つまり「新しい3つ以外」が表示されます。実際に消すのは、表示された名前を見て、まちがいないと確かめてからにしましょう。
「表示した名前をそのまま消す」処理を cron や systemd timer で自動にすると、日付の書き方やフォルダをまちがえたときに、新しいバックアップまで消えてしまうことがあります。自動で消す仕組みを作るのは、手で何度か試して結果を確かめてからにしてください。この記事では、表示するところまでにします。
箱が増えたあとに、同じ tar を打つとどうなるか
箱が5つに増えたところで、STEP 3 の最初と同じコマンドで戻そうとすると、⚠️ の箱で書いたとおり失敗します。
- 1
- 2
tar -xzf archives/backup-*.tar.gz -C restore-test
echo $?(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
kaito@demo:~/linux-practice/backup-test$ tar -xzf archives/backup-*.tar.gz -C restore-test
tar: archives/backup-20261101-060949.tar.gz: Not found in archive
tar: archives/backup-20261101-060950.tar.gz: Not found in archive
tar: archives/backup-20261101-060951.tar.gz: Not found in archive
tar: archives/backup-20261101-060952.tar.gz: Not found in archive
tar: Exiting with failure status due to previous errors
kaito@demo:~/linux-practice/backup-test$ echo $?
2* は名前の順(ここでは古い順)に広がるので、1つ目にいちばん古い箱(060940)が開かれ、残りの4つの名前を「この箱の中から取り出すファイルの名前」と受け取りました。その4つは箱の中にないので、Not found in archive(箱の中に見つからない)が4行出て、最後に tar: Exiting with failure status due to previous errors(前のエラーのため、失敗として終わります)と表示されます。echo $? は 2 で、失敗したことがわかります。
このように失敗したときは、1つ目の箱の中身も含めて、何も展開されません。「一部だけ戻った」という中途半端な状態にはならないので、書き方を直して打ち直せば大丈夫です。
⚠️ の箱で紹介した、ls -t の1行目(いちばん新しい箱)だけを渡す書き方なら、ちゃんと戻せます。
- 1
- 2
- 3
tar -xzf "$(ls -t archives/backup-*.tar.gz | head -n 1)" -C restore-test
echo $?
diff -r src restore-test/src && echo "同じです:戻せることを確認しました"(例)
- 1
- 2
- 3
- 4
- 5
kaito@demo:~/linux-practice/backup-test$ tar -xzf "$(ls -t archives/backup-*.tar.gz | head -n 1)" -C restore-test
kaito@demo:~/linux-practice/backup-test$ echo $?
0
kaito@demo:~/linux-practice/backup-test$ diff -r src restore-test/src && echo "同じです:戻せることを確認しました"
同じです:戻せることを確認しました今度はエラーが出ず、echo $? は 0(成功)でした。diff -r でも、元と同じに戻せたことを確かめられます。
ここまでの rsync も tar も、同じパソコンの中で写しただけです。3-2-1 ルールの「1つはサーバーの外」にするには、作った箱を、別の場所にも写します。
- SSH で別のパソコンへ写す:
rsyncは、写し先に SSH(=ネットワークの向こうのコンピューターに、暗号化して安全にログインし、操作するしくみ)の相手を書けます。SSH 入門の記事で~/.ssh/configにpractice-serverという名前を登録していれば、rsync -av archives/ practice-server:backups/のように書けます。-nで下見してから使うのは、ここでも同じです。 - VPS から自分の PC へ持ってくる:前の VPS の記事の STEP 14 のように、自分の PC から
scpで持ってくる方法もあります。
そして、バックアップの箱は、ほかの人に読ませないようにしましょう。上の ls -lh では -rw-rw-r-- で、ほかのユーザーも読める形でした。サーバーで使うときは、chmod 700 archives でフォルダごと自分だけが開ける形にしておくと安心です(chmod は Lv2 の記事で説明しています)。
n8n のデータは、この記事の rsync ではなく、前の VPS の記事の方法で:前の VPS の記事の n8n のデータは、ふつうのフォルダではなく、Docker の名前つきボリューム(Docker 入門の記事の💡の箱)に入っています。その記事の STEP 14 のように、n8n を止めてから docker run … tar で箱にし、その箱を、ここで学んだ方法で日付つきで残し、サーバーの外にも写します。
STEP 4:更新(アップデート)の様子を見る
ここからは、システムの更新です。見るだけで、設定は変えません。
- 1
- 2
sudo apt update
apt list --upgradable(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
kaito@demo:~/linux-practice/backup-test$ sudo apt update
Get:1 http://deb.debian.org/debian trixie InRelease [140 kB]
Get:2 http://deb.debian.org/debian trixie-updates InRelease [47.3 kB]
Get:3 http://deb.debian.org/debian-security trixie-security InRelease [43.4 kB]
Fetched 231 kB in 0s (4942 kB/s)
All packages are up to date.
kaito@demo:~/linux-practice/backup-test$ apt list --upgradable検証のときは更新できるものがなかったので、apt list --upgradable は何も表示しませんでした。
Debian には、セキュリティの更新を自動で入れてくれる unattended-upgrades というしくみがあります。入っているか、有効になっているかを確かめます。
- 1
- 2
- 3
apt policy unattended-upgrades
cat /etc/apt/apt.conf.d/20auto-upgrades
systemctl list-timers "apt-daily*" --no-pager(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
kaito@demo:~/linux-practice/backup-test$ apt policy unattended-upgrades
unattended-upgrades:
Installed: (none)
Candidate: 2.12
Version table:
2.12 500
500 http://deb.debian.org/debian trixie/main amd64 Packages
kaito@demo:~/linux-practice/backup-test$ cat /etc/apt/apt.conf.d/20auto-upgrades
cat: /etc/apt/apt.conf.d/20auto-upgrades: No such file or directory
kaito@demo:~/linux-practice/backup-test$ systemctl list-timers "apt-daily*" --no-pager
NEXT LEFT LAST PASSED UNIT ACTIVATES
Sun 2026-11-01 06:50:17 JST 2h 57min - - apt-daily-upgrade.timer apt-daily-upgrade.service
Sun 2026-11-01 08:15:21 JST 4h 22min - - apt-daily.timer apt-daily.service
2 timers listed.
Pass --all to see loaded but inactive timers, too.検証環境では、Installed: (none) なので unattended-upgrades は入っておらず、20auto-upgrades のファイルもありませんでした。apt-daily.timer と apt-daily-upgrade.timer は apt に最初からついているタイマーですが、unattended-upgrades が入っていない今の状態では、セキュリティの更新が自動で入ることはありません。
自動アップデートが動いた記録は、ここに残ります。
- 1
- 2
ls /var/log/unattended-upgrades/
tail -n 20 /var/log/apt/history.log(例)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
kaito@demo:~/linux-practice/backup-test$ ls /var/log/unattended-upgrades/
ls: cannot access '/var/log/unattended-upgrades/': No such file or directory
kaito@demo:~/linux-practice/backup-test$ tail -n 20 /var/log/apt/history.log
…(途中省略)…
Start-Date: 2026-11-01 03:42:23
Commandline: apt install ufw
Requested-By: kaito (1000)
Install: libnetfilter-conntrack3:amd64 (1.1.0-1, automatic), iptables:amd64 (1.8.11-2, automatic), ufw:amd64 (0.36.2-9), libip4tc2:amd64 (1.8.11-2, automatic), libnfnetlink0:amd64 (1.0.2-3, automatic), libip6tc2:amd64 (1.8.11-2, automatic)
End-Date: 2026-11-01 03:42:24
Start-Date: 2026-11-01 03:48:37
Commandline: apt install docker.io docker-compose
Requested-By: kaito (1000)
Install: docker-compose:amd64 (2.26.1-4), libnl-3-200:amd64 (3.7.0-2, automatic), libintl-perl:amd64 (1.35-1, automatic), containerd:amd64 (1.7.24~ds1-6+deb13u1, automatic), apparmor:amd64 (4.1.0-1, automatic), libcompel1:amd64 (4.1.1-1, automatic), docker-cli:amd64 (26.1.5+dfsg1-9+deb13u1, automatic), python3-pycriu:amd64 (4.1.1-1, automatic), gettext-base:amd64 (0.23.1-2, automatic), docker.io:amd64 (26.1.5+dfsg1-9+deb13u1), libsort-naturally-perl:amd64 (1.03-4, automatic), libnet1:amd64 (1.3+dfsg-2, automatic), libprotobuf-c1:amd64 (1.5.1-1, automatic), docker-buildx:amd64 (0.13.1+ds1-3, automatic), libmodule-find-perl:amd64 (0.17-1, automatic), libterm-readkey-perl:amd64 (2.38-2+b4, automatic), runc:amd64 (1.1.15+ds1-2+b4, automatic), libprotobuf32t64:amd64 (3.21.12-11+deb13u1, automatic), python3-protobuf:amd64 (3.21.12-11+deb13u1, automatic), criu:amd64 (4.1.1-1, automatic), needrestart:amd64 (3.11-1, automatic), tini:amd64 (0.19.0-3+b8, automatic), libintl-xs-perl:amd64 (1.35-1, automatic), libproc-processtable-perl:amd64 (0.636-1+b3, automatic)
End-Date: 2026-11-01 03:48:42
Start-Date: 2026-11-01 03:51:37
Commandline: apt install rsync
Requested-By: kaito (1000)
Install: rsync:amd64 (3.5.0+ds1-0+deb13u1)
End-Date: 2026-11-01 03:51:38unattended-upgrades が入っていないので、記録のフォルダもありません。history.log には、このシリーズで入れた ufw(=Debian・Ubuntu で使える、ファイアウォールをかんたんに設定するための道具)・docker.io・rsync の記録が並んでいます(前のほうは省略しています)。
本物の VPS で自動アップデートを有効にするときは、sudo apt install unattended-upgrades のあと、sudo dpkg-reconfigure -plow unattended-upgrades で「はい」を選びます。設定ファイルには「更新のあと自動で再起動する」設定(Automatic-Reboot)もありますが、有効にすると、n8n などの処理の途中でサーバーが再起動されることがあります。この記事では設定を変えません。sudo apt full-upgrade -y を cron で毎日動かすような「なんでも自動で入れる」設定も、思わぬ不具合の元になるので避けましょう。
🤖 詰まったらAIに聞こう:バックアップの計画を立てたい
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
Linuxの初心者です。VPSで動かしているもののバックアップの計画を立てたいです。
何を・どこに・どのくらいの間隔で・何世代残すとよいか、
rsyncとtarを使った具体的な手順と、戻せるかの確かめ方を教えてください。
【守りたいもの】例:n8nのデータフォルダ、Pythonのスクリプトとcsv
【データの量】例:du -sh の結果で約500MB
【バックアップを置ける場所】例:自分のPC、別のVPS、クラウドストレージ
【使っている定期実行】例:systemd timer / cronバックアップ先のサーバーの IP アドレス、ユーザー名、パスワード、クラウドストレージのアクセスキーは貼らないでください。フォルダの名前に、お客さまの名前や会社名が入っている場合も、ダミーに置き換えましょう。バックアップのファイルそのものは、個人情報のかたまりです。AI やチャットに添付しないでください。
後片づけ
- 1
- 2
- 3
cd ~/linux-practice
rm -r backup-test
ls(例)
- 1
- 2
- 3
- 4
kaito@demo:~/linux-practice/backup-test$ cd ~/linux-practice
kaito@demo:~/linux-practice$ rm -r backup-test
kaito@demo:~/linux-practice$ ls
archive-test chmod-test edit-test find-test grep-test link-test perm-test redirect-testrsync は、このあとも使うので残しておいてかまいません。
よくある質問
Q. cp -r でも写せるのに、なぜ rsync を使うのですか?
cp -r は、毎回すべてのファイルを写します。rsync は2回目から、変わったファイルだけを写すので、データが多いときに速く終わります。-n で何が写るかを先に見られるのと、SSH の相手にもそのまま写せるのも、バックアップに向いている理由です。
Q. unattended-upgrades を入れたら、どこを見れば動いたとわかりますか?
この記事の STEP 4 で見た、/var/log/unattended-upgrades/ のフォルダと /var/log/apt/history.log です。入れたあとに、systemctl list-timers で apt-daily-upgrade.timer の次の予定を見て、その時刻を過ぎてからログを確かめます。表示される内容や時刻は、環境により異なります。
Q. apt upgrade のあとに、紫や青の画面で「再起動するサービス」を聞かれました。
needrestart の画面です。更新したライブラリを使っているサービスを、再起動するかどうかを聞いています。何を選べばいいかわからないときは、表示されたサービス名をメモして、そのまま OK で進めてかまいません(多くの場合、選ばれているサービスが再起動されます)。表示のされ方は、環境により異なります。
まとめ
- バックアップは「3-2-1」。同じサーバーの中だけに置かない
-
rsync -av src/ dest/で丸ごと写す。末尾の/で「中身だけ」か「フォルダごと」かが変わる -
--deleteは、必ず-nで下見してから -
tar -czfで日付つきの世代を残し、tar -xzf+diff -rで戻せるか確かめる - 古いバックアップの整理は、まず表示するだけ
- 更新は
apt list --upgradableで確かめ、unattended-upgrades のタイマーとログで動いているかを見る
これで Lv4 はおしまいです。次の Lv5 では、サーバーで起きる「困った」を自分で調べる力をつけます。最初は、「容量がいっぱい」「動作が重い」ときの調べ方です。
次に読む記事
関連する記事
- Git入門|init・add・commit を1回やってみる:スクリプトや設定ファイルの変更の歴史も残しておきたい方に
- Pythonで毎日の作業を自動化する入門|ダウンロードフォルダを自動で整理しよう:ファイルの整理やコピーを Python で自動化したい方に
- 自動化スタック総覧|GAS・n8n・Python・Notionの使い分け:どの自動化のデータを守るべきかを整理したい方に