fix: new resource selection view

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

No files matched your search

+1 -1
View File
@@ -78,7 +78,7 @@ class ServicesGenerate extends Command
if ($logo->count() > 0) {
$logo = str($logo[0])->after('# logo:')->trim()->value();
} else {
$logo = 'svgs/unknown.svg';
$logo = 'svgs/coolify.png';
}
$minversion = collect(preg_grep('/^# minversion:/', explode("\n", $content)))->values();
if ($minversion->count() > 0) {
+4 -3
View File
@@ -94,10 +94,10 @@ class Select extends Component
{
$services = get_service_templates(true);
$services = collect($services)->map(function ($service, $key) {
return array_merge($service, [
return [
'name' => str($key)->headline(),
'logo' => asset($service['logo']),
]);
'logo' => asset(data_get($service, 'logo', 'svgs/unknown.svg')),
] + (array) $service;
})->all();
$gitBasedApplications = [
[
@@ -256,6 +256,7 @@ class Select extends Component
public function setType(string $type)
{
$type = str($type)->lower()->value();
if ($this->loading) {
return;
}
+116 -59
View File
@@ -283,9 +283,63 @@ class Service extends BaseModel
$fields = collect([]);
$applications = $this->applications()->get();
foreach ($applications as $application) {
$image = str($application->image)->before(':')->value();
$image = str($application->image)->before(':');
if ($image->isEmpty()) {
continue;
}
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([]);
$email = $this->environment_variables()->where('key', 'IN_USER_EMAIL')->first();
$data = $data->merge([
@@ -306,7 +360,7 @@ class Service extends BaseModel
]);
$fields->put('Invoice Ninja', $data->toArray());
break;
case str($image)?->contains('argilla'):
case $image->contains('argilla'):
$data = collect([]);
$api_key = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_APIKEY')->first();
$data = $data->merge([
@@ -344,7 +398,7 @@ class Service extends BaseModel
]);
$fields->put('Argilla', $data->toArray());
break;
case str($image)?->contains('rabbitmq'):
case $image->contains('rabbitmq'):
$data = collect([]);
$host_port = $this->environment_variables()->where('key', 'PORT')->first();
$username = $this->environment_variables()->where('key', 'SERVICE_USER_RABBITMQ')->first();
@@ -379,7 +433,7 @@ class Service extends BaseModel
}
$fields->put('RabbitMQ', $data->toArray());
break;
case str($image)?->contains('tolgee'):
case $image->contains('tolgee'):
$data = collect([]);
$admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_TOLGEE')->first();
$data = $data->merge([
@@ -402,7 +456,7 @@ class Service extends BaseModel
}
$fields->put('Tolgee', $data->toArray());
break;
case str($image)?->contains('logto'):
case $image->contains('logto'):
$data = collect([]);
$logto_endpoint = $this->environment_variables()->where('key', 'LOGTO_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());
break;
case str($image)?->contains('unleash-server'):
case $image->contains('unleash-server'):
$data = collect([]);
$admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_UNLEASH')->first();
$data = $data->merge([
@@ -449,7 +503,7 @@ class Service extends BaseModel
}
$fields->put('Unleash', $data->toArray());
break;
case str($image)?->contains('grafana'):
case $image->contains('grafana'):
$data = collect([]);
$admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_GRAFANA')->first();
$data = $data->merge([
@@ -472,7 +526,7 @@ class Service extends BaseModel
}
$fields->put('Grafana', $data->toArray());
break;
case str($image)?->contains('directus'):
case $image->contains('directus'):
$data = collect([]);
$admin_email = $this->environment_variables()->where('key', 'ADMIN_EMAIL')->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());
break;
case str($image)?->contains('kong'):
case $image->contains('kong'):
$data = collect([]);
$dashboard_user = $this->environment_variables()->where('key', 'SERVICE_USER_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());
case str($image)?->contains('minio'):
case $image->contains('minio'):
$data = collect([]);
$console_url = $this->environment_variables()->where('key', 'MINIO_BROWSER_REDIRECT_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());
break;
case str($image)?->contains('weblate'):
case $image->contains('weblate'):
$data = collect([]);
$admin_email = $this->environment_variables()->where('key', 'WEBLATE_ADMIN_EMAIL')->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());
break;
case str($image)?->contains('meilisearch'):
case $image->contains('meilisearch'):
$data = collect([]);
$SERVICE_PASSWORD_MEILISEARCH = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_MEILISEARCH')->first();
if ($SERVICE_PASSWORD_MEILISEARCH) {
@@ -615,7 +669,7 @@ class Service extends BaseModel
}
$fields->put('Meilisearch', $data->toArray());
break;
case str($image)?->contains('ghost'):
case $image->contains('ghost'):
$data = collect([]);
$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();
@@ -675,45 +729,8 @@ class Service extends BaseModel
$fields->put('Ghost', $data->toArray());
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;
case str($image)?->contains('vaultwarden'):
case $image->contains('vaultwarden'):
$data = collect([]);
$DATABASE_URL = $this->environment_variables()->where('key', 'DATABASE_URL')->first();
@@ -779,7 +796,7 @@ class Service extends BaseModel
$fields->put('Vaultwarden', $data);
break;
case str($image)->contains('gitlab/gitlab'):
case $image->contains('gitlab/gitlab'):
$password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_GITLAB')->first();
$data = collect([]);
if ($password) {
@@ -803,7 +820,7 @@ class Service extends BaseModel
$fields->put('GitLab', $data->toArray());
break;
case str($image)->contains('code-server'):
case $image->contains('code-server'):
$data = collect([]);
$password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_64_PASSWORDCODESERVER')->first();
if ($password) {
@@ -829,7 +846,7 @@ class Service extends BaseModel
}
$fields->put('Code Server', $data->toArray());
break;
case str($image)->contains('elestio/strapi'):
case $image->contains('elestio/strapi'):
$data = collect([]);
$license = $this->environment_variables()->where('key', 'STRAPI_LICENSE')->first();
if ($license) {
@@ -852,15 +869,55 @@ class Service extends BaseModel
$fields->put('Strapi', $data->toArray());
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();
foreach ($databases as $database) {
$image = str($database->image)->before(':')->value();
$image = str($database->image)->before(':');
if ($image->isEmpty()) {
continue;
}
switch ($image) {
case str($image)->contains('postgres'):
case $image->contains('postgres'):
$userVariables = ['SERVICE_USER_POSTGRES', 'SERVICE_USER_POSTGRESQL'];
$passwordVariables = ['SERVICE_PASSWORD_POSTGRES', 'SERVICE_PASSWORD_POSTGRESQL'];
$dbNameVariables = ['POSTGRESQL_DATABASE', 'POSTGRES_DB'];
@@ -898,7 +955,7 @@ class Service extends BaseModel
}
$fields->put('PostgreSQL', $data->toArray());
break;
case str($image)->contains('mysql'):
case $image->contains('mysql'):
$userVariables = ['SERVICE_USER_MYSQL', 'SERVICE_USER_WORDPRESS', 'MYSQL_USER'];
$passwordVariables = ['SERVICE_PASSWORD_MYSQL', 'SERVICE_PASSWORD_WORDPRESS', 'MYSQL_PASSWORD'];
$rootPasswordVariables = ['SERVICE_PASSWORD_MYSQLROOT', 'SERVICE_PASSWORD_ROOT'];
@@ -948,7 +1005,7 @@ class Service extends BaseModel
}
$fields->put('MySQL', $data->toArray());
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'];
$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'];
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

+5
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

@@ -4,7 +4,6 @@
'hover:border-l-red-500 cursor-not-allowed' => $upgrade,
])>
<div class="flex items-center">
{{ $logo }}
<div class="flex flex-col pl-2 ">
<div class="dark:text-white text-md">
@@ -19,4 +18,8 @@
@endif
</div>
</div>
@isset($documentation)
<div class="flex-1"></div>
{{ $documentation }}
@endisset
</div>
@@ -48,7 +48,6 @@
</div>
</template>
</div>
<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">
<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">
<template x-for="service in filteredServices" :key="service.name">
<x-resource-view @click="setType('one-click-service-' + service.name)">
<x-slot:title>
<template x-if="service.name">
<span x-text="service.name"></span>
</template>
</x-slot>
<x-slot:description>
<template x-if="service.slogan">
<span x-text="service.slogan"></span>
</template>
</x-slot>
<x-slot:logo>
<template x-if="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"
:src='service.logo'>
</template>
</x-slot:logo>
<x-slot:documentation>
<template x-show="service.documentation">
<div>
<div class="flex-1"></div>
<div class="flex items-center px-2 " title="Read the documentation.">
<div x-on:click="setType('one-click-service-' + service.name)">
<x-resource-view>
<x-slot:title>
<template x-if="service.name">
<span x-text="service.name"></span>
</template>
</x-slot>
<x-slot:description>
<template x-if="service.slogan">
<span x-text="service.slogan"></span>
</template>
</x-slot>
<x-slot:logo>
<template x-if="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"
:src='service.logo'>
</template>
</x-slot:logo>
<x-slot:documentation>
<template x-if="service.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"
onclick="event.stopPropagation()" :href="service.documentation"
target="_blank">
Docs
</a>
</div>
</div>
</template>
</x-slot:documentation>
</x-resource-view>
</template>
</x-slot:documentation>
</x-resource-view>
</div>
</template>
</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>
function sortFn(a, b) {
return a.name.localeCompare(b.name)
+9 -8
View File
@@ -4,15 +4,9 @@
# logo: svgs/langfuse.png
# port: 3000
version: "3"
volumes:
pg_data: null
services:
langfuse:
image: langfuse/langfuse:2
restart: always
environment:
- SERVICE_FQDN_LANGFUSE_3000
- 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}
- TELEMETRY_ENABLED=${TELEMETRY_ENABLED:-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:
test:
- CMD
@@ -44,7 +45,7 @@ services:
- POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
- POSTGRES_USER=$SERVICE_USER_POSTGRES
volumes:
- "pg_data:/var/lib/postgresql/data"
- "pg-data:/var/lib/postgresql/data"
healthcheck:
test:
- CMD-SHELL
+19 -26
View File
@@ -4,16 +4,9 @@
# logo: svgs/litellm.svg
# port: 4000
version: "3"
volumes:
pg_data: null
redis_data: null
services:
litellm:
image: "ghcr.io/berriai/litellm-database:main-stable"
restart: always
depends_on:
postgres:
condition: service_healthy
@@ -21,23 +14,23 @@ services:
condition: service_healthy
environment:
- SERVICE_FQDN_LITELLM_4000
- LITELLM_LOG=ERROR
- LITELLM_MODE=PRODUCTION
- "LITELLM_MASTER_KEY=${SERVICE_PASSWORD_MASTERKEY}"
- "UI_USERNAME=${SERVICE_USER_UI}"
- "UI_PASSWORD=${SERVICE_PASSWORD_UI}"
- "DATABASE_URL=postgresql://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-litellm}"
- REDIS_HOST=redis
- REDIS_PORT=6379
- "POSTGRES_USER=${SERVICE_USER_POSTGRES}"
- "POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}"
- "POSTGRES_DB=${POSTGRES_DB:-litellm}"
- "OPENAI_API_KEY=${OPENAI_API_KEY}"
- "OPENAI_API_BASE=${OPENAI_API_BASE}"
- "ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}"
- "ANTHROPIC_API_BASE=${ANTHROPIC_API_BASE}"
- "VOYAGE_API_KEY=${VOYAGE_API_KEY}"
- "VOYAGE_API_BASE=${VOYAGE_API_BASE}"
- LITELLM_LOG=${LITELLM_LOG:-ERROR}
- LITELLM_MODE=${LITELLM_MODE:-PRODUCTION}
- LITELLM_MASTER_KEY=${SERVICE_PASSWORD_MASTERKEY}
- UI_USERNAME=${SERVICE_USER_UI}
- UI_PASSWORD=${SERVICE_PASSWORD_UI}
- DATABASE_URL=postgresql://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-litellm}
- REDIS_HOST=${REDIS_HOST:-redis}
- REDIS_PORT=${REDIS_PORT:-6379}
- POSTGRES_USER=${SERVICE_USER_POSTGRES}
- POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}
- POSTGRES_DB=${POSTGRES_DB:-litellm}
- OPENAI_API_KEY=${OPENAI_API_KEY}
- OPENAI_API_BASE=${OPENAI_API_BASE}
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- ANTHROPIC_API_BASE=${ANTHROPIC_API_BASE}
- VOYAGE_API_KEY=${VOYAGE_API_KEY}
- VOYAGE_API_BASE=${VOYAGE_API_BASE}
volumes:
- type: bind
source: ./litellm-config.yaml
@@ -154,7 +147,7 @@ services:
- POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
- POSTGRES_USER=$SERVICE_USER_POSTGRES
volumes:
- "pg_data:/var/lib/postgresql/data"
- "pg-data:/var/lib/postgresql/data"
healthcheck:
test:
- CMD-SHELL
@@ -166,7 +159,7 @@ services:
image: redis:7-alpine
command: redis-server --appendonly yes
volumes:
- redis_data:/data
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
+8 -16
View File
@@ -4,15 +4,9 @@
# logo: svgs/prefect.png
# port: 4200
version: "3"
volumes:
pg_data:
services:
prefect:
image: "prefecthq/prefect:3-latest"
restart: always
depends_on:
postgresql:
condition: service_healthy
@@ -20,9 +14,9 @@ services:
- SERVICE_FQDN_PREFECT_4200
- 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_EXPERIMENTAL_WARN=true
- PREFECT_EXPERIMENTAL_ENABLE_SCHEDULE_CONCURRENCY=true
- PREFECT_RUNNER_SERVER_ENABLE=true
- PREFECT_EXPERIMENTAL_WARN=${PREFECT_EXPERIMENTAL_WARN:-false}
- PREFECT_EXPERIMENTAL_ENABLE_SCHEDULE_CONCURRENCY=${PREFECT_EXPERIMENTAL_ENABLE_SCHEDULE_CONCURRENCY:-false}
- PREFECT_RUNNER_SERVER_ENABLE=${PREFECT_RUNNER_SERVER_ENABLE:-false}
- PREFECT_DEFAULT_WORK_POOL_NAME=${DEFAULT_POOL_NAME:-default}
command:
- prefect
@@ -43,9 +37,8 @@ services:
retries: 3
postgresql:
image: "postgres:16-alpine"
restart: always
volumes:
- "pg_data:/var/lib/postgresql/data"
- "pg-data:/var/lib/postgresql/data"
environment:
- POSTGRES_USER=$SERVICE_USER_POSTGRES
- POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
@@ -59,7 +52,6 @@ services:
retries: 3
agent:
image: "prefecthq/prefect:3-python3.12"
restart: always
depends_on:
prefect:
condition: service_healthy
@@ -68,10 +60,10 @@ services:
- prefect
- worker
- start
- "--pool=$${DEFAULT_POOL_NAME}"
- "--with-healthcheck"
- "--name=$${DEFAULT_WORKER_NAME}"
- "--limit=$${DEFAULT_POOL_LIMIT}"
- --pool=${DEFAULT_POOL_NAME}
- --with-healthcheck
- --name=${DEFAULT_WORKER_NAME}
- --limit=${DEFAULT_POOL_LIMIT}
environment:
- PREFECT_API_URL=http://prefect:4200/api
- PREFECT_API_KEY=${SERVICE_PASSWORD_APIKEY}
+1 -7
View File
@@ -4,20 +4,14 @@
# logo: svgs/qdrant.png
# port: 6333
version: "3"
volumes:
qdrant_storage: null
services:
qdrant:
image: "qdrant/qdrant:latest"
restart: always
environment:
- SERVICE_FQDN_QDRANT_6333
- QDRANT__SERVICE__API_KEY=${SERVICE_PASSWORD_QDRANTAPIKEY}
volumes:
- "qdrant_storage:/qdrant/storage"
- "qdrant-storage:/qdrant/storage"
healthcheck:
test:
- CMD-SHELL
+3 -9
View File
@@ -4,24 +4,18 @@
# logo: svgs/searxng.svg
# port: 8080
version: "3"
volumes:
redis_data: null
services:
searxng:
image: searxng/searxng
restart: always
depends_on:
redis:
condition: service_healthy
environment:
- SERVICE_FQDN_SEARXNG_8080
- INSTANCE_NAME=coolify
- INSTANCE_NAME=${INSTANCE_NAME:-coolify}
- BASE_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_REDIS_URL=redis://redis:6379/0
healthcheck:
@@ -67,7 +61,7 @@ services:
image: "redis:7"
restart: always
volumes:
- "redis_data:/data"
- "redis-data:/data"
healthcheck:
test:
- CMD
+1 -1
View File
@@ -1 +1 @@
{"activepieces":{"documentation":"https:\/\/www.activepieces.com\/docs\/getting-started\/introduction?utm_source=coolify.io","slogan":"Open source no-code business automation.","compose":"c2VydmljZXM6CiAgYWN0aXZlcGllY2VzOgogICAgaW1hZ2U6ICdnaGNyLmlvL2FjdGl2ZXBpZWNlcy9hY3RpdmVwaWVjZXM6bGF0ZXN0JwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9GUUROX0FDVElWRVBJRUNFUwogICAgICAtIEFQX0FQSV9LRVk9JFNFUlZJQ0VfUEFTU1dPUkRfNjRfQVBJS0VZCiAgICAgIC0gQVBfRU5DUllQVElPTl9LRVk9JFNFUlZJQ0VfUEFTU1dPUkRfRU5DUllQVElPTktFWQogICAgICAtICdBUF9FTkdJTkVfRVhFQ1VUQUJMRV9QQVRIPSR7QVBfRU5HSU5FX0VYRUNVVEFCTEVfUEFUSDotZGlzdC9wYWNrYWdlcy9lbmdpbmUvbWFpbi5qc30nCiAgICAgIC0gJ0FQX0VOVklST05NRU5UPSR7QVBfRU5WSVJPTk1FTlQ6LXByb2R9JwogICAgICAtICdBUF9FWEVDVVRJT05fTU9ERT0ke0FQX0VYRUNVVElPTl9NT0RFOi1VTlNBTkRCT1hFRH0nCiAgICAgIC0gJ0FQX0ZST05URU5EX1VSTD0ke1NFUlZJQ0VfRlFETl9BQ1RJVkVQSUVDRVN9JwogICAgICAtIEFQX0pXVF9TRUNSRVQ9JFNFUlZJQ0VfUEFTU1dPUkRfNjRfSldUCiAgICAgIC0gJ0FQX1BPU1RHUkVTX0RBVEFCQVNFPSR7UE9TVEdSRVNfREI6LWFjdGl2ZXBpZWNlc30nCiAgICAgIC0gJ0FQX1BPU1RHUkVTX0hPU1Q9JHtQT1NUR1JFU19IT1NUOi1wb3N0Z3Jlc30nCiAgICAgIC0gJ0FQX1BPU1RHUkVTX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU30nCiAgICAgIC0gJ0FQX1BPU1RHUkVTX1BPUlQ9JHtQT1NUR1JFU19QT1JUOi01NDMyfScKICAgICAgLSBBUF9QT1NUR1JFU19VU0VSTkFNRT0kU0VSVklDRV9VU0VSX1BPU1RHUkVTCiAgICAgIC0gJ0FQX1JFRElTX0hPU1Q9JHtSRURJU19IT1NUOi1yZWRpc30nCiAgICAgIC0gJ0FQX1JFRElTX1BPUlQ9JHtSRURJU19QT1JUOi02Mzc5fScKICAgICAgLSAnQVBfU0FOREJPWF9SVU5fVElNRV9TRUNPTkRTPSR7QVBfU0FOREJPWF9SVU5fVElNRV9TRUNPTkRTOi02MDB9JwogICAgICAtICdBUF9URUxFTUVUUllfRU5BQkxFRD0ke0FQX1RFTEVNRVRSWV9FTkFCTEVEOi1mYWxzZX0nCiAgICAgIC0gJ0FQX1RFTVBMQVRFU19TT1VSQ0VfVVJMPSR7QVBfVEVNUExBVEVTX1NPVVJDRV9VUkw6LWh0dHBzOi8vY2xvdWQuYWN0aXZlcGllY2VzLmNvbS9hcGkvdjEvZmxvdy10ZW1wbGF0ZXN9JwogICAgICAtICdBUF9UUklHR0VSX0RFRkFVTFRfUE9MTF9JTlRFUlZBTD0ke0FQX1RSSUdHRVJfREVGQVVMVF9QT0xMX0lOVEVSVkFMOi01fScKICAgICAgLSAnQVBfV0VCSE9PS19USU1FT1VUX1NFQ09ORFM9JHtBUF9XRUJIT09LX1RJTUVPVVRfU0VDT05EUzotMzB9JwogICAgZGVwZW5kc19vbjoKICAgICAgcG9zdGdyZXM6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgICAgcmVkaXM6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWQKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSBjdXJsCiAgICAgICAgLSAnLWYnCiAgICAgICAgLSAnaHR0cDovLzEyNy4wLjAuMTo4MCcKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAogIHBvc3RncmVzOgogICAgaW1hZ2U6ICdwb3N0Z3JlczpsYXRlc3QnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSAnUE9TVEdSRVNfREI9JHtQT1NUR1JFU19EQjotYWN0aXZlcGllY2VzfScKICAgICAgLSAnUE9TVEdSRVNfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfScKICAgICAgLSAnUE9TVEdSRVNfVVNFUj0ke1NFUlZJQ0VfVVNFUl9QT1NUR1JFU30nCiAgICAgIC0gJ1BPU1RHUkVTX1BPUlQ9JHtQT1NUR1JFU19QT1JUOi01NDMyfScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ3BnLWRhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQtU0hFTEwKICAgICAgICAtICdwZ19pc3JlYWR5IC1VICQke1BPU1RHUkVTX1VTRVJ9IC1kICQke1BPU1RHUkVTX0RCfScKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAogIHJlZGlzOgogICAgaW1hZ2U6ICdyZWRpczpsYXRlc3QnCiAgICB2b2x1bWVzOgogICAgICAtICdyZWRpc19kYXRhOi9kYXRhJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIHJlZGlzLWNsaQogICAgICAgIC0gcGluZwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMjBzCiAgICAgIHJldHJpZXM6IDEwCg==","tags":["workflow","automation","no code","open source"],"logo":"svgs\/activepieces.png","minversion":"0.0.0","port":"80"},"anythingllm":{"documentation":"https:\/\/docs.anythingllm.com\/installation-docker\/overview?utm_source=coolify.io","slogan":"AnythingLLM is the easiest to use, all-in-one AI application that can do RAG, AI Agents, and much more with no code or infrastructure headaches.","compose":"c2VydmljZXM6CiAgYW55dGhpbmctbGxtOgogICAgaW1hZ2U6IG1pbnRwbGV4bGFicy9hbnl0aGluZ2xsbQogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9GUUROX0FOWVRISU5HTExNXzMwMDEKICAgICAgLSBTVE9SQUdFX0RJUj0vYXBwL3NlcnZlci9zdG9yYWdlCiAgICAgIC0gJ0RJU0FCTEVfVEVMRU1FVFJZPSR7RElTQUJMRV9URUxFTUVUUlk6LXRydWV9JwogICAgICAtICdQQVNTV09SRExPV0VSQ0FTRT0ke1BBU1NXT1JETE9XRVJDQVNFOi0xfScKICAgICAgLSAnUEFTU1dPUkRNQVhDSEFSPSR7UEFTU1dPUkRNQVhDSEFSOi0yNTB9JwogICAgICAtICdQQVNTV09SRE1JTkNIQVI9JHtQQVNTV09SRE1JTkNIQVI6LTZ9JwogICAgICAtICdQQVNTV09SRE5VTUVSSUM9JHtQQVNTV09SRE5VTUVSSUM6LTF9JwogICAgICAtICdQQVNTV09SRFJFUVVJUkVNRU5UUz0ke1BBU1NXT1JEUkVRVUlSRU1FTlRTOi0xfScKICAgICAgLSAnUEFTU1dPUkRTWU1CT0w9JHtQQVNTV09SRFNZTUJPTDotMX0nCiAgICAgIC0gJ1BBU1NXT1JEVVBQRVJDQVNFPSR7UEFTU1dPUkRVUFBFUkNBU0U6LTF9JwogICAgICAtICdTSUdfS0VZPSR7U0VSVklDRV9QQVNTV09SRF9TSUdLRVl9JwogICAgICAtICdTSUdfU0FMVD0ke1NFUlZJQ0VfUEFTU1dPUkRfU0lHU0FMVH0nCiAgICAgIC0gJ0pXVF9TRUNSRVQ9JHtTRVJWSUNFX1BBU1NXT1JEX0pXVFNFQ1JFVH0nCiAgICAgIC0gJ0FVVEhfVE9LRU49JHtTRVJWSUNFX1BBU1NXT1JEX0FVVEhUT0tFTn0nCiAgICAgIC0gJ1NFUlZFUl9QT1JUPSR7U0VSVkVSX1BPUlQ6LTMwMDF9JwogICAgY2FwX2FkZDoKICAgICAgLSBTWVNfQURNSU4KICAgIHZvbHVtZXM6CiAgICAgIC0gJ2FueXRoaW5nbGxtLXN0b3JhZ2U6L2FwcC9zZXJ2ZXIvc3RvcmFnZScKICAgICAgLSAnYW55dGhpbmdsbG0taG90Oi9hcHAvY29sbGVjdG9yL2hvdGRpcicKICAgICAgLSAnYW55dGhpbmdsbG0tb3V0cHV0czovYXBwL2NvbGxlY3Rvci9vdXRwdXRzJwogICAgdXNlcjogJyR7VUlEOiLine truncated
{"activepieces":{"documentation":"https:\/\/www.activepieces.com\/docs\/getting-started\/introduction?utm_source=coolify.io","slogan":"Open source no-code business automation.","compose":"c2VydmljZXM6CiAgYWN0aXZlcGllY2VzOgogICAgaW1hZ2U6ICdnaGNyLmlvL2FjdGl2ZXBpZWNlcy9hY3RpdmVwaWVjZXM6bGF0ZXN0JwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9GUUROX0FDVElWRVBJRUNFUwogICAgICAtIEFQX0FQSV9LRVk9JFNFUlZJQ0VfUEFTU1dPUkRfNjRfQVBJS0VZCiAgICAgIC0gQVBfRU5DUllQVElPTl9LRVk9JFNFUlZJQ0VfUEFTU1dPUkRfRU5DUllQVElPTktFWQogICAgICAtICdBUF9FTkdJTkVfRVhFQ1VUQUJMRV9QQVRIPSR7QVBfRU5HSU5FX0VYRUNVVEFCTEVfUEFUSDotZGlzdC9wYWNrYWdlcy9lbmdpbmUvbWFpbi5qc30nCiAgICAgIC0gJ0FQX0VOVklST05NRU5UPSR7QVBfRU5WSVJPTk1FTlQ6LXByb2R9JwogICAgICAtICdBUF9FWEVDVVRJT05fTU9ERT0ke0FQX0VYRUNVVElPTl9NT0RFOi1VTlNBTkRCT1hFRH0nCiAgICAgIC0gJ0FQX0ZST05URU5EX1VSTD0ke1NFUlZJQ0VfRlFETl9BQ1RJVkVQSUVDRVN9JwogICAgICAtIEFQX0pXVF9TRUNSRVQ9JFNFUlZJQ0VfUEFTU1dPUkRfNjRfSldUCiAgICAgIC0gJ0FQX1BPU1RHUkVTX0RBVEFCQVNFPSR7UE9TVEdSRVNfREI6LWFjdGl2ZXBpZWNlc30nCiAgICAgIC0gJ0FQX1BPU1RHUkVTX0hPU1Q9JHtQT1NUR1JFU19IT1NUOi1wb3N0Z3Jlc30nCiAgICAgIC0gJ0FQX1BPU1RHUkVTX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU30nCiAgICAgIC0gJ0FQX1BPU1RHUkVTX1BPUlQ9JHtQT1NUR1JFU19QT1JUOi01NDMyfScKICAgICAgLSBBUF9QT1NUR1JFU19VU0VSTkFNRT0kU0VSVklDRV9VU0VSX1BPU1RHUkVTCiAgICAgIC0gJ0FQX1JFRElTX0hPU1Q9JHtSRURJU19IT1NUOi1yZWRpc30nCiAgICAgIC0gJ0FQX1JFRElTX1BPUlQ9JHtSRURJU19QT1JUOi02Mzc5fScKICAgICAgLSAnQVBfU0FOREJPWF9SVU5fVElNRV9TRUNPTkRTPSR7QVBfU0FOREJPWF9SVU5fVElNRV9TRUNPTkRTOi02MDB9JwogICAgICAtICdBUF9URUxFTUVUUllfRU5BQkxFRD0ke0FQX1RFTEVNRVRSWV9FTkFCTEVEOi1mYWxzZX0nCiAgICAgIC0gJ0FQX1RFTVBMQVRFU19TT1VSQ0VfVVJMPSR7QVBfVEVNUExBVEVTX1NPVVJDRV9VUkw6LWh0dHBzOi8vY2xvdWQuYWN0aXZlcGllY2VzLmNvbS9hcGkvdjEvZmxvdy10ZW1wbGF0ZXN9JwogICAgICAtICdBUF9UUklHR0VSX0RFRkFVTFRfUE9MTF9JTlRFUlZBTD0ke0FQX1RSSUdHRVJfREVGQVVMVF9QT0xMX0lOVEVSVkFMOi01fScKICAgICAgLSAnQVBfV0VCSE9PS19USU1FT1VUX1NFQ09ORFM9JHtBUF9XRUJIT09LX1RJTUVPVVRfU0VDT05EUzotMzB9JwogICAgZGVwZW5kc19vbjoKICAgICAgcG9zdGdyZXM6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgICAgcmVkaXM6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWQKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSBjdXJsCiAgICAgICAgLSAnLWYnCiAgICAgICAgLSAnaHR0cDovLzEyNy4wLjAuMTo4MCcKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAogIHBvc3RncmVzOgogICAgaW1hZ2U6ICdwb3N0Z3JlczpsYXRlc3QnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSAnUE9TVEdSRVNfREI9JHtQT1NUR1JFU19EQjotYWN0aXZlcGllY2VzfScKICAgICAgLSAnUE9TVEdSRVNfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfScKICAgICAgLSAnUE9TVEdSRVNfVVNFUj0ke1NFUlZJQ0VfVVNFUl9QT1NUR1JFU30nCiAgICAgIC0gJ1BPU1RHUkVTX1BPUlQ9JHtQT1NUR1JFU19QT1JUOi01NDMyfScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ3BnLWRhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQtU0hFTEwKICAgICAgICAtICdwZ19pc3JlYWR5IC1VICQke1BPU1RHUkVTX1VTRVJ9IC1kICQke1BPU1RHUkVTX0RCfScKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAogIHJlZGlzOgogICAgaW1hZ2U6ICdyZWRpczpsYXRlc3QnCiAgICB2b2x1bWVzOgogICAgICAtICdyZWRpc19kYXRhOi9kYXRhJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIHJlZGlzLWNsaQogICAgICAgIC0gcGluZwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMjBzCiAgICAgIHJldHJpZXM6IDEwCg==","tags":["workflow","automation","no code","open source"],"logo":"svgs\/activepieces.png","minversion":"0.0.0","port":"80"},"anythingllm":{"documentation":"https:\/\/docs.anythingllm.com\/installation-docker\/overview?utm_source=coolify.io","slogan":"AnythingLLM is the easiest to use, all-in-one AI application that can do RAG, AI Agents, and much more with no code or infrastructure headaches.","compose":"c2VydmljZXM6CiAgYW55dGhpbmctbGxtOgogICAgaW1hZ2U6IG1pbnRwbGV4bGFicy9hbnl0aGluZ2xsbQogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9GUUROX0FOWVRISU5HTExNXzMwMDEKICAgICAgLSBTVE9SQUdFX0RJUj0vYXBwL3NlcnZlci9zdG9yYWdlCiAgICAgIC0gJ0RJU0FCTEVfVEVMRU1FVFJZPSR7RElTQUJMRV9URUxFTUVUUlk6LXRydWV9JwogICAgICAtICdQQVNTV09SRExPV0VSQ0FTRT0ke1BBU1NXT1JETE9XRVJDQVNFOi0xfScKICAgICAgLSAnUEFTU1dPUkRNQVhDSEFSPSR7UEFTU1dPUkRNQVhDSEFSOi0yNTB9JwogICAgICAtICdQQVNTV09SRE1JTkNIQVI9JHtQQVNTV09SRE1JTkNIQVI6LTZ9JwogICAgICAtICdQQVNTV09SRE5VTUVSSUM9JHtQQVNTV09SRE5VTUVSSUM6LTF9JwogICAgICAtICdQQVNTV09SRFJFUVVJUkVNRU5UUz0ke1BBU1NXT1JEUkVRVUlSRU1FTlRTOi0xfScKICAgICAgLSAnUEFTU1dPUkRTWU1CT0w9JHtQQVNTV09SRFNZTUJPTDotMX0nCiAgICAgIC0gJ1BBU1NXT1JEVVBQRVJDQVNFPSR7UEFTU1dPUkRVUFBFUkNBU0U6LTF9JwogICAgICAtICdTSUdfS0VZPSR7U0VSVklDRV9QQVNTV09SRF9TSUdLRVl9JwogICAgICAtICdTSUdfU0FMVD0ke1NFUlZJQ0VfUEFTU1dPUkRfU0lHU0FMVH0nCiAgICAgIC0gJ0pXVF9TRUNSRVQ9JHtTRVJWSUNFX1BBU1NXT1JEX0pXVFNFQ1JFVH0nCiAgICAgIC0gJ0FVVEhfVE9LRU49JHtTRVJWSUNFX1BBU1NXT1JEX0FVVEhUT0tFTn0nCiAgICAgIC0gJ1NFUlZFUl9QT1JUPSR7U0VSVkVSX1BPUlQ6LTMwMDF9JwogICAgY2FwX2FkZDoKICAgICAgLSBTWVNfQURNSU4KICAgIHZvbHVtZXM6CiAgICAgIC0gJ2FueXRoaW5nbGxtLXN0b3JhZ2U6L2FwcC9zZXJ2ZXIvc3RvcmFnZScKICAgICAgLSAnYW55dGhpbmdsbG0taG90Oi9hcHAvY29sbGVjdG9yL2hvdGRpcicKICAgICAgLSAnYW55dGhpbmdsbG0tb3V0cHV0czovYXBwL2NvbGxlY3Rvci9vdXRwdXRzJwogICAgdXNlcjogJyR7VUlEOiLine truncated