fix: new resource selection view

fix: new services
This commit is contained in:
Andras Bacsai
2024-10-07 11:19:14 +02:00
parent 370a0b1eec
commit 1c10a43321
13 changed files with 200 additions and 158 deletions

View File

@@ -78,7 +78,7 @@ class ServicesGenerate extends Command
if ($logo->count() > 0) { if ($logo->count() > 0) {
$logo = str($logo[0])->after('# logo:')->trim()->value(); $logo = str($logo[0])->after('# logo:')->trim()->value();
} else { } else {
$logo = 'svgs/unknown.svg'; $logo = 'svgs/coolify.png';
} }
$minversion = collect(preg_grep('/^# minversion:/', explode("\n", $content)))->values(); $minversion = collect(preg_grep('/^# minversion:/', explode("\n", $content)))->values();
if ($minversion->count() > 0) { if ($minversion->count() > 0) {

View File

@@ -94,10 +94,10 @@ class Select extends Component
{ {
$services = get_service_templates(true); $services = get_service_templates(true);
$services = collect($services)->map(function ($service, $key) { $services = collect($services)->map(function ($service, $key) {
return array_merge($service, [ return [
'name' => str($key)->headline(), 'name' => str($key)->headline(),
'logo' => asset($service['logo']), 'logo' => asset(data_get($service, 'logo', 'svgs/unknown.svg')),
]); ] + (array) $service;
})->all(); })->all();
$gitBasedApplications = [ $gitBasedApplications = [
[ [
@@ -256,6 +256,7 @@ class Select extends Component
public function setType(string $type) public function setType(string $type)
{ {
$type = str($type)->lower()->value();
if ($this->loading) { if ($this->loading) {
return; return;
} }

View File

@@ -283,9 +283,63 @@ class Service extends BaseModel
$fields = collect([]); $fields = collect([]);
$applications = $this->applications()->get(); $applications = $this->applications()->get();
foreach ($applications as $application) { foreach ($applications as $application) {
$image = str($application->image)->before(':')->value(); $image = str($application->image)->before(':');
if ($image->isEmpty()) {
continue;
}
switch ($image) { switch ($image) {
case str($image)?->contains('invoiceninja'): case $image->contains('litellm'):
$data = collect([]);
$username = $this->environment_variables()->where('key', 'SERVICE_USER_UI')->first();
$password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_UI')->first();
if ($username) {
$data = $data->merge([
'Username' => [
'key' => data_get($username, 'key'),
'value' => data_get($username, 'value'),
'rules' => 'required',
],
]);
}
if ($password) {
$data = $data->merge([
'Password' => [
'key' => data_get($password, 'key'),
'value' => data_get($password, 'value'),
'rules' => 'required',
'isPassword' => true,
],
]);
}
$fields->put('Litellm', $data->toArray());
break;
case $image->contains('langfuse'):
$data = collect([]);
$email = $this->environment_variables()->where('key', 'LANGFUSE_INIT_USER_EMAIL')->first();
if ($email) {
$data = $data->merge([
'Admin Email' => [
'key' => 'LANGFUSE_INIT_USER_EMAIL',
'value' => data_get($email, 'value'),
'rules' => 'required|email',
],
]);
}
$password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_LANGFUSE')->first();
ray('password', $password);
if ($password) {
$data = $data->merge([
'Admin Password' => [
'key' => 'LANGFUSE_INIT_USER_PASSWORD',
'value' => data_get($password, 'value'),
'rules' => 'required',
'isPassword' => true,
],
]);
}
$fields->put('Langfuse', $data->toArray());
break;
case $image->contains('invoiceninja'):
$data = collect([]); $data = collect([]);
$email = $this->environment_variables()->where('key', 'IN_USER_EMAIL')->first(); $email = $this->environment_variables()->where('key', 'IN_USER_EMAIL')->first();
$data = $data->merge([ $data = $data->merge([
@@ -306,7 +360,7 @@ class Service extends BaseModel
]); ]);
$fields->put('Invoice Ninja', $data->toArray()); $fields->put('Invoice Ninja', $data->toArray());
break; break;
case str($image)?->contains('argilla'): case $image->contains('argilla'):
$data = collect([]); $data = collect([]);
$api_key = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_APIKEY')->first(); $api_key = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_APIKEY')->first();
$data = $data->merge([ $data = $data->merge([
@@ -344,7 +398,7 @@ class Service extends BaseModel
]); ]);
$fields->put('Argilla', $data->toArray()); $fields->put('Argilla', $data->toArray());
break; break;
case str($image)?->contains('rabbitmq'): case $image->contains('rabbitmq'):
$data = collect([]); $data = collect([]);
$host_port = $this->environment_variables()->where('key', 'PORT')->first(); $host_port = $this->environment_variables()->where('key', 'PORT')->first();
$username = $this->environment_variables()->where('key', 'SERVICE_USER_RABBITMQ')->first(); $username = $this->environment_variables()->where('key', 'SERVICE_USER_RABBITMQ')->first();
@@ -379,7 +433,7 @@ class Service extends BaseModel
} }
$fields->put('RabbitMQ', $data->toArray()); $fields->put('RabbitMQ', $data->toArray());
break; break;
case str($image)?->contains('tolgee'): case $image->contains('tolgee'):
$data = collect([]); $data = collect([]);
$admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_TOLGEE')->first(); $admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_TOLGEE')->first();
$data = $data->merge([ $data = $data->merge([
@@ -402,7 +456,7 @@ class Service extends BaseModel
} }
$fields->put('Tolgee', $data->toArray()); $fields->put('Tolgee', $data->toArray());
break; break;
case str($image)?->contains('logto'): case $image->contains('logto'):
$data = collect([]); $data = collect([]);
$logto_endpoint = $this->environment_variables()->where('key', 'LOGTO_ENDPOINT')->first(); $logto_endpoint = $this->environment_variables()->where('key', 'LOGTO_ENDPOINT')->first();
$logto_admin_endpoint = $this->environment_variables()->where('key', 'LOGTO_ADMIN_ENDPOINT')->first(); $logto_admin_endpoint = $this->environment_variables()->where('key', 'LOGTO_ADMIN_ENDPOINT')->first();
@@ -426,7 +480,7 @@ class Service extends BaseModel
} }
$fields->put('Logto', $data->toArray()); $fields->put('Logto', $data->toArray());
break; break;
case str($image)?->contains('unleash-server'): case $image->contains('unleash-server'):
$data = collect([]); $data = collect([]);
$admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_UNLEASH')->first(); $admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_UNLEASH')->first();
$data = $data->merge([ $data = $data->merge([
@@ -449,7 +503,7 @@ class Service extends BaseModel
} }
$fields->put('Unleash', $data->toArray()); $fields->put('Unleash', $data->toArray());
break; break;
case str($image)?->contains('grafana'): case $image->contains('grafana'):
$data = collect([]); $data = collect([]);
$admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_GRAFANA')->first(); $admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_GRAFANA')->first();
$data = $data->merge([ $data = $data->merge([
@@ -472,7 +526,7 @@ class Service extends BaseModel
} }
$fields->put('Grafana', $data->toArray()); $fields->put('Grafana', $data->toArray());
break; break;
case str($image)?->contains('directus'): case $image->contains('directus'):
$data = collect([]); $data = collect([]);
$admin_email = $this->environment_variables()->where('key', 'ADMIN_EMAIL')->first(); $admin_email = $this->environment_variables()->where('key', 'ADMIN_EMAIL')->first();
$admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_ADMIN')->first(); $admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_ADMIN')->first();
@@ -498,7 +552,7 @@ class Service extends BaseModel
} }
$fields->put('Directus', $data->toArray()); $fields->put('Directus', $data->toArray());
break; break;
case str($image)?->contains('kong'): case $image->contains('kong'):
$data = collect([]); $data = collect([]);
$dashboard_user = $this->environment_variables()->where('key', 'SERVICE_USER_ADMIN')->first(); $dashboard_user = $this->environment_variables()->where('key', 'SERVICE_USER_ADMIN')->first();
$dashboard_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_ADMIN')->first(); $dashboard_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_ADMIN')->first();
@@ -522,7 +576,7 @@ class Service extends BaseModel
]); ]);
} }
$fields->put('Supabase', $data->toArray()); $fields->put('Supabase', $data->toArray());
case str($image)?->contains('minio'): case $image->contains('minio'):
$data = collect([]); $data = collect([]);
$console_url = $this->environment_variables()->where('key', 'MINIO_BROWSER_REDIRECT_URL')->first(); $console_url = $this->environment_variables()->where('key', 'MINIO_BROWSER_REDIRECT_URL')->first();
$s3_api_url = $this->environment_variables()->where('key', 'MINIO_SERVER_URL')->first(); $s3_api_url = $this->environment_variables()->where('key', 'MINIO_SERVER_URL')->first();
@@ -575,7 +629,7 @@ class Service extends BaseModel
$fields->put('MinIO', $data->toArray()); $fields->put('MinIO', $data->toArray());
break; break;
case str($image)?->contains('weblate'): case $image->contains('weblate'):
$data = collect([]); $data = collect([]);
$admin_email = $this->environment_variables()->where('key', 'WEBLATE_ADMIN_EMAIL')->first(); $admin_email = $this->environment_variables()->where('key', 'WEBLATE_ADMIN_EMAIL')->first();
$admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_WEBLATE')->first(); $admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_WEBLATE')->first();
@@ -601,7 +655,7 @@ class Service extends BaseModel
} }
$fields->put('Weblate', $data->toArray()); $fields->put('Weblate', $data->toArray());
break; break;
case str($image)?->contains('meilisearch'): case $image->contains('meilisearch'):
$data = collect([]); $data = collect([]);
$SERVICE_PASSWORD_MEILISEARCH = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_MEILISEARCH')->first(); $SERVICE_PASSWORD_MEILISEARCH = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_MEILISEARCH')->first();
if ($SERVICE_PASSWORD_MEILISEARCH) { if ($SERVICE_PASSWORD_MEILISEARCH) {
@@ -615,7 +669,7 @@ class Service extends BaseModel
} }
$fields->put('Meilisearch', $data->toArray()); $fields->put('Meilisearch', $data->toArray());
break; break;
case str($image)?->contains('ghost'): case $image->contains('ghost'):
$data = collect([]); $data = collect([]);
$MAIL_OPTIONS_AUTH_PASS = $this->environment_variables()->where('key', 'MAIL_OPTIONS_AUTH_PASS')->first(); $MAIL_OPTIONS_AUTH_PASS = $this->environment_variables()->where('key', 'MAIL_OPTIONS_AUTH_PASS')->first();
$MAIL_OPTIONS_AUTH_USER = $this->environment_variables()->where('key', 'MAIL_OPTIONS_AUTH_USER')->first(); $MAIL_OPTIONS_AUTH_USER = $this->environment_variables()->where('key', 'MAIL_OPTIONS_AUTH_USER')->first();
@@ -675,45 +729,8 @@ class Service extends BaseModel
$fields->put('Ghost', $data->toArray()); $fields->put('Ghost', $data->toArray());
break; break;
default:
$data = collect([]);
$admin_user = $this->environment_variables()->where('key', 'SERVICE_USER_ADMIN')->first();
// Chaskiq
$admin_email = $this->environment_variables()->where('key', 'ADMIN_EMAIL')->first();
$admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_ADMIN')->first(); case $image->contains('vaultwarden'):
if ($admin_user) {
$data = $data->merge([
'User' => [
'key' => 'SERVICE_USER_ADMIN',
'value' => data_get($admin_user, 'value', 'admin'),
'readonly' => true,
'rules' => 'required',
],
]);
}
if ($admin_password) {
$data = $data->merge([
'Password' => [
'key' => 'SERVICE_PASSWORD_ADMIN',
'value' => data_get($admin_password, 'value'),
'rules' => 'required',
'isPassword' => true,
],
]);
}
if ($admin_email) {
$data = $data->merge([
'Email' => [
'key' => 'ADMIN_EMAIL',
'value' => data_get($admin_email, 'value'),
'rules' => 'required|email',
],
]);
}
$fields->put('Admin', $data->toArray());
break;
case str($image)?->contains('vaultwarden'):
$data = collect([]); $data = collect([]);
$DATABASE_URL = $this->environment_variables()->where('key', 'DATABASE_URL')->first(); $DATABASE_URL = $this->environment_variables()->where('key', 'DATABASE_URL')->first();
@@ -779,7 +796,7 @@ class Service extends BaseModel
$fields->put('Vaultwarden', $data); $fields->put('Vaultwarden', $data);
break; break;
case str($image)->contains('gitlab/gitlab'): case $image->contains('gitlab/gitlab'):
$password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_GITLAB')->first(); $password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_GITLAB')->first();
$data = collect([]); $data = collect([]);
if ($password) { if ($password) {
@@ -803,7 +820,7 @@ class Service extends BaseModel
$fields->put('GitLab', $data->toArray()); $fields->put('GitLab', $data->toArray());
break; break;
case str($image)->contains('code-server'): case $image->contains('code-server'):
$data = collect([]); $data = collect([]);
$password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_64_PASSWORDCODESERVER')->first(); $password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_64_PASSWORDCODESERVER')->first();
if ($password) { if ($password) {
@@ -829,7 +846,7 @@ class Service extends BaseModel
} }
$fields->put('Code Server', $data->toArray()); $fields->put('Code Server', $data->toArray());
break; break;
case str($image)->contains('elestio/strapi'): case $image->contains('elestio/strapi'):
$data = collect([]); $data = collect([]);
$license = $this->environment_variables()->where('key', 'STRAPI_LICENSE')->first(); $license = $this->environment_variables()->where('key', 'STRAPI_LICENSE')->first();
if ($license) { if ($license) {
@@ -852,15 +869,55 @@ class Service extends BaseModel
$fields->put('Strapi', $data->toArray()); $fields->put('Strapi', $data->toArray());
break; break;
default:
$data = collect([]);
$admin_user = $this->environment_variables()->where('key', 'SERVICE_USER_ADMIN')->first();
// Chaskiq
$admin_email = $this->environment_variables()->where('key', 'ADMIN_EMAIL')->first();
$admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_ADMIN')->first();
if ($admin_user) {
$data = $data->merge([
'User' => [
'key' => 'SERVICE_USER_ADMIN',
'value' => data_get($admin_user, 'value', 'admin'),
'readonly' => true,
'rules' => 'required',
],
]);
}
if ($admin_password) {
$data = $data->merge([
'Password' => [
'key' => 'SERVICE_PASSWORD_ADMIN',
'value' => data_get($admin_password, 'value'),
'rules' => 'required',
'isPassword' => true,
],
]);
}
if ($admin_email) {
$data = $data->merge([
'Email' => [
'key' => 'ADMIN_EMAIL',
'value' => data_get($admin_email, 'value'),
'rules' => 'required|email',
],
]);
}
$fields->put('Admin', $data->toArray());
break;
} }
} }
$databases = $this->databases()->get(); $databases = $this->databases()->get();
foreach ($databases as $database) { foreach ($databases as $database) {
$image = str($database->image)->before(':')->value(); $image = str($database->image)->before(':');
if ($image->isEmpty()) {
continue;
}
switch ($image) { switch ($image) {
case str($image)->contains('postgres'): case $image->contains('postgres'):
$userVariables = ['SERVICE_USER_POSTGRES', 'SERVICE_USER_POSTGRESQL']; $userVariables = ['SERVICE_USER_POSTGRES', 'SERVICE_USER_POSTGRESQL'];
$passwordVariables = ['SERVICE_PASSWORD_POSTGRES', 'SERVICE_PASSWORD_POSTGRESQL']; $passwordVariables = ['SERVICE_PASSWORD_POSTGRES', 'SERVICE_PASSWORD_POSTGRESQL'];
$dbNameVariables = ['POSTGRESQL_DATABASE', 'POSTGRES_DB']; $dbNameVariables = ['POSTGRESQL_DATABASE', 'POSTGRES_DB'];
@@ -898,7 +955,7 @@ class Service extends BaseModel
} }
$fields->put('PostgreSQL', $data->toArray()); $fields->put('PostgreSQL', $data->toArray());
break; break;
case str($image)->contains('mysql'): case $image->contains('mysql'):
$userVariables = ['SERVICE_USER_MYSQL', 'SERVICE_USER_WORDPRESS', 'MYSQL_USER']; $userVariables = ['SERVICE_USER_MYSQL', 'SERVICE_USER_WORDPRESS', 'MYSQL_USER'];
$passwordVariables = ['SERVICE_PASSWORD_MYSQL', 'SERVICE_PASSWORD_WORDPRESS', 'MYSQL_PASSWORD']; $passwordVariables = ['SERVICE_PASSWORD_MYSQL', 'SERVICE_PASSWORD_WORDPRESS', 'MYSQL_PASSWORD'];
$rootPasswordVariables = ['SERVICE_PASSWORD_MYSQLROOT', 'SERVICE_PASSWORD_ROOT']; $rootPasswordVariables = ['SERVICE_PASSWORD_MYSQLROOT', 'SERVICE_PASSWORD_ROOT'];
@@ -948,7 +1005,7 @@ class Service extends BaseModel
} }
$fields->put('MySQL', $data->toArray()); $fields->put('MySQL', $data->toArray());
break; break;
case str($image)->contains('mariadb'): case $image->contains('mariadb'):
$userVariables = ['SERVICE_USER_MARIADB', 'SERVICE_USER_WORDPRESS', '_APP_DB_USER', 'SERVICE_USER_MYSQL', 'MYSQL_USER']; $userVariables = ['SERVICE_USER_MARIADB', 'SERVICE_USER_WORDPRESS', '_APP_DB_USER', 'SERVICE_USER_MYSQL', 'MYSQL_USER'];
$passwordVariables = ['SERVICE_PASSWORD_MARIADB', 'SERVICE_PASSWORD_WORDPRESS', '_APP_DB_PASS', 'MYSQL_PASSWORD']; $passwordVariables = ['SERVICE_PASSWORD_MARIADB', 'SERVICE_PASSWORD_WORDPRESS', '_APP_DB_PASS', 'MYSQL_PASSWORD'];
$rootPasswordVariables = ['SERVICE_PASSWORD_MARIADBROOT', 'SERVICE_PASSWORD_ROOT', '_APP_DB_ROOT_PASS', 'MYSQL_ROOT_PASSWORD']; $rootPasswordVariables = ['SERVICE_PASSWORD_MARIADBROOT', 'SERVICE_PASSWORD_ROOT', '_APP_DB_ROOT_PASS', 'MYSQL_ROOT_PASSWORD'];

