fix: new resource selection view
fix: new services
This commit is contained in:
		@@ -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) {
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -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'];
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								public/svgs/coolify.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											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
									
								
							
							
						
						
									
										5
									
								
								public/svgs/tolgee.svg
									
									
									
									
									
										Normal 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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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}
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
		Reference in New Issue
	
	Block a user