Príkazy a kontrola stavu
Štrnásť príkazov pokrýva inštaláciu, overovanie, údržbu a kľúče. Modely zadávate ako názov triedy alebo morph alias a príkazy volajú injektovaný SentinelManager, takže v testoch bežia aj nad Sentinel::fake().
| Príkaz | Účel |
|---|---|
sentinel:install {--force} | Publikuje, vygeneruje predvolený kľúč, ak chýba, a vypíše ďalšie kroky. |
sentinel:check {--json} {--strict} | Kontrola stavu inštalácie; exit 1 pri zlyhaní (--strict: aj pri varovaní). |
sentinel:verify {model?*} {--seal=} {--chunk=500} {--limit=} {--ledger} {--anchor=} {--check-schema} {--json} {--fail-on=*} {--max-findings=1000} {--allow-empty} {--isolated} | Skenuje zapečatené riadky (aj denník); exit 1 pri zisteniach, 2 keď nie je čo skenovať — pre cron a CI. |
sentinel:checkpoint {--connection=*} {--batch=} {--isolated} | Zloží čakajúce záznamy denníka do kontrolných bodov a publikuje ich do kotiev. |
sentinel:reseal {model} {--seal=} {--from-key=} {--only-outdated} {--upgrade-format} {--chunk=500} {--dry-run} {--acknowledge=} | Znovu zapečatí po rotácii alebo zmene definície; bez --acknowledge nikdy nič „nevyperie“. |
sentinel:seal-missing {model} {--seal=} {--reason=} {--chunk=500} | Baseline pre riadky, ktoré nikdy neboli zapečatené. |
sentinel:inspect {model} {id} {--seal=} {--show-values} {--check-schema} | Jeden riadok: riadok pečate, verdikt, manifest, história, zmenené polia (hodnoty len s --show-values). |
sentinel:prune {--idempotency} {--nonces} {--dry-run} | Zmaže expirované idempotenčné kľúče a nonce. |
sentinel:key:generate {--ring=} {--algorithm=hmac-sha256} {--kid=} {--database} {--activate-at=} {--owner-type=} {--owner-id=} {--label=} | Vygeneruje kľúč (riadky env alebo riadok v databáze). |
sentinel:key:import {kid} {--ring=} {--algorithm=} {--signing} {--file=} {--activate-at=} {--owner-type=} {--owner-id=} {--label=} | Importuje kľúč partnera (alebo vlastný); materiál z --file (PEM alebo base64:…) alebo zo skrytého vstupu, nikdy z argumentu. |
sentinel:key:rotate {--ring=} {--algorithm=} {--activate-at=} | Rotuje podpisový kľúč kruhu. |
sentinel:key:revoke {kid} {--ring=} {--reason=} | Odvolá kľúč. |
sentinel:key:retire {kid} {--ring=} {--force} | Vyradí kľúč (odmietne, kým ho pečate ešte používajú). |
sentinel:key:list {--ring=} | Inventár kľúčov a počet pečatí každého kľúča (na všetkých pripojeniach denníka) — nikdy nie materiál. |
php artisan sentinel:verify # every sealable model
php artisan sentinel:verify "App\Models\Invoice" --seal=financial --ledger
php artisan sentinel:verify --fail-on=tampered,missing --fail-on=backlog
php artisan sentinel:verify --ledger --anchor='<json>' # compare a payload from a log anchor
php artisan sentinel:verify --check-schema --limit=10000 # CI against a staging snapshot
php artisan sentinel:reseal "App\Models\Invoice" --from-key=default-20250901-a1b2c3 --dry-run
php artisan sentinel:seal-missing "App\Models\Invoice" --reason="Initial baseline 2026-10"
php artisan sentinel:inspect "App\Models\Invoice" 42 --seal=financial
php artisan sentinel:prune --dry-run
php artisan sentinel:key:list --ring=httpVoľby, ktoré sa oplatí poznať
- --fail-on berie hodnoty VerificationStatus (tampered, missing, … — aj outdated a unsealed, ktoré inak nikdy nezlyhajú) a hodnoty LedgerFindingKind, opakovane alebo oddelené čiarkou. Uvedené stavy nahradia predvolené — zlyhajú len tie; ak uvediete len druhy zistení denníka, zlyhávajúce stavy ostanú všetky. Porušenia denníka zlyhajú vždy; backlog a anchor_unreachable len vtedy, ak ich uvediete. Neznámy názov skončí kódom 2.
- --anchor='<json>' (obsah skopírovaný z kotvy log, ktorá sa len zapisuje) sa číta len spolu s --ledger; nedekódovateľný obsah skončí kódom 2.
- --isolated[=EXIT] (sentinel:verify, sentinel:checkpoint) beh preskočí — s kódom 0 alebo zadaným — kým zámok drží iná inštancia.
- Rozsahy: --chunk 1–100 000, --limit ≥ 1 (riadkov spolu naprieč modelmi), --max-findings 0–1 000 000, --batch 1–100 000; dôvody 1–sealing.reason_max_length znakov, dôvod odvolania najviac 1 000.
- --json: sentinel:verify vypíše models, unresolved_types, scanned, counts, findings, truncated a objekt ledger; sentinel:check vypíše failed a zoznam kontrol, pričom failed rešpektuje --strict.
- sentinel:inspect ponechá hodnoty skryté, pokiaľ nezadáte --show-values (môžu obsahovať osobné údaje); sentinel:key:import číta materiál z --file alebo zo skrytého vstupu, nikdy z argumentu, ktorý by skončil v histórii shellu.
Návratové kódy
0 znamená úspech, 1 zlyhanie a 2 neplatný vstup:
| Príkaz | 0 | 1 | 2 |
|---|---|---|---|
sentinel:install | vždy (druhé spustenie neuškodí) | — | — |
sentinel:check | žiadne zlyhanie (s --strict ani varovanie) | zlyhanie (s --strict aj varovanie) | — |
sentinel:verify | nenašlo sa nič zlyhávajúce (alebo nebolo čo skenovať, s --allow-empty) | zlyhávajúci stav (pozri --fail-on) alebo porušenie denníka | neplatný vstup či konfigurácia, alebo nie je čo skenovať |
sentinel:checkpoint | každé pripojenie má kontrolný bod (pripojenie držané iným behom sa s varovaním preskočí) | kontrolný bod pripojenia zlyhal | neplatné --batch alebo konfigurácia |
sentinel:reseal | nič sa nepreskočilo, nič nezlyhalo | preskočili sa riadky, ktoré nie sú neporušené (vypísané), alebo riadok zlyhal | neznámy model či pečať, neplatná voľba či konfigurácia, potvrdenie zamietnuté politikou |
sentinel:seal-missing | každý kandidát dostal baseline | riadky s históriou, no bez pečate (nahlásené, nikdy nie baseline), alebo riadok zlyhal | chýba --reason, neznámy model či pečať, neplatná voľba |
sentinel:inspect | každá skontrolovaná pečať je neporušená | pečať nie je neporušená alebo riadok neexistuje | neznámy model či pečať, chyba konfigurácie |
sentinel:prune | zmazané (alebo spočítané, s --dry-run) | chyba úložiska | — |
sentinel:key:generate | vygenerovaný | neznámy --algorithm, vlastník nenájdený, odmietnuté (obsadený kid, nepovolený algoritmus, neplatný kid či label) | — |
sentinel:key:import | importovaný | odmietnuté (obsadený kid, kruh len na čítanie, neplatný materiál, súkromný materiál bez --signing) | neplatný vstup (chýba --algorithm, vlastník nenájdený, nečitateľný, prázdny či > 64 KB súbor, bez terminálu aj --file) |
sentinel:key:rotate | rotovaný | neznámy --algorithm, odmietnuté | — |
sentinel:key:revoke | odvolaný — pri kľúči z konfigurácie sa vypíše riadok SENTINEL_REVOKED_KEYS | chýba --reason, neznámy kľúč, odmietnuté | — |
sentinel:key:retire | vyradený — pri kľúči z konfigurácie sa vypíše postup | neznámy kľúč, pečate ho stále používajú (bez --force), odmietnuté | — |
sentinel:key:list | vypísané | neplatný kruh alebo konfigurácia | — |
Plánovanie
Provider zaregistruje údržbu v plánovači, kým je schedule.enabled zapnuté (predvolené), každú úlohu s withoutOverlapping()->onOneServer(). Plný sken je predvolene denný — hodinové skeny celých tabuliek sú pri veľkých tabuľkách tichou záťažou — kým kontrolný bod ostáva každú minútu, pretože jeho interval je okno, v ktorom návrat ostane nepovšimnutý:
| Úloha | Príkaz | Predvolené | Env |
|---|---|---|---|
checkpoint | sentinel:checkpoint (len pri ledger.enabled) | everyMinute | SENTINEL_SCHEDULE_CHECKPOINT |
verify | sentinel:verify --allow-empty (+ --ledger, kým je denník zapnutý) | daily | SENTINEL_SCHEDULE_VERIFY |
prune | sentinel:prune | daily | SENTINEL_SCHEDULE_PRUNE |
Ak ich chcete zapojiť sami, nastavte SENTINEL_SCHEDULE=false a pridajte ich do routes/console.php. Ručne zapísané riadky nenechávajte vedľa automatického plánu — withoutOverlapping() bráni súbežným behom, nie dvojitému naplánovaniu.
// routes/console.php
use Illuminate\Support\Facades\Schedule;
Schedule::command('sentinel:checkpoint')->everyMinute()->withoutOverlapping();
Schedule::command('sentinel:verify --ledger')->hourly();
Schedule::command('sentinel:verify --json')->dailyAt('03:00')->emailOutputOnFailure('[email protected]');
Schedule::command('sentinel:prune')->daily();Sentinel::sealables() vypíše, čo sentinel:verify bez zadaného modelu skenuje: najprv sentinel.models, potom každú triedu s riadkami pečatí alebo záznamami v denníku. Ak nie je čo skenovať, skončí kódom 2, takže chybná konfigurácia nikdy nehlási zelenú. V CI zastaví pipeline pri zisteniach sentinel:verify --check-schema --limit=10000 nad snapshotom zo stagingu a sentinel:check --strict pri akejkoľvek oslabenej záruke.
Kontrola stavu
sentinel:check (alebo Sentinel::check()) nahlási na jednom mieste každú chybnú konfiguráciu, ktorá potichu oslabuje záruky. Správy uvádzajú nastavenia, kruhy, tabuľky a triedy — nikdy materiál kľúčov ani ich id:
$report = Sentinel::check(); // HealthReport
$report->failed(); // any failure (warnings do not fail it)
$report->failures(); // list<HealthCheck>: name, status, message
$report->warnings();| Kontrola | Zlyhá, keď | Varuje, keď |
|---|---|---|
configuration | Akékoľvek nastavenie alebo profil podpisov je neplatný. | — |
signing_keys | Kruh default, kruh denníka alebo kruh niektorého sealable modelu nevie podpisovať (kým je sealing.auto zapnuté). | To isté na uzle len na overovanie. |
app_key | Kľúče v databáze alebo idempotency.encrypt potrebujú APP_KEY a ten je prázdny. | — |
tables | Na svojom pripojení chýba tabuľka sentinel_*. | — |
models | Sealable model sa neskompiluje alebo jeho tabuľke chýba zapečatený stĺpec. | Nie sú žiadne sealable modely, uložené typy sa už nedajú vyhodnotiť alebo model žije na pripojení, ktoré ledger.connections neuvádza. |
anchors | Nakonfigurovaná kotva je nedostupná alebo kotva cache žije v pamäti procesu či v databáze, ktorú chráni. | Žiadna nie je nakonfigurovaná alebo kotva cache používa predvolený store. |
checkpoints | — | Záznamy denníka staršie než ledger.backlog_warning_seconds nemajú kontrolný bod. |
schedule | — | Plánovanie je vypnuté a sentinel:checkpoint nie je naplánovaný. |
retired_keys | — | Pečate stále používajú odvolaný, vyradený alebo neznámy kľúč (počty po kruhoch). |
stores | Úložisko idempotencie alebo nonce sa nedá zostaviť. | — |
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.