BIN
public/svgs/coolify.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

5
public/svgs/tolgee.svg Normal file
View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="100%" height="100%" viewBox="0 0 200 200" version="1.1" xmlns="http://www.w3.org/2000/svg"
style="fill:#EC407A;fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<path d="M97.16,7.27a16.94,16.94,0,0,0-1.9,24.47,16.36,16.36,0,0,0,5,3.83,3.23,3.23,0,0,1-2.9,5.77,23.14,23.14,0,0,1-11.41-13C73.83,31.1,63.46,37.09,52.82,46.51c-27.44,24.3-34.35,61.74-16.38,85.26-4.57,5.79-8,12.22-8.9,18.69a20.88,20.88,0,0,0,5.62,18c9.18,9.61,21.42,7.13,31.26,5.14,6.58-1.34,12.8-2.6,16.5-.23,3.22,2.07,3.47,3.87,3.61,4.45,2.1,9.32-5.79,13.89-7.67,16.27a1.48,1.48,0,0,0,1.13,2.4c3.48,0,9-1.18,12.34-4.08s7.16-7.9,5.89-16.32c-.08-.5-.18-1-.32-1.58-.86-3.35-3.1-7.57-8.61-11.09-7.72-4.95-17-3.07-25.22-1.41-9.76,2-16,2.85-20.37-1.71a9.13,9.13,0,0,1-2.46-8.19c.54-3.77,2.65-7.89,5.62-11.86,21.71,16.89,56.87,13.47,82.67-9.39a75.34,75.34,0,0,0,20.81-28.09A23.14,23.14,0,0,1,134.8,89a3.23,3.23,0,0,1,6.08-2.19,16.37,16.37,0,0,0,3.2,5.39,16.85,16.85,0,1,0,11.48-28,3.23,3.23,0,0,1-.51-6.44,23.41,23.41,0,0,1,12.88,2.69c2.6-14.08,3.34-31.41-2.06-37.51-4.08-4.61-20.62-8-35.18-7.76A23.48,23.48,0,0,1,130.8,25a3.23,3.23,0,0,1-6.33-1.28A16.94,16.94,0,0,0,97.16,7.27Zm63.25,21a5.29,5.29,0,0,1-.57,6.19c-1.29,1.14-2.72-.51-4.1-2.06s-3.1-3.42-1.81-4.56A5.74,5.74,0,0,1,160.41,28.27Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -4,7 +4,6 @@
'hover:border-l-red-500 cursor-not-allowed' => $upgrade, 'hover:border-l-red-500 cursor-not-allowed' => $upgrade,
])> ])>
<div class="flex items-center"> <div class="flex items-center">
{{ $logo }} {{ $logo }}
<div class="flex flex-col pl-2 "> <div class="flex flex-col pl-2 ">
<div class="dark:text-white text-md"> <div class="dark:text-white text-md">
@@ -19,4 +18,8 @@
@endif @endif
</div> </div>
</div> </div>
@isset($documentation)
<div class="flex-1"></div>
{{ $documentation }}
@endisset
</div> </div>

