Schemat receptury
Receptury OpenFactory używają JSON w snake_case. Format kanoniczny ma małą
obwolutę na najwyższym poziomie, obiekt os do konfiguracji systemu operacyjnego
oraz tablicę scenarios do weryfikacji po buildzie.
Walidacja pokazuje, że rozpoznane pola mają dopuszczalne kształty. Nie dowodzi, że każdy pakiet istnieje, że każde żądane zachowanie zostało odwzorowane, ani że obraz i testy się powiodą. Nieznane pola mogą być ignorowane dla wstecznej kompatybilności; zawsze sprawdzaj znormalizowaną recepturę zwróconą przez produkt.
Obwoluta kanoniczna
{
"name": "debian-web-check",
"display_name": "Debian Web Check",
"description": "Small Debian image with explicit smoke tests.",
"base_image": "debian-trixie",
"use_case": "Server evaluation",
"hardware": {},
"os": {},
"scenarios": [],
"publish_to": ["local"]
}Nie używaj pól camelCase, takich jak baseImage czy startupScripts. Walidator
zgodności akceptuje niektóre starsze płaskie receptury, ale znormalizowane wyjście
zagnieżdża pola OS pod os. Nowe integracje powinny wysyłać format kanoniczny.
Pola najwyższego poziomu
| Pole | Typ | Wymagane/domyślne | Znaczenie |
|---|---|---|---|
name | string | Wymagane; 3–100 znaków | Stabilna wewnętrzna nazwa receptury |
display_name | string lub null | Opcjonalne; 1–100 znaków | Nazwa dla użytkownika |
description | string | "" | Zamierzony wynik i granica |
base_image | string | debian-trixie | Dystrybucja/cel buildu; użyj aktualnej listy w konsoli |
task | string lub null | Opcjonalne | Cel operacyjny |
executor | string lub null | Opcjonalne | Technologia wykonująca zadanie |
use_case | string | General | Główny przypadek użycia |
hardware | object | Domyślne poniżej | Wymagania wdrożenia |
os | object | Pusty/obiekt domyślny | Pakiety OS, użytkownicy, usługi, bezpieczeństwo, pulpit, installer i skrypty |
scenarios | array | [] | Topologie testów i cele |
publish_to | string array | ["local"] | Żądane miejsca docelowe wyjścia |
delivery | object | {} | Dodatkowa zadeklarowana konfiguracja dostawy |
community | boolean | false | Prośba o widoczność w marketplace społeczności; polityka publikacji nadal obowiązuje |
Zaawansowane pola zależne od celu dotyczą remasteringu ISO źródłowego, ładunków gościa Proxmox, pochodzenia polityk i integracji dostawy. Użyj edytora lub kontraktu API wdrożonej wersji zamiast kopiować stary przykład.
Hardware
{
"hardware": {
"platform": "pc",
"architecture": "x86_64",
"gpu": null,
"min_cpu_cores": 2,
"min_memory_gb": 4,
"min_storage_gb": 16,
"nic_count": 1
}
}platform to pc, phone lub raspberry_pi; obsługiwane wartości urządzeń zależą od celu.
architecture to x86_64 lub aarch64. Wartości GPU nazywają obsługiwanego dostawcę lub
kombinację. To zadeklarowane wymagania, a nie dowód, że wynikowy obraz testowano na
pasującym sprzęcie fizycznym.
Obiekt OS
Typowe pola os:
| Pole | Typ | Cel |
|---|---|---|
features | string array | Zarejestrowane moduły funkcji |
packages | string array | Natywne pakiety do żądania |
excluded_packages | string array | Pakiety, które muszą pozostać nieobecne po rozszerzeniu funkcji |
custom_packages | array | Repozytoria źródłowe do spakowania przez obsługiwany path buildu |
package_overrides | array | Jawne operacje add, remove lub replace |
extra_repos | string array | Dodatkowe repozytoria; zaufanie i obsługa kluczy nadal wymagają przeglądu |
services | array | Nazwane włączenie i konfiguracja usług |
users | array | Konta i grupy lokalne w obrazie |
security | object | Zadeklarowane wybory hardeningu, szyfrowania, audytu, SELinux i fail2ban |
networking | object | Intencja interfejsu i sieci |
desktop_settings | object | Wygląd i zachowanie pulpitu |
branding | object | Tożsamość dystrybucji i zasoby |
runtime | object | Tożsamość init/usługi/menedżera pakietów |
boot | object | Argumenty jądra i wybory GRUB |
installer | object | Konfiguracja install-to-disk |
persistence | object | Trwałość live i polityka stref |
integrity | object | Żądane ustawienia dm-verity, Secure Boot i IMA/EVM |
file_attachments | array | Wcześniej przesłane pliki identyfikowane przez file_id |
startup_scripts | array | Ograniczone skrypty systemd one-shot |
time_zone | string lub null | Ustawienie strefy czasowej obrazu |
Obecność pola integrity lub security to intencja konfiguracji. Nie jest dowodem, że mechanizm został wyprodukowany, egzekwowany w runtime ani kwalifikowany do reżimu zgodności. Wymagaj pasujących dowodów buildu i testów.
Użytkownicy
{
"os": {
"users": [
{
"username": "deploy",
"full_name": "Deployment Operator",
"groups": ["sudo"],
"shell": "/bin/bash"
}
]
}
}Nazwy użytkowników i grup są ograniczone do bezpiecznych znaków kont Linux i długości.
Pozostawienie password nieset tworzy konto zablokowane hasłem dla workflow tylko-klucz
lub poświadczeń w czasie wdrożenia. Unikaj poświadczeń w plaintext w zapisanych recepturach.
Usługi
{
"os": {
"services": [
{
"name": "ssh",
"enabled": true,
"config": {
"port": 22,
"disable_password_auth": true
}
}
]
}
}config zależy od usługi. Składniowo poprawny klucz może być ignorowany przez generator,
który go nie implementuje. Sprawdź znormalizowaną recepturę, wygenerowaną konfigurację
i zachowanie gościa.
Bezpieczeństwo i installer
{
"os": {
"security": {
"hardening_level": "standard",
"disk_encryption": false,
"audit_logging": true,
"selinux": false,
"fail2ban": true
},
"installer": {
"enabled": false,
"type": "calamares",
"desktop_launcher": true,
"bootloader": "grub",
"delivery": [],
"user_setup": "build_time"
}
}
}Typy installera zależą od celu (calamares, anaconda lub elster-mobile). Włączenie
installera musi być poparte testem instalacji na dysku jednorazowym; ikona na live pulpicie
nie dowodzi, że instalacja działa.
Skrypty startowe
{
"os": {
"startup_scripts": [
{
"name": "write-build-marker",
"description": "Create a local marker after networking is available.",
"command": "install -m 0644 /dev/null /var/lib/example-ready",
"packages": [],
"run_as": "root",
"after": "network.target"
}
]
}
}Akceptowanych jest co najwyżej 32 skryptów startowych. Polecenia muszą być niepuste i nie
mogą zawierać bajtów NUL. Traktuj je jako kod shell z uprawnieniami root, chyba że run_as
mówi inaczej; sprawdź idempotentność, quoting, awarie sieci i ujawnienie sekretów.
Scenariusze i asercje
{
"scenarios": [
{
"id": "primary-smoke",
"name": "Primary image smoke test",
"enabled": true,
"tests": ["boot", "login", "packages"],
"custom_tests": [
{
"description": "Confirm SSH is enabled on the configured port.",
"assertions": [
{
"type": "service_enabled",
"description": "The SSH service starts at boot.",
"params": {"service": "ssh"}
},
{
"type": "port_listening",
"description": "The guest listens on TCP port 22.",
"params": {"port": 22}
}
]
}
]
}
]
}Scenariusz może też definiować topology z VM i sieciami, testy w formacie benchmark
oraz ustawienia CIS. Pominięta topologia domyślnie używa zwykłej ścieżki single-VM.
Asercje wymagają czytelnego opisu i params specyficznych dla typu. Nieznane typy asercji
mogą przejść parsowanie schematu; potwierdź wsparcie runnera, zanim potraktujesz je jako dowód.
Pełny minimalny przykład
{
"name": "debian-web-check",
"display_name": "Debian Web Check",
"description": "Debian image with SSH, curl, and explicit smoke tests.",
"base_image": "debian-trixie",
"use_case": "Server evaluation",
"hardware": {
"platform": "pc",
"architecture": "x86_64",
"min_cpu_cores": 2,
"min_memory_gb": 4,
"min_storage_gb": 16,
"nic_count": 1
},
"os": {
"features": ["ssh"],
"packages": ["curl"],
"users": [
{
"username": "deploy",
"groups": ["sudo"],
"shell": "/bin/bash"
}
],
"services": [
{
"name": "ssh",
"enabled": true,
"config": {"port": 22, "disable_password_auth": true}
}
],
"security": {
"hardening_level": "standard",
"audit_logging": true
},
"installer": {"enabled": false}
},
"scenarios": [
{
"id": "primary-smoke",
"name": "Primary image smoke test",
"enabled": true,
"tests": ["boot", "login", "packages"]
}
],
"publish_to": ["local"]
}Workflow walidacji
- Waliduj JSON przez aktualny edytor receptur, API lub narzędzie MCP
validate_recipe. - Porównaj zwróconą znormalizowaną recepturę z pierwotnym żądaniem.
- Traktuj odrzucone nieznane pola jako wadę receptury, a nie udaną konfigurację.
- Buduj dopiero po odwzorowaniu jawnych wymagań.
- Sprawdź wygenerowane dowody i uruchom asercje względem wynikowego gościa.
Zobacz Twój pierwszy build, aby odzyskać po błędach i problemach z pobieraniem.