内容
実行できるスクリプトの付いたハンドブックです。Debian か Ubuntu のサーバー単体で Node か Go のアプリ(SQLite か Postgres を使うもの)を動かしていて、デプロイ、再起動、操作ミスを乗り越えられる状態にしたい開発者に向けて書きました。
- 短い 15 章と、一枚に収まる印刷用の runbook(「サイトが落ちた」「バックアップからのリストア」)。
- shellcheck を通る 17 本のスクリプト。 ユーザー作成、sshd のハードニング、ファイアウォール、セキュリティ更新の自動化、自動ロールバック付きのリリースフォルダ方式デプロイ、ロールバック、SQLite と Postgres の整合性あるダンプを含む restic バックアップ、リストアドリル、ディスクとヘルスのチェック、スワップ、シークレットの監査、マイグレーションのデモ、Docker で行う災害復旧ドリルです。
- 設定テンプレート。 systemd ユニット、Caddyfile、sshd の drop-in、journald の上限、logrotate、cron、env ファイル。
- 印刷できるチェックリスト。 初日、毎週、デプロイ前、VPS 単体から移るとき。
多くのガイドが飛ばす章もあります。Postgres 本番運用のメモ(pg_dump で得られるものと得られないもの)、ディスクフルで落ちないためのログと journald の上限、メモリとスワップと OOM killer、デプロイ中でも安全な expand/contract マイグレーション、ひとつのマシンでのシークレット管理、そして VPS 単体から移るべき基準です。
ストップウォッチで測る復旧ドリル
スクリプトが「本番」サーバー(アプリ、SQLite、Postgres、アップロードファイル)を構築し、restic でサーバーの外のボリュームにバックアップしたあと、サーバーを破壊します。続いてクリーンな Debian コンテナ上に再構築し、データが無事かを確認します(行数と、全アップロードファイルのチェックサム)。
| 小さなデータ | 大きなデータ | |
|---|---|---|
| データ | データベースごとに 100k 行、200 x 100 KB のアップロード | データベースごとに 2M 行、500 x 1 MB のアップロード |
| スクリプトによる復旧の合計 | 29.8 s | 34.3 s |
apt のインストール | 24.1 s | 23.0 s |
restic restore | 1.6 s | 3.3 s |
pg_restore | 2.6 s | 4.9 s |
各一回の実行で、Docker Desktop 上の arm64 ノート PC を使いました。パッケージのインストールは実行ごとに 21 s から 57 s までぶれたため、合計は約 27 s から 62 s の範囲になりました。プロバイダーでの実サーバーの用意と DNS の切り替えは含みません。
何をどう検証したか
すべてのスクリプトと章を、クリーンな Debian 12 のコンテナで実行しました。
- 本物の sshd と ssh クライアント(鍵ログインは通り、root ログインとパスワードログインは拒否される)
- ufw を、二つのコンテナ間の実トラフィックでテスト
- PID 1 として動く systemd。ユニットの検証、
kill -9後の再起動、シンボリックリンク切り替え後の新リリースの読み込み、MemoryMaxの強制 - Debian の Caddy パッケージによるアプリへのプロキシと、アプリ停止時の 502 応答
- restic と PostgreSQL 15 のバックアップとリストア。失敗ケース(壊れたデータベース、誤ったパスワード、古いダンプ)も含む
- journald と logrotate の上限、ディスクフル、OOM による強制終了、SQLite と Postgres でのマイグレーション
verify/run.sh(Docker が必要)の一コマンドで、お使いのマシンで全チェックを再実行できます。
対象範囲
サーバーは一台、アプリは一つです。オートスケール、Kubernetes、マルチリージョンは扱いません。それらが必要かどうかの見分け方は、最終章に書いてあります。
よくある質問
どんな形式ですか?
Markdown、シェルスクリプト、設定ファイルです。どこでも読めて、コマンドもそのままコピーできます。PDF の DRM もアカウント登録もありません。
Debian 専用ですか?
コマンドは Debian と Ubuntu 向けで、Debian 12 で検証しています。
VPS Deploy & Backup Kit とはどう違いますか?
キットは、検証済みのスクリプトをまとめたものです(blue/green デプロイ、バックアップ、アラート)。ハンドブックは、その周りの知識とスクリプトです。サーバーのセットアップ、systemd、HTTPS、ログ、メモリ、マイグレーション、シークレット、復旧ドリルを扱います。デプロイとバックアップの基本は重なります。
Docker は必要ですか?
検証ハーネスを再実行するときだけです。スクリプト自体は、ふつうのサーバーで動きます。
ライセンスはどうなっていますか?
ご自身のサーバーとチーム内で使えます。ファイルの再販や再配布はできません。
変更履歴
- 0.2.0: 1〜3 章と 7 章をコンテナで検証、時間を計る災害復旧ドリル、Postgres、ログ、メモリ、マイグレーション、シークレット、VPS 単体から移るときの章を追加、17 本のテスト済みスクリプト、runbook。
- 0.1.0: 初回リリース。
続きを読む
- How to write a restore runbook you can follow at 3 a.m. (英語)
- systemd or pm2 for a small Node app on one VPS? (英語)
- SSH, ufw and fail2ban basics for a single VPS (英語)
- When a restore succeeds and hands you the wrong data (英語)
- Monitor one VPS without Prometheus, Grafana or a stack (英語)
- Find what filled your VPS disk and keep it from happening (英語)
- Harden a fresh Debian VPS in the first hour, step by step (英語)
- I destroyed my server on purpose and timed the recovery (英語)
- Caddy or nginx for a one-person VPS stack, compared (英語)
入手する
支払い、税、請求書は販売代行事業者の Polar が処理します。決済後にダウンロードリンクが届きます。