feat(v5): add WireGuard and coold/corrosion config to clusters/servers

Add WireGuard networking fields (interface, management pool, listen port),
container network pool, coold/corrosion versioning, and builder CPU quota
to clusters and servers via new migrations and model fillables.

Expose full cluster and server CRUD on the Clusters page with private key
selection, pending state tracking, and new form primitives (Field, Input,
Textarea). Add server status check fields and a lima test VM config for
development.
This commit is contained in:
Andras Bacsai committed 2026-06-19 07:23:45 +02:00
1 parent 5d57b131ff
commit 3ae87334bd
30 files changed
+3876 -103

No files matched your search

@@ -0,0 +1,90 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('v5_clusters', function (Blueprint $table) {
$table->string('wireguard_interface')->default('wg0')->after('description');
$table->string('wireguard_management_pool')->default('100.64.0.0/16')->after('wireguard_interface');
$table->unsignedInteger('wireguard_listen_port')->default(51820)->after('wireguard_management_pool');
$table->string('container_network_pool')->default('10.210.0.0/16')->after('wireguard_listen_port');
$table->unsignedTinyInteger('container_network_prefix')->default(24)->after('container_network_pool');
$table->json('namespaces')->nullable()->after('container_network_prefix');
$table->boolean('default_deny_containers')->default(true)->after('namespaces');
$table->string('coold_version')->default('nightly')->after('default_deny_containers');
$table->string('corrosion_version')->default('v1.0.0')->after('coold_version');
$table->unsignedInteger('corrosion_gossip_port')->default(8787)->after('corrosion_version');
$table->unsignedInteger('corrosion_api_port')->default(8080)->after('corrosion_gossip_port');
$table->boolean('builder_enabled')->default(true)->after('corrosion_api_port');
$table->unsignedInteger('builder_capacity')->default(2)->after('builder_enabled');
$table->string('builder_cpu_quota')->default('200%')->after('builder_capacity');
$table->string('builder_memory_max')->default('2G')->after('builder_cpu_quota');
$table->unsignedInteger('builder_timeout_secs')->default(1800)->after('builder_memory_max');
$table->string('last_cli_action')->nullable()->after('builder_timeout_secs');
$table->string('last_cli_status')->nullable()->after('last_cli_action');
$table->text('last_cli_summary')->nullable()->after('last_cli_status');
$table->timestamp('last_cli_ran_at')->nullable()->after('last_cli_summary');
});
Schema::table('v5_servers', function (Blueprint $table) {
$table->string('builder_cpu_quota')->default('200%')->after('builder_capacity');
$table->string('node_address')->nullable()->after('builder_cpu_quota');
$table->unsignedInteger('wireguard_listen_port_override')->nullable()->after('node_address');
$table->string('wireguard_endpoint_override')->nullable()->after('wireguard_listen_port_override');
$table->string('wireguard_management_ip')->nullable()->after('wireguard_endpoint_override');
$table->string('wireguard_public_key')->nullable()->after('wireguard_management_ip');
$table->json('container_subnets')->nullable()->after('wireguard_public_key');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('v5_servers', function (Blueprint $table) {
$table->dropColumn([
'builder_cpu_quota',
'node_address',
'wireguard_listen_port_override',
'wireguard_endpoint_override',
'wireguard_management_ip',
'wireguard_public_key',
'container_subnets',
]);
});
Schema::table('v5_clusters', function (Blueprint $table) {
$table->dropColumn([
'wireguard_interface',
'wireguard_management_pool',
'wireguard_listen_port',
'container_network_pool',
'container_network_prefix',
'namespaces',
'default_deny_containers',
'coold_version',
'corrosion_version',
'corrosion_gossip_port',
'corrosion_api_port',
'builder_enabled',
'builder_capacity',
'builder_cpu_quota',
'builder_memory_max',
'builder_timeout_secs',
'last_cli_action',
'last_cli_status',
'last_cli_summary',
'last_cli_ran_at',
]);
});
}
};
@@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
if (Schema::hasColumn('v5_servers', 'builder_cpu_quota')) {
return;
}
Schema::table('v5_servers', function (Blueprint $table) {
$table->string('builder_cpu_quota')->default('200%')->after('builder_capacity');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
if (! Schema::hasColumn('v5_servers', 'builder_cpu_quota')) {
return;
}
Schema::table('v5_servers', function (Blueprint $table) {
$table->dropColumn('builder_cpu_quota');
});
}
};
@@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('v5_servers', function (Blueprint $table) {
$table->string('last_status_check')->nullable()->after('last_bootstrapped_at');
$table->text('last_status_output')->nullable()->after('last_status_check');
$table->timestamp('last_status_checked_at')->nullable()->after('last_status_output');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('v5_servers', function (Blueprint $table) {
$table->dropColumn([
'last_status_check',
'last_status_output',
'last_status_checked_at',
]);
});
}
};
+33
View File
@@ -1327,6 +1327,26 @@ CREATE TABLE IF NOT EXISTS "v5_clusters" (
"created_by_user_id" INTEGER NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT,
"wireguard_interface" TEXT DEFAULT 'wg0' NOT NULL,
"wireguard_management_pool" TEXT DEFAULT '100.64.0.0/16' NOT NULL,
"wireguard_listen_port" INTEGER DEFAULT '51820' NOT NULL,
"container_network_pool" TEXT DEFAULT '10.210.0.0/16' NOT NULL,
"container_network_prefix" INTEGER DEFAULT '24' NOT NULL,
"namespaces" JSON,
"default_deny_containers" INTEGER DEFAULT true NOT NULL,
"coold_version" TEXT DEFAULT 'nightly' NOT NULL,
"corrosion_version" TEXT DEFAULT 'v1.0.0' NOT NULL,
"corrosion_gossip_port" INTEGER DEFAULT '8787' NOT NULL,
"corrosion_api_port" INTEGER DEFAULT '8080' NOT NULL,
"builder_enabled" INTEGER DEFAULT true NOT NULL,
"builder_capacity" INTEGER DEFAULT '2' NOT NULL,
"builder_cpu_quota" TEXT DEFAULT '200%' NOT NULL,
"builder_memory_max" TEXT DEFAULT '2G' NOT NULL,
"builder_timeout_secs" INTEGER NOT NULL DEFAULT '1800',
"last_cli_action" TEXT,
"last_cli_status" TEXT,
"last_cli_summary" TEXT,
"last_cli_ran_at" TEXT,
"created_at" TEXT,
"updated_at" TEXT
);
@@ -1345,7 +1365,17 @@ CREATE TABLE IF NOT EXISTS "v5_servers" (
"capabilities" TEXT,
"builder_enabled" INTEGER DEFAULT false NOT NULL,
"builder_capacity" INTEGER DEFAULT '0' NOT NULL,
"builder_cpu_quota" TEXT DEFAULT '200%' NOT NULL,
"node_address" TEXT,
"wireguard_listen_port_override" INTEGER,
"wireguard_endpoint_override" TEXT,
"wireguard_management_ip" TEXT,
"wireguard_public_key" TEXT,
"container_subnets" JSON,
"last_bootstrapped_at" TEXT,
"last_status_check" TEXT,
"last_status_output" TEXT,
"last_status_checked_at" TEXT,
"created_at" TEXT,
"updated_at" TEXT
);
@@ -1783,3 +1813,6 @@ INSERT INTO "migrations" ("id", "migration", "batch") VALUES (313, '2025_12_17_0
INSERT INTO "migrations" ("id", "migration", "batch") VALUES (314, '2025_12_17_000002_add_restart_tracking_to_standalone_databases', 314);
INSERT INTO "migrations" ("id", "migration", "batch") VALUES (316, '2026_06_16_130650_v5_create_servers_table', 316);
INSERT INTO "migrations" ("id", "migration", "batch") VALUES (317, '2026_06_16_130649_v5_create_clusters_table', 317);
INSERT INTO "migrations" ("id", "migration", "batch") VALUES (318, '2026_06_16_204644_v5_add_wireguard_cli_configuration_to_clusters_and_servers', 318);
INSERT INTO "migrations" ("id", "migration", "batch") VALUES (319, '2026_06_17_165112_v5_add_builder_cpu_quota_to_servers_table', 319);
INSERT INTO "migrations" ("id", "migration", "batch") VALUES (320, '2026_06_17_172845_add_status_check_fields_to_v5_servers_table', 320);
+11 -5
View File
@@ -59,26 +59,32 @@ class V5DevLimaSeeder extends Seeder
'capabilities' => $capabilities,
'builder_enabled' => $builderEnabled,
'builder_capacity' => $builderCapacity,
'wireguard_listen_port_override' => $server['wireguard_listen_port_override'],
'wireguard_endpoint_override' => $server['wireguard_endpoint_override'],
'last_bootstrapped_at' => now(),
]);
}
}
/**
* @return array<int, array{name: string, host: string, ssh_port: int}>
* @return array<int, array{name: string, host: string, ssh_port: int, wireguard_listen_port_override: int, wireguard_endpoint_override: string}>
*/
private function servers(): array
{
return [
[
'name' => 'coold-dev',
'host' => 'lima-coold-dev',
'ssh_port' => 22,
'host' => 'host.docker.internal',
'ssh_port' => 60001,
'wireguard_listen_port_override' => 51821,
'wireguard_endpoint_override' => 'host.lima.internal:51821',
],
[
'name' => 'coold-dev-2',
'host' => 'lima-coold-dev-2',
'ssh_port' => 22,
'host' => 'host.docker.internal',
'ssh_port' => 60002,
'wireguard_listen_port_override' => 51822,
'wireguard_endpoint_override' => 'host.lima.internal:51822',
],
];
}