diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 41b6bee..cd81d93 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -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' => []], + ); + } } } diff --git a/lang/de/provisioning.php b/lang/de/provisioning.php new file mode 100644 index 0000000..48d6790 --- /dev/null +++ b/lang/de/provisioning.php @@ -0,0 +1,30 @@ + [ + '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', + ], +]; diff --git a/lang/en/provisioning.php b/lang/en/provisioning.php new file mode 100644 index 0000000..b5cf271 --- /dev/null +++ b/lang/en/provisioning.php @@ -0,0 +1,30 @@ + [ + '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', + ], +];