154 lines
6.0 KiB
PHP
154 lines
6.0 KiB
PHP
<?php
|
|
|
|
namespace Database\Seeders;
|
|
|
|
use App\Models\Activity;
|
|
use App\Models\Backup;
|
|
use App\Models\Certificate;
|
|
use App\Models\Cluster;
|
|
use App\Models\Cron;
|
|
use App\Models\Invitation;
|
|
use App\Models\SecurityEvent;
|
|
use App\Models\Server;
|
|
use App\Models\Site;
|
|
use App\Models\TeamMember;
|
|
use App\Models\User;
|
|
use Illuminate\Database\Seeder;
|
|
|
|
class DatabaseSeeder extends Seeder
|
|
{
|
|
public function run(): void
|
|
{
|
|
/* ───── primary user (matches template) ───── */
|
|
$owner = User::updateOrCreate(
|
|
['email' => 'm.weber@acme-cluster.de'],
|
|
[
|
|
'name' => 'Marie Weber',
|
|
'password' => bcrypt('clupilot'),
|
|
'email_verified_at' => now(),
|
|
]
|
|
);
|
|
|
|
TeamMember::updateOrCreate(
|
|
['user_id' => $owner->id],
|
|
[
|
|
'role' => 'owner',
|
|
'scope' => 'All clusters',
|
|
'two_fa_enabled' => true,
|
|
'last_active_at' => now(),
|
|
]
|
|
);
|
|
|
|
/* ───── dev login (kept from previous seed) ───── */
|
|
User::updateOrCreate(
|
|
['email' => 'admin@clupilot.test'],
|
|
[
|
|
'name' => 'Admin',
|
|
'password' => bcrypt('clupilot'),
|
|
'email_verified_at' => now(),
|
|
]
|
|
);
|
|
|
|
/* ───── 1 cluster: Acme Cluster ───── */
|
|
$cluster = Cluster::firstOrCreate(
|
|
['slug' => 'acme-cluster'],
|
|
[
|
|
'name' => 'Acme Cluster',
|
|
'region' => 'eu-central-1',
|
|
'env' => 'prod',
|
|
'monthly_price_cents' => 24900,
|
|
'node_count' => 6,
|
|
'backups_enabled' => true,
|
|
]
|
|
);
|
|
|
|
/* ───── 6 servers ───── */
|
|
$servers = [
|
|
['name' => 'eu-prod-01', 'region' => 'eu-central-1', 'flag' => '🇩🇪', 'env' => 'prod', 'status' => 'ok', 'cpu' => 42, 'ram' => 58, 'disk' => 47],
|
|
['name' => 'eu-prod-02', 'region' => 'eu-central-1', 'flag' => '🇩🇪', 'env' => 'prod', 'status' => 'ok', 'cpu' => 36, 'ram' => 64, 'disk' => 51],
|
|
['name' => 'edge-ams', 'region' => 'eu-west-1', 'flag' => '🇳🇱', 'env' => 'edge', 'status' => 'ok', 'cpu' => 21, 'ram' => 45, 'disk' => 38],
|
|
['name' => 'us-east-01', 'region' => 'us-east-1', 'flag' => '🇺🇸', 'env' => 'prod', 'status' => 'warn', 'cpu' => 78, 'ram' => 71, 'disk' => 54],
|
|
['name' => 'staging', 'region' => 'eu-central-1', 'flag' => '🇩🇪', 'env' => 'staging', 'status' => 'ok', 'cpu' => 18, 'ram' => 32, 'disk' => 22],
|
|
['name' => 'ap-bom-01', 'region' => 'ap-south-1', 'flag' => '🇮🇳', 'env' => 'prod', 'status' => 'ok', 'cpu' => 28, 'ram' => 52, 'disk' => 43],
|
|
];
|
|
|
|
$serverModels = [];
|
|
foreach ($servers as $s) {
|
|
$serverModels[] = Server::firstOrCreate(
|
|
['name' => $s['name']],
|
|
[
|
|
'cluster_id' => $cluster->id,
|
|
'region' => $s['region'],
|
|
'country_flag' => $s['flag'],
|
|
'env' => $s['env'],
|
|
'cpu_cores' => 8,
|
|
'ram_gb' => 32,
|
|
'disk_gb' => 320,
|
|
'cpu_load_pct' => $s['cpu'],
|
|
'ram_used_pct' => $s['ram'],
|
|
'disk_used_pct' => $s['disk'],
|
|
'status' => $s['status'],
|
|
'ip' => fake()->ipv4(),
|
|
]
|
|
);
|
|
}
|
|
|
|
/* ───── 87 sites distributed across servers ───── */
|
|
$distribution = [23, 19, 14, 18, 6, 7]; // sums to 87
|
|
|
|
foreach ($serverModels as $i => $server) {
|
|
$target = $distribution[$i] ?? 5;
|
|
$existing = $server->sites()->count();
|
|
if ($existing < $target) {
|
|
Site::factory()->count($target - $existing)
|
|
->create(['server_id' => $server->id]);
|
|
}
|
|
}
|
|
|
|
$allSites = Site::query()->get();
|
|
|
|
/* ───── Certificates ───── */
|
|
foreach ($allSites as $site) {
|
|
if (! $site->certificate) {
|
|
Certificate::factory()->create([
|
|
'site_id' => $site->id,
|
|
'domain' => '*.' . $site->domain,
|
|
]);
|
|
}
|
|
}
|
|
|
|
/* ───── Backups (sample) ───── */
|
|
$backupSites = $allSites->random(min(28, $allSites->count()));
|
|
foreach ($backupSites as $site) {
|
|
Backup::factory()->count(rand(2, 6))->create(['site_id' => $site->id]);
|
|
}
|
|
|
|
/* ───── Crons (sample) ───── */
|
|
foreach ($allSites->random(min(20, $allSites->count())) as $site) {
|
|
Cron::factory()->count(rand(1, 4))->create(['site_id' => $site->id]);
|
|
}
|
|
|
|
/* ───── Security events: 128 in last 24h (matches template stat) ───── */
|
|
SecurityEvent::factory()->count(128)
|
|
->create(['site_id' => $allSites->random()->id]);
|
|
|
|
/* ───── Team members (4 + owner) ───── */
|
|
if (TeamMember::count() < 5) {
|
|
User::factory()->count(4)->create()->each(function (User $u) {
|
|
TeamMember::factory()->create(['user_id' => $u->id]);
|
|
});
|
|
}
|
|
|
|
/* ───── Pending invitations ───── */
|
|
if (Invitation::count() < 3) {
|
|
Invitation::factory()->count(3)->create([
|
|
'invited_by_user_id' => $owner->id,
|
|
'accepted_at' => null,
|
|
]);
|
|
}
|
|
|
|
/* ───── Activity feed (30 recent items) ───── */
|
|
Activity::factory()->count(30)->create(['user_id' => $owner->id]);
|
|
}
|
|
}
|