View File

@@ -48,7 +48,6 @@
</div> </div>
</template> </template>
</div> </div>
<h2 x-show="filteredDatabases.length > 0" class="py-4"> Databases </h2> <h2 x-show="filteredDatabases.length > 0" class="py-4"> Databases </h2>
<div class="grid justify-start grid-cols-1 gap-4 text-left xl:grid-cols-2"> <div class="grid justify-start grid-cols-1 gap-4 text-left xl:grid-cols-2">
<template x-for="database in filteredDatabases" :key="database.id"> <template x-for="database in filteredDatabases" :key="database.id">
@@ -78,41 +77,44 @@
<div class="grid justify-start grid-cols-1 gap-4 text-left xl:grid-cols-2"> <div class="grid justify-start grid-cols-1 gap-4 text-left xl:grid-cols-2">
<template x-for="service in filteredServices" :key="service.name"> <template x-for="service in filteredServices" :key="service.name">
<x-resource-view @click="setType('one-click-service-' + service.name)"> <div x-on:click="setType('one-click-service-' + service.name)">
<x-slot:title> <x-resource-view>
<template x-if="service.name"> <x-slot:title>
<span x-text="service.name"></span> <template x-if="service.name">
</template> <span x-text="service.name"></span>
</x-slot> </template>
<x-slot:description> </x-slot>
<template x-if="service.slogan"> <x-slot:description>
<span x-text="service.slogan"></span> <template x-if="service.slogan">
</template> <span x-text="service.slogan"></span>
</x-slot> </template>
<x-slot:logo> </x-slot>
<template x-if="service.logo"> <x-slot:logo>
<img class="w-[4.5rem] aspect-square h-[4.5rem] p-2 transition-all duration-200 opacity-30 grayscale group-hover:grayscale-0 group-hover:opacity-100" <template x-if="service.logo">
:src='service.logo'> <img class="w-[4.5rem] aspect-square h-[4.5rem] p-2 transition-all duration-200 opacity-30 grayscale group-hover:grayscale-0 group-hover:opacity-100"
</template> :src='service.logo'>
</x-slot:logo> </template>
<x-slot:documentation> </x-slot:logo>
<template x-show="service.documentation"> <x-slot:documentation>
<div> <template x-if="service.documentation">
<div class="flex-1"></div> <div class="flex items-center px-2" title="Read the documentation.">
<div class="flex items-center px-2 " title="Read the documentation.">
<a class="p-2 rounded hover:bg-coolgray-200 hover:no-underline group-hover:dark:text-white text-neutral-600" <a class="p-2 rounded hover:bg-coolgray-200 hover:no-underline group-hover:dark:text-white text-neutral-600"
onclick="event.stopPropagation()" :href="service.documentation" onclick="event.stopPropagation()" :href="service.documentation"
target="_blank"> target="_blank">
Docs Docs
</a> </a>
</div> </div>
</div> </template>
</template> </x-slot:documentation>
</x-slot:documentation> </x-resource-view>
</x-resource-view> </div>
</template> </template>
</div> </div>
</div> </div>
<div
x-show="filteredGitBasedApplications.length === 0 && filteredDockerBasedApplications.length === 0 && filteredDatabases.length === 0 && filteredServices.length === 0 && loading === false">
<div>No resources found.</div>
</div>
<script> <script>
function sortFn(a, b) { function sortFn(a, b) {
return a.name.localeCompare(b.name) return a.name.localeCompare(b.name)

View File

@@ -4,15 +4,9 @@
# logo: svgs/langfuse.png # logo: svgs/langfuse.png
# port: 3000 # port: 3000
version: "3"
volumes:
pg_data: null
services: services:
langfuse: langfuse:
image: langfuse/langfuse:2 image: langfuse/langfuse:2
restart: always
environment: environment:
- SERVICE_FQDN_LANGFUSE_3000 - SERVICE_FQDN_LANGFUSE_3000
- DATABASE_URL=postgresql://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-langfuse} - DATABASE_URL=postgresql://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-langfuse}
@@ -23,7 +17,14 @@ services:
- NEXTAUTH_SECRET=${SERVICE_BASE64_64_NEXTAUTHSECRET} - NEXTAUTH_SECRET=${SERVICE_BASE64_64_NEXTAUTHSECRET}
- TELEMETRY_ENABLED=${TELEMETRY_ENABLED:-false} - TELEMETRY_ENABLED=${TELEMETRY_ENABLED:-false}
- LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES=${LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES:-false} - LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES=${LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES:-false}
- HOSTNAME=0.0.0.0 - HOSTNAME=${HOSTNAME:-0.0.0.0}
- LANGFUSE_INIT_USER_NAME=${LANGFUSE_INIT_USER_NAME:-Admin}
- LANGFUSE_INIT_USER_EMAIL=${LANGFUSE_INIT_USER_EMAIL:-admin@example.com}
- LANGFUSE_INIT_USER_PASSWORD=${SERVICE_PASSWORD_LANGFUSE}
- LANGFUSE_INIT_ORG_ID=${LANGFUSE_INIT_ORG_ID:-my-org}
- LANGFUSE_INIT_ORG_NAME=${LANGFUSE_INIT_ORG_NAME:-My Org}
- LANGFUSE_INIT_PROJECT_ID=${LANGFUSE_INIT_PROJECT_ID:-my-project}
- LANGFUSE_INIT_PROJECT_NAME=${LANGFUSE_INIT_PROJECT_NAME:-My Project}
healthcheck: healthcheck:
test: test:
- CMD - CMD
@@ -44,7 +45,7 @@ services:
- POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
- POSTGRES_USER=$SERVICE_USER_POSTGRES - POSTGRES_USER=$SERVICE_USER_POSTGRES
volumes: volumes:
- "pg_data:/var/lib/postgresql/data" - "pg-data:/var/lib/postgresql/data"
healthcheck: healthcheck:
test: test:
- CMD-SHELL - CMD-SHELL

View File

@@ -4,16 +4,9 @@
# logo: svgs/litellm.svg # logo: svgs/litellm.svg
# port: 4000 # port: 4000
version: "3"
volumes:
pg_data: null
redis_data: null
services: services:
litellm: litellm:
image: "ghcr.io/berriai/litellm-database:main-stable" image: "ghcr.io/berriai/litellm-database:main-stable"
restart: always
depends_on: depends_on:
postgres: postgres:
condition: service_healthy condition: service_healthy
@@ -21,23 +14,23 @@ services:
condition: service_healthy condition: service_healthy
environment: environment:
- SERVICE_FQDN_LITELLM_4000 - SERVICE_FQDN_LITELLM_4000
- LITELLM_LOG=ERROR - LITELLM_LOG=${LITELLM_LOG:-ERROR}
- LITELLM_MODE=PRODUCTION - LITELLM_MODE=${LITELLM_MODE:-PRODUCTION}
- "LITELLM_MASTER_KEY=${SERVICE_PASSWORD_MASTERKEY}" - LITELLM_MASTER_KEY=${SERVICE_PASSWORD_MASTERKEY}
- "UI_USERNAME=${SERVICE_USER_UI}" - UI_USERNAME=${SERVICE_USER_UI}
- "UI_PASSWORD=${SERVICE_PASSWORD_UI}" - UI_PASSWORD=${SERVICE_PASSWORD_UI}
- "DATABASE_URL=postgresql://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-litellm}" - DATABASE_URL=postgresql://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-litellm}
- REDIS_HOST=redis - REDIS_HOST=${REDIS_HOST:-redis}
- REDIS_PORT=6379 - REDIS_PORT=${REDIS_PORT:-6379}
- "POSTGRES_USER=${SERVICE_USER_POSTGRES}" - POSTGRES_USER=${SERVICE_USER_POSTGRES}
- "POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}" - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}
- "POSTGRES_DB=${POSTGRES_DB:-litellm}" - POSTGRES_DB=${POSTGRES_DB:-litellm}
- "OPENAI_API_KEY=${OPENAI_API_KEY}" - OPENAI_API_KEY=${OPENAI_API_KEY}
- "OPENAI_API_BASE=${OPENAI_API_BASE}" - OPENAI_API_BASE=${OPENAI_API_BASE}
- "ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}" - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- "ANTHROPIC_API_BASE=${ANTHROPIC_API_BASE}" - ANTHROPIC_API_BASE=${ANTHROPIC_API_BASE}
- "VOYAGE_API_KEY=${VOYAGE_API_KEY}" - VOYAGE_API_KEY=${VOYAGE_API_KEY}
- "VOYAGE_API_BASE=${VOYAGE_API_BASE}" - VOYAGE_API_BASE=${VOYAGE_API_BASE}
volumes: volumes:
- type: bind - type: bind
source: ./litellm-config.yaml source: ./litellm-config.yaml
@@ -154,7 +147,7 @@ services:
- POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
- POSTGRES_USER=$SERVICE_USER_POSTGRES - POSTGRES_USER=$SERVICE_USER_POSTGRES
volumes: volumes:
- "pg_data:/var/lib/postgresql/data" - "pg-data:/var/lib/postgresql/data"
healthcheck: healthcheck:
test: test:
- CMD-SHELL - CMD-SHELL
@@ -166,7 +159,7 @@ services:
image: redis:7-alpine image: redis:7-alpine
command: redis-server --appendonly yes command: redis-server --appendonly yes
volumes: volumes:
- redis_data:/data - redis-data:/data
healthcheck: healthcheck:
test: ["CMD", "redis-cli", "ping"] test: ["CMD", "redis-cli", "ping"]
interval: 5s interval: 5s

View File

@@ -4,15 +4,9 @@
# logo: svgs/prefect.png # logo: svgs/prefect.png
# port: 4200 # port: 4200
version: "3"
volumes:
pg_data:
services: services:
prefect: prefect:
image: "prefecthq/prefect:3-latest" image: "prefecthq/prefect:3-latest"
restart: always
depends_on: depends_on:
postgresql: postgresql:
condition: service_healthy condition: service_healthy
@@ -20,9 +14,9 @@ services:
- SERVICE_FQDN_PREFECT_4200 - SERVICE_FQDN_PREFECT_4200
- PREFECT_API_DATABASE_CONNECTION_URL=postgresql+asyncpg://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgresql:5432/${POSTGRES_DB:-prefect} - PREFECT_API_DATABASE_CONNECTION_URL=postgresql+asyncpg://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgresql:5432/${POSTGRES_DB:-prefect}
- PREFECT_API_KEY=${SERVICE_PASSWORD_APIKEY} - PREFECT_API_KEY=${SERVICE_PASSWORD_APIKEY}
- PREFECT_EXPERIMENTAL_WARN=true - PREFECT_EXPERIMENTAL_WARN=${PREFECT_EXPERIMENTAL_WARN:-false}
- PREFECT_EXPERIMENTAL_ENABLE_SCHEDULE_CONCURRENCY=true - PREFECT_EXPERIMENTAL_ENABLE_SCHEDULE_CONCURRENCY=${PREFECT_EXPERIMENTAL_ENABLE_SCHEDULE_CONCURRENCY:-false}
- PREFECT_RUNNER_SERVER_ENABLE=true - PREFECT_RUNNER_SERVER_ENABLE=${PREFECT_RUNNER_SERVER_ENABLE:-false}
- PREFECT_DEFAULT_WORK_POOL_NAME=${DEFAULT_POOL_NAME:-default} - PREFECT_DEFAULT_WORK_POOL_NAME=${DEFAULT_POOL_NAME:-default}
command: command:
- prefect - prefect
@@ -43,9 +37,8 @@ services:
retries: 3 retries: 3
postgresql: postgresql:
image: "postgres:16-alpine" image: "postgres:16-alpine"
restart: always
volumes: volumes:
- "pg_data:/var/lib/postgresql/data" - "pg-data:/var/lib/postgresql/data"
environment: environment:
- POSTGRES_USER=$SERVICE_USER_POSTGRES - POSTGRES_USER=$SERVICE_USER_POSTGRES
- POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
@@ -59,7 +52,6 @@ services:
retries: 3 retries: 3
agent: agent:
image: "prefecthq/prefect:3-python3.12" image: "prefecthq/prefect:3-python3.12"
restart: always
depends_on: depends_on:
prefect: prefect:
condition: service_healthy condition: service_healthy
@@ -68,10 +60,10 @@ services:
- prefect - prefect
- worker - worker
- start - start
- "--pool=$${DEFAULT_POOL_NAME}" - --pool=${DEFAULT_POOL_NAME}
- "--with-healthcheck" - --with-healthcheck
- "--name=$${DEFAULT_WORKER_NAME}" - --name=${DEFAULT_WORKER_NAME}
- "--limit=$${DEFAULT_POOL_LIMIT}" - --limit=${DEFAULT_POOL_LIMIT}
environment: environment:
- PREFECT_API_URL=http://prefect:4200/api - PREFECT_API_URL=http://prefect:4200/api
- PREFECT_API_KEY=${SERVICE_PASSWORD_APIKEY} - PREFECT_API_KEY=${SERVICE_PASSWORD_APIKEY}

View File

@@ -4,20 +4,14 @@
# logo: svgs/qdrant.png # logo: svgs/qdrant.png
# port: 6333 # port: 6333
version: "3"
volumes:
qdrant_storage: null
services: services:
qdrant: qdrant:
image: "qdrant/qdrant:latest" image: "qdrant/qdrant:latest"
restart: always
environment: environment:
- SERVICE_FQDN_QDRANT_6333 - SERVICE_FQDN_QDRANT_6333
- QDRANT__SERVICE__API_KEY=${SERVICE_PASSWORD_QDRANTAPIKEY} - QDRANT__SERVICE__API_KEY=${SERVICE_PASSWORD_QDRANTAPIKEY}
volumes: volumes:
- "qdrant_storage:/qdrant/storage" - "qdrant-storage:/qdrant/storage"
healthcheck: healthcheck:
test: test:
- CMD-SHELL - CMD-SHELL

View File

@@ -4,24 +4,18 @@
# logo: svgs/searxng.svg # logo: svgs/searxng.svg
# port: 8080 # port: 8080
version: "3"
volumes:
redis_data: null
services: services:
searxng: searxng:
image: searxng/searxng image: searxng/searxng
restart: always
depends_on: depends_on:
redis: redis:
condition: service_healthy condition: service_healthy
environment: environment:
- SERVICE_FQDN_SEARXNG_8080 - SERVICE_FQDN_SEARXNG_8080
- INSTANCE_NAME=coolify - INSTANCE_NAME=${INSTANCE_NAME:-coolify}
- BASE_URL=${SERVICE_FQDN_SEARXNG_8080} - BASE_URL=${SERVICE_FQDN_SEARXNG_8080}
- SEARXNG_URL=${SERVICE_FQDN_SEARXNG_8080} - SEARXNG_URL=${SERVICE_FQDN_SEARXNG_8080}
- SEARXNG_BIND_ADDRESS=0.0.0.0 - SEARXNG_BIND_ADDRESS=${SEARXNG_BIND_ADDRESS:-0.0.0.0}
- SEARXNG_SECRET=${SERVICE_PASSWORD_SEARXNGSECRET} - SEARXNG_SECRET=${SERVICE_PASSWORD_SEARXNGSECRET}
- SEARXNG_REDIS_URL=redis://redis:6379/0 - SEARXNG_REDIS_URL=redis://redis:6379/0
healthcheck: healthcheck:
@@ -67,7 +61,7 @@ services:
image: "redis:7" image: "redis:7"
restart: always restart: always
volumes: volumes:
- "redis_data:/data" - "redis-data:/data"
healthcheck: healthcheck:
test: test:
- CMD - CMD

File diff suppressed because one or more lines are too long