feat(database): default new Redis databases to the Valkey image

Change the standalone_redis image column default to
valkey/valkey:9-alpine. Existing databases keep their current image.
Update the API docs, OpenAPI specs and image helper text to name Valkey
as the default and redis:8 as the Redis example.

Also restyle the status badges and database image cards on the new
resource page.
This commit is contained in:
Andras Bacsai
2026-11-06 12:44:00 +01:00
parent 145569bea6
commit b7dc2e435b
6 changed files with 46 additions and 21 deletions
@@ -1731,7 +1731,7 @@ class DatabasesController extends Controller
#[OA\Post(
summary: 'Create (Redis / Valkey)',
description: 'Create a new Redis or Valkey database. Set image to a Valkey image (for example valkey/valkey:9-alpine) for Valkey.',
description: 'Create a new Redis or Valkey database. Valkey (valkey/valkey:9-alpine) is the default. Set image to a Redis image (for example redis:8) for Redis.',
path: '/databases/redis',
operationId: 'create-database-redis',
security: [
@@ -1757,7 +1757,7 @@ class DatabasesController extends Controller
'redis_conf' => ['type' => 'string', 'description' => 'Redis conf'],
'name' => ['type' => 'string', 'description' => 'Name of the database'],
'description' => ['type' => 'string', 'description' => 'Description of the database'],
'image' => ['type' => 'string', 'description' => 'Docker image of the database. Default: redis:7.2. For Valkey, use a Valkey image, for example valkey/valkey:9-alpine.'],
'image' => ['type' => 'string', 'description' => 'Docker image of the database. Default: valkey/valkey:9-alpine. For Redis, use a Redis image, for example redis:8.'],
'is_public' => ['type' => 'boolean', 'description' => 'Is the database public?'],
'public_port' => ['type' => 'integer', 'description' => 'Public port of the database'],
'public_port_timeout' => ['type' => 'integer', 'description' => 'Public port timeout in seconds (default: 3600)'],
@@ -0,0 +1,25 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Existing databases keep their image. Only new databases use Valkey.
*/
public function up(): void
{
Schema::table('standalone_redis', function (Blueprint $table) {
$table->string('image')->default('valkey/valkey:9-alpine')->change();
});
}
public function down(): void
{
Schema::table('standalone_redis', function (Blueprint $table) {
$table->string('image')->default('redis:8')->change();
});
}
};
+2 -2
View File
@@ -9008,7 +9008,7 @@
"Databases"
],
"summary": "Create (Redis \/ Valkey)",
"description": "Create a new Redis or Valkey database. Set image to a Valkey image (for example valkey\/valkey:9-alpine) for Valkey.",
"description": "Create a new Redis or Valkey database. Valkey (valkey\/valkey:9-alpine) is the default. Set image to a Redis image (for example redis:8) for Redis.",
"operationId": "create-database-redis",
"requestBody": {
"description": "Database data",
@@ -9059,7 +9059,7 @@
},
"image": {
"type": "string",
"description": "Docker image of the database. Default: redis:7.2. For Valkey, use a Valkey image, for example valkey\/valkey:9-alpine."
"description": "Docker image of the database. Default: valkey\/valkey:9-alpine. For Redis, use a Redis image, for example redis:8."
},
"is_public": {
"type": "boolean",
+2 -2
View File
@@ -5905,7 +5905,7 @@ paths:
tags:
- Databases
summary: 'Create (Redis / Valkey)'
description: 'Create a new Redis or Valkey database. Set image to a Valkey image (for example valkey/valkey:9-alpine) for Valkey.'
description: 'Create a new Redis or Valkey database. Valkey (valkey/valkey:9-alpine) is the default. Set image to a Redis image (for example redis:8) for Redis.'
operationId: create-database-redis
requestBody:
description: 'Database data'
@@ -5946,7 +5946,7 @@ paths:
description: 'Description of the database'
image:
type: string
description: 'Docker image of the database. Default: redis:7.2. For Valkey, use a Valkey image, for example valkey/valkey:9-alpine.'
description: 'Docker image of the database. Default: valkey/valkey:9-alpine. For Redis, use a Redis image, for example redis:8.'
is_public:
type: boolean
description: 'Is the database public?'
@@ -14,7 +14,7 @@
<x-forms.input label="Description" id="description" canGate="update" :canResource="$database" />
<div class="lg:col-span-2">
<x-forms.input label="Image" id="image" required canGate="update" :canResource="$database"
helper="Use a published Redis or Valkey image from Docker Hub, for example redis:7.2 or valkey/valkey:9-alpine." />
helper="Use a published Redis or Valkey image from Docker Hub, for example valkey/valkey:9-alpine or redis:8." />
</div>
</div>
<x-application.settings-subsection id="credentials-section" title="Credentials" helper="Keep these values aligned with the credentials configured inside Redis / Valkey.">
@@ -717,7 +717,7 @@
{{ $server->description ?: $server->ip }}
</span>
</span>
<x-status-badge status="running" text="Ready" />
<x-status-badge type="success" status="Running" />
</button>
@empty
@if ($buildServers?->isEmpty() && ! $onlyBuildServerAvailable)
@@ -744,7 +744,7 @@
<span class="block text-[11px] text-neutral-500 dark:text-fg-faint">Build-only servers
cannot host resources.</span>
</span>
<x-status-badge status="exited" text="Build only" />
<x-status-badge status="Build only" />
<a href="{{ route('server.show', ['server_uuid' => $buildServer->uuid]) }}"
{{ wireNavigate() }} class="button">Settings</a>
</div>
@@ -788,7 +788,7 @@
<span class="block truncate text-[11px] text-neutral-500 dark:text-fg-faint">Network:
{{ $standaloneDocker->network }}</span>
</span>
<x-status-badge status="running" text="Standalone Docker" />
<x-status-badge type="success" status="Standalone Docker" />
</button>
@endforeach
@endif
@@ -803,7 +803,7 @@
needs bundled extensions.</p>
</div>
<div class="grid grid-cols-1 gap-3 lg:grid-cols-2">
<div class="group relative flex min-h-24 items-center gap-3 rounded-[10px] border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 hover:bg-neutral-50 dark:border-white/[0.07] dark:bg-surface dark:hover:border-white/[0.12] dark:hover:bg-white/[0.035]"
<div class="group relative flex min-h-24 items-center gap-3 rounded-xl border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 dark:border-white/[0.08] dark:bg-white/[0.05] dark:hover:border-white/[0.14]"
:class="{ 'cursor-pointer': !selecting, 'cursor-not-allowed opacity-50': selecting }"
x-on:click="!selecting && (selecting = true, $wire.setDatabaseImage('postgres:18-alpine'))"
:disabled="selecting">
@@ -826,7 +826,7 @@
</svg>
</a>
</div>
<div class="group relative flex min-h-24 items-center gap-3 rounded-[10px] border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 hover:bg-neutral-50 dark:border-white/[0.07] dark:bg-surface dark:hover:border-white/[0.12] dark:hover:bg-white/[0.035]"
<div class="group relative flex min-h-24 items-center gap-3 rounded-xl border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 dark:border-white/[0.08] dark:bg-white/[0.05] dark:hover:border-white/[0.14]"
:class="{ 'cursor-pointer': !selecting, 'cursor-not-allowed opacity-50': selecting }"
x-on:click="!selecting && (selecting = true, $wire.setDatabaseImage('postgres:17-alpine'))"
:disabled="selecting">
@@ -847,7 +847,7 @@
</svg>
</a>
</div>
<div class="group relative flex min-h-24 items-center gap-3 rounded-[10px] border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 hover:bg-neutral-50 dark:border-white/[0.07] dark:bg-surface dark:hover:border-white/[0.12] dark:hover:bg-white/[0.035]"
<div class="group relative flex min-h-24 items-center gap-3 rounded-xl border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 dark:border-white/[0.08] dark:bg-white/[0.05] dark:hover:border-white/[0.14]"
:class="{ 'cursor-pointer': !selecting, 'cursor-not-allowed opacity-50': selecting }"
x-on:click="!selecting && (selecting = true, $wire.setDatabaseImage('postgres:16-alpine'))"
:disabled="selecting">
@@ -868,7 +868,7 @@
</svg>
</a>
</div>
<div class="group relative flex min-h-24 items-center gap-3 rounded-[10px] border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 hover:bg-neutral-50 dark:border-white/[0.07] dark:bg-surface dark:hover:border-white/[0.12] dark:hover:bg-white/[0.035]"
<div class="group relative flex min-h-24 items-center gap-3 rounded-xl border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 dark:border-white/[0.08] dark:bg-white/[0.05] dark:hover:border-white/[0.14]"
:class="{ 'cursor-pointer': !selecting, 'cursor-not-allowed opacity-50': selecting }"
x-on:click="!selecting && (selecting = true, $wire.setDatabaseImage('supabase/postgres:17.11.0.018'))"
:disabled="selecting">
@@ -889,7 +889,7 @@
</svg>
</a>
</div>
<div class="group relative flex min-h-24 items-center gap-3 rounded-[10px] border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 hover:bg-neutral-50 dark:border-white/[0.07] dark:bg-surface dark:hover:border-white/[0.12] dark:hover:bg-white/[0.035]"
<div class="group relative flex min-h-24 items-center gap-3 rounded-xl border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 dark:border-white/[0.08] dark:bg-white/[0.05] dark:hover:border-white/[0.14]"
:class="{ 'cursor-pointer': !selecting, 'cursor-not-allowed opacity-50': selecting }"
x-on:click="!selecting && (selecting = true, $wire.setDatabaseImage('postgis/postgis:18-3.7-alpine'))"
:disabled="selecting">
@@ -912,7 +912,7 @@
</svg>
</a>
</div>
<div class="group relative flex min-h-24 items-center gap-3 rounded-[10px] border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 hover:bg-neutral-50 dark:border-white/[0.07] dark:bg-surface dark:hover:border-white/[0.12] dark:hover:bg-white/[0.035]"
<div class="group relative flex min-h-24 items-center gap-3 rounded-xl border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 dark:border-white/[0.08] dark:bg-white/[0.05] dark:hover:border-white/[0.14]"
:class="{ 'cursor-pointer': !selecting, 'cursor-not-allowed opacity-50': selecting }"
x-on:click="!selecting && (selecting = true, $wire.setDatabaseImage('pgvector/pgvector:pg18'))"
:disabled="selecting">
@@ -933,7 +933,7 @@
</svg>
</a>
</div>
<div class="group relative flex min-h-24 items-center gap-3 rounded-[10px] border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 hover:bg-neutral-50 dark:border-white/[0.07] dark:bg-surface dark:hover:border-white/[0.12] dark:hover:bg-white/[0.035]"
<div class="group relative flex min-h-24 items-center gap-3 rounded-xl border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 dark:border-white/[0.08] dark:bg-white/[0.05] dark:hover:border-white/[0.14]"
:class="{ 'cursor-pointer': !selecting, 'cursor-not-allowed opacity-50': selecting }"
x-on:click="!selecting && (selecting = true, $wire.setDatabaseImage('pgvector/pgvector:pg17'))"
:disabled="selecting">
@@ -965,7 +965,7 @@
and configuration.</p>
</div>
<div class="grid grid-cols-1 gap-3 lg:grid-cols-2">
<div class="group relative flex min-h-24 items-center gap-3 rounded-[10px] border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 hover:bg-neutral-50 dark:border-white/[0.07] dark:bg-surface dark:hover:border-white/[0.12] dark:hover:bg-white/[0.035]"
<div class="group relative flex min-h-24 items-center gap-3 rounded-xl border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 dark:border-white/[0.08] dark:bg-white/[0.05] dark:hover:border-white/[0.14]"
:class="{ 'cursor-pointer': !selecting, 'cursor-not-allowed opacity-50': selecting }"
x-on:click="!selecting && (selecting = true, $wire.setDatabaseImage('valkey/valkey:9-alpine'))"
:disabled="selecting">
@@ -987,12 +987,12 @@
</svg>
</a>
</div>
<div class="group relative flex min-h-24 items-center gap-3 rounded-[10px] border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 hover:bg-neutral-50 dark:border-white/[0.07] dark:bg-surface dark:hover:border-white/[0.12] dark:hover:bg-white/[0.035]"
<div class="group relative flex min-h-24 items-center gap-3 rounded-xl border border-neutral-200 bg-white p-4 transition-colors hover:border-neutral-300 dark:border-white/[0.08] dark:bg-white/[0.05] dark:hover:border-white/[0.14]"
:class="{ 'cursor-pointer': !selecting, 'cursor-not-allowed opacity-50': selecting }"
x-on:click="!selecting && (selecting = true, $wire.setDatabaseImage('redis:7.2'))"
x-on:click="!selecting && (selecting = true, $wire.setDatabaseImage('redis:8'))"
:disabled="selecting">
<div class="flex flex-col">
<div class="text-[13px] font-semibold text-black dark:text-fg">Redis 7.2</div>
<div class="text-[13px] font-semibold text-black dark:text-fg">Redis 8</div>
<div class="mt-1 pr-8 text-[11px] leading-4 text-neutral-500 dark:text-fg-faint">
The original in-memory key-value store.
</div>