mirror of
https://github.com/jhd3197/ServerKit.git
synced 2026-10-29 08:07:37 +09:00
The curated serverkit-recipes index is consumed like the themes registry (cached remote index, bundled fallback, SERVERKIT_RECIPES_REGISTRY_URL override). GET /recipes/registry[/<slug>] browses it; POST /recipes/runs now accepts a registry_slug plus server_id — targeting a server finds or creates the per-workspace Recipes project — and validated non-secret params that pre-supply handoff inputs so only true secrets pause the run. Frontend: Recipes catalog page (cards, category chips, install drawer with running-server picker, preflight table, up-front inputs and an asked-during-the-run secrets preview) under new Services and Marketplace tabs; runs land in the deployment console. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
133 lines
5.4 KiB
JSON
133 lines
5.4 KiB
JSON
{
|
|
"$schema": "./schema/index.schema.json",
|
|
"name": "serverkit-recipes",
|
|
"recipes": [
|
|
{
|
|
"slug": "minecraft-java",
|
|
"name": "Minecraft server",
|
|
"version": "1.4.0",
|
|
"category": "Game servers",
|
|
"icon": "box",
|
|
"description": "Paper server with RCON, auto-restart and a nightly world backup.",
|
|
"author": "serverkit",
|
|
"minutes": 4,
|
|
"featured": true,
|
|
"requirements": { "cpuCores": 4, "memoryMB": 8192, "diskGB": 40, "igpu": "none", "gpu": "none" },
|
|
"capabilities": [
|
|
"probe:runtime.java", "probe:hardware.capacity", "apply:files.fetch",
|
|
"handoff:text", "handoff:secret", "apply:systemd.unit",
|
|
"verify:net.listen", "verify:backup.schedule"
|
|
],
|
|
"inputs": [
|
|
{ "key": "world_name", "label": "World name", "help": "Becomes the level-name in server.properties.", "placeholder": "survival-01" },
|
|
{ "key": "max_players", "label": "Max players", "help": "Slot count advertised to clients.", "placeholder": "20" },
|
|
{ "key": "motd", "label": "MOTD", "help": "Message of the day shown in the server list.", "placeholder": "Welcome to the server" }
|
|
],
|
|
"handoffs": [
|
|
{ "key": "rcon_password", "label": "RCON password", "secret": true }
|
|
],
|
|
"steps": 8,
|
|
"manifest": "recipes/minecraft-java/recipe.yaml"
|
|
},
|
|
{
|
|
"slug": "plex",
|
|
"name": "Plex Media Server",
|
|
"version": "2.1.0",
|
|
"category": "Media",
|
|
"icon": "play",
|
|
"description": "Plex with hardware transcoding, claimed to your account and pointed at your library.",
|
|
"author": "serverkit",
|
|
"minutes": 6,
|
|
"featured": true,
|
|
"requirements": { "cpuCores": 4, "memoryMB": 8192, "diskGB": 200, "igpu": "required", "gpu": "none" },
|
|
"capabilities": [
|
|
"probe:device.dri", "handoff:text", "derive:config.libraries",
|
|
"apply:container.pull", "handoff:secret", "apply:container.run",
|
|
"verify:media.transcode"
|
|
],
|
|
"inputs": [
|
|
{ "key": "server_name", "label": "Server name", "help": "How this server appears in your Plex apps.", "placeholder": "acme-plex" },
|
|
{ "key": "media_path", "label": "Media path", "help": "Absolute path to your library on the server.", "placeholder": "/srv/media" }
|
|
],
|
|
"handoffs": [
|
|
{ "key": "claim_token", "label": "Plex claim token", "secret": true, "url": "https://plex.tv/claim" }
|
|
],
|
|
"steps": 6,
|
|
"manifest": "recipes/plex/recipe.yaml"
|
|
},
|
|
{
|
|
"slug": "jellyfin",
|
|
"name": "Jellyfin",
|
|
"version": "1.6.0",
|
|
"category": "Media",
|
|
"icon": "play",
|
|
"description": "Open-source media server, no account required. Hardware transcode when a device is present.",
|
|
"author": "serverkit",
|
|
"minutes": 4,
|
|
"featured": false,
|
|
"requirements": { "cpuCores": 2, "memoryMB": 4096, "diskGB": 100, "igpu": "preferred", "gpu": "none" },
|
|
"capabilities": [
|
|
"probe:device.dri", "handoff:text", "derive:config.jellyfin",
|
|
"apply:container.run", "handoff:secret", "verify:http.probe"
|
|
],
|
|
"inputs": [
|
|
{ "key": "server_name", "label": "Server name", "help": "How this server appears in Jellyfin clients.", "placeholder": "jellyfin" }
|
|
],
|
|
"handoffs": [
|
|
{ "key": "admin_password", "label": "Admin password", "secret": true }
|
|
],
|
|
"steps": 5,
|
|
"manifest": "recipes/jellyfin/recipe.yaml"
|
|
},
|
|
{
|
|
"slug": "vaultwarden",
|
|
"name": "Vaultwarden",
|
|
"version": "1.2.0",
|
|
"category": "Security",
|
|
"icon": "lock",
|
|
"description": "Bitwarden-compatible vault behind Caddy, with TLS and an admin token.",
|
|
"author": "serverkit",
|
|
"minutes": 3,
|
|
"featured": false,
|
|
"requirements": { "cpuCores": 1, "memoryMB": 1024, "diskGB": 10, "igpu": "none", "gpu": "none" },
|
|
"capabilities": [
|
|
"probe:proxy.caddy", "handoff:text", "derive:config.env",
|
|
"apply:container.run", "apply:tls.cert", "handoff:secret",
|
|
"verify:http.probe"
|
|
],
|
|
"inputs": [
|
|
{ "key": "domain", "label": "Domain", "help": "The hostname the vault answers on.", "placeholder": "vault.acme.dev" },
|
|
{ "key": "admin_email", "label": "Admin email", "help": "Used for the TLS certificate contact.", "placeholder": "ops@acme.dev" }
|
|
],
|
|
"handoffs": [
|
|
{ "key": "admin_token", "label": "Admin token", "secret": true }
|
|
],
|
|
"steps": 7,
|
|
"manifest": "recipes/vaultwarden/recipe.yaml"
|
|
},
|
|
{
|
|
"slug": "ollama",
|
|
"name": "Ollama",
|
|
"version": "0.9.0",
|
|
"category": "AI",
|
|
"icon": "zap",
|
|
"description": "Local model runner with an OpenAI-compatible endpoint. Unattended — no secrets needed.",
|
|
"author": "serverkit",
|
|
"minutes": 7,
|
|
"featured": true,
|
|
"requirements": { "cpuCores": 4, "memoryMB": 16384, "diskGB": 100, "igpu": "none", "gpu": "preferred" },
|
|
"capabilities": [
|
|
"probe:device.gpu", "handoff:text", "derive:config.models",
|
|
"apply:package.install", "apply:model.pull", "verify:http.probe"
|
|
],
|
|
"inputs": [
|
|
{ "key": "models", "label": "Models to pull", "help": "Comma-separated model tags.", "placeholder": "llama3.1:8b, qwen2.5:7b" },
|
|
{ "key": "listen_port", "label": "Port", "help": "HTTP port for the API endpoint.", "placeholder": "11434" }
|
|
],
|
|
"handoffs": [],
|
|
"steps": 6,
|
|
"manifest": "recipes/ollama/recipe.yaml"
|
|
}
|
|
]
|
|
}
|