Workload volume declarations: ownership, backup, and retention
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 初心者へのやさしさ
- 30/100
- issue の種類
- 機能追加
- 明瞭さ
- おおむね明確
- 活発さ
- 活発
- 技術スタック
- docker, go
- 領域
- cli, devops, infrastructure
調査の方向性
まず子 Issue #141、#142、#148 を読み、次に internal/onebox/workload_plan.go、internal/release/retention.go、および Issue に記載されている前提となる call site を確認します。完了とは、volume エントリの形、backup product の境界、実装順序が、子 Issue が schema や所有権について矛盾する前提を持たずに進められる程度に明確に決まっていることです。
索引モデルが issue の本文から書いたものです。
説明
Why these are tracked together
Three open issues change what a workloads.*.volumes[] entry means, and each was
filed against a different symptom. They share one substrate, so deciding the
entry shape once is cheaper than touching that schema node three times.
- #141 — declarative ownership for bind-mounted host directories. Adds host
provisioning metadata (owner, group, permissions) to an absolute bind source. - #142 —
backup:on workload volumes. Adds a backup contract to a volume
holding durable state. - #148 — retain workloads whose relative bind-mount content is unchanged.
Not a schema change; it makes the planner test the content behind a relative
bind rather than its shape, so an unchanged workload stops being recreated on
every deploy.
#141 and #142 both add properties to the same node. #148 is a defect in the
planner and retention, and is included here because it is the third thing that
turns on what a volume entry means — a mount that is release-scoped versus one
that is external host state.
Verified state on main (checked at 5e03da0)
hasReleasePathDependency(internal/onebox/workload_plan.go:139) marks any
workload with a relative bind non-retainable, and that case is evaluated above
the revision comparison (workload_plan.go:70), soretainis unreachable for
those workloads. #148's reproduction is accurate.RetentionCandidates(internal/release/retention.go:80) protects evidence
ids, active schedule leases, the current release and its predecessor chain, and
the activation and secret checkpoints. It never inspects live container mounts,
so #148's "hard part" is real: a container retained past the chain would mount a
pruned release directory.- A volume entry today has exactly
mode,name,path,source.modeis the
rw/roenum and a relative source is schema-forced toro. backup:exists only under aservicesentry that declares a driver
(properties/services/additionalProperties/anyOf[1]), and its implementation is
wal-g and PostgreSQL specific (internal/engine/backup_postgres.go,
backup_postgres_ops.go, and therenderServicewiring in
internal/app/services.go:350). There is no driver-neutral copy engine to reuse.ob doctoralready names the gap #142 describes
(cmd/ob/doctor.go:496), anddocs/product.md:53lists workload-volume backups
under "Not owned today".
Decisions that belong here rather than in a child
The entry shape, decided once. #141 proposes host_path, uid, gid and
mode. host_path duplicates the existing source, and mode collides with the
existing rw/ro enum on the same node. A nested block — for example
host: {uid, gid, mode} — leaves the existing keys alone and gives #142 a place
to sit beside it. Whatever is chosen, both children should be written against it
before either is implemented.
Which volumes backup: can attach to. #142's proposal attaches it to an
absolute bind source. Sampling the config corpus, most durable workload state is
in named volumes rather than binds — ext-gitea (data), ext-immich
(upload), ext-n8n (storage), ext-plausible (data), ext-paperless
(pgdata, redisdata). A backup contract that reaches only bind sources would
miss the common case. This is also a partial answer to #142's own open question
about whether one application's inventory is representative.
Whether #142 is taken at all. It moves a documented product boundary and
needs a copy engine that does not exist yet. That is a product decision, not a
backlog pull, and it should be settled before the schema work in #141 assumes it.
Where a declared-path check runs. #141's comment proposes the shared host
prerequisite gate. RequireHostPrerequisites
(internal/app/prerequisites.go:182) takes only a Runner and asserts three
constant Docker commands, so project-declared paths need a sibling gate called
from the same three sites — internal/engine/bootstrap.go:83,
internal/app/preflight.go:84 and internal/engine/preflight.go:33 — rather than
a widened signature.
Suggested order
- #141 — smallest, and a directory the platform backs up should be one the
platform provisioned. - #148 — independent of the schema decision and the only one with measured
production cost, so it need not wait on #142. - #142 — only after the product boundary question is answered.
Related, not part of this
- #75 — expose effective persistence settings in canonical and doctor.
- #97 — relative bind source semantics (closed).
- #119 — retain unchanged workloads (closed), whose contract #148 restores.
- 主要言語
- Go
- スター
- 3
- フォーク
- 0
- 平均マージ
- 3時間 10分
- マージ済み PR(30日)
- 39
環境構築
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
labstack/onebox のほかの issue
-
bug
難易度 1/5 1時間未満 初心者へのやさしさ 80/100
メンテナーはふだん 1 日以内に返信
-
bug
難易度 1/5 1時間未満 初心者へのやさしさ 85/100
メンテナーはふだん 1 日以内に返信
-
bug
難易度 1/5 1時間未満 初心者へのやさしさ 85/100
メンテナーはふだん 1 日以内に返信
-
bug
難易度 3/5 1〜2日 初心者へのやさしさ 65/100
メンテナーはふだん 1 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 55/100
メンテナーはふだん 1 日以内に返信
labstack/onebox の issue をすべて見る
似ている issue
-
Remove CAAPFオープンkind/chore kind/cleanup needs-area
難易度 2/5 1〜3時間 初心者へのやさしさ 86/100
rancher/turtles#2848 · コメント 3 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信
-
good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
メンテナーはふだん 1 日以内に返信
-
priority: low 🌱 type: enhancement 💅🏼
難易度 2/5 半日 初心者へのやさしさ 84/100
nebari-dev/llm-serving-pack#199 ·
メンテナーはふだん 3 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 90/100
kedacore/keda#8225 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信