@ -73,6 +73,18 @@ private function process_file($file)
|
|||||||
} else {
|
} else {
|
||||||
$slogan = str($file)->headline()->value();
|
$slogan = str($file)->headline()->value();
|
||||||
}
|
}
|
||||||
|
$logo = collect(preg_grep('/^# logo:/', explode("\n", $content)))->values();
|
||||||
|
if ($logo->count() > 0) {
|
||||||
|
$logo = str($logo[0])->after('# logo:')->trim()->value();
|
||||||
|
} else {
|
||||||
|
$logo = 'svgs/unknown.svg';
|
||||||
|
}
|
||||||
|
$minversion = collect(preg_grep('/^# minversion:/', explode("\n", $content)))->values();
|
||||||
|
if ($minversion->count() > 0) {
|
||||||
|
$minversion = str($minversion[0])->after('# minversion:')->trim()->value();
|
||||||
|
} else {
|
||||||
|
$minversion = '0.0.0';
|
||||||
|
}
|
||||||
$env_file = collect(preg_grep('/^# env_file:/', explode("\n", $content)))->values();
|
$env_file = collect(preg_grep('/^# env_file:/', explode("\n", $content)))->values();
|
||||||
if ($env_file->count() > 0) {
|
if ($env_file->count() > 0) {
|
||||||
$env_file = str($env_file[0])->after('# env_file:')->trim()->value();
|
$env_file = str($env_file[0])->after('# env_file:')->trim()->value();
|
||||||
@ -96,6 +108,8 @@ private function process_file($file)
|
|||||||
'slogan' => $slogan,
|
'slogan' => $slogan,
|
||||||
'compose' => $yaml,
|
'compose' => $yaml,
|
||||||
'tags' => $tags,
|
'tags' => $tags,
|
||||||
|
'logo' => $logo,
|
||||||
|
'minversion' => $minversion,
|
||||||
];
|
];
|
||||||
if ($env_file) {
|
if ($env_file) {
|
||||||
$env_file_content = file_get_contents(base_path("templates/compose/$env_file"));
|
$env_file_content = file_get_contents(base_path("templates/compose/$env_file"));
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
use App\Jobs\CheckLogDrainContainerJob;
|
use App\Jobs\CheckLogDrainContainerJob;
|
||||||
use App\Jobs\CleanupInstanceStuffsJob;
|
use App\Jobs\CleanupInstanceStuffsJob;
|
||||||
use App\Jobs\ComplexContainerStatusJob;
|
|
||||||
use App\Jobs\DatabaseBackupJob;
|
use App\Jobs\DatabaseBackupJob;
|
||||||
use App\Jobs\ScheduledTaskJob;
|
use App\Jobs\ScheduledTaskJob;
|
||||||
use App\Jobs\InstanceAutoUpdateJob;
|
use App\Jobs\InstanceAutoUpdateJob;
|
||||||
|
@ -66,6 +66,7 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
|
|||||||
private Server $mainServer;
|
private Server $mainServer;
|
||||||
private ?ApplicationPreview $preview = null;
|
private ?ApplicationPreview $preview = null;
|
||||||
private ?string $git_type = null;
|
private ?string $git_type = null;
|
||||||
|
private bool $only_this_server = false;
|
||||||
|
|
||||||
private string $container_name;
|
private string $container_name;
|
||||||
private ?string $currently_running_container_name = null;
|
private ?string $currently_running_container_name = null;
|
||||||
@ -115,6 +116,7 @@ public function __construct(int $application_deployment_queue_id)
|
|||||||
$this->commit = $this->application_deployment_queue->commit;
|
$this->commit = $this->application_deployment_queue->commit;
|
||||||
$this->force_rebuild = $this->application_deployment_queue->force_rebuild;
|
$this->force_rebuild = $this->application_deployment_queue->force_rebuild;
|
||||||
$this->restart_only = $this->application_deployment_queue->restart_only;
|
$this->restart_only = $this->application_deployment_queue->restart_only;
|
||||||
|
$this->only_this_server = $this->application_deployment_queue->only_this_server;
|
||||||
|
|
||||||
$this->git_type = data_get($this->application_deployment_queue, 'git_type');
|
$this->git_type = data_get($this->application_deployment_queue, 'git_type');
|
||||||
|
|
||||||
@ -331,7 +333,11 @@ private function deploy_simple_dockerfile()
|
|||||||
private function deploy_dockerimage_buildpack()
|
private function deploy_dockerimage_buildpack()
|
||||||
{
|
{
|
||||||
$this->dockerImage = $this->application->docker_registry_image_name;
|
$this->dockerImage = $this->application->docker_registry_image_name;
|
||||||
$this->dockerImageTag = $this->application->docker_registry_image_tag;
|
if (str($this->application->docker_registry_image_tag)->isEmpty()) {
|
||||||
|
$this->dockerImageTag = 'latest';
|
||||||
|
} else {
|
||||||
|
$this->dockerImageTag = $this->application->docker_registry_image_tag;
|
||||||
|
}
|
||||||
ray("echo 'Starting deployment of {$this->dockerImage}:{$this->dockerImageTag} to {$this->server->name}.'");
|
ray("echo 'Starting deployment of {$this->dockerImage}:{$this->dockerImageTag} to {$this->server->name}.'");
|
||||||
$this->application_deployment_queue->addLogEntry("Starting deployment of {$this->dockerImage}:{$this->dockerImageTag} to {$this->server->name}.");
|
$this->application_deployment_queue->addLogEntry("Starting deployment of {$this->dockerImage}:{$this->dockerImageTag} to {$this->server->name}.");
|
||||||
$this->generate_image_names();
|
$this->generate_image_names();
|
||||||
@ -887,7 +893,7 @@ private function deploy_to_additional_destinations()
|
|||||||
destination: $destination,
|
destination: $destination,
|
||||||
no_questions_asked: true,
|
no_questions_asked: true,
|
||||||
);
|
);
|
||||||
$this->application_deployment_queue->addLogEntry("Deploying to additional server: {$server->name}. Click here to see the deployment status: " . route('project.application.deployment.show', [
|
$this->application_deployment_queue->addLogEntry("Deployment to {$server->name}. Logs: " . route('project.application.deployment.show', [
|
||||||
'project_uuid' => data_get($this->application, 'environment.project.uuid'),
|
'project_uuid' => data_get($this->application, 'environment.project.uuid'),
|
||||||
'application_uuid' => data_get($this->application, 'uuid'),
|
'application_uuid' => data_get($this->application, 'uuid'),
|
||||||
'deployment_uuid' => $deployment_uuid,
|
'deployment_uuid' => $deployment_uuid,
|
||||||
@ -1619,7 +1625,9 @@ private function next(string $status)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ($status === ApplicationDeploymentStatus::FINISHED->value) {
|
if ($status === ApplicationDeploymentStatus::FINISHED->value) {
|
||||||
$this->deploy_to_additional_destinations();
|
if (!$this->only_this_server) {
|
||||||
|
$this->deploy_to_additional_destinations();
|
||||||
|
}
|
||||||
$this->application->environment->project->team?->notify(new DeploymentSuccess($this->application, $this->deployment_uuid, $this->preview));
|
$this->application->environment->project->team?->notify(new DeploymentSuccess($this->application, $this->deployment_uuid, $this->preview));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,17 +44,19 @@ public function uniqueId(): int
|
|||||||
public function handle()
|
public function handle()
|
||||||
{
|
{
|
||||||
$applications = $this->server->applications();
|
$applications = $this->server->applications();
|
||||||
|
$skip_these_applications = collect([]);
|
||||||
foreach ($applications as $application) {
|
foreach ($applications as $application) {
|
||||||
if ($application->additional_servers->count() > 0) {
|
if ($application->additional_servers->count() > 0) {
|
||||||
$is_main_server = $application->destination->server->id === $this->server->id;
|
$skip_these_applications->push($application);
|
||||||
if ($is_main_server) {
|
ComplexStatusCheck::run($application);
|
||||||
ComplexStatusCheck::run($application);
|
$applications = $applications->filter(function ($value, $key) use ($application) {
|
||||||
$applications = $applications->filter(function ($value, $key) use ($application) {
|
return $value->id !== $application->id;
|
||||||
return $value->id !== $application->id;
|
});
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$applications = $applications->filter(function ($value, $key) use ($skip_these_applications) {
|
||||||
|
return !$skip_these_applications->pluck('id')->contains($value->id);
|
||||||
|
});
|
||||||
|
|
||||||
if (!$this->server->isFunctional()) {
|
if (!$this->server->isFunctional()) {
|
||||||
return 'Server is not ready.';
|
return 'Server is not ready.';
|
||||||
|
59
app/Jobs/GithubAppPermissionJob.php
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Jobs;
|
||||||
|
|
||||||
|
use App\Models\GithubApp;
|
||||||
|
use Illuminate\Bus\Queueable;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldBeEncrypted;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
use Illuminate\Foundation\Bus\Dispatchable;
|
||||||
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
|
use Illuminate\Queue\Middleware\WithoutOverlapping;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
use Illuminate\Support\Facades\Http;
|
||||||
|
|
||||||
|
class GithubAppPermissionJob implements ShouldQueue, ShouldBeEncrypted
|
||||||
|
{
|
||||||
|
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||||
|
|
||||||
|
public $tries = 4;
|
||||||
|
public function backoff(): int
|
||||||
|
{
|
||||||
|
return isDev() ? 1 : 3;
|
||||||
|
}
|
||||||
|
public function __construct(public GithubApp $github_app)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
public function middleware(): array
|
||||||
|
{
|
||||||
|
return [(new WithoutOverlapping($this->github_app->uuid))];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function uniqueId(): int
|
||||||
|
{
|
||||||
|
return $this->github_app->uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$github_access_token = generate_github_jwt_token($this->github_app);
|
||||||
|
$response = Http::withHeaders([
|
||||||
|
'Authorization' => "Bearer $github_access_token",
|
||||||
|
'Accept' => 'application/vnd.github+json'
|
||||||
|
])->get("{$this->github_app->api_url}/app");
|
||||||
|
$response = $response->json();
|
||||||
|
$permissions = data_get($response, 'permissions');
|
||||||
|
$this->github_app->contents = data_get($permissions, 'contents');
|
||||||
|
$this->github_app->metadata = data_get($permissions, 'metadata');
|
||||||
|
$this->github_app->pull_requests = data_get($permissions, 'pull_requests');
|
||||||
|
$this->github_app->administration = data_get($permissions, 'administration');
|
||||||
|
$this->github_app->save();
|
||||||
|
$this->github_app->makeVisible('client_secret')->makeVisible('webhook_secret');
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
send_internal_notification('GithubAppPermissionJob failed with: ' . $e->getMessage());
|
||||||
|
ray($e->getMessage());
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -63,7 +63,7 @@ public function submitFromFields()
|
|||||||
]);
|
]);
|
||||||
$this->team->save();
|
$this->team->save();
|
||||||
refreshSession();
|
refreshSession();
|
||||||
$this->dispatch('success', 'Settings saved successfully.');
|
$this->dispatch('success', 'Settings saved.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
@ -71,7 +71,7 @@ public function submitFromFields()
|
|||||||
public function sendTestNotification()
|
public function sendTestNotification()
|
||||||
{
|
{
|
||||||
$this->team?->notify(new Test($this->emails));
|
$this->team?->notify(new Test($this->emails));
|
||||||
$this->dispatch('success', 'Test Email sent successfully.');
|
$this->dispatch('success', 'Test Email sent.');
|
||||||
}
|
}
|
||||||
public function instantSaveInstance()
|
public function instantSaveInstance()
|
||||||
{
|
{
|
||||||
@ -83,7 +83,7 @@ public function instantSaveInstance()
|
|||||||
$this->team->resend_enabled = false;
|
$this->team->resend_enabled = false;
|
||||||
$this->team->save();
|
$this->team->save();
|
||||||
refreshSession();
|
refreshSession();
|
||||||
$this->dispatch('success', 'Settings saved successfully.');
|
$this->dispatch('success', 'Settings saved.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
@ -131,7 +131,7 @@ public function submit()
|
|||||||
]);
|
]);
|
||||||
$this->team->save();
|
$this->team->save();
|
||||||
refreshSession();
|
refreshSession();
|
||||||
$this->dispatch('success', 'Settings saved successfully.');
|
$this->dispatch('success', 'Settings saved.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
$this->team->smtp_enabled = false;
|
$this->team->smtp_enabled = false;
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
@ -148,7 +148,7 @@ public function submitResend()
|
|||||||
]);
|
]);
|
||||||
$this->team->save();
|
$this->team->save();
|
||||||
refreshSession();
|
refreshSession();
|
||||||
$this->dispatch('success', 'Settings saved successfully.');
|
$this->dispatch('success', 'Settings saved.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
$this->team->resend_enabled = false;
|
$this->team->resend_enabled = false;
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
|
@ -27,7 +27,7 @@ public function submit()
|
|||||||
'name' => $this->name,
|
'name' => $this->name,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->dispatch('success', 'Profile updated successfully.');
|
$this->dispatch('success', 'Profile updated');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
|
@ -232,7 +232,6 @@ public function submit($showToaster = true)
|
|||||||
if (data_get($this->application, 'build_pack') === 'dockerimage') {
|
if (data_get($this->application, 'build_pack') === 'dockerimage') {
|
||||||
$this->validate([
|
$this->validate([
|
||||||
'application.docker_registry_image_name' => 'required',
|
'application.docker_registry_image_name' => 'required',
|
||||||
'application.docker_registry_image_tag' => 'required',
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
if (data_get($this->application, 'fqdn')) {
|
if (data_get($this->application, 'fqdn')) {
|
||||||
|
@ -33,15 +33,11 @@ public function check_status($showNotification = false)
|
|||||||
{
|
{
|
||||||
if ($this->application->destination->server->isFunctional()) {
|
if ($this->application->destination->server->isFunctional()) {
|
||||||
dispatch(new ContainerStatusJob($this->application->destination->server));
|
dispatch(new ContainerStatusJob($this->application->destination->server));
|
||||||
// $this->application->refresh();
|
|
||||||
// $this->application->previews->each(function ($preview) {
|
|
||||||
// $preview->refresh();
|
|
||||||
// });
|
|
||||||
} else {
|
} else {
|
||||||
dispatch(new ServerStatusJob($this->application->destination->server));
|
dispatch(new ServerStatusJob($this->application->destination->server));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($showNotification) $this->dispatch('success', "Application status updated.");
|
if ($showNotification) $this->dispatch('success', "Success", "Application status updated.");
|
||||||
}
|
}
|
||||||
|
|
||||||
public function force_deploy_without_cache()
|
public function force_deploy_without_cache()
|
||||||
|
@ -46,7 +46,7 @@ public function submit()
|
|||||||
$this->validate();
|
$this->validate();
|
||||||
$this->application->preview_url_template = str_replace(' ', '', $this->application->preview_url_template);
|
$this->application->preview_url_template = str_replace(' ', '', $this->application->preview_url_template);
|
||||||
$this->application->save();
|
$this->application->save();
|
||||||
$this->dispatch('success', 'Preview url template updated successfully.');
|
$this->dispatch('success', 'Preview url template updated.');
|
||||||
$this->generate_real_url();
|
$this->generate_real_url();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@ public function deleteBackup($exeuctionId)
|
|||||||
delete_backup_locally($execution->filename, $execution->scheduledDatabaseBackup->database->destination->server);
|
delete_backup_locally($execution->filename, $execution->scheduledDatabaseBackup->database->destination->server);
|
||||||
}
|
}
|
||||||
$execution->delete();
|
$execution->delete();
|
||||||
$this->dispatch('success', 'Backup deleted successfully.');
|
$this->dispatch('success', 'Backup deleted.');
|
||||||
$this->dispatch('refreshBackupExecutions');
|
$this->dispatch('refreshBackupExecutions');
|
||||||
}
|
}
|
||||||
public function download($exeuctionId)
|
public function download($exeuctionId)
|
||||||
|
@ -59,7 +59,7 @@ public function instantSaveAdvanced() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$this->database->save();
|
$this->database->save();
|
||||||
$this->dispatch('success', 'Database updated successfully.');
|
$this->dispatch('success', 'Database updated.');
|
||||||
$this->dispatch('success', 'You need to restart the service for the changes to take effect.');
|
$this->dispatch('success', 'You need to restart the service for the changes to take effect.');
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
@ -73,7 +73,7 @@ public function submit()
|
|||||||
}
|
}
|
||||||
$this->validate();
|
$this->validate();
|
||||||
$this->database->save();
|
$this->database->save();
|
||||||
$this->dispatch('success', 'Database updated successfully.');
|
$this->dispatch('success', 'Database updated.');
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@ public function instantSaveAdvanced()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$this->database->save();
|
$this->database->save();
|
||||||
$this->dispatch('success', 'Database updated successfully.');
|
$this->dispatch('success', 'Database updated.');
|
||||||
$this->dispatch('success', 'You need to restart the service for the changes to take effect.');
|
$this->dispatch('success', 'You need to restart the service for the changes to take effect.');
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
@ -75,7 +75,7 @@ public function submit()
|
|||||||
}
|
}
|
||||||
$this->validate();
|
$this->validate();
|
||||||
$this->database->save();
|
$this->database->save();
|
||||||
$this->dispatch('success', 'Database updated successfully.');
|
$this->dispatch('success', 'Database updated.');
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ public function instantSaveAdvanced()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$this->database->save();
|
$this->database->save();
|
||||||
$this->dispatch('success', 'Database updated successfully.');
|
$this->dispatch('success', 'Database updated.');
|
||||||
$this->dispatch('success', 'You need to restart the service for the changes to take effect.');
|
$this->dispatch('success', 'You need to restart the service for the changes to take effect.');
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
@ -74,7 +74,7 @@ public function submit()
|
|||||||
}
|
}
|
||||||
$this->validate();
|
$this->validate();
|
||||||
$this->database->save();
|
$this->database->save();
|
||||||
$this->dispatch('success', 'Database updated successfully.');
|
$this->dispatch('success', 'Database updated.');
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ public function instantSaveAdvanced() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$this->database->save();
|
$this->database->save();
|
||||||
$this->dispatch('success', 'Database updated successfully.');
|
$this->dispatch('success', 'Database updated.');
|
||||||
$this->dispatch('success', 'You need to restart the service for the changes to take effect.');
|
$this->dispatch('success', 'You need to restart the service for the changes to take effect.');
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
@ -105,7 +105,7 @@ public function save_init_script($script)
|
|||||||
$this->database->init_scripts = filter($this->database->init_scripts, fn ($s) => $s['filename'] !== $script['filename']);
|
$this->database->init_scripts = filter($this->database->init_scripts, fn ($s) => $s['filename'] !== $script['filename']);
|
||||||
$this->database->init_scripts = array_merge($this->database->init_scripts, [$script]);
|
$this->database->init_scripts = array_merge($this->database->init_scripts, [$script]);
|
||||||
$this->database->save();
|
$this->database->save();
|
||||||
$this->dispatch('success', 'Init script saved successfully.');
|
$this->dispatch('success', 'Init script saved.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete_init_script($script)
|
public function delete_init_script($script)
|
||||||
@ -116,7 +116,7 @@ public function delete_init_script($script)
|
|||||||
$this->database->init_scripts = $collection->filter(fn ($s) => $s['filename'] !== $script['filename'])->toArray();
|
$this->database->init_scripts = $collection->filter(fn ($s) => $s['filename'] !== $script['filename'])->toArray();
|
||||||
$this->database->save();
|
$this->database->save();
|
||||||
$this->refresh();
|
$this->refresh();
|
||||||
$this->dispatch('success', 'Init script deleted successfully.');
|
$this->dispatch('success', 'Init script deleted.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -148,7 +148,7 @@ public function save_new_init_script()
|
|||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
$this->database->save();
|
$this->database->save();
|
||||||
$this->dispatch('success', 'Init script added successfully.');
|
$this->dispatch('success', 'Init script added.');
|
||||||
$this->new_content = '';
|
$this->new_content = '';
|
||||||
$this->new_filename = '';
|
$this->new_filename = '';
|
||||||
}
|
}
|
||||||
@ -161,7 +161,7 @@ public function submit()
|
|||||||
}
|
}
|
||||||
$this->validate();
|
$this->validate();
|
||||||
$this->database->save();
|
$this->database->save();
|
||||||
$this->dispatch('success', 'Database updated successfully.');
|
$this->dispatch('success', 'Database updated.');
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ public function instantSaveAdvanced() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$this->database->save();
|
$this->database->save();
|
||||||
$this->dispatch('success', 'Database updated successfully.');
|
$this->dispatch('success', 'Database updated.');
|
||||||
$this->dispatch('success', 'You need to restart the service for the changes to take effect.');
|
$this->dispatch('success', 'You need to restart the service for the changes to take effect.');
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
@ -66,7 +66,7 @@ public function submit()
|
|||||||
$this->database->redis_conf = null;
|
$this->database->redis_conf = null;
|
||||||
}
|
}
|
||||||
$this->database->save();
|
$this->database->save();
|
||||||
$this->dispatch('success', 'Database updated successfully.');
|
$this->dispatch('success', 'Database updated.');
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ public function setSelectedBackup($backupId) {
|
|||||||
public function delete($scheduled_backup_id): void
|
public function delete($scheduled_backup_id): void
|
||||||
{
|
{
|
||||||
$this->database->scheduledBackups->find($scheduled_backup_id)->delete();
|
$this->database->scheduledBackups->find($scheduled_backup_id)->delete();
|
||||||
$this->dispatch('success', 'Scheduled backup deleted successfully.');
|
$this->dispatch('success', 'Scheduled backup deleted.');
|
||||||
$this->refreshScheduledBackups();
|
$this->refreshScheduledBackups();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,10 +71,10 @@ public function updatedSelectedEnvironment()
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
public function loadServices()
|
public function loadServices(bool $force = false)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
if (count($this->allServices) > 0) {
|
if (count($this->allServices) > 0 && !$force) {
|
||||||
if (!$this->search) {
|
if (!$this->search) {
|
||||||
$this->services = $this->allServices;
|
$this->services = $this->allServices;
|
||||||
return;
|
return;
|
||||||
|
@ -77,7 +77,7 @@ public function submit()
|
|||||||
$this->validate();
|
$this->validate();
|
||||||
$this->database->save();
|
$this->database->save();
|
||||||
updateCompose($this->database);
|
updateCompose($this->database);
|
||||||
$this->dispatch('success', 'Database saved successfully.');
|
$this->dispatch('success', 'Database saved.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
ray($e);
|
ray($e);
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -42,7 +42,7 @@ public function submit()
|
|||||||
}
|
}
|
||||||
$this->fileStorage->save();
|
$this->fileStorage->save();
|
||||||
$this->fileStorage->saveStorageOnServer();
|
$this->fileStorage->saveStorageOnServer();
|
||||||
$this->dispatch('success', 'File updated successfully.');
|
$this->dispatch('success', 'File updated.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
$this->fileStorage->setRawAttributes($original);
|
$this->fileStorage->setRawAttributes($original);
|
||||||
$this->fileStorage->save();
|
$this->fileStorage->save();
|
||||||
|
@ -64,9 +64,9 @@ public function stop(bool $forceCleanup = false)
|
|||||||
StopService::run($this->service);
|
StopService::run($this->service);
|
||||||
$this->service->refresh();
|
$this->service->refresh();
|
||||||
if ($forceCleanup) {
|
if ($forceCleanup) {
|
||||||
$this->dispatch('success', 'Force cleanup service successfully.');
|
$this->dispatch('success', 'Force cleanup service.');
|
||||||
} else {
|
} else {
|
||||||
$this->dispatch('success', 'Service stopped successfully.');
|
$this->dispatch('success', 'Service stopped.');
|
||||||
}
|
}
|
||||||
ServiceStatusChanged::dispatch();
|
ServiceStatusChanged::dispatch();
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ public function delete()
|
|||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$this->application->delete();
|
$this->application->delete();
|
||||||
$this->dispatch('success', 'Application deleted successfully.');
|
$this->dispatch('success', 'Application deleted.');
|
||||||
return redirect()->route('project.service.configuration', $this->parameters);
|
return redirect()->route('project.service.configuration', $this->parameters);
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
@ -58,7 +58,7 @@ public function submit()
|
|||||||
$this->validate();
|
$this->validate();
|
||||||
$this->application->save();
|
$this->application->save();
|
||||||
updateCompose($this->application);
|
updateCompose($this->application);
|
||||||
$this->dispatch('success', 'Application saved successfully.');
|
$this->dispatch('success', 'Application saved.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -48,7 +48,7 @@ public function saveCompose($raw)
|
|||||||
public function instantSave()
|
public function instantSave()
|
||||||
{
|
{
|
||||||
$this->service->save();
|
$this->service->save();
|
||||||
$this->dispatch('success', 'Service settings saved successfully.');
|
$this->dispatch('success', 'Service settings saved.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function submit()
|
public function submit()
|
||||||
@ -62,7 +62,7 @@ public function submit()
|
|||||||
$this->service->saveComposeConfigs();
|
$this->service->saveComposeConfigs();
|
||||||
$this->dispatch('refreshStacks');
|
$this->dispatch('refreshStacks');
|
||||||
$this->dispatch('refreshEnvs');
|
$this->dispatch('refreshEnvs');
|
||||||
$this->dispatch('success', 'Service saved successfully.');
|
$this->dispatch('success', 'Service saved.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
use App\Actions\Application\StopApplicationOneServer;
|
use App\Actions\Application\StopApplicationOneServer;
|
||||||
use App\Events\ApplicationStatusChanged;
|
use App\Events\ApplicationStatusChanged;
|
||||||
|
use App\Jobs\ContainerStatusJob;
|
||||||
use App\Models\Server;
|
use App\Models\Server;
|
||||||
use App\Models\StandaloneDocker;
|
use App\Models\StandaloneDocker;
|
||||||
use Livewire\Component;
|
use Livewire\Component;
|
||||||
@ -40,6 +41,17 @@ public function loadData()
|
|||||||
$this->networks = $this->networks->reject(function ($network) {
|
$this->networks = $this->networks->reject(function ($network) {
|
||||||
return $this->resource->destination->server->id == $network->server->id;
|
return $this->resource->destination->server->id == $network->server->id;
|
||||||
});
|
});
|
||||||
|
if ($this->resource?->additional_servers?->count() > 0) {
|
||||||
|
$this->networks = $this->networks->reject(function ($network) {
|
||||||
|
return $this->resource->additional_servers->pluck('id')->contains($network->server->id);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function stop(int $server_id)
|
||||||
|
{
|
||||||
|
$server = Server::find($server_id);
|
||||||
|
StopApplicationOneServer::run($this->resource, $server);
|
||||||
|
$this->refreshServers();
|
||||||
}
|
}
|
||||||
public function redeploy(int $network_id, int $server_id)
|
public function redeploy(int $network_id, int $server_id)
|
||||||
{
|
{
|
||||||
@ -55,6 +67,7 @@ public function redeploy(int $network_id, int $server_id)
|
|||||||
application: $this->resource,
|
application: $this->resource,
|
||||||
server: $server,
|
server: $server,
|
||||||
destination: $destination,
|
destination: $destination,
|
||||||
|
only_this_server: true,
|
||||||
no_questions_asked: true,
|
no_questions_asked: true,
|
||||||
);
|
);
|
||||||
return redirect()->route('project.application.deployment.show', [
|
return redirect()->route('project.application.deployment.show', [
|
||||||
@ -64,12 +77,29 @@ public function redeploy(int $network_id, int $server_id)
|
|||||||
'environment_name' => data_get($this->resource, 'environment.name'),
|
'environment_name' => data_get($this->resource, 'environment.name'),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
public function promote(int $network_id, int $server_id)
|
||||||
|
{
|
||||||
|
$main_destination = $this->resource->destination;
|
||||||
|
$this->resource->update([
|
||||||
|
'destination_id' => $network_id,
|
||||||
|
'destination_type' => StandaloneDocker::class,
|
||||||
|
]);
|
||||||
|
$this->resource->additional_networks()->detach($network_id, ['server_id' => $server_id]);
|
||||||
|
$this->resource->additional_networks()->attach($main_destination->id, ['server_id' => $main_destination->server->id]);
|
||||||
|
$this->refreshServers();
|
||||||
|
}
|
||||||
|
public function refreshServers()
|
||||||
|
{
|
||||||
|
ContainerStatusJob::dispatchSync($this->resource->destination->server);
|
||||||
|
$this->loadData();
|
||||||
|
$this->dispatch('refresh');
|
||||||
|
ApplicationStatusChanged::dispatch(data_get($this->resource, 'environment.project.team.id'));
|
||||||
|
}
|
||||||
public function addServer(int $network_id, int $server_id)
|
public function addServer(int $network_id, int $server_id)
|
||||||
{
|
{
|
||||||
$this->resource->additional_networks()->attach($network_id, ['server_id' => $server_id]);
|
$this->resource->additional_networks()->attach($network_id, ['server_id' => $server_id]);
|
||||||
$this->resource->load(['additional_networks']);
|
|
||||||
ApplicationStatusChanged::dispatch(data_get($this->resource, 'environment.project.team.id'));
|
|
||||||
$this->loadData();
|
$this->loadData();
|
||||||
|
ApplicationStatusChanged::dispatch(data_get($this->resource, 'environment.project.team.id'));
|
||||||
}
|
}
|
||||||
public function removeServer(int $network_id, int $server_id)
|
public function removeServer(int $network_id, int $server_id)
|
||||||
{
|
{
|
||||||
@ -80,8 +110,7 @@ public function removeServer(int $network_id, int $server_id)
|
|||||||
$server = Server::find($server_id);
|
$server = Server::find($server_id);
|
||||||
StopApplicationOneServer::run($this->resource, $server);
|
StopApplicationOneServer::run($this->resource, $server);
|
||||||
$this->resource->additional_networks()->detach($network_id, ['server_id' => $server_id]);
|
$this->resource->additional_networks()->detach($network_id, ['server_id' => $server_id]);
|
||||||
$this->resource->load(['additional_networks']);
|
|
||||||
ApplicationStatusChanged::dispatch(data_get($this->resource, 'environment.project.team.id'));
|
|
||||||
$this->loadData();
|
$this->loadData();
|
||||||
|
ApplicationStatusChanged::dispatch(data_get($this->resource, 'environment.project.team.id'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -120,9 +120,9 @@ public function saveVariables($isPreview)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($isPreview) {
|
if ($isPreview) {
|
||||||
$this->dispatch('success', 'Preview environment variables updated successfully.');
|
$this->dispatch('success', 'Preview environment variables updated.');
|
||||||
} else {
|
} else {
|
||||||
$this->dispatch('success', 'Environment variables updated successfully.');
|
$this->dispatch('success', 'Environment variables updated.');
|
||||||
}
|
}
|
||||||
$this->refreshEnvs();
|
$this->refreshEnvs();
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,7 @@ public function submit()
|
|||||||
}
|
}
|
||||||
$this->serialize();
|
$this->serialize();
|
||||||
$this->env->save();
|
$this->env->save();
|
||||||
$this->dispatch('success', 'Environment variable updated successfully.');
|
$this->dispatch('success', 'Environment variable updated.');
|
||||||
$this->dispatch('refreshEnvs');
|
$this->dispatch('refreshEnvs');
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
return handleError($e);
|
return handleError($e);
|
||||||
|
@ -52,7 +52,7 @@ public function submit()
|
|||||||
}
|
}
|
||||||
$this->validate();
|
$this->validate();
|
||||||
$this->resource->save();
|
$this->resource->save();
|
||||||
$this->dispatch('success', 'Resource limits updated successfully.');
|
$this->dispatch('success', 'Resource limits updated.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ public function submit($data)
|
|||||||
}
|
}
|
||||||
$task->save();
|
$task->save();
|
||||||
$this->refreshTasks();
|
$this->refreshTasks();
|
||||||
$this->dispatch('success', 'Scheduled task added successfully.');
|
$this->dispatch('success', 'Scheduled task added.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ public function submit()
|
|||||||
{
|
{
|
||||||
$this->validate();
|
$this->validate();
|
||||||
$this->task->save();
|
$this->task->save();
|
||||||
$this->dispatch('success', 'Scheduled task updated successfully.');
|
$this->dispatch('success', 'Scheduled task updated.');
|
||||||
$this->dispatch('refreshTasks');
|
$this->dispatch('refreshTasks');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ public function instantSave()
|
|||||||
refresh_server_connection($this->server->privateKey);
|
refresh_server_connection($this->server->privateKey);
|
||||||
$this->validateServer(false);
|
$this->validateServer(false);
|
||||||
$this->server->settings->save();
|
$this->server->settings->save();
|
||||||
$this->dispatch('success', 'Server updated successfully.');
|
$this->dispatch('success', 'Server updated.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
@ -88,7 +88,7 @@ public function checkLocalhostConnection()
|
|||||||
}
|
}
|
||||||
public function validateServer($install = true)
|
public function validateServer($install = true)
|
||||||
{
|
{
|
||||||
$this->dispatch('validateServer', $install);
|
$this->dispatch('init', $install);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function submit()
|
public function submit()
|
||||||
@ -113,6 +113,6 @@ public function submit()
|
|||||||
$this->server->settings->cleanup_after_percentage = $this->cleanup_after_percentage;
|
$this->server->settings->cleanup_after_percentage = $this->cleanup_after_percentage;
|
||||||
$this->server->settings->save();
|
$this->server->settings->save();
|
||||||
$this->server->save();
|
$this->server->save();
|
||||||
$this->dispatch('success', 'Server updated successfully.');
|
$this->dispatch('success', 'Server updated.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ public function configureLogDrain()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$this->dispatch('serverRefresh');
|
$this->dispatch('serverRefresh');
|
||||||
$this->dispatch('success', 'Log drain service started successfully.');
|
$this->dispatch('success', 'Log drain service started.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
@ -126,7 +126,7 @@ public function submit(string $type)
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
$this->server->settings->save();
|
$this->server->settings->save();
|
||||||
$this->dispatch('success', 'Settings saved successfully.');
|
$this->dispatch('success', 'Settings saved.');
|
||||||
return true;
|
return true;
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
if ($type === 'newrelic') {
|
if ($type === 'newrelic') {
|
||||||
|
28
app/Livewire/Server/Proxy/DynamicConfigurationNavbar.php
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Livewire\Server\Proxy;
|
||||||
|
|
||||||
|
use App\Models\Server;
|
||||||
|
use Livewire\Component;
|
||||||
|
|
||||||
|
class DynamicConfigurationNavbar extends Component
|
||||||
|
{
|
||||||
|
public $server_id;
|
||||||
|
public $fileName = '';
|
||||||
|
public $value = '';
|
||||||
|
public $newFile = false;
|
||||||
|
public function delete(string $fileName)
|
||||||
|
{
|
||||||
|
$server = Server::ownedByCurrentTeam()->whereId($this->server_id)->first();
|
||||||
|
$proxy_path = get_proxy_path();
|
||||||
|
$file = str_replace('|', '.', $fileName);
|
||||||
|
instant_remote_process(["rm -f {$proxy_path}/dynamic/{$file}"], $server);
|
||||||
|
$this->dispatch('success', 'File deleted.');
|
||||||
|
$this->dispatch('loadDynamicConfigurations');
|
||||||
|
$this->dispatch('refresh');
|
||||||
|
}
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return view('livewire.server.proxy.dynamic-configuration-navbar');
|
||||||
|
}
|
||||||
|
}
|
51
app/Livewire/Server/Proxy/DynamicConfigurations.php
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Livewire\Server\Proxy;
|
||||||
|
|
||||||
|
use App\Models\Server;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
use Livewire\Component;
|
||||||
|
|
||||||
|
class DynamicConfigurations extends Component
|
||||||
|
{
|
||||||
|
public ?Server $server = null;
|
||||||
|
public $parameters = [];
|
||||||
|
public Collection $contents;
|
||||||
|
protected $listeners = ['loadDynamicConfigurations', 'refresh' => '$refresh'];
|
||||||
|
protected $rules = [
|
||||||
|
'contents.*' => 'nullable|string',
|
||||||
|
];
|
||||||
|
public function loadDynamicConfigurations()
|
||||||
|
{
|
||||||
|
$proxy_path = get_proxy_path();
|
||||||
|
$files = instant_remote_process(["mkdir -p $proxy_path/dynamic && ls -1 {$proxy_path}/dynamic"], $this->server);
|
||||||
|
$files = collect(explode("\n", $files))->filter(fn ($file) => !empty($file));
|
||||||
|
$files = $files->map(fn ($file) => trim($file));
|
||||||
|
$files = $files->sort();
|
||||||
|
if ($files->contains('coolify.yaml')) {
|
||||||
|
$files = $files->filter(fn ($file) => $file !== 'coolify.yaml')->prepend('coolify.yaml');
|
||||||
|
}
|
||||||
|
$contents = collect([]);
|
||||||
|
foreach ($files as $file) {
|
||||||
|
$without_extension = str_replace('.', '|', $file);
|
||||||
|
$contents[$without_extension] = instant_remote_process(["cat {$proxy_path}/dynamic/{$file}"], $this->server);
|
||||||
|
}
|
||||||
|
$this->contents = $contents;
|
||||||
|
}
|
||||||
|
public function mount()
|
||||||
|
{
|
||||||
|
$this->parameters = get_route_parameters();
|
||||||
|
try {
|
||||||
|
$this->server = Server::ownedByCurrentTeam()->whereUuid(request()->server_uuid)->first();
|
||||||
|
if (is_null($this->server)) {
|
||||||
|
return redirect()->route('server.index');
|
||||||
|
}
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
return handleError($e, $this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return view('livewire.server.proxy.dynamic-configurations');
|
||||||
|
}
|
||||||
|
}
|
74
app/Livewire/Server/Proxy/NewDynamicConfiguration.php
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Livewire\Server\Proxy;
|
||||||
|
|
||||||
|
use App\Models\Server;
|
||||||
|
use Illuminate\Routing\Route;
|
||||||
|
use Livewire\Component;
|
||||||
|
use Symfony\Component\Yaml\Yaml;
|
||||||
|
|
||||||
|
class NewDynamicConfiguration extends Component
|
||||||
|
{
|
||||||
|
public string $fileName = '';
|
||||||
|
public string $value = '';
|
||||||
|
public bool $newFile = false;
|
||||||
|
public Server $server;
|
||||||
|
public $server_id;
|
||||||
|
public $parameters = [];
|
||||||
|
public function mount()
|
||||||
|
{
|
||||||
|
$this->parameters = get_route_parameters();
|
||||||
|
if ($this->fileName !== '') {
|
||||||
|
$this->fileName = str_replace('|', '.', $this->fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function addDynamicConfiguration()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$this->validate([
|
||||||
|
'fileName' => 'required',
|
||||||
|
'value' => 'required',
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (data_get($this->parameters, 'server_uuid')) {
|
||||||
|
$this->server = Server::ownedByCurrentTeam()->whereUuid(data_get($this->parameters, 'server_uuid'))->first();
|
||||||
|
}
|
||||||
|
if (!is_null($this->server_id)) {
|
||||||
|
$this->server = Server::ownedByCurrentTeam()->whereId($this->server_id)->first();
|
||||||
|
}
|
||||||
|
if (is_null($this->server)) {
|
||||||
|
return redirect()->route('server.index');
|
||||||
|
}
|
||||||
|
if (!str($this->fileName)->endsWith('.yaml') && !str($this->fileName)->endsWith('.yml')) {
|
||||||
|
$this->fileName = "{$this->fileName}.yaml";
|
||||||
|
}
|
||||||
|
if ($this->fileName === 'coolify.yaml') {
|
||||||
|
$this->dispatch('error', 'File name is reserved.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$proxy_path = get_proxy_path();
|
||||||
|
$file = "{$proxy_path}/dynamic/{$this->fileName}";
|
||||||
|
if ($this->newFile) {
|
||||||
|
$exists = instant_remote_process(["test -f $file && echo 1 || echo 0"], $this->server);
|
||||||
|
if ($exists == 1) {
|
||||||
|
$this->dispatch('error', 'File already exists');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$yaml = Yaml::parse($this->value);
|
||||||
|
$yaml = Yaml::dump($yaml, 10, 2);
|
||||||
|
$this->value = $yaml;
|
||||||
|
$base64_value = base64_encode($this->value);
|
||||||
|
instant_remote_process(["echo '{$base64_value}' | base64 -d > {$file}"], $this->server);
|
||||||
|
$this->dispatch('loadDynamicConfigurations');
|
||||||
|
$this->dispatch('dynamic-configuration-added');
|
||||||
|
$this->dispatch('success', 'Dynamic configuration saved.');
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
return handleError($e, $this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return view('livewire.server.proxy.new-dynamic-configuration');
|
||||||
|
}
|
||||||
|
}
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Livewire\Server;
|
namespace App\Livewire\Server;
|
||||||
|
|
||||||
|
use App\Actions\Proxy\CheckProxy;
|
||||||
use App\Actions\Proxy\StartProxy;
|
use App\Actions\Proxy\StartProxy;
|
||||||
use App\Models\Server;
|
use App\Models\Server;
|
||||||
use Livewire\Component;
|
use Livewire\Component;
|
||||||
@ -21,7 +22,15 @@ class ValidateAndInstall extends Component
|
|||||||
public $error = null;
|
public $error = null;
|
||||||
public bool $ask = false;
|
public bool $ask = false;
|
||||||
|
|
||||||
protected $listeners = ['validateServer' => 'init', 'validateDockerEngine', 'validateServerNow' => 'validateServer'];
|
protected $listeners = [
|
||||||
|
'init',
|
||||||
|
'validateConnection',
|
||||||
|
'validateOS',
|
||||||
|
'validateDockerEngine',
|
||||||
|
'validateDockerVersion',
|
||||||
|
'startProxy',
|
||||||
|
'refresh' => '$refresh',
|
||||||
|
];
|
||||||
|
|
||||||
public function init(bool $install = true)
|
public function init(bool $install = true)
|
||||||
{
|
{
|
||||||
@ -35,31 +44,29 @@ public function init(bool $install = true)
|
|||||||
$this->error = null;
|
$this->error = null;
|
||||||
$this->number_of_tries = 0;
|
$this->number_of_tries = 0;
|
||||||
if (!$this->ask) {
|
if (!$this->ask) {
|
||||||
$this->dispatch('validateServerNow');
|
$this->dispatch('validateConnection');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public function startValidatingAfterAsking() {
|
public function startValidatingAfterAsking()
|
||||||
|
{
|
||||||
$this->ask = false;
|
$this->ask = false;
|
||||||
$this->init();
|
$this->init();
|
||||||
}
|
}
|
||||||
public function validateServer()
|
public function startProxy()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$this->validateConnection();
|
$shouldStart = CheckProxy::run($this->server);
|
||||||
$this->validateOS();
|
if ($shouldStart) {
|
||||||
$this->validateDockerEngine();
|
$proxy = StartProxy::run($this->server, false);
|
||||||
|
if ($proxy === 'OK') {
|
||||||
if ($this->server->isSwarm()) {
|
$this->proxy_started = true;
|
||||||
$swarmInstalled = $this->server->validateDockerSwarm();
|
} else {
|
||||||
if ($swarmInstalled) {
|
throw new \Exception("Proxy could not be started.");
|
||||||
$this->dispatch('success', 'Docker Swarm is initiated.');
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$proxy = StartProxy::run($this->server);
|
$this->proxy_started = true;
|
||||||
if ($proxy) {
|
|
||||||
$this->proxy_started = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
@ -71,6 +78,7 @@ public function validateConnection()
|
|||||||
$this->error = 'Server is not reachable. Please validate your configuration and connection.<br><br>Check this <a target="_blank" class="underline" href="https://coolify.io/docs/server/openssh">documentation</a> for further help.';
|
$this->error = 'Server is not reachable. Please validate your configuration and connection.<br><br>Check this <a target="_blank" class="underline" href="https://coolify.io/docs/server/openssh">documentation</a> for further help.';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
$this->dispatch('validateOS');
|
||||||
}
|
}
|
||||||
public function validateOS()
|
public function validateOS()
|
||||||
{
|
{
|
||||||
@ -79,6 +87,7 @@ public function validateOS()
|
|||||||
$this->error = 'Server OS type is not supported. Please install Docker manually before continuing: <a target="_blank" class="underline" href="https://docs.docker.com/engine/install/#server">documentation</a>.';
|
$this->error = 'Server OS type is not supported. Please install Docker manually before continuing: <a target="_blank" class="underline" href="https://docs.docker.com/engine/install/#server">documentation</a>.';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
$this->dispatch('validateDockerEngine');
|
||||||
}
|
}
|
||||||
public function validateDockerEngine()
|
public function validateDockerEngine()
|
||||||
{
|
{
|
||||||
@ -90,29 +99,39 @@ public function validateDockerEngine()
|
|||||||
$this->error = 'Docker Engine could not be installed. Please install Docker manually before continuing: <a target="_blank" class="underline" href="https://docs.docker.com/engine/install/#server">documentation</a>.';
|
$this->error = 'Docker Engine could not be installed. Please install Docker manually before continuing: <a target="_blank" class="underline" href="https://docs.docker.com/engine/install/#server">documentation</a>.';
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
$activity = $this->server->installDocker();
|
if ($this->number_of_tries == 0) {
|
||||||
$this->number_of_tries++;
|
$activity = $this->server->installDocker();
|
||||||
$this->dispatch('newActivityMonitor', $activity->id, 'validateDockerEngine');
|
$this->number_of_tries++;
|
||||||
|
$this->dispatch('newActivityMonitor', $activity->id, 'init');
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$this->error = 'Docker Engine is not installed. Please install Docker manually before continuing: <a target="_blank" class="underline" href="https://docs.docker.com/engine/install/#server">documentation</a>.';
|
$this->error = 'Docker Engine is not installed. Please install Docker manually before continuing: <a target="_blank" class="underline" href="https://docs.docker.com/engine/install/#server">documentation</a>.';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
$this->validateDockerVersion();
|
|
||||||
}
|
}
|
||||||
|
$this->dispatch('validateDockerVersion');
|
||||||
}
|
}
|
||||||
public function validateDockerVersion()
|
public function validateDockerVersion()
|
||||||
{
|
{
|
||||||
$this->docker_version = $this->server->validateDockerEngineVersion();
|
if ($this->server->isSwarm()) {
|
||||||
if ($this->docker_version) {
|
$swarmInstalled = $this->server->validateDockerSwarm();
|
||||||
$this->dispatch('serverInstalled');
|
if ($swarmInstalled) {
|
||||||
$this->dispatch('success', 'Server validated successfully.');
|
$this->dispatch('success', 'Docker Swarm is initiated.');
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
$this->error = 'Docker Engine version is not 22+. Please install Docker manually before continuing: <a target="_blank" class="underline" href="https://docs.docker.com/engine/install/#server">documentation</a>.';
|
$this->docker_version = $this->server->validateDockerEngineVersion();
|
||||||
return;
|
if ($this->docker_version) {
|
||||||
|
$this->dispatch('serverInstalled');
|
||||||
|
$this->dispatch('success', 'Server validated.');
|
||||||
|
} else {
|
||||||
|
$this->error = 'Docker Engine version is not 22+. Please install Docker manually before continuing: <a target="_blank" class="underline" href="https://docs.docker.com/engine/install/#server">documentation</a>.';
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->dispatch('startProxy');
|
||||||
}
|
}
|
||||||
public function render()
|
public function render()
|
||||||
{
|
{
|
||||||
|
@ -81,6 +81,6 @@ public function backup_now()
|
|||||||
}
|
}
|
||||||
public function submit()
|
public function submit()
|
||||||
{
|
{
|
||||||
$this->dispatch('success', 'Backup updated successfully.');
|
$this->dispatch('success', 'Backup updated.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ public function submitFromFields() {
|
|||||||
'settings.smtp_from_name' => 'required',
|
'settings.smtp_from_name' => 'required',
|
||||||
]);
|
]);
|
||||||
$this->settings->save();
|
$this->settings->save();
|
||||||
$this->dispatch('success', 'Settings saved successfully.');
|
$this->dispatch('success', 'Settings saved.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
@ -61,7 +61,7 @@ public function submitResend() {
|
|||||||
'settings.resend_api_key' => 'required'
|
'settings.resend_api_key' => 'required'
|
||||||
]);
|
]);
|
||||||
$this->settings->save();
|
$this->settings->save();
|
||||||
$this->dispatch('success', 'Settings saved successfully.');
|
$this->dispatch('success', 'Settings saved.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
$this->settings->resend_enabled = false;
|
$this->settings->resend_enabled = false;
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
@ -98,7 +98,7 @@ public function submit()
|
|||||||
'settings.smtp_timeout' => 'nullable',
|
'settings.smtp_timeout' => 'nullable',
|
||||||
]);
|
]);
|
||||||
$this->settings->save();
|
$this->settings->save();
|
||||||
$this->dispatch('success', 'Settings saved successfully.');
|
$this->dispatch('success', 'Settings saved.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,10 @@
|
|||||||
|
|
||||||
namespace App\Livewire\Source\Github;
|
namespace App\Livewire\Source\Github;
|
||||||
|
|
||||||
|
use App\Jobs\GithubAppPermissionJob;
|
||||||
use App\Models\GithubApp;
|
use App\Models\GithubApp;
|
||||||
use App\Models\InstanceSettings;
|
use App\Models\InstanceSettings;
|
||||||
|
use Illuminate\Support\Facades\Http;
|
||||||
use Livewire\Component;
|
use Livewire\Component;
|
||||||
|
|
||||||
class Change extends Component
|
class Change extends Component
|
||||||
@ -15,6 +17,7 @@ class Change extends Component
|
|||||||
|
|
||||||
public ?bool $default_permissions = true;
|
public ?bool $default_permissions = true;
|
||||||
public ?bool $preview_deployment_permissions = true;
|
public ?bool $preview_deployment_permissions = true;
|
||||||
|
public ?bool $administration = false;
|
||||||
|
|
||||||
public $parameters;
|
public $parameters;
|
||||||
public ?GithubApp $github_app;
|
public ?GithubApp $github_app;
|
||||||
@ -34,8 +37,52 @@ class Change extends Component
|
|||||||
'github_app.client_secret' => 'required|string',
|
'github_app.client_secret' => 'required|string',
|
||||||
'github_app.webhook_secret' => 'required|string',
|
'github_app.webhook_secret' => 'required|string',
|
||||||
'github_app.is_system_wide' => 'required|bool',
|
'github_app.is_system_wide' => 'required|bool',
|
||||||
|
'github_app.contents' => 'nullable|string',
|
||||||
|
'github_app.metadata' => 'nullable|string',
|
||||||
|
'github_app.pull_requests' => 'nullable|string',
|
||||||
|
'github_app.administration' => 'nullable|string',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public function checkPermissions()
|
||||||
|
{
|
||||||
|
GithubAppPermissionJob::dispatchSync($this->github_app);
|
||||||
|
$this->github_app->refresh()->makeVisible('client_secret')->makeVisible('webhook_secret');
|
||||||
|
$this->dispatch('success', 'Github App permissions updated.');
|
||||||
|
}
|
||||||
|
// public function check()
|
||||||
|
// {
|
||||||
|
|
||||||
|
// Need administration:read:write permission
|
||||||
|
// https://docs.github.com/en/rest/actions/self-hosted-runners?apiVersion=2022-11-28#list-self-hosted-runners-for-a-repository
|
||||||
|
|
||||||
|
|
||||||
|
// $github_access_token = generate_github_installation_token($this->github_app);
|
||||||
|
// $repositories = Http::withToken($github_access_token)->get("{$this->github_app->api_url}/installation/repositories?per_page=100");
|
||||||
|
// $runners_by_repository = collect([]);
|
||||||
|
// $repositories = $repositories->json()['repositories'];
|
||||||
|
// foreach ($repositories as $repository) {
|
||||||
|
// $runners_downloads = Http::withToken($github_access_token)->get("{$this->github_app->api_url}/repos/{$repository['full_name']}/actions/runners/downloads");
|
||||||
|
// $runners = Http::withToken($github_access_token)->get("{$this->github_app->api_url}/repos/{$repository['full_name']}/actions/runners");
|
||||||
|
// $token = Http::withHeaders([
|
||||||
|
// 'Authorization' => "Bearer $github_access_token",
|
||||||
|
// 'Accept' => 'application/vnd.github+json'
|
||||||
|
// ])->withBody(null)->post("{$this->github_app->api_url}/repos/{$repository['full_name']}/actions/runners/registration-token");
|
||||||
|
// $token = $token->json();
|
||||||
|
// $remove_token = Http::withHeaders([
|
||||||
|
// 'Authorization' => "Bearer $github_access_token",
|
||||||
|
// 'Accept' => 'application/vnd.github+json'
|
||||||
|
// ])->withBody(null)->post("{$this->github_app->api_url}/repos/{$repository['full_name']}/actions/runners/remove-token");
|
||||||
|
// $remove_token = $remove_token->json();
|
||||||
|
// $runners_by_repository->put($repository['full_name'], [
|
||||||
|
// 'token' => $token,
|
||||||
|
// 'remove_token' => $remove_token,
|
||||||
|
// 'runners' => $runners->json(),
|
||||||
|
// 'runners_downloads' => $runners_downloads->json()
|
||||||
|
// ]);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// ray($runners_by_repository);
|
||||||
|
// }
|
||||||
public function mount()
|
public function mount()
|
||||||
{
|
{
|
||||||
$github_app_uuid = request()->github_app_uuid;
|
$github_app_uuid = request()->github_app_uuid;
|
||||||
@ -103,7 +150,7 @@ public function submit()
|
|||||||
'github_app.is_system_wide' => 'required|bool',
|
'github_app.is_system_wide' => 'required|bool',
|
||||||
]);
|
]);
|
||||||
$this->github_app->save();
|
$this->github_app->save();
|
||||||
$this->dispatch('success', 'Github App updated successfully.');
|
$this->dispatch('success', 'Github App updated.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
@ -111,6 +158,13 @@ public function submit()
|
|||||||
|
|
||||||
public function instantSave()
|
public function instantSave()
|
||||||
{
|
{
|
||||||
|
try {
|
||||||
|
$this->github_app->makeVisible('client_secret')->makeVisible('webhook_secret');
|
||||||
|
$this->github_app->save();
|
||||||
|
$this->dispatch('success', 'Github App updated.');
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
return handleError($e, $this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete()
|
public function delete()
|
||||||
|
@ -37,7 +37,7 @@ public function submit()
|
|||||||
try {
|
try {
|
||||||
$this->team->save();
|
$this->team->save();
|
||||||
refreshSession();
|
refreshSession();
|
||||||
$this->dispatch('success', 'Team updated successfully.');
|
$this->dispatch('success', 'Team updated.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ private function generate_invite_link(bool $sendEmail = false)
|
|||||||
]);
|
]);
|
||||||
$mail->subject('You have been invited to ' . currentTeam()->name . ' on ' . config('app.name') . '.');
|
$mail->subject('You have been invited to ' . currentTeam()->name . ' on ' . config('app.name') . '.');
|
||||||
send_user_an_email($mail, $this->email);
|
send_user_an_email($mail, $this->email);
|
||||||
$this->dispatch('success', 'Invitation sent via email successfully.');
|
$this->dispatch('success', 'Invitation sent via email.');
|
||||||
$this->dispatch('refreshInvitations');
|
$this->dispatch('refreshInvitations');
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
use Illuminate\Support\Collection;
|
|
||||||
use Spatie\Activitylog\Models\Activity;
|
use Spatie\Activitylog\Models\Activity;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
use RuntimeException;
|
use RuntimeException;
|
||||||
@ -274,15 +273,11 @@ public function status(): Attribute
|
|||||||
foreach ($additional_servers_status as $status) {
|
foreach ($additional_servers_status as $status) {
|
||||||
$server_status = str($status)->before(':')->value();
|
$server_status = str($status)->before(':')->value();
|
||||||
$server_health = str($status)->after(':')->value() ?? 'unhealthy';
|
$server_health = str($status)->after(':')->value() ?? 'unhealthy';
|
||||||
if ($server_status !== 'running') {
|
if ($main_server_status !== $server_status) {
|
||||||
if ($main_server_status !== $server_status) {
|
$complex_status = 'degraded';
|
||||||
$complex_status = 'degraded';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if ($server_health !== 'healthy') {
|
if ($main_server_health !== $server_health) {
|
||||||
if ($main_server_health !== $server_health) {
|
$complex_health = 'unhealthy';
|
||||||
$complex_health = 'unhealthy';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "$complex_status:$complex_health";
|
return "$complex_status:$complex_health";
|
||||||
|
@ -57,6 +57,7 @@ public function saveStorageOnServer()
|
|||||||
if ($content) {
|
if ($content) {
|
||||||
$content = base64_encode($content);
|
$content = base64_encode($content);
|
||||||
$commands->push("echo '$content' | base64 -d > $path");
|
$commands->push("echo '$content' | base64 -d > $path");
|
||||||
|
$commands->push("chmod +x $path");
|
||||||
}
|
}
|
||||||
} else if ($isDir == 'NOK' && $fileVolume->is_directory) {
|
} else if ($isDir == 'NOK' && $fileVolume->is_directory) {
|
||||||
$commands->push("mkdir -p $path > /dev/null 2>&1 || true");
|
$commands->push("mkdir -p $path > /dev/null 2>&1 || true");
|
||||||
|
@ -398,10 +398,10 @@ public function validateOS(): bool | Stringable
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
if ($supported->count() === 1) {
|
if ($supported->count() === 1) {
|
||||||
ray('supported');
|
// ray('supported');
|
||||||
return str($supported->first());
|
return str($supported->first());
|
||||||
} else {
|
} else {
|
||||||
ray('not supported');
|
// ray('not supported');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -468,6 +468,16 @@ public function validateDockerEngine($throwError = false)
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
instant_remote_process(["docker version"], $this);
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
$this->settings->is_usable = false;
|
||||||
|
$this->settings->save();
|
||||||
|
if ($throwError) {
|
||||||
|
throw new \Exception('Server is not usable. Docker Engine is not running.');
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
$this->settings->is_usable = true;
|
$this->settings->is_usable = true;
|
||||||
$this->settings->save();
|
$this->settings->save();
|
||||||
$this->validateCoolifyNetwork(isSwarm: false, isBuildServer: $this->settings->is_build_server);
|
$this->validateCoolifyNetwork(isSwarm: false, isBuildServer: $this->settings->is_build_server);
|
||||||
|
31
app/View/Components/ResourceView.php
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\View\Components;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Contracts\View\View;
|
||||||
|
use Illuminate\View\Component;
|
||||||
|
|
||||||
|
class ResourceView extends Component
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Create a new component instance.
|
||||||
|
*/
|
||||||
|
public function __construct(
|
||||||
|
public ?string $wire = null,
|
||||||
|
public ?string $logo = null,
|
||||||
|
public ?string $documentation = null,
|
||||||
|
public bool $upgrade = false,
|
||||||
|
)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the view / contents that represent the component.
|
||||||
|
*/
|
||||||
|
public function render(): View|Closure|string
|
||||||
|
{
|
||||||
|
return view('components.resource-view');
|
||||||
|
}
|
||||||
|
}
|
@ -11,11 +11,12 @@ class Index extends Component
|
|||||||
/**
|
/**
|
||||||
* Create a new component instance.
|
* Create a new component instance.
|
||||||
*/
|
*/
|
||||||
|
public $status = "exited:unhealthy";
|
||||||
public function __construct(
|
public function __construct(
|
||||||
public string $status = 'exited',
|
public $resource = null,
|
||||||
)
|
public bool $showRefreshButton = true,
|
||||||
{
|
) {
|
||||||
//
|
$this->status = $resource->status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
use App\Models\StandaloneDocker;
|
use App\Models\StandaloneDocker;
|
||||||
use Spatie\Url\Url;
|
use Spatie\Url\Url;
|
||||||
|
|
||||||
function queue_application_deployment(Application $application, string $deployment_uuid, int | null $pull_request_id = 0, string $commit = 'HEAD', bool $force_rebuild = false, bool $is_webhook = false, bool $restart_only = false, ?string $git_type = null, bool $no_questions_asked = false, Server $server = null, StandaloneDocker $destination = null)
|
function queue_application_deployment(Application $application, string $deployment_uuid, int | null $pull_request_id = 0, string $commit = 'HEAD', bool $force_rebuild = false, bool $is_webhook = false, bool $restart_only = false, ?string $git_type = null, bool $no_questions_asked = false, Server $server = null, StandaloneDocker $destination = null, bool $only_this_server = false)
|
||||||
{
|
{
|
||||||
$application_id = $application->id;
|
$application_id = $application->id;
|
||||||
$deployment_link = Url::fromString($application->link() . "/deployment/{$deployment_uuid}");
|
$deployment_link = Url::fromString($application->link() . "/deployment/{$deployment_uuid}");
|
||||||
@ -37,7 +37,8 @@ function queue_application_deployment(Application $application, string $deployme
|
|||||||
'is_webhook' => $is_webhook,
|
'is_webhook' => $is_webhook,
|
||||||
'restart_only' => $restart_only,
|
'restart_only' => $restart_only,
|
||||||
'commit' => $commit,
|
'commit' => $commit,
|
||||||
'git_type' => $git_type
|
'git_type' => $git_type,
|
||||||
|
'only_this_server' => $only_this_server
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if ($no_questions_asked) {
|
if ($no_questions_asked) {
|
||||||
|
@ -212,7 +212,7 @@ function generateServiceSpecificFqdns(ServiceApplication|Application $resource,
|
|||||||
}
|
}
|
||||||
return $payload;
|
return $payload;
|
||||||
}
|
}
|
||||||
function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_https_enabled = false, $onlyPort = null, ?Collection $serviceLabels = null, ?bool $is_gzip_enabled = true)
|
function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_https_enabled = false, $onlyPort = null, ?Collection $serviceLabels = null, ?bool $is_gzip_enabled = true, ?string $service_name = null)
|
||||||
{
|
{
|
||||||
$labels = collect([]);
|
$labels = collect([]);
|
||||||
$labels->push('traefik.enable=true');
|
$labels->push('traefik.enable=true');
|
||||||
@ -264,6 +264,10 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
|
|||||||
}
|
}
|
||||||
$http_label = "http-{$loop}-{$uuid}";
|
$http_label = "http-{$loop}-{$uuid}";
|
||||||
$https_label = "https-{$loop}-{$uuid}";
|
$https_label = "https-{$loop}-{$uuid}";
|
||||||
|
if ($service_name) {
|
||||||
|
$http_label = "http-{$loop}-{$uuid}-{$service_name}";
|
||||||
|
$https_label = "https-{$loop}-{$uuid}-{$service_name}";
|
||||||
|
}
|
||||||
|
|
||||||
if ($schema === 'https') {
|
if ($schema === 'https') {
|
||||||
// Set labels for https
|
// Set labels for https
|
||||||
|
@ -86,3 +86,8 @@ function get_installation_path(GithubApp $source)
|
|||||||
$installation_path = $github->html_url === 'https://github.com' ? 'apps' : 'github-apps';
|
$installation_path = $github->html_url === 'https://github.com' ? 'apps' : 'github-apps';
|
||||||
return "$github->html_url/$installation_path/$name/installations/new";
|
return "$github->html_url/$installation_path/$name/installations/new";
|
||||||
}
|
}
|
||||||
|
function get_permissions_path(GithubApp $source) {
|
||||||
|
$github = GithubApp::where('uuid', $source->uuid)->first();
|
||||||
|
$name = Str::of(Str::kebab($github->name));
|
||||||
|
return "$github->html_url/settings/apps/$name/permissions";
|
||||||
|
}
|
||||||
|
@ -140,7 +140,9 @@ function generate_default_proxy_configuration(Server $server)
|
|||||||
"--entrypoints.http.address=:80",
|
"--entrypoints.http.address=:80",
|
||||||
"--entrypoints.https.address=:443",
|
"--entrypoints.https.address=:443",
|
||||||
"--entrypoints.http.http.encodequerysemicolons=true",
|
"--entrypoints.http.http.encodequerysemicolons=true",
|
||||||
|
"--entryPoints.http.http2.maxConcurrentStreams=50",
|
||||||
"--entrypoints.https.http.encodequerysemicolons=true",
|
"--entrypoints.https.http.encodequerysemicolons=true",
|
||||||
|
"--entryPoints.https.http2.maxConcurrentStreams=50",
|
||||||
"--providers.docker.exposedbydefault=false",
|
"--providers.docker.exposedbydefault=false",
|
||||||
"--providers.file.directory=/traefik/dynamic/",
|
"--providers.file.directory=/traefik/dynamic/",
|
||||||
"--providers.file.watch=true",
|
"--providers.file.watch=true",
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
use App\Models\Service;
|
use App\Models\Service;
|
||||||
use App\Models\ServiceApplication;
|
use App\Models\ServiceApplication;
|
||||||
use App\Models\ServiceDatabase;
|
use App\Models\ServiceDatabase;
|
||||||
use Illuminate\Support\Facades\Storage;
|
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
|
use Spatie\Url\Url;
|
||||||
use Symfony\Component\Yaml\Yaml;
|
use Symfony\Component\Yaml\Yaml;
|
||||||
|
|
||||||
function replaceRegex(?string $name = null)
|
function replaceRegex(?string $name = null)
|
||||||
@ -95,12 +95,17 @@ function updateCompose($resource)
|
|||||||
// Update FQDN
|
// Update FQDN
|
||||||
$variableName = "SERVICE_FQDN_" . Str::of($resource->name)->upper();
|
$variableName = "SERVICE_FQDN_" . Str::of($resource->name)->upper();
|
||||||
$generatedEnv = EnvironmentVariable::where('service_id', $resource->service_id)->where('key', $variableName)->first();
|
$generatedEnv = EnvironmentVariable::where('service_id', $resource->service_id)->where('key', $variableName)->first();
|
||||||
|
$fqdn = Url::fromString($resource->fqdn);
|
||||||
|
$fqdn = $fqdn->getScheme() . '://' . $fqdn->getHost();
|
||||||
if ($generatedEnv) {
|
if ($generatedEnv) {
|
||||||
$generatedEnv->value = $resource->fqdn;
|
$generatedEnv->value = $fqdn;
|
||||||
$generatedEnv->save();
|
$generatedEnv->save();
|
||||||
}
|
}
|
||||||
$variableName = "SERVICE_URL_" . Str::of($resource->name)->upper();
|
$variableName = "SERVICE_URL_" . Str::of($resource->name)->upper();
|
||||||
$generatedEnv = EnvironmentVariable::where('service_id', $resource->service_id)->where('key', $variableName)->first();
|
$generatedEnv = EnvironmentVariable::where('service_id', $resource->service_id)->where('key', $variableName)->first();
|
||||||
|
$url = Url::fromString($resource->fqdn);
|
||||||
|
$url = $url->getHost();
|
||||||
|
ray($url);
|
||||||
if ($generatedEnv) {
|
if ($generatedEnv) {
|
||||||
$url = Str::of($resource->fqdn)->after('://');
|
$url = Str::of($resource->fqdn)->after('://');
|
||||||
$generatedEnv->value = $url;
|
$generatedEnv->value = $url;
|
||||||
|
@ -104,13 +104,13 @@ function handleError(?Throwable $error = null, ?Livewire\Component $livewire = n
|
|||||||
ray($error);
|
ray($error);
|
||||||
if ($error instanceof TooManyRequestsException) {
|
if ($error instanceof TooManyRequestsException) {
|
||||||
if (isset($livewire)) {
|
if (isset($livewire)) {
|
||||||
return $livewire->dispatch('error', "Too many requests.", "Please try again in {$error->secondsUntilAvailable} seconds.");
|
return $livewire->dispatch('error', 'Too many requests. Please try again in {$error->secondsUntilAvailable} seconds.');
|
||||||
}
|
}
|
||||||
return "Too many requests. Please try again in {$error->secondsUntilAvailable} seconds.";
|
return "Too many requests. Please try again in {$error->secondsUntilAvailable} seconds.";
|
||||||
}
|
}
|
||||||
if ($error instanceof UniqueConstraintViolationException) {
|
if ($error instanceof UniqueConstraintViolationException) {
|
||||||
if (isset($livewire)) {
|
if (isset($livewire)) {
|
||||||
return $livewire->dispatch('error', "Duplicate entry found.", "Please use a different name.");
|
return $livewire->dispatch('error', 'Duplicate entry found. Please use a different name.');
|
||||||
}
|
}
|
||||||
return "Duplicate entry found. Please use a different name.";
|
return "Duplicate entry found. Please use a different name.";
|
||||||
}
|
}
|
||||||
@ -125,9 +125,6 @@ function handleError(?Throwable $error = null, ?Livewire\Component $livewire = n
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isset($livewire)) {
|
if (isset($livewire)) {
|
||||||
if (str($message)->length() > 20) {
|
|
||||||
return $livewire->dispatch('error', 'Error occured', $message);
|
|
||||||
}
|
|
||||||
return $livewire->dispatch('error', $message);
|
return $livewire->dispatch('error', $message);
|
||||||
}
|
}
|
||||||
throw new Exception($message);
|
throw new Exception($message);
|
||||||
@ -975,7 +972,7 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
if (!$isDatabase) {
|
if (!$isDatabase) {
|
||||||
if ($command->value() === 'FQDN' && is_null($savedService->fqdn)) {
|
if ($command->value() === 'FQDN' && is_null($savedService->fqdn) && !$foundEnv) {
|
||||||
$savedService->fqdn = $fqdn;
|
$savedService->fqdn = $fqdn;
|
||||||
$savedService->save();
|
$savedService->save();
|
||||||
}
|
}
|
||||||
@ -1039,7 +1036,7 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal
|
|||||||
$serviceLabels = $serviceLabels->merge($defaultLabels);
|
$serviceLabels = $serviceLabels->merge($defaultLabels);
|
||||||
if (!$isDatabase && $fqdns->count() > 0) {
|
if (!$isDatabase && $fqdns->count() > 0) {
|
||||||
if ($fqdns) {
|
if ($fqdns) {
|
||||||
$serviceLabels = $serviceLabels->merge(fqdnLabelsForTraefik($resource->uuid, $fqdns, true, serviceLabels: $serviceLabels, is_gzip_enabled: $savedService->isGzipEnabled()));
|
$serviceLabels = $serviceLabels->merge(fqdnLabelsForTraefik($resource->uuid, $fqdns, true, serviceLabels: $serviceLabels, is_gzip_enabled: $savedService->isGzipEnabled(), service_name: $serviceName));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($resource->server->isLogDrainEnabled() && $savedService->isLogDrainEnabled()) {
|
if ($resource->server->isLogDrainEnabled() && $savedService->isLogDrainEnabled()) {
|
||||||
@ -1480,7 +1477,7 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal
|
|||||||
return $preview_fqdn;
|
return $preview_fqdn;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
$serviceLabels = $serviceLabels->merge(fqdnLabelsForTraefik($uuid, $fqdns,serviceLabels: $serviceLabels));
|
$serviceLabels = $serviceLabels->merge(fqdnLabelsForTraefik($uuid, $fqdns, serviceLabels: $serviceLabels));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
// The release version of your application
|
// The release version of your application
|
||||||
// Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
|
// Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
|
||||||
'release' => '4.0.0-beta.221',
|
'release' => '4.0.0-beta.222',
|
||||||
// When left empty or `null` the Laravel environment will be used
|
// When left empty or `null` the Laravel environment will be used
|
||||||
'environment' => config('app.env'),
|
'environment' => config('app.env'),
|
||||||
|
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
return '4.0.0-beta.221';
|
return '4.0.0-beta.222';
|
||||||
|
@ -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('github_apps', function (Blueprint $table) {
|
||||||
|
$table->string('contents')->nullable();
|
||||||
|
$table->string('metadata')->nullable();
|
||||||
|
$table->string('pull_requests')->nullable();
|
||||||
|
$table->string('administration')->nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('github_apps', function (Blueprint $table) {
|
||||||
|
$table->dropColumn('contents');
|
||||||
|
$table->dropColumn('metadata');
|
||||||
|
$table->dropColumn('pull_requests');
|
||||||
|
$table->dropColumn('administration');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,28 @@
|
|||||||
|
<?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('application_deployment_queues', function (Blueprint $table) {
|
||||||
|
$table->boolean('only_this_server')->default(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('application_deployment_queues', function (Blueprint $table) {
|
||||||
|
$table->dropColumn('only_this_server');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
19
public/svgs/appsmith.svg
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<svg width="924" height="235" viewBox="0 0 924 235" fill="ffffff" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_1_41)">
|
||||||
|
<path d="M602.936 59.0637C601.82 58.0005 600.937 56.7175 600.342 55.2956C599.746 53.8738 599.452 52.344 599.478 50.8028C599.478 47.673 600.722 44.6712 602.935 42.4581C605.148 40.2449 608.15 39.0016 611.28 39.0016C612.821 38.9758 614.351 39.2697 615.772 39.8648C617.194 40.46 618.477 41.3434 619.54 42.4593C620.635 43.5541 621.498 44.8581 622.078 46.2936C622.658 47.7291 622.943 49.2667 622.916 50.8146C622.941 52.3558 622.648 53.8856 622.052 55.3074C621.457 56.7293 620.574 58.0123 619.458 59.0755C618.389 60.1594 617.114 61.0169 615.706 61.5968C614.299 62.1767 612.79 62.4671 611.268 62.4507C609.723 62.4725 608.19 62.184 606.758 61.6022C605.327 61.0204 604.027 60.1572 602.936 59.0637V59.0637Z" fill="#ffffff"/>
|
||||||
|
<path d="M62.7915 160.047C61.7766 158.246 60.9899 154.705 60.4313 149.426C54.5778 157.876 45.2351 162.097 32.4032 162.089C22.8284 162.089 15.2009 159.784 9.52053 155.173C3.84018 150.563 1 144.143 1 135.914C1 120.045 12.1443 110.997 34.433 108.771L47.6033 107.591C51.9934 107.036 55.1443 105.986 57.0443 104.475C58.023 103.637 58.7921 102.581 59.29 101.393C59.788 100.204 60.001 98.9159 59.912 97.6303C59.912 93.9169 58.7043 91.1868 56.289 89.4402C53.8737 87.6936 49.7904 86.8204 44.0393 86.8204C37.8554 86.8204 33.4103 87.8628 30.7038 89.9477C28.0013 92.0365 26.42 95.6005 25.9833 100.675H5.03605C6.27125 80.8646 19.3313 70.9555 44.2163 70.9476C68.4247 70.9476 80.5249 79.6727 80.5171 97.1229V143.561C80.5171 151.224 81.6972 156.731 84.0574 160.083L62.7915 160.047ZM53.6691 141.425C57.8389 137.766 59.9199 132.503 59.912 125.635V117.704C57.894 119.51 54.566 120.69 49.9517 121.245L38.4691 122.543C32.8045 123.227 28.792 124.553 26.4318 126.52C25.2054 127.563 24.2386 128.876 23.6077 130.357C22.9769 131.838 22.6993 133.446 22.797 135.052C22.7027 136.7 22.9938 138.348 23.6473 139.864C24.3008 141.379 25.2986 142.722 26.5616 143.785C29.1028 145.862 32.7337 146.901 37.4542 146.901C44.1022 146.877 49.5072 145.052 53.6691 141.425Z" fill="#ffffff"/>
|
||||||
|
<path d="M186.056 83.2092C193.042 91.5409 196.531 102.63 196.524 116.477C196.516 130.324 193.026 141.338 186.056 149.521C178.975 157.852 169.463 162.018 157.52 162.018C145.577 162.018 136.569 157.573 130.495 148.683V193.091H109.253V72.9067H129.681V85.4042C135.975 75.7272 145.263 70.8847 157.544 70.8768C169.463 70.8768 178.967 74.9876 186.056 83.2092V83.2092ZM152.458 144.505C159.428 144.505 164.935 141.972 168.979 136.905C173.023 131.838 174.99 124.805 174.88 115.804C174.88 106.906 172.937 100.12 169.05 95.4471C165.164 90.7738 159.621 88.4371 152.422 88.4371C145.341 88.4371 139.834 90.8603 135.9 95.7067C131.967 100.553 130 107.477 130 116.477C130 125.588 132.026 132.511 136.077 137.247C139.901 142.086 145.361 144.505 152.458 144.505Z" fill="#ffffff"/>
|
||||||
|
<path d="M295.501 83.2092C302.487 91.5409 305.977 102.63 305.969 116.477C305.961 130.324 302.472 141.338 295.501 149.521C288.42 157.852 278.908 162.018 266.965 162.018C255.023 162.018 246.014 157.573 239.941 148.683V193.091H218.698V72.9067H239.138V85.4042C245.432 75.7272 254.72 70.8847 267.001 70.8768C278.873 70.8768 288.373 74.9876 295.501 83.2092ZM261.903 144.505C268.873 144.505 274.381 141.972 278.424 136.905C282.468 131.838 284.435 124.805 284.325 115.804C284.325 106.906 282.382 100.12 278.495 95.4471C274.609 90.7738 269.066 88.4371 261.867 88.4371C254.787 88.4371 249.279 90.8603 245.346 95.7067C241.412 100.553 239.445 107.477 239.445 116.477C239.445 125.588 241.475 132.511 245.534 137.247C249.311 142.086 254.747 144.505 261.844 144.505H261.903Z" fill="#ffffff"/>
|
||||||
|
<path d="M325.158 132.35H345.928C346.494 137.755 348.268 141.582 351.25 143.832C354.232 146.082 358.933 147.208 365.353 147.208C376.839 147.208 382.583 143.718 382.583 136.74C382.644 135.312 382.333 133.892 381.682 132.62C381.03 131.348 380.06 130.267 378.865 129.482C376.387 127.79 371.938 126.382 365.518 125.257L355.558 123.57C336.534 120.423 327.022 111.642 327.022 97.2291C327.022 89.0075 330.169 82.5601 336.463 77.8868C342.757 73.2135 351.651 70.8768 363.146 70.8768C388.023 70.8768 400.859 80.7112 401.653 100.38H381.591C381.363 95.2111 379.731 91.5251 376.694 89.3222C373.657 87.1193 369.153 86.0218 363.181 86.0297C353.048 86.0297 347.981 89.4088 347.981 96.167C347.928 97.4972 348.209 98.8196 348.799 100.013C349.388 101.207 350.268 102.234 351.356 103C353.614 104.628 357.332 105.895 362.509 106.8L373.484 108.488C384.066 110.399 391.748 113.44 396.532 117.61C401.315 121.78 403.707 127.578 403.707 135.005C403.707 143.785 400.332 150.539 393.581 155.268C386.831 159.996 377.315 162.356 365.034 162.349C339.591 162.388 326.298 152.388 325.158 132.35V132.35Z" fill="#ffffff"/>
|
||||||
|
<path d="M549.335 79.3265C554.677 84.9597 557.352 92.6699 557.36 102.457V160.047H536.117V105.832C536.117 94.8177 531.106 89.3104 521.082 89.3104C518.592 89.2151 516.113 89.6885 513.833 90.6945C511.553 91.7006 509.532 93.2129 507.924 95.1167C504.612 98.9954 502.952 104.652 502.944 112.087V160.047H481.867V105.832C481.867 94.8177 476.804 89.3104 466.678 89.3104C464.224 89.2393 461.785 89.7271 459.546 90.7371C457.307 91.7471 455.327 93.2527 453.756 95.1403C450.428 99.0189 448.768 104.676 448.776 112.111V160.071H427.534V72.9067H448.139V85.4042C454.094 75.7272 462.355 70.8847 472.921 70.8768C486.21 70.8768 495.218 76.2818 499.946 87.0918C506.468 76.2818 515.473 70.8768 526.959 70.8768C536.534 70.8768 543.993 73.6934 549.335 79.3265V79.3265Z" fill="#ffffff"/>
|
||||||
|
<path d="M720.347 89.1216H693.204V136.232C693.204 139.041 693.963 141.008 695.482 142.133C697 143.258 699.545 143.809 703.117 143.785H718.66V160C714.045 160.449 702.055 160.673 699.235 160.673C689.794 160.673 682.898 158.899 678.547 155.35C674.196 151.802 672.029 146.145 672.044 138.38V89.1216H652.289V72.9066H672.044V43.8165H693.204V72.9066H720.347V89.1216Z" fill="#ffffff"/>
|
||||||
|
<path d="M815.536 79.0669C821.004 84.5348 823.734 92.2765 823.726 102.292V160.047H802.484V105.832C802.484 94.8177 797.024 89.3104 786.104 89.3104C783.52 89.2569 780.955 89.746 778.572 90.7461C776.19 91.7463 774.044 93.2352 772.273 95.1167C768.512 98.9953 766.628 104.369 766.62 111.237V160.047H745.378V43.8165H766.62V84.5545C773.26 75.4439 782.095 70.8847 793.126 70.8768C802.614 70.8768 810.084 73.6069 815.536 79.0669V79.0669Z" fill="#ffffff"/>
|
||||||
|
<path d="M840.909 188.748V172.533H923.99V188.748H840.909Z" fill="#FF6D2D"/>
|
||||||
|
<path d="M622.101 143.832V72.9066H577.363V89.1216H600.836V143.832H577.363V160.047H645.574V143.832H622.101Z" fill="#ffffff"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_1_41">
|
||||||
|
<rect width="924" height="235" fill="black"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 6.5 KiB |
1
public/svgs/appwrite.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="112" height="98" fill="none" class="u-max-width-100-percent" viewBox="0 0 112 98"><path fill="#FD366E" d="M111.1 73.473v24.49H48.87c-18.13 0-33.96-9.849-42.429-24.49A48.7 48.7 0 0 1 0 52.293V45.67a48.5 48.5 0 0 1 1.732-10.048C7.545 15.064 26.448 0 48.871 0c22.422 0 41.323 15.064 47.136 35.623H69.398C65.03 28.922 57.47 24.491 48.872 24.491s-16.16 4.43-20.528 11.132a24.3 24.3 0 0 0-3.042 6.68 24.5 24.5 0 0 0-.921 6.679c0 7.02 2.952 13.348 7.685 17.811a24.4 24.4 0 0 0 16.806 6.68z"/><path fill="#FD366E" d="M111.1 42.303v24.49H65.676a24.4 24.4 0 0 0 7.686-17.81c0-2.316-.321-4.556-.922-6.68z"/></svg>
|
After Width: | Height: | Size: 649 B |
BIN
public/svgs/babybuddy.png
Normal file
After Width: | Height: | Size: 27 KiB |
59
public/svgs/bitwarden.svg
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
version="1.1"
|
||||||
|
id="svg2"
|
||||||
|
xml:space="preserve"
|
||||||
|
width="64"
|
||||||
|
height="64"
|
||||||
|
viewBox="0 0 64 63.999999"
|
||||||
|
sodipodi:docname="bitwarden-icon.svg"
|
||||||
|
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
|
||||||
|
id="metadata8"><rdf:RDF><cc:Work
|
||||||
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||||
|
id="defs6"><clipPath
|
||||||
|
clipPathUnits="userSpaceOnUse"
|
||||||
|
id="clipPath18"><path
|
||||||
|
d="M 0,1500 H 1500 V 0 H 0 Z"
|
||||||
|
id="path16"
|
||||||
|
inkscape:connector-curvature="0" /></clipPath></defs><sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1440"
|
||||||
|
inkscape:window-height="799"
|
||||||
|
id="namedview4"
|
||||||
|
showgrid="false"
|
||||||
|
fit-margin-top="50"
|
||||||
|
fit-margin-left="50"
|
||||||
|
fit-margin-right="50"
|
||||||
|
fit-margin-bottom="50"
|
||||||
|
inkscape:zoom="5.3400704"
|
||||||
|
inkscape:cx="72.883247"
|
||||||
|
inkscape:cy="23.722997"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="1"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="g10" /><g
|
||||||
|
id="g10"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
inkscape:label="logo-vertical"
|
||||||
|
transform="matrix(1.3333333,0,0,-1.3333333,31.882666,774.35078)"><path
|
||||||
|
d="m 20.088053,578.76279 v -24.00016 c 0,-1.79111 -0.34893,-3.56734 -1.046785,-5.32749 -0.698165,-1.76104 -1.562895,-3.32302 -2.593423,-4.68822 -1.031908,-1.36442 -2.261363,-2.69188 -3.687599,-3.98376 -1.427771,-1.29219 -2.745111,-2.36474 -3.9537075,-3.21903 -1.2081373,-0.85369 -2.4685751,-1.66122 -3.7808519,-2.42195 -1.3125864,-0.76028 -2.2452616,-1.27562 -2.7971051,-1.54665 -0.5518437,-0.27117 -0.9947907,-0.47961 -1.3280751,-0.6253 -0.2500014,-0.12451 -0.5211689,-0.18713 -0.8124295,-0.18713 -0.2917201,0 -0.5624267,0.0627 -0.81258076,0.18713 -0.33343844,0.14566 -0.77607884,0.35413 -1.32776984,0.6253 -0.552611,0.27103 -1.4845188,0.78637 -2.7972576,1.54665 -1.3125851,0.76073 -2.5731749,1.56826 -3.7814668,2.42195 -1.2081351,0.85429 -2.5257829,1.92684 -3.9529389,3.21903 -1.427156,1.29188 -2.655998,2.61934 -3.687139,3.98376 -1.031297,1.3652 -1.896026,2.92718 -2.594036,4.68822 -0.69801,1.76015 -1.046939,3.53638 -1.046939,5.32749 v 24.00016 c 0,0.54172 0.198161,1.01088 0.594021,1.40629 0.395556,0.39586 0.864578,0.59402 1.405992,0.59402 h 36.000846 c 0.540954,0 1.009208,-0.19816 1.405377,-0.59402 0.396014,-0.39541 0.593868,-0.86457 0.593868,-1.40629 m -6.000346,-24.00016 v 20.00043 H 0.0880769 v -35.53105 c 2.4786974,1.31259 4.6980372,2.73943 6.6564844,4.281 4.8952787,3.83317 7.3431457,7.58318 7.3431457,11.24962"
|
||||||
|
style="fill:#3c8dbc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.15337521"
|
||||||
|
id="path28"
|
||||||
|
inkscape:connector-curvature="0" /></g></svg>
|
After Width: | Height: | Size: 3.4 KiB |
15
public/svgs/code-server.svg
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<svg width="45" height="31" viewBox="0 0 45 31" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_5345_61190)">
|
||||||
|
<path d="M42.9532 13.469C42.0762 13.469 41.4914 12.9612 41.4914 11.919V5.93276C41.4914 2.1112 39.8966 0 35.7767 0H33.8629V4.03534H34.4477C36.069 4.03534 36.8399 4.91724 36.8399 6.49396V11.7854C36.8399 14.0836 37.5309 15.019 39.046 15.5C37.5309 15.9544 36.8399 16.9164 36.8399 19.2146C36.8399 20.5242 36.8399 21.8336 36.8399 23.1432C36.8399 24.2388 36.8399 25.3078 36.5475 26.4034C36.2552 27.419 35.7767 28.381 35.1122 29.2094C34.7401 29.6906 34.3148 30.0914 33.8364 30.4656V31H35.7501C39.87 31 41.4649 28.8888 41.4649 25.0672V19.081C41.4649 18.012 42.023 17.531 42.9267 17.531H44.0165V13.4956H42.9532V13.469Z" fill="white"/>
|
||||||
|
<path d="M29.929 6.09391H24.0282C23.8953 6.09391 23.7891 5.98701 23.7891 5.85339V5.39909C23.7891 5.26547 23.8953 5.15857 24.0282 5.15857H29.9556C30.0884 5.15857 30.1948 5.26547 30.1948 5.39909V5.85339C30.1948 5.98701 30.0618 6.09391 29.929 6.09391Z" fill="white"/>
|
||||||
|
<path d="M30.9388 11.8661H26.6328C26.4999 11.8661 26.3936 11.7591 26.3936 11.6255V11.1713C26.3936 11.0377 26.4999 10.9307 26.6328 10.9307H30.9388C31.0717 10.9307 31.1779 11.0377 31.1779 11.1713V11.6255C31.1779 11.7325 31.0717 11.8661 30.9388 11.8661Z" fill="white"/>
|
||||||
|
<path d="M32.6401 8.97996H24.0282C23.8953 8.97996 23.7891 8.87306 23.7891 8.73944V8.28513C23.7891 8.1515 23.8953 8.04462 24.0282 8.04462H32.6135C32.7464 8.04462 32.8528 8.1515 32.8528 8.28513V8.73944C32.8528 8.84634 32.773 8.97996 32.6401 8.97996Z" fill="white"/>
|
||||||
|
<path d="M17.1972 7.40258C17.7819 7.40258 18.3668 7.45604 18.9249 7.58966V6.49396C18.9249 4.94396 19.7223 4.03534 21.3171 4.03534H21.9019V0H19.9881C15.8682 0 14.2734 2.1112 14.2734 5.93276V7.91034C15.2037 7.58966 16.1872 7.40258 17.1972 7.40258Z" fill="white"/>
|
||||||
|
<path d="M34.4476 21.94C34.0223 18.546 31.4175 15.7132 28.0684 15.0718C27.1381 14.8848 26.2078 14.858 25.3041 15.0184C25.2775 15.0184 25.2775 14.9916 25.2509 14.9916C23.789 11.9184 20.6527 9.88733 17.2504 9.88733C13.8481 9.88733 10.7383 11.865 9.24981 14.9382C9.22324 14.9382 9.22324 14.965 9.19665 14.965C8.23978 14.858 7.2829 14.9114 6.32602 15.152C3.03011 15.9537 0.531599 18.733 0.0797398 22.1002C0.0265799 22.4476 0 22.795 0 23.1158C0 24.1312 0.691078 25.0666 1.70111 25.2002C2.95037 25.3874 4.04014 24.4252 4.01357 23.196C4.01357 23.0088 4.01357 22.795 4.04014 22.608C4.25279 20.8976 5.5552 19.4546 7.25631 19.0537C7.78792 18.92 8.31951 18.8934 8.82454 18.9736C10.4459 19.1874 12.0407 18.3588 12.7318 16.9158C13.2368 15.8468 14.0342 14.9114 15.0974 14.4037C16.2669 13.8425 17.5959 13.7624 18.8186 14.19C20.0944 14.6442 21.0513 15.6062 21.6361 16.8088C22.2474 17.9848 22.5397 18.8132 23.8422 18.9736C24.3738 19.0537 25.8622 19.027 26.4205 19.0002C27.5102 19.0002 28.6 19.3744 29.3708 20.1494C29.8758 20.6838 30.2479 21.352 30.4074 22.1002C30.6466 23.3028 30.3543 24.5054 29.6366 25.414C29.1316 26.0554 28.4405 26.5364 27.6697 26.7502C27.2975 26.8572 26.9254 26.8838 26.5533 26.8838C26.3407 26.8838 26.0484 26.8838 25.7028 26.8838C24.6396 26.8838 22.3803 26.8838 20.6791 26.8838C19.5097 26.8838 18.5793 25.9486 18.5793 24.7726V20.8175V16.9425C18.5793 16.6218 18.3136 16.3546 17.9946 16.3546H17.1706C15.5492 16.3812 14.2468 18.1986 14.2468 20.1226C14.2468 22.0468 14.2468 27.1512 14.2468 27.1512C14.2468 29.2356 15.9213 30.9192 17.9946 30.9192C17.9946 30.9192 27.2179 30.8925 27.3507 30.8925C29.4771 30.6787 31.444 29.583 32.773 27.8994C34.1021 26.2692 34.7134 24.1312 34.4476 21.94Z" fill="white"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_5345_61190">
|
||||||
|
<rect width="44.2857" height="31" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.6 KiB |
31
public/svgs/directus.svg
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<svg width="1024" height="1028" viewBox="0 0 1024 1028" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_1255_4057)">
|
||||||
|
<rect width="1024" height="1028" fill="#6644FF"/>
|
||||||
|
<path d="M0 856.177V0H1024V1028H987.478C944.858 1005.08 881.857 978.413 792.583 956.099C706.535 934.591 579.091 924.288 443.621 913.336C289.815 900.902 125.662 887.631 0 856.177Z" fill="#754DFC"/>
|
||||||
|
<path d="M0 630.724V0H1024V864.167C987.48 836.871 914.997 793.6 788.518 757.39C703.262 732.982 576.241 718.365 441.22 702.828C288.002 685.197 124.482 666.38 0 630.724Z" fill="#8555F8"/>
|
||||||
|
<path d="M0 385.079V0H1024V661.623C992.243 634.157 920.217 583.508 783.219 539.058C698.867 511.689 572.433 492.648 438.037 472.408C285.691 449.465 123.114 424.981 0 385.079Z" fill="#945EF5"/>
|
||||||
|
<path d="M1024 0V470.993C995.948 444.51 924.692 389.046 780.011 339.296C696.15 310.459 570.068 289.215 436.045 266.632C284.289 241.062 122.352 213.776 0 171.81V0H1024Z" fill="#A366F1"/>
|
||||||
|
<path d="M170.96 0H1024V278.073C1008.47 260.248 941.186 192.346 771.386 130.624C688.04 100.328 562.349 76.8867 428.741 51.9689C343.042 35.9861 254.087 19.396 170.96 0Z" fill="#B36EEE"/>
|
||||||
|
<g filter="url(#filter0_dd_1255_4057)">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M751.713 578.4C748 577.472 744.906 576.544 742.122 575.306C740.063 574.391 738.343 573.308 736.836 572.055C735.835 571.222 735.405 569.911 735.529 568.615C737.022 553.073 735.38 539.364 736.862 523.951C743.05 461.46 782.345 481.259 817.617 471.05C837.872 465.345 858.126 454.117 865.527 432.032C866.739 428.417 865.672 424.486 863.154 421.622C840.049 395.355 814.469 372.145 786.676 352.254C693.499 285.923 572.404 258.379 461.196 274.491C456.983 275.101 454.775 279.768 457.077 283.348C471.161 305.263 489.743 323.197 511.052 336.397C514.925 338.796 513.368 343.978 508.923 342.981C498.473 340.639 485.045 336.07 472.417 327.159C471.2 326.301 469.632 326.084 468.249 326.636C462.603 328.887 454.451 332.133 447.714 335.041C443.836 336.715 443.046 341.715 446.238 344.482C502.095 392.893 583.352 400.252 646.98 361.511C650.856 359.151 657.062 364.001 655.813 368.363C653.814 375.352 651.478 384.958 648.991 398.04C633.211 477.856 587.728 471.669 531.417 451.56C418.895 410.784 355.06 445.604 298.306 376.675C294.363 371.885 287.431 370.225 282.74 374.285C271.024 384.427 264.09 399.231 264.09 415.055C264.09 433.797 273.766 449.851 288.108 459.461C289.902 460.664 292.286 460.156 293.624 458.461C297.119 454.039 299.978 451.107 303.538 449.253C307.434 447.224 309.335 452.797 306.045 455.709C293.991 466.38 290.532 479.092 282.655 504.152C270.278 543.441 275.538 583.659 217.679 594.177C187.048 595.724 187.667 616.452 176.528 647.388C163.601 684.728 146.674 701.267 115.345 733.897C111.061 738.359 110.693 745.495 115.402 749.508C127.916 760.172 140.822 760.758 153.942 755.357C186.429 741.745 211.491 699.671 235.006 672.447C261.306 642.129 324.424 655.122 372.073 625.423C397.77 609.668 413.21 589.543 408.273 559.396C407.477 554.54 413.034 551.622 415.049 556.111C418.875 564.633 421.383 573.723 422.426 583.116C422.699 585.578 424.9 587.4 427.374 587.261C478.926 584.363 545.591 641.216 607.891 656.599C611.681 657.535 614.375 653.158 612.232 649.896C608.291 643.894 604.94 637.666 602.271 631.301C599.515 624.689 597.427 618.274 595.951 612.082C594.796 607.24 601.872 605.938 604.288 610.292C620.266 639.089 652.198 666.13 696.639 669.353C711.8 670.591 728.508 668.734 745.835 663.475C766.565 657.288 785.748 649.244 808.644 653.576C825.661 656.669 841.441 665.331 851.342 679.872C865.235 700.13 894.563 705.498 910.194 684.325C912.321 681.444 912.5 677.592 911.094 674.298C876.675 593.634 789.279 588.093 751.713 578.4Z" fill="white"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<filter id="filter0_dd_1255_4057" x="52" y="222" width="920" height="608.703" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||||
|
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||||
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||||
|
<feOffset dy="12"/>
|
||||||
|
<feGaussianBlur stdDeviation="30"/>
|
||||||
|
<feColorMatrix type="matrix" values="0 0 0 0 0.0901961 0 0 0 0 0.160784 0 0 0 0 0.25098 0 0 0 0.1 0"/>
|
||||||
|
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1255_4057"/>
|
||||||
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
|
||||||
|
<feOffset dy="16"/>
|
||||||
|
<feColorMatrix type="matrix" values="0 0 0 0 0.0901961 0 0 0 0 0.160784 0 0 0 0 0.25098 0 0 0 0.1 0"/>
|
||||||
|
<feBlend mode="normal" in2="effect1_dropShadow_1255_4057" result="effect2_dropShadow_1255_4057"/>
|
||||||
|
<feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow_1255_4057" result="shape"/>
|
||||||
|
</filter>
|
||||||
|
<clipPath id="clip0_1255_4057">
|
||||||
|
<rect width="1024" height="1028" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.7 KiB |
BIN
public/svgs/docker-registry.png
Normal file
After Width: | Height: | Size: 7.0 KiB |
1
public/svgs/docker.svg
Normal file
After Width: | Height: | Size: 6.4 KiB |
BIN
public/svgs/dokuwiki.png
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
public/svgs/duplicati.webp
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
public/svgs/emby.png
Normal file
After Width: | Height: | Size: 849 KiB |
1
public/svgs/fider.svg
Normal file
After Width: | Height: | Size: 9.7 KiB |
147
public/svgs/filebrowser.svg
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xml:space="preserve"
|
||||||
|
width="560"
|
||||||
|
height="560"
|
||||||
|
version="1.1"
|
||||||
|
style="clip-rule:evenodd;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision"
|
||||||
|
viewBox="0 0 560 560"
|
||||||
|
id="svg44"
|
||||||
|
sodipodi:docname="icon_raw.svg"
|
||||||
|
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||||
|
inkscape:export-filename="/home/umarcor/filebrowser/logo/icon_raw.svg.png"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96"><metadata
|
||||||
|
id="metadata48"><rdf:RDF><cc:Work
|
||||||
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1366"
|
||||||
|
inkscape:window-height="711"
|
||||||
|
id="namedview46"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="0.33714286"
|
||||||
|
inkscape:cx="-172.33051"
|
||||||
|
inkscape:cy="280"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="20"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg44" />
|
||||||
|
<defs
|
||||||
|
id="defs4">
|
||||||
|
<style
|
||||||
|
type="text/css"
|
||||||
|
id="style2">
|
||||||
|
<![CDATA[
|
||||||
|
.fil1 {fill:#FEFEFE}
|
||||||
|
.fil6 {fill:#006498}
|
||||||
|
.fil7 {fill:#0EA5EB}
|
||||||
|
.fil8 {fill:#2979FF}
|
||||||
|
.fil3 {fill:#2BBCFF}
|
||||||
|
.fil0 {fill:#455A64}
|
||||||
|
.fil4 {fill:#53C6FC}
|
||||||
|
.fil5 {fill:#BDEAFF}
|
||||||
|
.fil2 {fill:#332C2B;fill-opacity:0.149020}
|
||||||
|
]]>
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="g85"
|
||||||
|
transform="translate(-70,-70)"><path
|
||||||
|
class="fil1"
|
||||||
|
d="M 350,71 C 504,71 629,196 629,350 629,504 504,629 350,629 196,629 71,504 71,350 71,196 196,71 350,71 Z"
|
||||||
|
id="path9"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#fefefe" /><path
|
||||||
|
class="fil2"
|
||||||
|
d="M 475,236 593,387 C 596,503 444,639 301,585 L 225,486 339,330 c 0,0 138,-95 136,-94 z"
|
||||||
|
id="path11"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#332c2b;fill-opacity:0.14902003" /><path
|
||||||
|
class="fil3"
|
||||||
|
d="m 231,211 h 208 l 38,24 v 246 c 0,5 -3,8 -8,8 H 231 c -5,0 -8,-3 -8,-8 V 219 c 0,-5 3,-8 8,-8 z"
|
||||||
|
id="path13"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#2bbcff" /><path
|
||||||
|
class="fil4"
|
||||||
|
d="m 231,211 h 208 l 38,24 v 2 L 440,214 H 231 c -4,0 -7,3 -7,7 v 263 c -1,-1 -1,-2 -1,-3 V 219 c 0,-5 3,-8 8,-8 z"
|
||||||
|
id="path15"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#53c6fc" /><polygon
|
||||||
|
class="fil5"
|
||||||
|
points="305,212 418,212 418,310 305,310 "
|
||||||
|
id="polygon17"
|
||||||
|
style="fill:#bdeaff" /><path
|
||||||
|
class="fil5"
|
||||||
|
d="m 255,363 h 189 c 3,0 5,2 5,4 V 483 H 250 V 367 c 0,-2 2,-4 5,-4 z"
|
||||||
|
id="path19"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#bdeaff" /><polygon
|
||||||
|
class="fil6"
|
||||||
|
points="250,470 449,470 449,483 250,483 "
|
||||||
|
id="polygon21"
|
||||||
|
style="fill:#006498" /><path
|
||||||
|
class="fil6"
|
||||||
|
d="m 380,226 h 10 c 3,0 6,2 6,5 v 40 c 0,3 -3,6 -6,6 h -10 c -3,0 -6,-3 -6,-6 v -40 c 0,-3 3,-5 6,-5 z"
|
||||||
|
id="path23"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#006498" /><path
|
||||||
|
class="fil1"
|
||||||
|
d="m 254,226 c 10,0 17,7 17,17 0,9 -7,16 -17,16 -9,0 -17,-7 -17,-16 0,-10 8,-17 17,-17 z"
|
||||||
|
id="path25"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#fefefe" /><path
|
||||||
|
class="fil6"
|
||||||
|
d="m 267,448 h 165 c 2,0 3,1 3,3 v 0 c 0,1 -1,3 -3,3 H 267 c -2,0 -3,-2 -3,-3 v 0 c 0,-2 1,-3 3,-3 z"
|
||||||
|
id="path27"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#006498" /><path
|
||||||
|
class="fil6"
|
||||||
|
d="m 267,415 h 165 c 2,0 3,1 3,3 v 0 c 0,1 -1,2 -3,2 H 267 c -2,0 -3,-1 -3,-2 v 0 c 0,-2 1,-3 3,-3 z"
|
||||||
|
id="path29"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#006498" /><path
|
||||||
|
class="fil6"
|
||||||
|
d="m 267,381 h 165 c 2,0 3,2 3,3 v 0 c 0,2 -1,3 -3,3 H 267 c -2,0 -3,-1 -3,-3 v 0 c 0,-1 1,-3 3,-3 z"
|
||||||
|
id="path31"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#006498" /><path
|
||||||
|
class="fil1"
|
||||||
|
d="m 236,472 c 3,0 5,2 5,5 0,2 -2,4 -5,4 -3,0 -5,-2 -5,-4 0,-3 2,-5 5,-5 z"
|
||||||
|
id="path33"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#fefefe" /><path
|
||||||
|
class="fil1"
|
||||||
|
d="m 463,472 c 3,0 5,2 5,5 0,2 -2,4 -5,4 -3,0 -5,-2 -5,-4 0,-3 2,-5 5,-5 z"
|
||||||
|
id="path35"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#fefefe" /><polygon
|
||||||
|
class="fil6"
|
||||||
|
points="305,212 284,212 284,310 305,310 "
|
||||||
|
id="polygon37"
|
||||||
|
style="fill:#006498" /><path
|
||||||
|
class="fil7"
|
||||||
|
d="m 477,479 v 2 c 0,5 -3,8 -8,8 H 231 c -5,0 -8,-3 -8,-8 v -2 c 0,4 3,8 8,8 h 238 c 5,0 8,-4 8,-8 z"
|
||||||
|
id="path39"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#0ea5eb" /><path
|
||||||
|
class="fil8"
|
||||||
|
d="M 350,70 C 505,70 630,195 630,350 630,505 505,630 350,630 195,630 70,505 70,350 70,195 195,70 350,70 Z m 0,46 C 479,116 584,221 584,350 584,479 479,584 350,584 221,584 116,479 116,350 116,221 221,116 350,116 Z"
|
||||||
|
id="path41"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#2979ff" /></g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.4 KiB |
BIN
public/svgs/formbricks.png
Normal file
After Width: | Height: | Size: 22 KiB |
9
public/svgs/ghost.svg
Normal file
After Width: | Height: | Size: 9.7 KiB |
1
public/svgs/git.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#F34F29" d="M124.737 58.378L69.621 3.264c-3.172-3.174-8.32-3.174-11.497 0L46.68 14.71l14.518 14.518c3.375-1.139 7.243-.375 9.932 2.314 2.703 2.706 3.461 6.607 2.294 9.993l13.992 13.993c3.385-1.167 7.292-.413 9.994 2.295 3.78 3.777 3.78 9.9 0 13.679a9.673 9.673 0 01-13.683 0 9.677 9.677 0 01-2.105-10.521L68.574 47.933l-.002 34.341a9.708 9.708 0 012.559 1.828c3.778 3.777 3.778 9.898 0 13.683-3.779 3.777-9.904 3.777-13.679 0-3.778-3.784-3.778-9.905 0-13.683a9.65 9.65 0 013.167-2.11V47.333a9.581 9.581 0 01-3.167-2.111c-2.862-2.86-3.551-7.06-2.083-10.576L41.056 20.333 3.264 58.123a8.133 8.133 0 000 11.5l55.117 55.114c3.174 3.174 8.32 3.174 11.499 0l54.858-54.858a8.135 8.135 0 00-.001-11.501z"/></svg>
|
After Width: | Height: | Size: 778 B |
31
public/svgs/gitea.svg
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="100 100 800 520" xml:space="preserve">
|
||||||
|
<style type="text/css">
|
||||||
|
.st0{fill:#73A952;}
|
||||||
|
.st1{fill:#303030;}
|
||||||
|
</style>
|
||||||
|
<g id="Layer_2_1_">
|
||||||
|
<g>
|
||||||
|
<path class="st0" d="M822.9,149.5c-4.8-4.8-10.8-4.4-10.8-4.4s-132.1,7.3-200.3,8.9c-14.9,0.3-29.8,0.6-44.5,0.6v132.1
|
||||||
|
c-6.4-2.9-12.4-6-18.7-8.9c0-41,0-122.9,0-122.9c-32.7,0.3-100.3-2.5-100.3-2.5s-159.4-7.9-176.5-9.5c-11.1-0.6-25.4-2.2-43.8,1.6
|
||||||
|
c-9.8,1.9-37.8,8.3-60.6,30.2c-50.8,45.1-37.8,117.2-36.2,128c1.9,13,7.6,49.8,35.6,81.6c51.4,63.2,162.6,61.6,162.6,61.6
|
||||||
|
s13.7,32.7,34.6,62.5c28.3,37.1,57.2,66.4,85.1,69.9c70.8,0,212.7,0,212.7,0s13.7,0,31.8-11.7c15.9-9.5,29.8-26.4,29.8-26.4
|
||||||
|
s14.6-15.6,34.9-51.1c6.4-10.8,11.4-21.6,15.9-31.4c0,0,62.2-131.8,62.2-260.4C834.6,158.7,825.1,151.7,822.9,149.5L822.9,149.5z
|
||||||
|
M263.1,379.3c-29.2-9.5-41.6-21-41.6-21s-21.6-15.2-32.4-44.8c-18.4-50.2-1.6-80.3-1.6-80.3s9.5-25.4,43.5-33.7
|
||||||
|
c15.6-4.1,34.9-3.5,34.9-3.5s7.9,67,17.8,106c8.3,33,27.9,87.6,27.9,87.6S282.1,386,263.1,379.3L263.1,379.3z M601.2,500.3
|
||||||
|
c0,0-7,16.2-22.2,17.5c-6.7,0.3-11.7-1.3-11.7-1.3s-0.3,0-6-2.2l-127-61.9c0,0-12.4-6.4-14.3-17.5c-2.5-9.2,3.2-20.3,3.2-20.3
|
||||||
|
l61.3-126.1c0,0,5.4-10.8,13.7-14.6c0.6-0.3,2.5-1.3,5.1-1.6c9.2-2.2,20.3,3.2,20.3,3.2l124.8,60.3c0,0,14.3,6.4,17.1,18.1
|
||||||
|
c2.2,8.3-0.6,15.9-1.9,19.4C656.2,390.4,601.2,500.3,601.2,500.3L601.2,500.3z"/>
|
||||||
|
<path class="st0" d="M489.8,408.9c-9.2,0-17.5,6.7-19.4,15.6c-2.2,8.9,2.2,18.4,10.2,22.5c8.6,4.4,19.7,1.9,25.7-6
|
||||||
|
c5.7-7.9,4.8-19.1-1.9-26l27-55.2c1.6,0,4.1,0.3,7-0.6c4.8-1,7.9-4.1,7.9-4.1c4.8,1.9,9.8,4.1,14.9,7c5.4,2.9,10.5,5.4,15.2,8.3
|
||||||
|
c1,0.6,1.9,1.3,3.2,2.2c1.9,1.6,3.8,3.5,5.4,6.4c2.2,6.4-2.2,16.8-2.2,16.8c-2.5,8.6-20.6,45.7-20.6,45.7c-9.2-0.3-17.1,5.7-20,14
|
||||||
|
c-2.9,9.2,1.3,19.4,10.2,24.1s19.7,1.9,25.4-6c5.7-7.6,5.1-18.4-1.3-25.4c2.2-4.1,4.1-8.3,6.4-12.7c5.7-11.7,15.2-34.3,15.2-34.3
|
||||||
|
c1-1.9,6.4-11.7,3.2-24.1c-2.9-12.7-14.3-18.7-14.3-18.7c-13.7-8.9-33-17.1-33-17.1s0-4.8-1.3-7.9c-1.3-3.5-3.2-5.7-4.4-7
|
||||||
|
c5.4-10.8,10.5-21.6,15.9-32.7c-4.8-2.2-9.2-4.4-13.7-7c-5.4,11.1-10.8,22.2-16.2,33.3c-7.6,0-14.6,3.8-18.1,10.5
|
||||||
|
c-3.8,7-3.2,15.9,2.2,22.2L489.8,408.9L489.8,408.9z"/>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
1
public/svgs/github.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><g fill="#ffffff"><path fill-rule="evenodd" clip-rule="evenodd" d="M64 1.512c-23.493 0-42.545 19.047-42.545 42.545 0 18.797 12.19 34.745 29.095 40.37 2.126.394 2.907-.923 2.907-2.047 0-1.014-.04-4.366-.058-7.92-11.837 2.573-14.334-5.02-14.334-5.02-1.935-4.918-4.724-6.226-4.724-6.226-3.86-2.64.29-2.586.29-2.586 4.273.3 6.523 4.385 6.523 4.385 3.794 6.504 9.953 4.623 12.38 3.536.383-2.75 1.485-4.628 2.702-5.69-9.45-1.075-19.384-4.724-19.384-21.026 0-4.645 1.662-8.44 4.384-11.42-.442-1.072-1.898-5.4.412-11.26 0 0 3.572-1.142 11.7 4.363 3.395-.943 7.035-1.416 10.65-1.432 3.616.017 7.258.49 10.658 1.432 8.12-5.504 11.688-4.362 11.688-4.362 2.316 5.86.86 10.187.418 11.26 2.728 2.978 4.378 6.774 4.378 11.42 0 16.34-9.953 19.938-19.427 20.99 1.526 1.32 2.886 3.91 2.886 7.88 0 5.692-.048 10.273-.048 11.674 0 1.13.766 2.458 2.922 2.04 16.896-5.632 29.07-21.574 29.07-40.365C106.545 20.56 87.497 1.512 64 1.512z"/><path d="M37.57 62.596c-.095.212-.428.275-.73.13-.31-.14-.482-.427-.382-.64.09-.216.424-.277.733-.132.31.14.486.43.38.642zM39.293 64.52c-.203.187-.6.1-.87-.198-.278-.297-.33-.694-.124-.884.208-.188.593-.1.87.197.28.3.335.693.123.884zm1.677 2.448c-.26.182-.687.012-.95-.367-.262-.377-.262-.83.005-1.013.264-.182.684-.018.95.357.262.385.262.84-.005 1.024zm2.298 2.368c-.233.257-.73.188-1.093-.163-.372-.343-.475-.83-.242-1.087.237-.257.736-.185 1.102.163.37.342.482.83.233 1.086zm3.172 1.374c-.104.334-.582.485-1.064.344-.482-.146-.796-.536-.7-.872.1-.336.582-.493 1.067-.342.48.144.795.53.696.87zm3.48.255c.013.35-.396.642-.902.648-.508.012-.92-.272-.926-.618 0-.354.4-.642.908-.65.506-.01.92.272.92.62zm3.24-.551c.06.342-.29.694-.793.787-.494.092-.95-.12-1.014-.46-.06-.35.297-.7.79-.792.503-.088.953.118 1.017.466zm0 0"/></g><path d="M24.855 108.302h-10.7a.5.5 0 00-.5.5v5.232a.5.5 0 00.5.5h4.173v6.5s-.937.32-3.53.32c-3.056 0-7.327-1.116-7.327-10.508 0-9.393 4.448-10.63 8.624-10.63 3.614 0 5.17.636 6.162.943.31.094.6-.216.6-.492l1.193-5.055a.468.468 0 00-.192-.39c-.403-.288-2.857-1.66-9.058-1.66-7.144 0-14.472 3.038-14.472 17.65 0 14.61 8.39 16.787 15.46 16.787 5.854 0 9.405-2.502 9.405-2.502.146-.08.162-.285.162-.38v-16.316a.5.5 0 00-.5-.5zM79.506 94.81H73.48a.5.5 0 00-.498.503l.002 11.644h-9.392V95.313a.5.5 0 00-.497-.503H57.07a.5.5 0 00-.498.503v31.53c0 .277.224.503.498.503h6.025a.5.5 0 00.497-.504v-13.486h9.392l-.016 13.486c0 .278.224.504.5.504h6.038a.5.5 0 00.497-.504v-31.53a.497.497 0 00-.497-.502zm-47.166.717c-2.144 0-3.884 1.753-3.884 3.923 0 2.167 1.74 3.925 3.884 3.925 2.146 0 3.885-1.758 3.885-3.925 0-2.17-1.74-3.923-3.885-3.923zm2.956 9.608H29.29c-.276 0-.522.284-.522.56v20.852c0 .613.382.795.876.795h5.41c.595 0 .74-.292.74-.805v-20.899a.5.5 0 00-.498-.502zm67.606.047h-5.98a.5.5 0 00-.496.504v15.46s-1.52 1.11-3.675 1.11-2.727-.977-2.727-3.088v-13.482a.5.5 0 00-.497-.504h-6.068a.502.502 0 00-.498.504v14.502c0 6.27 3.495 7.804 8.302 7.804 3.944 0 7.124-2.18 7.124-2.18s.15 1.15.22 1.285c.07.136.247.273.44.273l3.86-.017a.502.502 0 00.5-.504l-.003-21.166a.504.504 0 00-.5-.502zm16.342-.708c-3.396 0-5.706 1.515-5.706 1.515V95.312a.5.5 0 00-.497-.503H107a.5.5 0 00-.5.503v31.53a.5.5 0 00.5.503h4.192c.19 0 .332-.097.437-.268.103-.17.254-1.454.254-1.454s2.47 2.34 7.148 2.34c5.49 0 8.64-2.784 8.64-12.502s-5.03-10.988-8.428-10.988zm-2.36 17.764c-2.073-.063-3.48-1.004-3.48-1.004v-9.985s1.388-.85 3.09-1.004c2.153-.193 4.228.458 4.228 5.594 0 5.417-.935 6.486-3.837 6.398zm-63.689-.118c-.263 0-.937.107-1.63.107-2.22 0-2.973-1.032-2.973-2.368v-8.866h4.52a.5.5 0 00.5-.504v-4.856a.5.5 0 00-.5-.502h-4.52l-.007-5.97c0-.227-.116-.34-.378-.34h-6.16c-.238 0-.367.106-.367.335v6.17s-3.087.745-3.295.805a.5.5 0 00-.36.48v3.877a.5.5 0 00.497.503h3.158v9.328c0 6.93 4.86 7.61 8.14 7.61 1.497 0 3.29-.48 3.586-.59.18-.067.283-.252.283-.453l.004-4.265a.51.51 0 00-.5-.502z" fill="#ffffff"/></svg>
|
After Width: | Height: | Size: 3.8 KiB |
BIN
public/svgs/glitchtip.png
Normal file
After Width: | Height: | Size: 16 KiB |
1
public/svgs/grafana.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><linearGradient id="a" x1="45.842" x2="45.842" y1="89.57" y2="8.802" gradientTransform="translate(-2.405 27.316) scale(1.4463)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fcee1f"/><stop offset="1" stop-color="#f15b2a"/></linearGradient><path fill="url(#a)" d="M69.162 0c-9.91 6.4-11.77 14.865-11.77 14.865s.002.206-.101.412c-.62.104-1.033.31-1.549.413-.722.206-1.445.413-2.168.826l-2.168.93c-1.445.722-2.89 1.341-4.336 2.167-1.342.826-2.683 1.548-4.025 2.477a1.266 1.266 0 0 1-.309-.205c-13.316-5.161-25.084 1.031-25.084 1.031-1.032 14.245 5.367 23.02 6.606 24.672-.31.929-.62 1.754-.93 2.58a52.973 52.973 0 0 0-2.166 9.91c-.103.413-.104 1.033-.207 1.445C8.671 67.613 5.06 80.103 5.06 80.103c10.219 11.768 22.193 12.49 22.193 12.49 1.445 2.685 3.302 5.369 5.264 7.743.825 1.032 1.756 1.96 2.582 2.992-3.716 10.632.619 19.613.619 19.613 11.458.413 18.992-4.955 20.54-6.297 1.136.31 2.272.724 3.407 1.034a47.25 47.25 0 0 0 10.633 1.549h4.644C80.31 126.969 89.807 128 89.807 128c6.71-7.123 7.123-14.038 7.123-15.69v-.62c1.342-1.033 2.683-2.064 4.129-3.2 2.684-2.374 4.955-5.264 7.02-8.154.206-.207.309-.62.618-.826 7.639.413 12.903-4.748 12.903-4.748-1.24-7.949-5.78-11.768-6.71-12.49l-.103-.104-.103-.104-.104-.103c0-.413.104-.93.104-1.445.103-.93.103-1.755.103-2.58v-3.407c0-.206 0-.413-.103-.722l-.104-.723-.103-.723c-.104-.929-.31-1.754-.413-2.58-.825-3.406-2.166-6.71-3.818-9.498-1.858-2.993-4.026-5.471-6.504-7.742-2.477-2.168-5.264-4.025-8.154-5.264-2.994-1.342-5.884-2.167-8.98-2.476-1.446-.207-3.098-.207-4.544-.207H79.69c-.825.103-1.546.205-2.27.308-3.096.62-5.883 1.756-8.36 3.201-2.478 1.446-4.646 3.407-6.504 5.575-1.858 2.167-3.2 4.438-4.13 6.916a23.313 23.313 0 0 0-1.548 7.431v2.684c0 .31 0 .62.104.93.103 1.238.31 2.374.722 3.51.723 2.27 1.756 4.334 3.098 6.09a19.973 19.973 0 0 0 4.54 4.335c1.756 1.136 3.408 1.96 5.266 2.477 1.858.516 3.509.826 5.16.722h2.376c.206 0 .412-.101.619-.101.206 0 .31-.104.619-.104.31-.103.825-.207 1.135-.31.722-.207 1.342-.62 2.064-.826.723-.31 1.24-.722 1.756-1.032.103-.103.309-.207.412-.31.62-.413.723-1.238.207-1.858-.413-.413-1.136-.62-1.756-.31-.103.103-.205.104-.412.207-.413.206-1.032.413-1.445.619-.62.103-1.135.31-1.754.414-.31 0-.62.102-.93.102h-2.58c-.103 0-.31.001-.414-.102-1.239-.206-2.58-.62-3.818-1.137-1.239-.619-2.478-1.34-3.51-2.373a15.894 15.894 0 0 1-2.89-3.51c-.826-1.341-1.24-2.89-1.446-4.335-.103-.826-.207-1.55-.103-2.375v-1.239c0-.413.103-.825.207-1.238.619-3.406 2.27-6.71 4.851-9.187.723-.723 1.342-1.238 2.168-1.754.826-.62 1.547-1.032 2.373-1.342.826-.31 1.756-.723 2.582-.93.93-.206 1.858-.414 2.684-.414.413 0 .929-.101 1.342-.101h1.238c1.032.103 2.065.205 2.994.412 1.961.413 3.82 1.135 5.678 2.168 3.613 2.064 6.708 5.16 8.566 8.877.93 1.858 1.548 3.82 1.961 5.988.103.62.104 1.03.207 1.547v2.787c0 .62-.103 1.136-.103 1.756-.104.62-.102 1.134-.205 1.754-.104.619-.208 1.136-.311 1.755-.206 1.136-.722 2.168-1.031 3.303-.826 2.168-1.963 4.232-3.305 5.986-2.684 3.717-6.502 6.815-10.63 8.776-2.169.929-4.337 1.755-6.608 2.064a19.003 19.003 0 0 1-3.407.309h-1.755c-.62 0-1.238.002-1.858-.102-2.477-.206-4.85-.724-7.224-1.343-2.375-.723-4.647-1.548-6.815-2.684-4.335-2.27-8.153-5.573-11.25-9.289-1.445-1.961-2.892-4.027-4.027-6.092-1.136-2.064-1.961-4.438-2.58-6.709-.723-2.27-1.032-4.645-1.135-7.02v-3.613c0-1.135.102-2.372.309-3.61.103-1.24.309-2.376.619-3.614.206-1.239.62-2.375.93-3.614.722-2.374 1.444-4.644 2.476-6.812 2.064-4.335 4.645-8.155 7.742-11.252a24.86 24.86 0 0 1 2.479-2.168c.31-.31 1.135-1.033 2.064-1.549s1.858-1.136 2.89-1.549c.414-.206.93-.413 1.446-.722.206-.103.411-.206.824-.309.207-.103.414-.207.826-.31 1.033-.413 2.066-.825 3.098-1.135.207-.103.62-.104.826-.207.207-.103.618-.102.824-.205.62-.103 1.033-.208 1.55-.414.206-.104.619-.104.825-.207.207 0 .62-.102.827-.102.206 0 .62-.103.826-.103l.412-.104.412-.103c.206 0 .62-.104.826-.104.31 0 .62-.104.93-.104.206 0 .721-.101.928-.101.206 0 .311 0 .62-.104h.723c.31 0 .618 0 .928-.103h4.647c2.064.103 4.128.31 5.986.723 3.82.722 7.638 1.961 10.941 3.613 3.304 1.548 6.4 3.611 8.877 5.78.104.102.311.207.414.413.104.103.31.206.412.412.31.207.62.62.93.826.31.207.62.62.93.827.206.31.618.618.824.927 1.136 1.136 2.169 2.375 3.098 3.51a41.422 41.422 0 0 1 4.44 7.02c.102.103.1.207.204.414.103.103.104.205.207.412.103.206.206.62.412.826.104.206.208.62.31.826.104.207.208.62.311.826.413 1.033.826 2.064 1.135 3.096.62 1.548.929 2.993 1.239 4.13.103.412.62.825 1.033.825.619 0 .927-.414.927-1.033-.31-1.755-.308-3.198-.412-4.953-.206-2.168-.619-4.647-1.238-7.434-.62-2.787-1.86-5.677-3.305-8.877-1.548-3.096-3.509-6.4-6.09-9.394-1.032-1.239-2.167-2.373-3.302-3.612 1.858-7.122-2.168-13.42-2.168-13.42-6.916-.412-11.253 2.168-12.801 3.303-.206-.103-.618-.205-.824-.308-1.136-.413-2.375-.93-3.613-1.342-1.24-.31-2.478-.827-3.717-1.033-1.239-.31-2.58-.62-4.026-.827-.206 0-.413-.103-.722-.103C77.833 4.128 69.162 0 69.162 0z"/></svg>
|
After Width: | Height: | Size: 4.8 KiB |
21
public/svgs/grocy.svg
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||||
|
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||||
|
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||||
|
width="185.000000pt" height="222.000000pt" viewBox="0 0 185.000000 222.000000"
|
||||||
|
preserveAspectRatio="xMidYMid meet">
|
||||||
|
<metadata>
|
||||||
|
Created by potrace 1.16, written by Peter Selinger 2001-2019
|
||||||
|
</metadata>
|
||||||
|
<g transform="translate(0.000000,222.000000) scale(0.100000,-0.100000)"
|
||||||
|
fill="#337ab7" stroke="none">
|
||||||
|
<path d="M983 2210 c-468 -66 -828 -418 -944 -920 -29 -124 -36 -358 -15 -478
|
||||||
|
57 -328 272 -604 565 -727 125 -53 193 -67 353 -72 112 -4 171 -1 250 12 247
|
||||||
|
41 496 156 611 284 l37 41 -5 172 c-3 95 -8 316 -11 491 l-6 319 -267 -8
|
||||||
|
c-146 -3 -342 -9 -436 -13 l-170 -6 -8 -213 c-5 -118 -7 -215 -5 -217 2 -2 81
|
||||||
|
-7 176 -11 l172 -7 0 -27 c0 -65 -12 -90 -51 -111 -60 -30 -172 -44 -241 -30
|
||||||
|
-249 52 -347 418 -180 677 105 163 290 242 537 231 68 -4 153 -15 195 -25 41
|
||||||
|
-11 77 -16 80 -11 9 13 43 526 37 542 -8 22 -124 64 -236 87 -115 23 -342 34
|
||||||
|
-438 20z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.0 KiB |
15
public/svgs/jellyfin.svg
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<svg id="banner-dark" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-50 0 600 512">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="linear-gradient" x1="110.25" y1="213.3" x2="496.14" y2="436.09" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-color="#aa5cc3"/>
|
||||||
|
<stop offset="1" stop-color="#00a4dc"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<title>banner-dark</title>
|
||||||
|
<g id="banner-dark">
|
||||||
|
<g id="banner-dark-icon">
|
||||||
|
<path id="inner-shape" d="M261.42,201.62c-20.44,0-86.24,119.29-76.2,139.43s142.48,19.92,152.4,0S281.86,201.63,261.42,201.62Z" fill="url(#linear-gradient)"/>
|
||||||
|
<path id="outer-shape" d="M261.42,23.3C199.83,23.3,1.57,382.73,31.8,443.43s429.34,60,459.24,0S323,23.3,261.42,23.3ZM411.9,390.76c-19.59,39.33-281.08,39.77-300.9,0S221.1,115.48,261.45,115.48,431.49,351.42,411.9,390.76Z" fill="url(#linear-gradient)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 952 B |
1
public/svgs/mariadb.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#fff" d="M127.434 12.182a1.727 1.727 0 0 0-1.174-.392c-1.168 0-2.68.793-3.495 1.218l-.322.165a11.095 11.095 0 0 1-4.365 1.1c-1.554.049-2.892.14-4.635.322-10.327 1.06-14.933 8.975-19.37 16.63-2.416 4.164-4.91 8.489-8.33 11.793a22.472 22.472 0 0 1-2.252 1.913c-3.54 2.631-7.985 4.51-11.443 5.84-3.329 1.273-6.964 2.417-10.474 3.524-3.219 1.012-6.255 1.97-9.048 3.008a96.902 96.902 0 0 1-3.275 1.14c-2.545.825-4.378 1.458-7.06 3.304a45.386 45.386 0 0 0-2.804 2.066 29.585 29.585 0 0 0-5.597 5.894 34.802 34.802 0 0 1-4.701 5.642c-.566.554-1.57.826-3.074.826-1.76 0-3.895-.363-6.154-.747-2.33-.413-4.738-.805-6.803-.805-1.677 0-2.962.273-3.92.826 0 0-1.617.942-2.298 2.16l.67.302a13.718 13.718 0 0 1 2.859 2.065 14.342 14.342 0 0 0 2.973 2.115 2.553 2.553 0 0 1 .918.582c-.281.413-.694.946-1.129 1.516-2.384 3.119-3.774 5.09-2.977 6.163a2.507 2.507 0 0 0 1.239.28c5.196 0 7.989-1.35 11.52-3.06 1.024-.495 2.066-1.004 3.305-1.528 2.065-.896 4.288-2.325 6.647-3.838 3.084-2.01 6.31-4.076 9.442-5.072a25.734 25.734 0 0 1 7.943-1.115c3.305 0 6.783.441 10.138.872 2.499.322 5.089.652 7.63.805.986.057 1.9.086 2.787.086a32.307 32.307 0 0 0 3.557-.185l.284-.1c1.781-1.094 2.617-3.444 3.425-5.717.52-1.462.96-2.775 1.652-3.61a1.054 1.054 0 0 1 .132-.11.166.166 0 0 1 .202.032v.066c-.412 8.885-3.99 14.527-7.608 19.543l-2.416 2.59s3.383 0 5.307-.744c7.024-2.099 12.324-6.725 16.181-14.103a60.185 60.185 0 0 0 2.549-5.82c.065-.165.673-.47.616.384-.021.252-.038.533-.059.827 0 .173 0 .35-.033.528-.1 1.24-.392 3.859-.392 3.859l2.169-1.162c5.229-3.304 9.26-9.97 12.318-20.343 1.272-4.321 2.205-8.613 3.027-12.392.983-4.545 1.83-8.44 2.801-9.952 1.524-2.37 3.85-3.973 6.101-5.53.306-.211.616-.414.917-.637 2.83-1.986 5.643-4.279 6.263-8.555v-.095c.45-3.189.07-4.002-.364-4.373zm-7.283 103.727h-10.327V97.92h9.315c3.56 0 6.952.67 6.902 4.66 0 2.813-1.747 3.59-3.589 3.886 2.615.224 4.188 1.892 4.188 4.586.017 4.035-3.523 4.858-6.489 4.858zm-.772-10.14c3.565 0 4.362-1.372 4.362-3.115 0-2.619-1.595-3.214-4.362-3.214h-7.402v6.328zm.099 1.52h-7.501v7.1h7.823c2.194 0 4.511-.723 4.511-3.486 0-3.19-2.665-3.615-4.833-3.615zm-31.497-9.37h8.125c6.828 0 10.24 3.764 10.19 8.994.05 5.436-3.716 8.997-9.591 8.997H87.98zm2.242 1.596v14.825h6.197c5.432 0 7.501-3.665 7.501-7.477 0-4.309-2.59-7.348-7.5-7.348zm-10.838 5.357v-2.095h3.404v13.132h-3.392v-2.114c-.896 1.52-2.739 2.391-4.982 2.391-4.684 0-7.303-3.305-7.303-7.105 0-3.664 2.479-6.609 6.804-6.609 2.454.029 4.498.855 5.469 2.4zm-8.675 4.387c0 2.416 1.52 4.485 4.462 4.485 2.841 0 4.386-2.02 4.386-4.411 0-2.392-1.599-4.436-4.544-4.436-2.828 0-4.3 2.04-4.3 4.362zm-10.013-9.947a1.722 1.722 0 0 1 1.818-1.768 1.788 1.788 0 0 1 1.847 1.821 1.714 1.714 0 0 1-1.847 1.744 1.743 1.743 0 0 1-1.818-1.797zm.15 3.465h3.39v9.596c0 .595.125 1.02.62 1.02a3.657 3.657 0 0 0 .648-.073l.525 2.478a5.931 5.931 0 0 1-2.242.414c-1.421 0-2.942-.414-2.942-3.64zM52.15 115.91h-3.386v-13.132h3.386v2.942a5.197 5.197 0 0 1 4.735-3.218 6.13 6.13 0 0 1 2.119.347l-.723 2.479a7.435 7.435 0 0 0-1.793-.249c-2.445 0-4.338 1.843-4.338 4.545zm-11.037-11.037v-2.095h3.392v13.132h-3.392v-2.114c-.896 1.52-2.738 2.391-4.982 2.391-4.688 0-7.303-3.305-7.303-7.105 0-3.664 2.479-6.609 6.804-6.609 2.466.029 4.51.855 5.481 2.4zm-8.675 4.387c0 2.416 1.52 4.485 4.462 4.485 2.838 0 4.383-2.02 4.383-4.411 0-2.391-1.595-4.436-4.544-4.436-2.826 0-4.296 2.04-4.296 4.362zm-9.24-11.34 4.651 17.99h-3.51L21.24 102.95 15.4 115.91h-2.965l-5.808-12.883-3.19 12.883H0l4.61-17.99h3.04l6.28 13.93 6.253-13.93z"/></svg>
|
After Width: | Height: | Size: 3.5 KiB |
19
public/svgs/meilisearch.svg
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<svg width="495" height="74" viewBox="0 0 130 74" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M0.825012 73.993L24.0688 14.5224C27.3443 6.14179 35.4223 0.625977 44.4203 0.625977H58.4336L35.1899 60.0966C31.9143 68.4772 23.8363 73.993 14.8384 73.993H0.825012Z" fill="url(#paint0_linear_0_3)"/>
|
||||||
|
<path d="M34.9246 73.9932L58.1684 14.5226C61.444 6.14197 69.5219 0.626152 78.5199 0.626152H92.5333L69.2895 60.0968C66.014 68.4774 57.936 73.9932 48.938 73.9932H34.9246Z" fill="url(#paint1_linear_0_3)"/>
|
||||||
|
<path d="M69.0262 73.9932L92.27 14.5226C95.5456 6.14197 103.624 0.626152 112.622 0.626152H126.635L103.391 60.0968C100.116 68.4774 92.0376 73.9932 83.0396 73.9932H69.0262Z" fill="url(#paint2_linear_0_3)"/>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="paint0_linear_0_3" x1="126.635" y1="-4.97799" x2="0.825008" y2="66.0978" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#FF5CAA"/>
|
||||||
|
<stop offset="1" stop-color="#FF4E62"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint1_linear_0_3" x1="126.635" y1="-4.97799" x2="0.825008" y2="66.0978" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#FF5CAA"/>
|
||||||
|
<stop offset="1" stop-color="#FF4E62"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="paint2_linear_0_3" x1="126.635" y1="-4.97799" x2="0.825008" y2="66.0978" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop stop-color="#FF5CAA"/>
|
||||||
|
<stop offset="1" stop-color="#FF4E62"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
1
public/svgs/metabase.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" preserveAspectRatio="xMidYMid"><g transform="matrix(.197726 0 0 .197726 6.691093 -.000001)" fill="#509ee3"><ellipse ry="19.704" rx="19.394" cy="82.757" cx="19.394"/><ellipse ry="19.704" rx="19.394" cy="137.928" cx="19.394"/><ellipse ry="19.704" rx="19.394" cy="82.757" cx="73.697" opacity=".2"/><ellipse ry="19.704" rx="19.394" cy="138.464" cx="73.697"/><ellipse ry="19.704" rx="19.394" cy="82.757" cx="128" opacity=".2"/><ellipse ry="19.704" rx="19.394" cy="19.704" cx="128" opacity=".2"/><ellipse ry="19.704" rx="19.394" cy="138.464" cx="128" opacity=".2"/><ellipse ry="19.704" rx="19.394" cy="82.757" cx="182.303" opacity=".2"/><ellipse ry="19.704" rx="19.394" cy="82.757" cx="236.606"/><ellipse ry="19.704" rx="19.394" cy="138.464" cx="182.303"/><ellipse ry="19.704" rx="19.394" cy="138.464" cx="236.606"/><ellipse ry="19.704" rx="19.394" cy="193.099" cx="19.394"/><ellipse ry="19.704" rx="19.394" cy="193.635" cx="73.697" opacity=".2"/><ellipse ry="19.704" rx="19.394" cy="193.635" cx="128"/><ellipse ry="19.704" rx="19.394" cy="193.635" cx="182.303" opacity=".2"/><ellipse ry="19.704" rx="19.394" cy="193.635" cx="236.606"/><ellipse ry="19.704" rx="19.394" cy="248.27" cx="19.394"/><ellipse ry="19.704" rx="19.394" cy="248.806" cx="73.697" opacity=".2"/><ellipse ry="19.704" rx="19.394" cy="248.806" cx="128" opacity=".2"/><ellipse ry="19.704" rx="19.394" cy="303.977" cx="128" opacity=".2"/><ellipse ry="19.704" rx="19.394" cy="248.806" cx="182.303" opacity=".2"/><ellipse ry="19.704" rx="19.394" cy="248.806" cx="236.606"/></g></svg>
|
After Width: | Height: | Size: 1.6 KiB |
1
public/svgs/minio.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><path d="M40.25 3.108l8.387 13.714c.04.055.04.128 0 .183-.06.06-.158.06-.22 0L37.593 5.68z" fill="#f05a28"/><path d="M21.733 39.997c1.838-3.9 4.337-7.45 7.388-10.496a37.79 37.79 0 0 1 3.657-3.243v8.01zm-6.4 7.4l17.47-8.9V58.83L36.74 64V36.474l2.438-1.22a11.85 11.85 0 0 0 3.255-18.749l-9.02-9.4a2 2 0 0 1 .098-2.804 2.01 2.01 0 0 1 2.828.098l1.22 1.317 2.694-2.584C37.07-1 33.168-.525 30.9 1.584a5.73 5.73 0 0 0-.244 8.095l9.07 9.448c1.68 1.8 2.458 4.244 2.116 6.674s-1.765 4.575-3.872 5.834l-1.22.634V19.42a41.13 41.13 0 0 0-21.407 27.977" fill="#fff"/></svg>
|
After Width: | Height: | Size: 624 B |
1
public/svgs/mongodb.svg
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
public/svgs/moodle.png
Normal file
After Width: | Height: | Size: 48 KiB |
1
public/svgs/mysql.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path fill="#fff" d="M0 91.313h4.242V74.566l6.566 14.598c.773 1.77 1.832 2.391 3.914 2.391s3.098-.621 3.871-2.391l6.566-14.598v16.746h4.242V74.594c0-1.633-.652-2.422-2-2.828-3.223-1.004-5.383-.137-6.363 2.039l-6.441 14.41-6.238-14.41c-.937-2.176-3.14-3.043-6.359-2.039-1.348.406-2 1.195-2 2.828zM32.93 77.68h4.238v9.227c-.039.5.16 1.676 2.484 1.715h9.223V77.633h4.25c.02 0-.008 14.984-.008 15.047.023 3.695-4.582 4.496-6.707 4.559H33.02v-2.852l13.414-.004c2.73-.285 2.406-1.645 2.406-2.098v-1.113h-9.012c-4.195-.039-6.863-1.871-6.898-3.977-.004-.191.09-9.422 0-9.516zm0 0"/><path fill="#fff" d="M56.391 91.313h12.195c1.426 0 2.813-.301 3.914-.816 1.836-.84 2.73-1.984 2.73-3.48v-3.098c0-1.223-1.016-2.367-3.016-3.125-1.059-.41-2.367-.625-3.629-.625h-5.141c-1.711 0-2.527-.516-2.73-1.656-.039-.137-.039-.246-.039-.383V76.2c0-.109 0-.219.039-.355.203-.867.652-1.113 2.16-1.25l.41-.027h12.109v-2.824H63.488c-1.711 0-2.609.109-3.426.352-2.527.789-3.629 2.039-3.629 4.215v2.473c0 1.902 2.16 3.535 5.789 3.914l1.223.055h4.406c.164 0 .324 0 .449.027 1.344.109 1.914.355 2.324.844.211.195.332.473.324.758v2.477c0 .297-.203.68-.609 1.004-.367.328-.98.543-1.793.598l-.449.027H56.391zm45.297-4.922c0 2.91 2.164 4.539 6.523 4.867l1.227.055h11.051v-2.828h-11.133c-2.488 0-3.426-.625-3.426-2.121V71.738h-4.238V86.39zm-23.75.148V76.457c0-2.559 1.801-4.113 5.355-4.602a7.976 7.976 0 0 1 1.145-.082h8.047c.41 0 .777.027 1.188.082 3.555.488 5.352 2.043 5.352 4.602v10.082c0 2.078-.762 3.188-2.523 3.914l4.18 3.77h-4.926l-3.379-3.051-3.402.215H84.44a9.23 9.23 0 0 1-2.492-.352c-2.699-.734-4.008-2.152-4.008-4.496zm4.578-.246c0 .137.039.273.082.438.246 1.172 1.348 1.824 3.023 1.824h3.852l-3.539-3.195h4.926l3.086 2.789c.57-.305.941-.766 1.074-1.363.039-.137.039-.273.039-.41v-9.668c0-.109 0-.246-.039-.383-.246-1.09-1.348-1.715-2.984-1.715h-6.414c-1.879 0-3.105.816-3.105 2.098zm0 0"/><path fill="#00618A" d="M124.219 67.047c-2.605-.07-4.598.172-6.301.891-.484.203-1.258.207-1.336.813.266.281.309.699.52 1.039.406.66 1.094 1.539 1.707 2l2.074 1.484c1.273.777 2.699 1.223 3.93 2 .723.461 1.441 1.039 2.148 1.559.348.254.582.656 1.039.816v-.074c-.238-.305-.301-.723-.52-1.039l-.965-.965c-.941-1.25-2.137-2.348-3.41-3.262-1.016-.727-3.281-1.711-3.707-2.891l-.074-.074c.719-.078 1.563-.34 2.223-.516 1.117-.301 2.113-.223 3.262-.52l1.559-.449v-.293c-.582-.598-.996-1.387-1.633-1.93-1.656-1.41-3.469-2.824-5.336-4.004-1.035-.652-2.312-1.074-3.41-1.629-.367-.187-1.016-.281-1.262-.594-.574-.734-.887-1.664-1.332-2.52l-2.668-5.633c-.562-1.285-.93-2.555-1.633-3.707-3.363-5.535-6.988-8.875-12.602-12.156-1.191-.699-2.633-.973-4.148-1.332l-2.449-.148c-.496-.211-1.012-.82-1.48-1.113-1.859-1.176-6.629-3.73-8.008-.371-.867 2.121 1.301 4.191 2.078 5.266.543.754 1.242 1.598 1.629 2.445.258.555.301 1.113.52 1.703.539 1.453 1.008 3.031 1.707 4.375.352.68.738 1.395 1.184 2 .273.371.742.539.816 1.113-.457.641-.484 1.633-.742 2.445-1.16 3.652-.723 8.191.965 10.898.516.828 1.734 2.609 3.41 1.926 1.465-.598 1.137-2.445 1.555-4.078.098-.367.039-.641.223-.887v.074l1.336 2.668c.988 1.59 2.738 3.25 4.223 4.371.773.582 1.379 1.59 2.375 1.93V68.6h-.074c-.195-.297-.496-.422-.742-.664-.582-.57-1.227-1.277-1.703-1.93-1.352-1.832-2.547-3.84-3.633-5.93-.52-.996-.973-2.098-1.41-3.113-.168-.391-.164-.984-.516-1.184-.48.742-1.187 1.344-1.559 2.223-.594 1.402-.668 3.117-.891 4.891l-.148.074c-1.031-.25-1.395-1.312-1.777-2.223-.973-2.305-1.152-6.02-.297-8.672.219-.687 1.219-2.852.813-3.484-.191-.633-.828-1-1.184-1.484a11.7 11.7 0 0 1-1.187-2.074c-.793-1.801-1.164-3.816-2-5.633-.398-.871-1.074-1.75-1.629-2.523-.617-.855-1.305-1.484-1.781-2.52-.168-.367-.398-.957-.148-1.336.078-.254.195-.359.445-.441.43-.332 1.629.109 2.074.293 1.191.496 2.184.965 3.191 1.633.48.32.969.941 1.555 1.113h.668c1.043.238 2.211.07 3.188.367 1.723.523 3.27 1.34 4.668 2.227 4.273 2.695 7.766 6.535 10.156 11.117.387.738.551 1.441.891 2.223.684 1.578 1.543 3.203 2.223 4.746s1.34 3.094 2.297 4.375c.504.672 2.453 1.031 3.336 1.406.621.262 1.637.535 2.223.891 1.125.676 2.211 1.48 3.266 2.223.523.375 2.141 1.188 2.223 1.855zM91.082 38.805a5.26 5.26 0 0 0-1.332.148v.074h.074c.258.535.715.879 1.035 1.336l.742 1.555.074-.07c.461-.324.668-.844.668-1.633-.187-.195-.211-.437-.371-.668-.211-.309-.621-.48-.891-.742zm0 0"/></svg>
|
After Width: | Height: | Size: 4.2 KiB |
BIN
public/svgs/n8n.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
73
public/svgs/nextcloud.svg
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
version="1.1"
|
||||||
|
id="Layer_1"
|
||||||
|
inkscape:export-filename="nextcloud-logo-white-transparent.png"
|
||||||
|
inkscape:export-xdpi="300.09631"
|
||||||
|
inkscape:export-ydpi="300.09631"
|
||||||
|
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||||
|
sodipodi:docname="nextcloud-icon.svg"
|
||||||
|
x="0px"
|
||||||
|
y="0px"
|
||||||
|
viewBox="0 0 64.000005 64.000001"
|
||||||
|
xml:space="preserve"
|
||||||
|
width="64"
|
||||||
|
height="64"><metadata
|
||||||
|
id="metadata19"><rdf:RDF><cc:Work
|
||||||
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||||
|
id="defs17" />
|
||||||
|
<style
|
||||||
|
type="text/css"
|
||||||
|
id="style2">
|
||||||
|
.st0{fill:#0082C9;}
|
||||||
|
</style>
|
||||||
|
<sodipodi:namedview
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
fit-margin-bottom="10"
|
||||||
|
fit-margin-left="10"
|
||||||
|
fit-margin-right="10"
|
||||||
|
fit-margin-top="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
id="namedview16"
|
||||||
|
inkscape:bbox-nodes="true"
|
||||||
|
inkscape:bbox-paths="true"
|
||||||
|
inkscape:current-layer="Layer_1"
|
||||||
|
inkscape:cx="47.896274"
|
||||||
|
inkscape:cy="53.386932"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:snap-bbox="true"
|
||||||
|
inkscape:snap-bbox-edge-midpoints="true"
|
||||||
|
inkscape:snap-bbox-midpoints="true"
|
||||||
|
inkscape:snap-page="true"
|
||||||
|
inkscape:window-height="1001"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-x="-9"
|
||||||
|
inkscape:window-y="-9"
|
||||||
|
inkscape:zoom="4"
|
||||||
|
objecttolerance="10"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
showgrid="false"
|
||||||
|
units="px">
|
||||||
|
</sodipodi:namedview>
|
||||||
|
|
||||||
|
<path
|
||||||
|
id="XMLID_107_"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
class="st0"
|
||||||
|
d="m 32.028095,17.446884 c -6.630378,0 -12.249342,4.49517 -13.99122,10.563651 C 16.519754,24.751537 13.260755,22.50395 9.439859,22.50395 4.270413,22.50395 0,26.774363 0,31.999999 c 0,5.225637 4.270413,9.49605 9.496049,9.49605 3.764706,0 7.079895,-2.247586 8.597015,-5.506585 1.685689,6.068481 7.304653,10.563652 13.935031,10.563652 6.574188,0 12.193152,-4.438981 13.99122,-10.451272 1.517121,3.146619 4.77612,5.338015 8.484636,5.338015 5.225637,0 9.496049,-4.270412 9.496049,-9.496049 0,-5.225637 -4.270412,-9.43986 -9.496049,-9.43986 -3.708516,0 -6.967515,2.191396 -8.484636,5.338016 -1.798068,-5.956101 -7.360843,-10.395082 -13.99122,-10.395082 z m 0,5.562773 c 5.000878,0 8.990343,3.989465 8.990343,8.990342 0,5.000879 -3.989465,8.990343 -8.990343,8.990343 -5.000878,0 -8.990343,-3.989464 -8.990343,-8.990343 0,-5.000875 3.989465,-8.99034 8.990343,-8.990342 z M 9.496049,28.066724 c 2.191397,0 3.933275,1.74188 3.933275,3.933275 0,2.191396 -1.741878,3.933276 -3.933275,3.933276 -2.191396,0 -3.933275,-1.74188 -3.933275,-3.933276 0,-2.191395 1.741879,-3.933275 3.933275,-3.933275 z m 45.007902,0 c 2.191396,0 3.933275,1.74188 3.933275,3.933275 0,2.191396 -1.741879,3.933276 -3.933275,3.933276 -2.191396,0 -3.933275,-1.74188 -3.933275,-3.933276 0.05619,-2.191395 1.741879,-3.933275 3.933275,-3.933275 z"
|
||||||
|
style="fill:#0082c9;stroke-width:0.56189638" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.4 KiB |
10
public/svgs/nocodb.svg
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="256px" height="256px" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
|
||||||
|
<title>NocoDB</title>
|
||||||
|
<g>
|
||||||
|
<path d="M211.570833,256 L44.4291667,256 C19.8916667,256 0,236.108333 0,211.570833 L0,44.4291667 C0,19.8916667 19.8916667,0 44.4291667,0 L211.570833,0 C236.108333,0 256,19.8916667 256,44.4291667 L256,211.570833 C256,236.108333 236.108333,256 211.570833,256" fill="#0381FD"></path>
|
||||||
|
<path d="M162.302917,117.771667 C157.307083,117.550833 153.019583,121.500833 152.790417,126.538333 C152.56125,131.63 156.31125,135.875833 161.357083,136.238333 C166.540417,136.605 171.007083,132.4925 171.12375,127.2425 C171.23625,122.125833 167.390417,117.996667 162.302917,117.771667 L162.302917,117.771667 Z M93.8070833,136.255 C98.8529167,136.371667 103.002917,132.4175 103.165417,127.338333 C103.332083,122.0675 99.1695833,117.750833 93.9445833,117.767452 C88.91125,117.788333 84.8529167,121.8675 84.8235904,126.938333 C84.7945833,132.0175 88.7654167,136.134167 93.8070833,136.255 L93.8070833,136.255 Z M165.63625,59.9175 C163.477917,65.53 161.357083,71.0466667 159.107083,76.8925 C161.16125,77.7175 162.802917,78.3966667 164.46125,79.0383333 C202.66125,93.7841667 229.315417,130.950833 230.54875,171.209167 C230.815417,179.896667 230.015417,180.750833 221.494583,180.755 C202.569583,180.759167 183.644583,180.755 164.715417,180.755 L158.63625,180.755 C160.802917,186.3675 162.677917,191.23 164.602917,196.225833 L200.252917,196.225833 C208.01125,190.663333 214.39875,190.459167 219.102917,195.721667 C223.17375,200.28 223.032083,208.125833 218.794583,212.588333 C213.944583,217.688333 207.477917,217.313333 200.06125,211.363333 C187.794583,211.363333 175.344583,211.371667 162.89875,211.359167 C155.969583,211.350833 154.452917,210.221667 151.965417,203.609167 C149.165417,196.1675 146.302917,188.750833 143.377917,181.088333 L118.644583,181.088333 C115.68625,188.7425 112.71125,196.450833 109.72375,204.155 C107.277917,210.450833 105.73625,211.434167 98.9529167,211.4175 C85.8445833,211.384167 72.73625,211.409167 59.81125,211.409167 C52.4570833,217.363333 45.9570833,217.6925 41.1029167,212.500833 C36.8320833,207.93 36.7445833,200.355 40.9070833,195.655 C45.5779167,190.38 52.3445833,190.584167 59.6029167,196.346667 L97.26125,196.346667 C99.1445833,191.525833 101.057083,186.638333 103.240417,181.0425 C101.09875,180.934167 99.37375,180.7675 97.6529167,180.7675 C76.23625,180.750833 54.8195833,180.7675 33.4029167,180.746667 C26.41125,180.7425 25.31125,179.584167 25.4154167,172.6175 C26.06125,129.688333 54.7529167,91.2258333 96.3195833,77.555 C98.18625,76.9425 100.04875,76.3216667 102.407083,75.5425 C100.377917,70.2633333 98.4404167,65.23 96.4279167,59.9966667 L59.8029167,59.9966667 C51.1320833,66.9383333 45.2445833,65.205 40.7445833,60.2841667 C36.4945833,55.6383333 36.8695833,47.9675 41.21125,43.4633333 C46.0820833,38.4091667 52.1945833,38.78 60.0070833,44.7383333 C72.7654167,44.7383333 85.7154167,44.9008333 98.6570833,44.655 C103.98625,44.555 106.969583,46.7591667 108.719583,51.6216667 C111.23625,58.6258333 114.057083,65.5216667 116.927917,72.9258333 C128.09875,71.7008333 136.790417,71.93 145.03625,72.9258333 C147.51125,66.5258333 150.22375,59.4466667 152.990417,52.3883333 C155.540417,45.8841667 157.19875,44.7508333 164.090417,44.7383333 C176.044583,44.7216667 187.994583,44.7341667 199.815417,44.7341667 C208.519583,37.2841667 214.877917,39.4175 219.257083,44.0758333 C223.44875,48.5383333 223.077917,56.5591667 218.78625,60.8966667 C213.777917,65.9591667 207.457083,65.6591667 200.48625,59.9175 L165.63625,59.9175 Z" fill="#FFFFFF"></path>
|
||||||
|
<path d="M93.8066667,136.254167 C88.765,136.1375 84.7941667,132.016667 84.8231737,126.9375 C84.8525,121.870833 88.9108333,117.7875 93.9441667,117.770758 C99.1691667,117.75 103.331667,122.066667 103.165,127.3375 C103.0025,132.416667 98.8525,136.370833 93.8066667,136.254167" fill="#0381FD"></path>
|
||||||
|
<path d="M162.302917,117.771667 C167.390417,117.996667 171.23625,122.125833 171.12375,127.2425 C171.007083,132.4925 166.540417,136.605 161.357083,136.238333 C156.31125,135.875833 152.56125,131.63 152.790417,126.538333 C153.019583,121.500833 157.307083,117.550833 162.302917,117.771667" fill="#0381FD"></path>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.3 KiB |
12
public/svgs/openblocks.svg
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<rect fill="#FFFFFF" x="0" y="0" width="16" height="16" rx="2"/>
|
||||||
|
<g transform="translate(2.000000, 2.000000)" fill="#222222">
|
||||||
|
<rect x="4.85714286" y="8" width="5.42857143" height="4" rx="0.576"/>
|
||||||
|
<rect x="4.85714286" y="0" width="7.14285714" height="7.14285714" rx="0.576"/>
|
||||||
|
<rect x="0" y="4.85714286" width="4" height="7.14285714" rx="0.576"/>
|
||||||
|
<rect x="0" y="0" width="4" height="4" rx="0.576"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 705 B |
1
public/svgs/phpmyadmin.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64"><g transform="matrix(1.261023 0 0 1.261023 -66.033665 -1.274064)"><path d="M80.936 2.5l-.045-.1c-.022-.022-.045-.045-.1-.045l-.1.023c-.045.045-.068.068-.068.113l-1.918 34.73.294-.045L80.868 3.4l2.212 3.634h-.023c1.67 4.92 2.37 10.155 2.1 15.707l.135.203 2.2 3.88.135.135c3.363 2.956 7.13 4.942 11.306 5.958l1.015 1.648.135.045.023-.045L80.9 3.152l.045-.655m-.685 12.257c2.37 4.852 3.227 12.186 2.595 22.003l9.23-1.128zM101.3 36.08c.948-.113 1.557-.316 1.828-.6L54.8 41.37c.023 2.008.925 3.588 2.685 4.716a5.76 5.76 0 0 0 1.422.745c.43-.496.903-.858 1.467-1.196h.022c5.055-3.07 12.57-3.543 22.5-1.444l.113.022a34.56 34.56 0 0 1 3.182.812.88.88 0 0 0 .745-.226c.36-.27.813-.474 1.422-.6v-.023c1.602-2.844 3.77-4.942 6.477-6.32 1.873-.925 4.04-1.535 6.454-1.76m-23.198.874l2.2-33.896A115 115 0 0 1 64.89 37.705l13.202-.745M65.657 9.654l-.1-.045-.1.023-.045.113-1.828 29.338.27-.023 1.828-29.315-.045-.1M63.085 38.45l1.94-28.615L54.802 39.33l8.282-.88" fill="#ccc"/><g fill="none" stroke="#ccc"><path d="M63.5 47.988c-2.55 1.22-4.4 1.422-5.574.677-1.174-.8-2.98-.6-5.416.54m16.97-1.037a6.61 6.61 0 0 0-1.535-.316c-1.106-.1-2.437.34-3.995 1.264-1.557.948-3.43 1.3-5.665 1.106m25.1-4.355c-10.742-2.2-18.483-1.693-23.222 1.58m29.993-.52a4.89 4.89 0 0 0-1.535-.316c-1.106-.1-2.437.34-3.994 1.264s-3.43 1.286-5.665 1.106" stroke-width=".266" stroke-linecap="round" stroke-linejoin="round"/><path d="M75.745 9.925c-1.106-.677-2.257-.496-3.453.564-1.038-1.06-2.12-1.24-3.25-.564m4.198-3.792c-1.128-.677-2.234-.406-3.363.812-1.106-1.22-2.234-1.5-3.363-.812" stroke-linecap="round" stroke-linejoin="round" stroke-width=".643"/></g></g></svg>
|
After Width: | Height: | Size: 1.7 KiB |
9
public/svgs/pocketbase.svg
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect x="25.536" y="13.4861" width="1.71467" height="16.7338" transform="rotate(45.9772 25.536 13.4861)" fill="white"/>
|
||||||
|
<path d="M26 14H36.8C37.4628 14 38 14.5373 38 15.2V36.8C38 37.4628 37.4628 38 36.8 38H15.2C14.5373 38 14 37.4628 14 36.8V26" fill="white"/>
|
||||||
|
<path d="M26 14H36.8C37.4628 14 38 14.5373 38 15.2V36.8C38 37.4628 37.4628 38 36.8 38H15.2C14.5373 38 14 37.4628 14 36.8V26" stroke="#16161a" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M26 14V3.2C26 2.53726 25.4628 2 24.8 2H3.2C2.53726 2 2 2.53726 2 3.2V24.8C2 25.4628 2.53726 26 3.2 26H14" fill="white"/>
|
||||||
|
<path d="M26 14V3.2C26 2.53726 25.4628 2 24.8 2H3.2C2.53726 2 2 2.53726 2 3.2V24.8C2 25.4628 2.53726 26 3.2 26H14" stroke="#16161a" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M10 20C9.44772 20 9 19.5523 9 19V8C9 7.44772 9.44772 7 10 7H13.7531C14.4801 7 15.1591 7.07311 15.7901 7.21932C16.4348 7.35225 16.9904 7.58487 17.4568 7.91718C17.9369 8.2362 18.3141 8.6682 18.5885 9.21319C18.8628 9.74489 19 10.4029 19 11.1871C19 11.9448 18.856 12.6028 18.5679 13.161C18.2936 13.7193 17.9163 14.1779 17.4362 14.5368C16.9561 14.8957 16.4005 15.1616 15.7695 15.3344C15.1385 15.5072 14.4664 15.5936 13.7531 15.5936H13.0247C12.4724 15.5936 12.0247 16.0413 12.0247 16.5936V19C12.0247 19.5523 11.577 20 11.0247 20H10ZM12.0247 12.2607C12.0247 12.813 12.4724 13.2607 13.0247 13.2607H13.5679C15.214 13.2607 16.037 12.5695 16.037 11.1871C16.037 10.5092 15.8244 10.0307 15.3992 9.75153C14.9877 9.47239 14.3772 9.33282 13.5679 9.33282H13.0247C12.4724 9.33282 12.0247 9.78054 12.0247 10.3328V12.2607Z" fill="#16161a"/>
|
||||||
|
<path d="M22 33C21.4477 33 21 32.5523 21 32V21C21 20.4477 21.4477 20 22 20H25.4877C26.1844 20 26.8265 20.0532 27.4139 20.1595C28.015 20.2526 28.5342 20.4254 28.9713 20.6779C29.4085 20.9305 29.75 21.2628 29.9959 21.6748C30.2555 22.0869 30.3852 22.6053 30.3852 23.2301C30.3852 23.5225 30.3374 23.8149 30.2418 24.1074C30.1598 24.3998 30.0232 24.6723 29.832 24.9248C29.6407 25.1774 29.4016 25.4034 29.1148 25.6028C28.837 25.7958 28.5081 25.939 28.1279 26.0323C28.1058 26.0378 28.0902 26.0575 28.0902 26.0802V26.0802C28.0902 26.1039 28.1073 26.1242 28.1306 26.1286C29.0669 26.3034 29.7774 26.6332 30.2623 27.1181C30.7541 27.6099 31 28.2945 31 29.1718C31 29.8364 30.8702 30.408 30.6107 30.8865C30.3511 31.365 29.9891 31.7638 29.5246 32.0828C29.0601 32.3885 28.5137 32.6212 27.8852 32.7807C27.2705 32.9269 26.6011 33 25.8771 33H22ZM24.0123 24.2239C24.0123 24.7762 24.46 25.2239 25.0123 25.2239H25.3443C26.082 25.2239 26.6148 25.0844 26.9426 24.8052C27.2705 24.5261 27.4344 24.1339 27.4344 23.6288C27.4344 23.1503 27.2637 22.8113 26.9221 22.612C26.5943 22.3993 26.0751 22.2929 25.3648 22.2929H25.0123C24.46 22.2929 24.0123 22.7407 24.0123 23.2929V24.2239ZM24.0123 29.7071C24.0123 30.2593 24.46 30.7071 25.0123 30.7071H25.6311C27.2432 30.7071 28.0492 30.1222 28.0492 28.9525C28.0492 28.3809 27.8511 27.9688 27.4549 27.7163C27.0724 27.4637 26.4645 27.3374 25.6311 27.3374H25.0123C24.46 27.3374 24.0123 27.7851 24.0123 28.3374V29.7071Z" fill="#16161a"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.1 KiB |
1
public/svgs/postgres.svg
Normal file
After Width: | Height: | Size: 12 KiB |
7
public/svgs/posthog.svg
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M8.35523 16.1353C8.14021 16.5654 7.52647 16.5654 7.31142 16.1353L6.79714 15.1068C6.715 14.9425 6.715 14.7491 6.79714 14.5849L7.31142 13.5563C7.52647 13.1262 8.14021 13.1262 8.35523 13.5563L8.86953 14.5849C8.95163 14.7491 8.95163 14.9425 8.86953 15.1068L8.35523 16.1353ZM8.35523 21.9687C8.14021 22.3988 7.52647 22.3988 7.31142 21.9687L6.79714 20.9401C6.715 20.7758 6.715 20.5825 6.79714 20.4182L7.31142 19.3897C7.52647 18.9596 8.14021 18.9596 8.35523 19.3897L8.86953 20.4182C8.95163 20.5825 8.95163 20.7758 8.86953 20.9401L8.35523 21.9687Z" fill="#1D4AFF"/>
|
||||||
|
<path d="M2 19.7545C2 19.2347 2.62852 18.9743 2.99611 19.3419L5.67055 22.0164C6.03815 22.384 5.7778 23.0125 5.25796 23.0125H2.58351C2.26125 23.0125 2 22.7512 2 22.429V19.7545ZM2 16.9375C2 17.0922 2.06148 17.2407 2.17091 17.3501L7.66243 22.8416C7.77186 22.951 7.92028 23.0125 8.07502 23.0125H11.0913C11.6111 23.0125 11.8715 22.384 11.5039 22.0164L2.99611 13.5086C2.62852 13.141 2 13.4013 2 13.9212V16.9375V16.9375ZM2 11.1041C2 11.2589 2.06148 11.4073 2.17091 11.5167L13.4958 22.8416C13.6052 22.951 13.7536 23.0125 13.9084 23.0125H16.9246C17.4445 23.0125 17.7048 22.384 17.3372 22.0164L2.99611 7.67526C2.62853 7.30767 2 7.56801 2 8.08786V11.1041V11.1041ZM7.83333 11.1041C7.83333 11.2589 7.89484 11.4073 8.00424 11.5167L18.5039 22.0164C18.8715 22.384 19.5 22.1236 19.5 21.6038V18.5875C19.5 18.4328 19.4385 18.2843 19.3291 18.1749L8.82944 7.67525C8.46183 7.30767 7.83333 7.56801 7.83333 8.08786V11.1041ZM14.6628 7.67526C14.2952 7.30767 13.6667 7.56801 13.6667 8.08786V11.1041C13.6667 11.2589 13.7282 11.4073 13.8376 11.5167L18.5039 16.183C18.8715 16.5507 19.5 16.2903 19.5 15.7704V12.7542C19.5 12.5994 19.4385 12.451 19.3291 12.3416L14.6628 7.67526V7.67526Z" fill="#F9BD2B"/>
|
||||||
|
<path d="M26.8136 19.8261L21.3212 14.3337C20.9536 13.966 20.3251 14.2264 20.3251 14.7463V22.429C20.3251 22.7512 20.5863 23.0125 20.9086 23.0125H29.4165C29.7388 23.0125 30 22.7512 30 22.429V21.7293C30 21.4071 29.7377 21.1497 29.4181 21.1081C28.4374 20.9804 27.52 20.5325 26.8136 19.8261ZM23.125 21.1458C22.6099 21.1458 22.1917 20.7277 22.1917 20.2125C22.1917 19.6973 22.6099 19.2791 23.125 19.2791C23.6403 19.2791 24.0584 19.6973 24.0584 20.2125C24.0584 20.7277 23.6403 21.1458 23.125 21.1458Z" fill="black"/>
|
||||||
|
<path d="M2 22.429C2 22.7512 2.26125 23.0125 2.58351 23.0125H5.25796C5.7778 23.0125 6.03815 22.384 5.67056 22.0164L2.99611 19.3419C2.62852 18.9743 2 19.2347 2 19.7545V22.429V22.429ZM7.83333 12.5125L2.99611 7.67526C2.62852 7.30767 2 7.56801 2 8.08786V11.1041C2 11.2589 2.06148 11.4073 2.17091 11.5167L7.83333 17.1791V12.5125ZM2.99611 13.5086C2.62852 13.141 2 13.4013 2 13.9212V16.9375C2 17.0922 2.06148 17.2406 2.17091 17.3501L7.83333 23.0125V18.3458L2.99611 13.5086V13.5086Z" fill="#1D4AFF"/>
|
||||||
|
<path d="M13.6667 12.7542C13.6667 12.5994 13.6052 12.451 13.4958 12.3416L8.82944 7.67526C8.46189 7.30767 7.83334 7.56801 7.83334 8.08786V11.1041C7.83334 11.2589 7.89484 11.4073 8.00424 11.5167L13.6667 17.1791V12.7542V12.7542ZM7.83334 23.0125H11.0913C11.6111 23.0125 11.8715 22.384 11.5039 22.0164L7.83334 18.3458V23.0125ZM7.83334 12.5125V16.9375C7.83334 17.0922 7.89484 17.2406 8.00424 17.3501L13.6667 23.0125V18.5875C13.6667 18.4328 13.6052 18.2843 13.4958 18.1749L7.83334 12.5125Z" fill="#F54E00"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.3 KiB |
1
public/svgs/redis.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><path d="M21.4 97.6c0 1.8-1.5 3.5-3.5 3.5-1.5 0-2.8.4-4 1.3-1.3.8-2.2 1.9-3 3.2-1.6 2.1-2.4 4.6-2.7 5.5v12.5c0 1.9-1.6 3.5-3.6 3.5-1.9 0-3.5-1.6-3.5-3.5v-26c0-1.9 1.6-3.4 3.5-3.4 2 0 3.6 1.5 3.6 3.4v.5c.4-.5.9-1 1.4-1.3 2.2-1.4 5-2.6 8.3-2.6 2 0 3.5 1.5 3.5 3.4zm-1.9 13c.1-9 7-16.5 16.1-16.5 8.6 0 15.3 6.4 15.9 15.3v.3c0 .1 0 .5-.1.6-.2 1.6-1.6 2.6-3.4 2.6H27c.3 1.5 1.1 3.2 2.2 4.3 1.4 1.6 4 2.8 6.3 3 2.4.2 5.2-.4 6.8-1.6 1.4-1.4 4.1-1.3 4.9-.2.9.9 1.5 2.9 0 4.3-3.2 3-7.1 4.3-11.8 4.3-8.9 0-15.9-7.5-15.9-16.4zm7.1-3.2h18.6c-.7-2.6-4-6.5-9.7-7-5.6.2-8.3 4.3-8.9 7zm58.3 16.1c0 1.9-1.6 3.6-3.6 3.6-1.8 0-3.2-1.3-3.5-2.8-2.5 1.7-5.7 2.8-9 2.8-8.9 0-16-7.5-16-16.4 0-9 7.1-16.5 16-16.5 3.2 0 6.4 1.1 8.8 2.8V84.5c0-1.9 1.6-3.6 3.6-3.6s3.6 1.6 3.6 3.6v26.2l.1 12.8zm-16-22.2c-2.4 0-4.5 1-6.2 2.7-1.6 1.6-2.6 4-2.6 6.6 0 2.5 1 4.9 2.6 6.5 1.6 1.7 3.8 2.7 6.2 2.7 2.4 0 4.5-1 6.2-2.7 1.6-1.6 2.6-4 2.6-6.5 0-2.6-1-5-2.6-6.6-1.6-1.7-3.7-2.7-6.2-2.7zm28.6-15.4c0 2-1.5 3.6-3.6 3.6-2 0-3.6-1.6-3.6-3.6v-1.4c0-2 1.6-3.6 3.6-3.6s3.6 1.6 3.6 3.6v1.4zm0 11.9v25.7c0 2-1.5 3.6-3.6 3.6-2 0-3.6-1.6-3.6-3.6V97.8c0-2.1 1.6-3.6 3.6-3.6 2.1 0 3.6 1.5 3.6 3.6zm4.5 19.8c1.2-1.6 3.5-1.8 4.9-.5 1.7 1.4 4.7 3 7.2 2.9 1.8 0 3.4-.6 4.5-1.3.9-.8 1.2-1.4 1.2-2 0-.3-.1-.5-.2-.7-.1-.2-.3-.5-.9-.8-.9-.7-2.9-1.4-5.3-1.8h-.1c-2-.4-4-.9-5.7-1.7-1.8-.9-3.4-2-4.5-3.8-.7-1.2-1.1-2.6-1.1-4.1 0-3 1.7-5.6 3.9-7.2 2.3-1.6 5.1-2.4 8.1-2.4 4.5 0 7.8 2.2 9.9 3.6 1.6 1.1 2 3.2 1.1 4.9-1.1 1.6-3.2 2-4.9.9-2.1-1.4-4-2.4-6.1-2.4-1.6 0-3.1.5-4 1.2-.9.6-1.1 1.2-1.1 1.5 0 .3 0 .3.1.5.1.1.3.4.7.7.9.6 2.6 1.2 4.8 1.6l.1.1h.1c2.2.4 4.2 1 6.1 1.9 1.8.8 3.6 2 4.7 3.9.8 1.3 1.3 2.8 1.3 4.3 0 3.2-1.8 5.9-4.1 7.6-2.4 1.6-5.3 2.6-8.6 2.6-5.1-.1-9.1-2.4-11.7-4.5-1.4-1.3-1.6-3.5-.4-5z" fill="#fff"/><path fill="#A41E11" d="M106.9 62.7c-5 2.6-30.7 13.2-36.2 16-5.5 2.9-8.5 2.8-12.8.8-4.4-2.1-31.7-13.1-36.7-15.5-2.5-1.2-3.8-2.2-3.8-3.1v-9.4s35.6-7.8 41.4-9.8c5.8-2.1 7.8-2.1 12.6-.3 4.9 1.8 34.2 7.1 39 8.8v9.3c.1.9-1 1.9-3.5 3.2z"/><path fill="#D82C20" d="M106.9 53.3c-5 2.6-30.7 13.2-36.2 16-5.5 2.9-8.5 2.8-12.8.8C53.5 68 26.2 57 21.2 54.6c-4.9-2.4-5-4-.2-5.9 4.8-1.9 32.1-12.6 37.8-14.6 5.8-2.1 7.8-2.1 12.6-.3 4.9 1.8 30.5 12 35.3 13.7 5 1.8 5.2 3.2.2 5.8z"/><path fill="#A41E11" d="M106.9 47.4c-5 2.6-30.7 13.2-36.2 16-5.5 2.9-8.5 2.8-12.8.8-4.4-2.1-31.7-13.2-36.7-15.5-2.5-1.2-3.8-2.2-3.8-3.1v-9.4s35.6-7.8 41.4-9.8c5.8-2.1 7.8-2.1 12.6-.3 4.9 1.8 34.2 7.1 39 8.8v9.3c.1.9-1 1.9-3.5 3.2z"/><path fill="#D82C20" d="M106.9 38c-5 2.6-30.7 13.2-36.2 16-5.5 2.9-8.5 2.8-12.8.8-4.3-2.1-31.7-13.1-36.6-15.5-4.9-2.4-5-4-.2-5.9 4.8-1.9 32.1-12.6 37.8-14.6 5.8-2.1 7.8-2.1 12.6-.3 4.9 1.8 30.5 12 35.3 13.7 4.9 1.7 5.1 3.2.1 5.8z"/><path fill="#A41E11" d="M106.9 31.5c-5 2.6-30.7 13.2-36.2 16-5.5 2.9-8.5 2.8-12.8.8-4.3-2.1-31.7-13.1-36.6-15.5-2.5-1.2-3.8-2.2-3.8-3.1v-9.4s35.6-7.8 41.4-9.8c5.8-2.1 7.8-2.1 12.6-.3 4.9 1.8 34.2 7.1 39 8.8v9.3c0 .8-1.1 1.9-3.6 3.2z"/><path fill="#D82C20" d="M106.9 22.1c-5 2.6-30.7 13.2-36.2 16-5.5 2.9-8.5 2.8-12.8.8-4.3-2.1-31.7-13.1-36.6-15.5s-5-4-.2-5.9c4.8-1.9 32.1-12.6 37.8-14.6C64.7.8 66.7.8 71.5 2.6c4.9 1.8 30.5 12 35.3 13.7 4.9 1.7 5.1 3.2.1 5.8z"/><path fill="#fff" d="M76.2 13l-8.1.8-1.8 4.4-2.9-4.9-9.3-.8L61 10l-2-3.8 6.5 2.5 6.1-2-1.7 4zM65.8 34.1l-15-6.3 21.6-3.3z"/><ellipse fill="#fff" cx="45" cy="19.9" rx="11.5" ry="4.5"/><path fill="#7A0C00" d="M85.7 14.2l12.8 5-12.8 5.1z"/><path fill="#AD2115" d="M71.6 19.8l14.1-5.6v10.1l-1.3.5z"/></svg>
|
After Width: | Height: | Size: 3.4 KiB |
BIN
public/svgs/stirling.png
Normal file
After Width: | Height: | Size: 8.7 KiB |
32
public/svgs/syncthing.svg
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 129 117.3" enable-background="new 0 0 429 117.3" xml:space="preserve">
|
||||||
|
<g>
|
||||||
|
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="58.666" y1="117.332" x2="58.666" y2="-9.094947e-13">
|
||||||
|
<stop offset="0" style="stop-color:#0882C8"/>
|
||||||
|
<stop offset="1" style="stop-color:#26B6DB"/>
|
||||||
|
</linearGradient>
|
||||||
|
<circle fill="url(#SVGID_1_)" cx="58.7" cy="58.7" r="58.7"/>
|
||||||
|
<g>
|
||||||
|
<circle fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" cx="58.7" cy="58.5" r="43.7"/>
|
||||||
|
<g>
|
||||||
|
<path fill="#FFFFFF" d="M94.7,47.8c4.7,1.6,9.8-0.9,11.4-5.6c1.6-4.7-0.9-9.8-5.6-11.4c-4.7-1.6-9.8,0.9-11.4,5.6
|
||||||
|
C87.5,41.1,90,46.2,94.7,47.8z"/>
|
||||||
|
<line fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" x1="97.6" y1="39.4" x2="67.5" y2="64.4"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path fill="#FFFFFF" d="M77.6,91c-0.4,4.9,3.2,9.3,8.2,9.8c5,0.4,9.3-3.2,9.8-8.2c0.4-4.9-3.2-9.3-8.2-9.8
|
||||||
|
C82.4,82.4,78,86,77.6,91z"/>
|
||||||
|
<line fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" x1="86.5" y1="91.8" x2="67.5" y2="64.4"/>
|
||||||
|
</g>
|
||||||
|
<path fill="#FFFFFF" d="M60,69.3c2.7,4.2,8.3,5.4,12.4,2.7c4.2-2.7,5.4-8.3,2.7-12.4c-2.7-4.2-8.3-5.4-12.4-2.7
|
||||||
|
C58.5,59.5,57.3,65.1,60,69.3z"/>
|
||||||
|
<g>
|
||||||
|
<path fill="#FFFFFF" d="M21.2,61.4c-4.3-2.5-9.8-1.1-12.3,3.1c-2.5,4.3-1.1,9.8,3.1,12.3c4.3,2.5,9.8,1.1,12.3-3.1
|
||||||
|
C26.8,69.5,25.4,64,21.2,61.4z"/>
|
||||||
|
<line fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" x1="16.6" y1="69.1" x2="67.5" y2="64.4"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
BIN
public/svgs/trigger.avif
Normal file
BIN
public/svgs/trigger.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
1
public/svgs/umami.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="1141.333" height="1141.333" preserveAspectRatio="xMidYMid meet" version="1.0" viewBox="0 0 856 856"><metadata>Created by potrace 1.11, written by Peter Selinger 2001-2013</metadata><g fill="#fff" stroke="none"><path d="M4027 8163 c-2 -2 -28 -5 -58 -7 -50 -4 -94 -9 -179 -22 -19 -2 -48 -6 -65 -9 -47 -6 -236 -44 -280 -55 -22 -6 -49 -12 -60 -15 -34 -6 -58 -13 -130 -36 -38 -13 -72 -23 -75 -24 -29 -6 -194 -66 -264 -96 -49 -22 -95 -39 -102 -39 -7 0 -19 -7 -28 -15 -8 -9 -18 -15 -21 -14 -7 1 -197 -92 -205 -101 -3 -3 -21 -13 -40 -24 -79 -42 -123 -69 -226 -137 -94 -62 -246 -173 -280 -204 -6 -5 -29 -25 -52 -43 -136 -111 -329 -305 -457 -462 -21 -25 -41 -47 -44 -50 -4 -3 -22 -26 -39 -52 -18 -25 -38 -52 -45 -60 -34 -35 -207 -308 -259 -408 -13 -25 -25 -47 -28 -50 -11 -11 -121 -250 -159 -346 -42 -105 -114 -321 -126 -374 l-7 -30 -263 0 c-245 0 -268 -2 -321 -21 -94 -35 -171 -122 -191 -216 -9 -39 -8 -852 0 -938 9 -87 16 -150 23 -195 3 -19 6 -48 8 -65 3 -29 14 -97 22 -140 3 -11 7 -36 10 -55 3 -19 9 -51 14 -70 5 -19 11 -46 14 -60 29 -138 104 -401 145 -505 5 -11 23 -58 42 -105 18 -47 42 -105 52 -130 11 -25 21 -49 22 -55 3 -10 109 -224 164 -330 18 -33 50 -89 71 -124 22 -34 40 -64 40 -66 0 -8 104 -161 114 -167 6 -4 7 -8 3 -8 -4 0 4 -12 18 -27 14 -15 25 -32 25 -36 0 -5 6 -14 13 -21 6 -7 21 -25 32 -41 11 -15 34 -44 50 -64 17 -21 41 -52 55 -70 13 -18 33 -43 45 -56 11 -13 42 -49 70 -81 100 -118 359 -369 483 -469 34 -27 62 -53 62 -57 0 -5 6 -8 13 -8 7 0 19 -9 27 -20 8 -11 19 -20 26 -20 6 0 19 -9 29 -20 10 -11 22 -20 27 -20 5 0 23 -13 41 -30 18 -16 37 -30 44 -30 6 0 13 -4 15 -8 3 -8 186 -132 194 -132 2 0 27 -15 56 -34 132 -83 377 -207 558 -280 36 -15 74 -31 85 -36 62 -26 220 -81 320 -109 79 -23 191 -53 214 -57 14 -3 28 -7 31 -9 4 -2 20 -7 36 -9 16 -3 40 -8 54 -11 14 -3 36 -8 50 -11 14 -2 36 -7 50 -10 13 -3 40 -8 60 -10 19 -2 46 -7 60 -10 54 -10 171 -25 320 -40 90 -9 613 -12 636 -4 11 5 28 4 37 -1 9 -6 17 -6 17 -1 0 4 10 8 23 9 29 0 154 12 192 18 17 3 46 7 65 9 70 10 131 20 183 32 16 3 38 7 50 9 45 7 165 36 252 60 50 14 100 28 112 30 12 3 34 10 48 15 14 5 25 7 25 4 0 -4 6 -2 13 3 6 6 30 16 52 22 22 7 47 15 55 18 8 4 17 7 20 7 10 2 179 68 240 94 96 40 342 159 395 191 17 10 53 30 80 46 28 15 81 47 118 71 37 24 72 44 76 44 5 0 11 3 13 8 2 4 30 25 63 47 33 22 62 42 65 45 3 3 50 38 105 79 55 40 105 79 110 85 6 6 24 22 40 34 85 65 465 430 465 447 0 3 8 13 18 23 9 10 35 40 57 66 22 27 47 56 55 65 8 9 42 52 74 96 32 44 71 96 85 115 140 183 358 576 461 830 12 30 28 69 36 85 24 56 123 355 117 355 -3 0 -1 6 5 13 6 6 14 30 18 52 10 48 9 46 17 65 5 13 37 155 52 230 9 42 35 195 40 231 34 235 40 357 40 804 l0 420 -24 44 c-46 87 -143 157 -231 166 -19 2 -144 4 -276 4 l-242 1 -36 118 c-21 64 -46 139 -56 166 -11 27 -20 52 -20 57 0 5 -11 33 -25 63 -14 30 -25 58 -25 61 0 18 -152 329 -162 333 -5 2 -8 10 -8 18 0 8 -4 14 -10 14 -5 0 -9 3 -8 8 3 9 -40 82 -128 217 -63 97 -98 145 -187 259 -133 171 -380 420 -559 564 -71 56 -132 102 -138 102 -5 0 -10 3 -10 8 0 4 -25 23 -55 42 -30 19 -55 38 -55 43 0 4 -6 7 -13 7 -7 0 -22 8 -33 18 -11 9 -37 26 -59 37 -21 11 -44 25 -50 30 -41 37 -413 220 -540 266 -27 9 -61 22 -75 27 -14 5 -28 10 -32 11 -4 1 -28 10 -53 21 -25 11 -46 19 -48 18 -2 -1 -109 29 -137 40 -13 4 -32 9 -65 16 -5 1 -16 5 -22 9 -7 5 -13 6 -13 3 0 -2 -15 0 -32 5 -18 5 -44 11 -58 14 -14 3 -36 7 -50 10 -14 3 -50 9 -80 15 -30 6 -64 12 -75 14 -11 2 -45 6 -75 10 -30 4 -71 9 -90 12 -19 3 -53 6 -75 7 -22 1 -44 5 -50 8 -11 7 -542 9 -548 2z m57 -404 c7 10 436 8 511 -3 22 -3 60 -8 85 -11 25 -2 56 -6 70 -9 14 -2 43 -7 65 -10 38 -5 58 -9 115 -21 14 -3 34 -7 45 -9 11 -2 58 -14 105 -26 47 -12 92 -23 100 -25 35 -7 279 -94 308 -109 17 -9 34 -16 37 -16 3 1 20 -6 38 -14 17 -8 68 -31 112 -51 44 -20 82 -35 84 -35 2 1 7 -3 10 -8 3 -5 43 -28 88 -51 45 -23 87 -48 93 -56 7 -8 17 -15 22 -15 12 0 192 -121 196 -132 2 -4 8 -8 13 -8 10 0 119 -86 220 -172 102 -87 256 -244 349 -357 25 -30 53 -63 63 -73 9 -10 17 -22 17 -28 0 -5 3 -10 8 -10 4 0 25 -27 46 -60 22 -33 43 -60 48 -60 4 0 8 -5 8 -11 0 -6 11 -25 25 -43 14 -18 25 -38 25 -44 0 -7 4 -12 8 -12 5 0 16 -15 25 -32 9 -18 30 -55 47 -83 46 -77 161 -305 154 -305 -4 0 -2 -6 4 -12 6 -7 23 -47 40 -88 16 -41 33 -84 37 -95 5 -11 9 -22 10 -25 0 -3 11 -36 24 -73 13 -38 21 -70 19 -73 -3 -2 -1386 -3 -3075 -2 l-3071 3 38 110 c47 137 117 301 182 425 62 118 167 295 191 320 9 11 17 22 17 25 0 7 39 63 58 83 6 7 26 35 44 60 18 26 37 52 43 57 6 6 34 37 61 70 48 59 271 286 329 335 17 14 53 43 80 65 28 22 52 42 55 45 3 3 21 17 40 30 19 14 40 28 45 32 40 32 105 78 109 78 3 0 28 16 55 35 26 19 53 35 58 35 5 0 18 8 29 18 17 15 53 35 216 119 118 60 412 176 422 166 3 -4 6 -2 6 4 0 6 12 13 28 16 15 3 52 12 82 21 30 9 63 19 73 21 10 2 27 7 37 10 10 3 29 8 42 10 13 3 48 10 78 16 30 7 61 12 68 12 6 0 12 4 12 9 0 5 5 6 10 3 6 -4 34 -2 63 4 51 11 71 13 197 26 36 4 67 9 69 11 2 2 10 -1 17 -7 8 -6 14 -7 18 0z" transform="translate(0.000000,856.000000) scale(0.100000,-0.100000)"/></g></svg>
|
After Width: | Height: | Size: 4.8 KiB |
3
public/svgs/unknown.svg
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<svg width="45.34" height="64" viewBox="0 0 17 24" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill="#FCD34D" d="M11.403 18.751v4.499c-.01.41-.34.74-.748.75H6.159a.768.768 0 0 1-.749-.748v-4.5c.01-.41.34-.739.749-.749h4.5c.41.01.74.34.75.749v.001zm5.923-11.247a6.306 6.306 0 0 1-.962 3.354l.015-.026a5.462 5.462 0 0 1-1.021 1.108l-.01.008c-.321.282-.672.55-1.042.794l-.036.022q-.413.253-1.144.665a3.71 3.71 0 0 0-1.275 1.204l-.009.014a2.535 2.535 0 0 0-.515 1.243l-.001.012a.978.978 0 0 1-.226.611l.001-.002a.652.652 0 0 1-.524.29h-4.5a.563.563 0 0 1-.479-.343l-.001-.004a1.394 1.394 0 0 1-.197-.702v-.845a4.356 4.356 0 0 1 1.219-2.935l-.001.001A7.945 7.945 0 0 1 9.251 9.96l.048-.02a4.627 4.627 0 0 0 1.574-1.049l.001-.001a2.094 2.094 0 0 0 .469-1.429v.005a1.695 1.695 0 0 0-.863-1.382l-.009-.004a3.436 3.436 0 0 0-2.018-.599h.003a3.53 3.53 0 0 0-2.039.552l.014-.009A12.825 12.825 0 0 0 4.45 8.149l-.025.035a.73.73 0 0 1-.581.3a.897.897 0 0 1-.472-.152l.003.002L.301 5.991a.732.732 0 0 1-.29-.464L.01 5.523a.747.747 0 0 1 .105-.527l-.002.003C1.77 2 4.912.003 8.522.003c.103 0 .205.002.307.005h-.015a8.362 8.362 0 0 1 3.074.602l-.057-.02a10.2 10.2 0 0 1 2.757 1.571l-.02-.016a7.838 7.838 0 0 1 1.966 2.349l.02.041c.483.857.768 1.881.769 2.971z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.2 KiB |
9
public/svgs/uptime-kuma.svg
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<svg width="640" height="640" viewBox="0 0 640 640" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g transform="matrix(1 0 0 1 320 320)">
|
||||||
|
<linearGradient id="S3" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1 0 0 1 -319.99875 -320.0001577393)" x1="259.78" y1="261.15" x2="463.85" y2="456.49">
|
||||||
|
<stop stop-color="#5CDD8B"/>
|
||||||
|
<stop offset="1" stop-color="#86E6A9"/>
|
||||||
|
</linearGradient>
|
||||||
|
<path style="stroke: rgb(242,242,242); stroke-opacity: 0.51; stroke-width: 200; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: url(#S3); fill-rule: nonzero; opacity: 1;" transform=" translate(0, 0)" d="M 170.40125 -84.36016 C 224.09125 38.37984 224.09125 115.33984 170.40125 146.49984 C 89.85125000000001 193.23984000000002 -120.03875 207.48984000000002 -180.45875 135.63984 C -220.73875 87.73983999999999 -220.73875 14.399839999999998 -180.45875 -84.36016000000001 C -139.49875 -151.82016 -81.28875000000001 -185.55016 -5.828750000000014 -185.55016 C 69.64124999999999 -185.55016 128.38125 -151.82016000000002 170.40124999999998 -84.36016000000001 z" stroke-linecap="round" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.1 KiB |