Plugins base (#613)

* wip

* wip

* cleanup

* notification channels

* phpstan

* services

* remove server types

* refactoring

* refactoring
This commit is contained in:
Saeed Vaziry
2025-06-14 14:35:18 +02:00
committed by GitHub
parent adc0653d15
commit 131b828807
311 changed files with 3976 additions and 2660 deletions

View File

@ -3,10 +3,11 @@
namespace Database\Factories;
use App\Enums\BackupStatus;
use App\Models\Backup;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\Backup>
* @extends Factory<Backup>
*/
class BackupFactory extends Factory
{

View File

@ -2,10 +2,11 @@
namespace Database\Factories;
use App\Models\BackupFile;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\BackupFile>
* @extends Factory<BackupFile>
*/
class BackupFileFactory extends Factory
{

View File

@ -8,7 +8,7 @@
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\CommandExecution>
* @extends Factory<CommandExecution>
*/
class CommandExecutionFactory extends Factory
{

View File

@ -8,7 +8,7 @@
use Illuminate\Support\Carbon;
/**
* @extends Factory<\App\Models\Command>
* @extends Factory<Command>
*/
class CommandFactory extends Factory
{

View File

@ -7,7 +7,7 @@
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\CronJob>
* @extends Factory<CronJob>
*/
class CronJobFactory extends Factory
{

View File

@ -7,7 +7,7 @@
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\Database>
* @extends Factory<Database>
*/
class DatabaseFactory extends Factory
{

View File

@ -6,7 +6,7 @@
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\DatabaseUser>
* @extends Factory<DatabaseUser>
*/
class DatabaseUserFactory extends Factory
{

View File

@ -6,7 +6,7 @@
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\Deployment>
* @extends Factory<Deployment>
*/
class DeploymentFactory extends Factory
{

View File

@ -8,7 +8,7 @@
use Illuminate\Support\Carbon;
/**
* @extends Factory<\App\Models\DeploymentScript>
* @extends Factory<DeploymentScript>
*/
class DeploymentScriptFactory extends Factory
{

View File

@ -7,7 +7,7 @@
use Illuminate\Support\Carbon;
/**
* @extends Factory<\App\Models\File>
* @extends Factory<File>
*/
class FileFactory extends Factory
{

View File

@ -6,7 +6,7 @@
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\FirewallRule>
* @extends Factory<FirewallRule>
*/
class FirewallRuleFactory extends Factory
{

View File

@ -9,7 +9,7 @@
use Illuminate\Support\Carbon;
/**
* @extends Factory<\App\Models\GitHook>
* @extends Factory<GitHook>
*/
class GitHookFactory extends Factory
{

View File

@ -7,7 +7,7 @@
use Illuminate\Support\Carbon;
/**
* @extends Factory<\App\Models\LoadBalancerServer>
* @extends Factory<LoadBalancerServer>
*/
class LoadBalancerServerFactory extends Factory
{

View File

@ -2,10 +2,11 @@
namespace Database\Factories;
use App\Models\Metric;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\Metric>
* @extends Factory<Metric>
*/
class MetricFactory extends Factory
{

View File

@ -2,10 +2,11 @@
namespace Database\Factories;
use App\Models\NotificationChannel;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\NotificationChannel>
* @extends Factory<NotificationChannel>
*/
class NotificationChannelFactory extends Factory
{

View File

@ -7,7 +7,7 @@
use Illuminate\Support\Carbon;
/**
* @extends Factory<\App\Models\Project>
* @extends Factory<Project>
*/
class ProjectFactory extends Factory
{

View File

@ -8,7 +8,7 @@
use Illuminate\Support\Carbon;
/**
* @extends Factory<\App\Models\ScriptExecution>
* @extends Factory<ScriptExecution>
*/
class ScriptExecutionFactory extends Factory
{

View File

@ -7,7 +7,7 @@
use Illuminate\Support\Carbon;
/**
* @extends Factory<\App\Models\Script>
* @extends Factory<Script>
*/
class ScriptFactory extends Factory
{

View File

@ -3,14 +3,13 @@
namespace Database\Factories;
use App\Enums\OperatingSystem;
use App\Enums\ServerProvider;
use App\Enums\ServerStatus;
use App\Enums\ServerType;
use App\Models\Server;
use App\ServerProviders\Custom;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\Server>
* @extends Factory<Server>
*/
class ServerFactory extends Factory
{
@ -27,8 +26,7 @@ public function definition(): array
'local_ip' => $this->faker->ipv4(),
'port' => 22,
'os' => OperatingSystem::UBUNTU22,
'type' => ServerType::REGULAR,
'provider' => ServerProvider::CUSTOM,
'provider' => Custom::id(),
'authentication' => [
'user' => 'vito',
'pass' => 'password',

View File

@ -6,7 +6,7 @@
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\ServerLog>
* @extends Factory<ServerLog>
*/
class ServerLogFactory extends Factory
{

View File

@ -7,7 +7,7 @@
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\ServerProvider>
* @extends Factory<ServerProvider>
*/
class ServerProviderFactory extends Factory
{
@ -17,7 +17,7 @@ public function definition(): array
{
return [
'profile' => $this->faker->word(),
'provider' => $this->faker->randomElement(config('core.server_providers')),
'provider' => $this->faker->randomElement(array_keys(config('server-provider.providers'))),
'credentials' => [],
'connected' => 1,
'user_id' => User::factory(),

View File

@ -7,7 +7,7 @@
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\Service>
* @extends Factory<Service>
*/
class ServiceFactory extends Factory
{

View File

@ -2,12 +2,12 @@
namespace Database\Factories;
use App\Enums\SiteType;
use App\Models\Site;
use App\SiteTypes\Laravel;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\Site>
* @extends Factory<Site>
*/
class SiteFactory extends Factory
{
@ -17,7 +17,7 @@ public function definition(): array
{
return [
'server_id' => 1,
'type' => SiteType::LARAVEL,
'type' => Laravel::id(),
'domain' => 'test.com',
'web_directory' => '/',
'path' => '/home',

View File

@ -3,11 +3,14 @@
namespace Database\Factories;
use App\Models\SourceControl;
use App\SourceControlProviders\Bitbucket;
use App\SourceControlProviders\Github;
use App\SourceControlProviders\Gitlab;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
/**
* @extends Factory<\App\Models\SourceControl>
* @extends Factory<SourceControl>
*/
class SourceControlFactory extends Factory
{
@ -17,39 +20,39 @@ public function definition(): array
{
return [
'access_token' => Str::random(10),
'provider' => \App\Enums\SourceControl::GITHUB,
'provider' => Github::id(),
'profile' => $this->faker->name,
'project_id' => null,
];
}
/**
* @return Factory<\App\Models\SourceControl>
* @return Factory<SourceControl>
*/
public function gitlab(): Factory
{
return $this->state(fn (array $attributes): array => [
'provider' => \App\Enums\SourceControl::GITLAB,
'provider' => Gitlab::id(),
]);
}
/**
* @return Factory<\App\Models\SourceControl>
* @return Factory<SourceControl>
*/
public function github(): Factory
{
return $this->state(fn (array $attributes): array => [
'provider' => \App\Enums\SourceControl::GITHUB,
'provider' => Github::id(),
]);
}
/**
* @return Factory<\App\Models\SourceControl>
* @return Factory<SourceControl>
*/
public function bitbucket(): Factory
{
return $this->state(fn (array $attributes): array => [
'provider' => \App\Enums\SourceControl::BITBUCKET,
'provider' => Bitbucket::id(),
]);
}
}

View File

@ -6,7 +6,7 @@
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\SshKey>
* @extends Factory<SshKey>
*/
class SshKeyFactory extends Factory
{

View File

@ -8,7 +8,7 @@
use Illuminate\Support\Carbon;
/**
* @extends Factory<\App\Models\Ssl>
* @extends Factory<Ssl>
*/
class SslFactory extends Factory
{

View File

@ -2,11 +2,12 @@
namespace Database\Factories;
use App\Models\StorageProvider;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory<\App\Models\StorageProvider>
* @extends Factory<StorageProvider>
*/
class StorageProviderFactory extends Factory
{
@ -14,7 +15,7 @@ public function definition(): array
{
return [
'profile' => $this->faker->word(),
'provider' => $this->faker->randomElement(config('core.storage_providers')),
'provider' => $this->faker->randomElement(array_keys(config('storage-provider.providers'))),
'credentials' => [
'token' => 'test-token',
],

View File

@ -7,7 +7,7 @@
use Illuminate\Support\Carbon;
/**
* @extends Factory<\App\Models\Tag>
* @extends Factory<Tag>
*/
class TagFactory extends Factory
{

View File

@ -8,7 +8,7 @@
use Illuminate\Support\Str;
/**
* @extends Factory<\App\Models\User>
* @extends Factory<User>
*/
class UserFactory extends Factory
{

View File

@ -16,6 +16,7 @@ class WorkerFactory extends Factory
public function definition(): array
{
return [
'name' => $this->faker->name,
'command' => 'php artisan queue:work',
'user' => 'vito',
'auto_start' => 1,

View File

@ -1,19 +1,20 @@
<?php
use App\Enums\StorageProvider;
use App\Models\StorageProvider;
use App\StorageProviders\S3;
use Illuminate\Database\Migrations\Migration;
return new class extends Migration
{
public function up(): void
{
$wasabiProviders = \App\Models\StorageProvider::query()
$wasabiProviders = StorageProvider::query()
->where('provider', 'wasabi')
->get();
/** @var \App\Models\StorageProvider $provider */
/** @var StorageProvider $provider */
foreach ($wasabiProviders as $provider) {
$provider->provider = StorageProvider::S3;
$provider->provider = S3::id();
$credentials = $provider->credentials;
$credentials['api_url'] = "https://{$credentials['bucket']}.s3.{$credentials['region']}.wasabisys.com";
$provider->credentials = $credentials;

View File

@ -0,0 +1,23 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('servers', function (Blueprint $table) {
$table->dropColumn('type');
$table->dropColumn('type_data');
});
}
public function down(): void
{
Schema::table('servers', function (Blueprint $table) {
//
});
}
};

View File

@ -0,0 +1,22 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('workers', function (Blueprint $table) {
$table->string('name')->nullable()->index();
});
}
public function down(): void
{
Schema::table('workers', function (Blueprint $table) {
$table->dropColumn('name');
});
}
};

View File

@ -3,6 +3,10 @@
namespace Database\Seeders;
use App\Models\NotificationChannel;
use App\NotificationChannels\Discord;
use App\NotificationChannels\Email;
use App\NotificationChannels\Slack;
use App\NotificationChannels\Telegram;
use Illuminate\Database\Seeder;
class NotificationChannelsSeeder extends Seeder
@ -11,7 +15,7 @@ public function run(): void
{
NotificationChannel::factory()->create([
'label' => 'Slack',
'provider' => \App\Enums\NotificationChannel::SLACK,
'provider' => Slack::id(),
'data' => [
'webhook' => 'slack_webhook',
],
@ -20,7 +24,7 @@ public function run(): void
NotificationChannel::factory()->create([
'label' => 'Discord',
'provider' => \App\Enums\NotificationChannel::DISCORD,
'provider' => Discord::id(),
'data' => [
'webhook' => 'discord_webhook',
],
@ -29,7 +33,7 @@ public function run(): void
NotificationChannel::factory()->create([
'label' => 'Telegram',
'provider' => \App\Enums\NotificationChannel::TELEGRAM,
'provider' => Telegram::id(),
'data' => [
'token' => 'telegram_token',
'chat_id' => 'telegram_chat_id',
@ -39,7 +43,7 @@ public function run(): void
NotificationChannel::factory()->create([
'label' => 'Email',
'provider' => \App\Enums\NotificationChannel::EMAIL,
'provider' => Email::id(),
'data' => [
'email' => 'email@vitodeploy.com',
],

View File

@ -71,8 +71,8 @@ private function database(Server $server): void
Service::query()->create([
'server_id' => $server->id,
'type' => 'database',
'name' => config('core.databases_name.mysql80'),
'version' => config('core.databases_version.mysql80'),
'name' => 'mysql',
'version' => '8.4',
'status' => ServiceStatus::READY,
]);
}

View File

@ -2,7 +2,6 @@
namespace Database\Seeders;
use App\Enums\SiteType;
use App\Enums\SslStatus;
use App\Enums\SslType;
use App\Enums\WorkerStatus;
@ -11,6 +10,8 @@
use App\Models\SourceControl;
use App\Models\Ssl;
use App\Models\Worker;
use App\SiteTypes\Laravel;
use App\SiteTypes\Wordpress;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Seeder;
@ -31,7 +32,7 @@ public function run(): void
'server_id' => $server->id,
'domain' => $server->project->name.'.com',
'source_control_id' => $sourceControls->random()->id,
'type' => SiteType::LARAVEL,
'type' => Laravel::id(),
'path' => '/home/vito/'.$server->project->name.'.com',
'aliases' => ['www.'.$server->project->name.'.com'],
]);
@ -52,7 +53,7 @@ public function run(): void
$blog = Site::factory()->create([
'server_id' => $server->id,
'domain' => 'blog.'.$server->project->name.'.com',
'type' => SiteType::WORDPRESS,
'type' => Wordpress::id(),
'path' => '/home/vito/blog.'.$server->project->name.'.com',
'aliases' => ['www.blog.'.$server->project->name.'.com'],
]);

View File

@ -3,6 +3,9 @@
namespace Database\Seeders;
use App\Models\SourceControl;
use App\SourceControlProviders\Bitbucket;
use App\SourceControlProviders\Github;
use App\SourceControlProviders\Gitlab;
use Illuminate\Database\Seeder;
class SourceControlsSeeder extends Seeder
@ -11,7 +14,7 @@ public function run(): void
{
SourceControl::factory()->create([
'profile' => 'GitHub',
'provider' => \App\Enums\SourceControl::GITHUB,
'provider' => Github::id(),
'provider_data' => [
'token' => 'github_token',
],
@ -19,7 +22,7 @@ public function run(): void
SourceControl::factory()->create([
'profile' => 'GitLab',
'provider' => \App\Enums\SourceControl::GITLAB,
'provider' => Gitlab::id(),
'provider_data' => [
'token' => 'gitlab_token',
],
@ -27,7 +30,7 @@ public function run(): void
SourceControl::factory()->create([
'profile' => 'Bitbucket',
'provider' => \App\Enums\SourceControl::BITBUCKET,
'provider' => Bitbucket::id(),
'provider_data' => [
'username' => 'bitbucket_username',
'password' => 'bitbucket_password',

View File

@ -3,6 +3,8 @@
namespace Database\Seeders;
use App\Models\StorageProvider;
use App\StorageProviders\FTP;
use App\StorageProviders\S3;
use Illuminate\Database\Seeder;
class StorageProvidersSeeder extends Seeder
@ -11,7 +13,7 @@ public function run(): void
{
StorageProvider::factory()->create([
'profile' => 'FTP',
'provider' => \App\Enums\StorageProvider::FTP,
'provider' => FTP::id(),
'credentials' => [
'host' => 'ftp.example.com',
'username' => 'ftp_user',
@ -21,7 +23,7 @@ public function run(): void
StorageProvider::factory()->create([
'profile' => 'S3',
'provider' => \App\Enums\StorageProvider::S3,
'provider' => S3::id(),
'credentials' => [
'secret' => 's3_secret',
],