Distributed lock — pregled¶
TL;DR
Vendor-neutral lock za remote mutaciju shared state izvan
lokalnog workspace-a. Tri live consumera: Coolify deploy, mobile
version-state read-modify-write, bump fingerprint auto-seed.
Lock ide prije svake mutacije; release_lock() na kraju.
Vendor-neutral = isti lock API, više backend implementacija.
Šta lock štiti¶
Coolify deploy — dva paralelna pipeline-a ne smiju istovremeno pisati u isti Coolify env. Posljedica bez locka: prepisani secrets, nepredvidivi image_tag.
Mobile version-state (Flagsmith / Infisical / git / Backoffice) — read-modify-write kritična sekcija. Posljedica bez locka: dva pipeline-a pročitaju isti state, oba inkrementiraju, oba pišu — jedan increment izgubljen.
bump fingerprint auto-seed — kada novi servis treba baseline,
bump acquire-uje lock da ne bi drugi bump paralelno seed-ovao
različit baseline.
Kada NE treba lock¶
- Samo-lokalne operacije (file read/write unutar workspace-a).
- Idempotentne operacije (Coolify redeploy sa istim tagom).
- Read-only pozivi (Sentry DSN fetch, Slack channel info).
Lock backend opcije¶
| Backend | Trade-off |
|---|---|
| Infisical (default) | Lock key je secret u Infisical folder-u; CAS preko Infisical API |
| Flagsmith | Lock key je Flagsmith feature flag; CAS preko Flagsmith API |
| Backoffice (v25+) | Lock u version-store HTTP backend; native CAS |
| git | Lock preko git refs na dedicated branch; CAS preko push |
| memory / none | Samo za testiranje; nikad production |
CI_LOCK_BACKEND env var bira backend. Production treba
infisical / flagsmith / backoffice (ovisno o dostupnosti u
consumer repo-u).
Lock životni ciklus¶
from ci.lock import acquire, release
with acquire("coolify:<uuid>:<env>", timeout=300) as lock:
coolify_set_env(uuid, key, value)
coolify_redeploy(uuid, image_tag)
# lock automatski otpusti
Ako acquire timeout-uje (drugi pipeline drži), acquire raise-uje
LockTimeout. Verb to tretira kao transient fail (exit 1, retry).
Tri load-bearing konstante (F35/F38/F40)¶
- F35 — dvofazni lock (Phase 1 lock, Phase 2 lock, između release)
- F38 — deploy/mobile folder split (Coolify deploy koristi jedan lock namespace, mobile RMW drugi — ne mogu se preklapati)
- F40 — acquire budget (timeout + max retries)
Detalji u 06-lock-protocol.md.
Failure modes¶
- Acquire timeout (drugi pipeline drži) → exit 1, retry.
- Release fail (lock ostaje držan) → sljedeći run će timeout-ovati;
ručno čišćenje (ili
release_locksa--force). - Backend unreachable → exit 2, fail-loud. Lock NIKAD ne degradira na "no-op".
Vidi i¶
06-lock-protocol.md— F35/F38/F40 deep-dive02-verbs/02-deploy-coolify.md— Coolify lock kontraktci/lock/CLAUDE.md— operativna dokumentacija