chore(engine-b): provisioning step/mail i18n (DE+EN) + demo seed data

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat/portal-design
nexxo 2026-07-25 11:59:06 +02:00
parent a9fbb395f9
commit 3e19778046
3 changed files with 105 additions and 0 deletions

View File

@ -2,7 +2,11 @@
namespace Database\Seeders;
use App\Models\Customer;
use App\Models\Host;
use App\Models\Instance;
use App\Models\Order;
use App\Models\ProvisioningRun;
use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
@ -55,8 +59,49 @@ class DatabaseSeeder extends Seeder
'cpu_weight' => 32,
'reserve_pct' => 15,
'pve_version' => 'pve-manager/8.2.2',
'node' => $host['name'],
'last_seen_at' => now(),
]);
}
// A live customer (matched to the portal login) with an active instance.
$fsn1 = Host::query()->where('name', 'pve-fsn-1')->first();
$berger = Customer::updateOrCreate(
['email' => 'kunde@clupilot.local'],
['name' => 'Kanzlei Berger', 'locale' => 'de'],
);
$bergerOrder = Order::updateOrCreate(
['stripe_event_id' => 'seed_berger'],
['customer_id' => $berger->id, 'plan' => 'team', 'amount_cents' => 17900, 'currency' => 'EUR', 'datacenter' => 'fsn', 'status' => 'active'],
);
Instance::updateOrCreate(
['subdomain' => 'kanzlei-berger'],
[
'customer_id' => $berger->id, 'order_id' => $bergerOrder->id, 'host_id' => $fsn1?->id,
'vmid' => 101, 'plan' => 'team', 'quota_gb' => 500, 'disk_gb' => 540, 'ram_mb' => 8192,
'cores' => 4, 'status' => 'active', 'cert_ok' => true, 'route_written' => true,
],
);
// A few in-flight runs so the operator provisioning console has content.
$demoRuns = [
['name' => 'Ordination Dr. Fux', 'plan' => 'start', 'step' => 7, 'status' => 'running'],
['name' => 'Weingut Prantl', 'plan' => 'business', 'step' => 13, 'status' => 'waiting'],
['name' => 'Praxis Sommer', 'plan' => 'team', 'step' => 2, 'status' => 'failed'],
];
foreach ($demoRuns as $i => $demo) {
$customer = Customer::updateOrCreate(
['email' => "demo{$i}@clupilot.local"],
['name' => $demo['name'], 'locale' => 'de'],
);
$order = Order::updateOrCreate(
['stripe_event_id' => "seed_demo_{$i}"],
['customer_id' => $customer->id, 'plan' => $demo['plan'], 'amount_cents' => 1900, 'currency' => 'EUR', 'datacenter' => 'fsn', 'status' => 'provisioning'],
);
ProvisioningRun::updateOrCreate(
['subject_type' => Order::class, 'subject_id' => $order->id, 'pipeline' => 'customer'],
['current_step' => $demo['step'], 'status' => $demo['status'], 'attempt' => $demo['status'] === 'failed' ? 3 : 1, 'context' => []],
);
}
}
}

30
lang/de/provisioning.php Normal file
View File

@ -0,0 +1,30 @@
<?php
return [
'step' => [
'validate_order' => 'Bestellung prüfen',
'reserve_resources' => 'Ressourcen reservieren',
'clone_vm' => 'VM aus Vorlage klonen',
'configure_cloud_init' => 'Cloud-Init konfigurieren',
'start_vm' => 'VM starten',
'wait_for_guest_agent' => 'Auf Gast-Agent warten',
'configure_network' => 'Netzwerk konfigurieren',
'deploy_application_stack' => 'Anwendung ausrollen',
'configure_nextcloud' => 'Nextcloud einrichten',
'create_customer_admin' => 'Admin-Konto anlegen',
'configure_dns_and_tls' => 'DNS & TLS einrichten',
'register_backup' => 'Backup einrichten',
'register_monitoring' => 'Monitoring einrichten',
'run_acceptance_checks' => 'Abnahmeprüfung',
'complete_provisioning' => 'Bereitstellung abschließen',
],
'mail' => [
'ready_subject' => 'Ihre CluPilot Cloud ist bereit',
'ready_greeting' => 'Willkommen bei CluPilot!',
'ready_line' => 'Ihre Cloud ist eingerichtet und einsatzbereit. Hier sind Ihre Zugangsdaten:',
'ready_user' => 'Benutzername: :user',
'ready_password' => 'Initial-Passwort: :password (bitte nach dem ersten Login ändern)',
'ready_action' => 'Zur Cloud',
],
];

30
lang/en/provisioning.php Normal file
View File

@ -0,0 +1,30 @@
<?php
return [
'step' => [
'validate_order' => 'Validate order',
'reserve_resources' => 'Reserve resources',
'clone_vm' => 'Clone VM from template',
'configure_cloud_init' => 'Configure cloud-init',
'start_vm' => 'Start VM',
'wait_for_guest_agent' => 'Wait for guest agent',
'configure_network' => 'Configure network',
'deploy_application_stack' => 'Deploy application stack',
'configure_nextcloud' => 'Set up Nextcloud',
'create_customer_admin' => 'Create admin account',
'configure_dns_and_tls' => 'Configure DNS & TLS',
'register_backup' => 'Register backup',
'register_monitoring' => 'Register monitoring',
'run_acceptance_checks' => 'Acceptance checks',
'complete_provisioning' => 'Complete provisioning',
],
'mail' => [
'ready_subject' => 'Your CluPilot cloud is ready',
'ready_greeting' => 'Welcome to CluPilot!',
'ready_line' => 'Your cloud is set up and ready to use. Here are your credentials:',
'ready_user' => 'Username: :user',
'ready_password' => 'Initial password: :password (please change it after your first login)',
'ready_action' => 'Open your cloud',
],
];