@@ -57,31 +57,55 @@ graph LR
5757| パラメータ | デフォルト値 | 説明 |
5858| -----------| ------------| ------|
5959| ` DEFAULT_MAX_INCREMENTALS ` | ` 10 ` | 1 世代あたりの最大差分バックアップ数 |
60- | ` DEFAULT_MAX_GENERATIONS ` | ` 3 ` | 保持する最大世代数 |
60+ | ` DEFAULT_MAX_GENERATIONS ` | ` 3 ` | アカウントグループ(系列)ごとに保持する世代数 |
61+ | 全体の上限 | ` DEFAULT_MAX_GENERATIONS × 3 ` (` 9 ` ) | すべてのグループを合わせて保持する世代数の上限 |
6162
62- デフォルト設定では、差分バックアップが 10 回溜まるとフルバックアップが新たに作成され、最大 3 世代が保持されます。
63+ デフォルト設定では、差分バックアップが 10 回溜まるとフルバックアップが新たに作成され、グループごとに最大 3 世代、全体で最大 9 世代が保持されます。
64+
65+ ### 系列
66+
67+ 世代は、控える** ボリュームの組** (共通ボリューム ` devbase_home_ubuntu ` とグループの
68+ ボリューム ` devbase_home_<group> ` )ごとの** 系列** に分かれます。アカウントグループ 1 つにつき
69+ 系列が 1 つできます。アカウントグループ分離より前に作られた世代(共通ボリュームだけを控えたもの)は、
70+ まとめて 1 つの系列になります。
71+
72+ - 差分は、起動したグループの系列の** 最新の世代** へ積みます。別のグループのプロジェクトを
73+ 起動した後に戻ってきても、フルバックアップを取り直しません
74+ - 保持の数は系列ごとに数えます。グループを切り替えても、他のグループの世代が保持の枠から押し出されません
75+ - 全体の上限を超えると、系列をまたいで最も古い世代から削除します
76+ - ** 各系列の最新の世代は自動では削除されません。** 次の差分の積み先になるためです。使わなくなった
77+ グループや、アカウントグループ分離より前の系列の最新の世代も残ります。不要になったら
78+ ` devbase snapshot delete <名前> ` で削除してください。系列の数が全体の上限を超えているときは、
79+ 上限を超えたまま残し、警告を出します
80+
81+ 積み先・最小間隔・ローテーションの規則と世代の場所の検証の仕様は
82+ [ スナップショットの世代の系列] ( ../specifications/snapshot-series.md ) にあります。
6383
6484### 世代の概念
6585
6686``` mermaid
6787graph TD
68- subgraph 世代 1(最古)
69- A1[full.tar.zst]
70- A2[incr-001.tar.zst]
71- A3[incr-002.tar.zst]
88+ subgraph 系列 default
89+ subgraph 世代 1(最古)
90+ A1[full.tar.zst]
91+ A2[incr-001.tar.zst]
92+ A3[incr-002.tar.zst]
93+ end
94+ subgraph 世代 2(系列の最新)
95+ B1[full.tar.zst]
96+ B2[incr-001.tar.zst]
97+ end
7298 end
73- subgraph 世代 2
74- B1[full.tar.zst]
75- B2[incr-001.tar.zst]
76- end
77- subgraph 世代 3(最新)
78- C1[full.tar.zst]
99+ subgraph 系列 with
100+ subgraph 世代 3(系列の最新)
101+ C1[full.tar.zst]
102+ end
79103 end
80104```
81105
82106- 1 つの世代は 1 つのフルバックアップと 0 個以上の差分バックアップで構成される
83- - 差分バックアップが ` DEFAULT_MAX_INCREMENTALS ` 回に達すると新しい世代が開始される
84- - ` DEFAULT_MAX_GENERATIONS ` を超えた古い世代は自動的に削除される
107+ - 系列の最新の世代の差分バックアップが ` DEFAULT_MAX_INCREMENTALS ` 回に達すると、その系列に新しい世代が開始される
108+ - 系列ごとに ` DEFAULT_MAX_GENERATIONS ` を超えた古い世代と、全体の上限を超えた古い世代は自動的に削除される
85109
86110## 自動実行
87111
@@ -91,22 +115,37 @@ graph TD
91115
92116``` mermaid
93117flowchart TD
94- A[devbase up 実行] --> B{現世代の差分バックアップが<br/>DEFAULT_MAX_INCREMENTALS 回以上?}
95- B -->|はい| C[新世代のフルバックアップを作成]
96- B -->|いいえ| D[現世代に差分バックアップを追加]
97- C --> E[コンテナを起動]
98- D --> E
118+ A[devbase up 実行] --> S{起動するグループの系列に<br/>世代がある?}
119+ S -->|いいえ| C[新世代のフルバックアップを作成]
120+ S -->|はい| B{系列の最新の世代の差分バックアップが<br/>DEFAULT_MAX_INCREMENTALS 回以上?}
121+ B -->|はい| C
122+ B -->|いいえ| D[系列の最新の世代に差分バックアップを追加]
123+ C --> R[ローテーション]
124+ D --> R
125+ R --> E[コンテナを起動]
99126```
100127
128+ 起動時の出力には、扱った系列のグループ名が出ます。新しい世代を作るときは、その理由
129+ (系列に世代が無い / 差分が上限に達した)を 1 行出します。
130+
131+ ``` text
132+ [0/6] スナップショットを差分更新中: 20260920-212546 (グループ with)
133+ ```
134+
135+ 直近のスナップショットから ` DEVBASE_SNAPSHOT_MIN_INTERVAL_MINUTES ` (既定 60 分)以内なら
136+ スナップショットを飛ばします。この間隔も系列ごとに判定するため、default のプロジェクトを
137+ 起動した直後に with のプロジェクトを起動しても、with の系列は控えます。
138+
101139### ` devbase down ` 時の動作
102140
103141``` mermaid
104142flowchart TD
105143 A[devbase down 実行] --> B[コンテナを停止・削除]
106- B --> C{世代数 > DEFAULT_MAX_GENERATIONS?}
107- C -->|はい| D[最古の世代を削除]
108- D --> C
109- C -->|いいえ| E[完了]
144+ B --> C[系列ごとに DEFAULT_MAX_GENERATIONS を<br/>超えた古い世代を削除]
145+ C --> T{全体の世代数 > 全体の上限?}
146+ T -->|はい| D[系列の最新ではない世代のうち<br/>最も古いものを削除]
147+ D --> T
148+ T -->|いいえ| E[完了]
110149```
111150
112151## バックアップデータ構造
@@ -190,9 +229,11 @@ before-upgrade 2026-02-21 14:00:00 1 2.1GB devbase_ho
190229### 対象ボリュームが変わったとき
191230
192231アカウントグループを切り替えたり、分離前の環境から更新したりすると、対象ボリュームの構成が
193- 変わります。このとき devbase は** 新しい世代を作ります** 。旧世代の差分状態ファイル
194- (` snapshot.snar ` )は別のレイアウトを記録しているため、そこへ差分を積むと全ファイルが
195- 移動したものとして扱われ、差分が壊れるからです。世代を分けることで旧世代はそのまま復元できます。
232+ 変わります。devbase は、切り替えた先のグループの系列([ 系列] ( #系列 ) )の最新の世代へ差分を
233+ 積みます。** 新しい世代を作るのは、その系列にまだ世代が無いときだけです。** 構成の違う世代へは
234+ 差分を積みません。差分状態ファイル(` snapshot.snar ` )は別のレイアウトを記録しているため、
235+ そこへ差分を積むと全ファイルが移動したものとして扱われ、差分が壊れるからです。
236+ 系列を分けることで、どの世代もそのまま復元できます。
196237
197238構成の違う世代を明示的に指定して差分を作ろうとした場合は、理由を示して中断します。
198239
@@ -332,11 +373,20 @@ devbase snapshot delete 20260218-080000
332373# デフォルトの保持数で実行
333374devbase snapshot rotate
334375
335- # 保持する世代数を指定
376+ # グループごとに保持する世代数を指定
336377devbase snapshot rotate --keep 5
378+
379+ # 全体の上限も指定
380+ devbase snapshot rotate --keep 5 --max-total 10
337381```
338382
339- ` --keep N ` で指定した世代数より古い世代を削除します。名前付きスナップショット(` --name ` で作成したもの)はローテーション対象外です。
383+ ` --keep N ` はアカウントグループ(系列)ごとに残す世代数です。各系列で古い世代から削除し、
384+ 残りの合計が ` --max-total M ` (省略時は ` N × 3 ` )を超えていれば、系列をまたいで古い世代から
385+ 削除します。各系列の最新の世代は削除しません。名前付きスナップショット(` --name ` で作成したもの)や
386+ ` copy ` で作った世代も、対象ボリュームの組でいずれかの系列に入り、同じ規則で削除の対象になります。
387+
388+ ** ` --keep ` と ` --max-total ` は、その 1 回の実行だけに効きます。** 値は保存されず、
389+ ` devbase up ` / ` devbase down ` の自動ローテーションは既定(グループごとに 3・全体で 9)で動きます。
340390
341391## 運用のベストプラクティス
342392
@@ -357,9 +407,8 @@ devbase snapshot rotate --keep 5
357407 du -sh projects/< project> /backups/
358408 ```
359409
360- 5 . ** ローテーションの保持数はプロジェクトに合わせて調整する **
410+ 5 . ** 長期保持したい世代は ` backups/ ` の外へ複製する **
361411
362- ``` bash
363- # 長期保持が必要な場合
364- devbase snapshot rotate --keep 7
365- ```
412+ ` devbase snapshot rotate --keep ` の指定はその 1 回だけに効き、次の ` devbase up ` / ` devbase down `
413+ の自動ローテーションで既定の数まで削除されます。` snapshot copy ` で作った世代もローテーションの
414+ 対象です。長く残したい世代は、世代のディレクトリを ` backups/ ` の外へ複製してください。
0 commit comments