Merge branch 'next' into patch-1
							
								
								
									
										1
									
								
								.github/workflows/coolify-helper.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -98,3 +98,4 @@ jobs:
 | 
				
			|||||||
        if: always()
 | 
					        if: always()
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          webhook: ${{ secrets.DISCORD_WEBHOOK_PROD_RELEASE_CHANNEL  }}
 | 
					          webhook: ${{ secrets.DISCORD_WEBHOOK_PROD_RELEASE_CHANNEL  }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,9 +24,11 @@ class Project extends BaseModel
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    protected $guarded = [];
 | 
					    protected $guarded = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected $appends = ['default_environment'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static function ownedByCurrentTeam()
 | 
					    public static function ownedByCurrentTeam()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return Project::whereTeamId(currentTeam()->id)->orderBy('name');
 | 
					        return Project::whereTeamId(currentTeam()->id)->orderByRaw('LOWER(name)');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    protected static function booted()
 | 
					    protected static function booted()
 | 
				
			||||||
@@ -131,7 +133,7 @@ class Project extends BaseModel
 | 
				
			|||||||
        return $this->postgresqls()->get()->merge($this->redis()->get())->merge($this->mongodbs()->get())->merge($this->mysqls()->get())->merge($this->mariadbs()->get())->merge($this->keydbs()->get())->merge($this->dragonflies()->get())->merge($this->clickhouses()->get());
 | 
					        return $this->postgresqls()->get()->merge($this->redis()->get())->merge($this->mongodbs()->get())->merge($this->mysqls()->get())->merge($this->mariadbs()->get())->merge($this->keydbs()->get())->merge($this->dragonflies()->get())->merge($this->clickhouses()->get());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function default_environment()
 | 
					    public function getDefaultEnvironmentAttribute()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $default = $this->environments()->where('name', 'production')->first();
 | 
					        $default = $this->environments()->where('name', 'production')->first();
 | 
				
			||||||
        if ($default) {
 | 
					        if ($default) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -283,9 +283,109 @@ 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('argilla'):
 | 
					                case $image->contains('label-studio'):
 | 
				
			||||||
 | 
					                    $data = collect([]);
 | 
				
			||||||
 | 
					                    $username = $this->environment_variables()->where('key', 'LABEL_STUDIO_USERNAME')->first();
 | 
				
			||||||
 | 
					                    $password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_LABELSTUDIO')->first();
 | 
				
			||||||
 | 
					                    if ($username) {
 | 
				
			||||||
 | 
					                        $data = $data->merge([
 | 
				
			||||||
 | 
					                            'Username' => [
 | 
				
			||||||
 | 
					                                'key' => 'LABEL_STUDIO_USERNAME',
 | 
				
			||||||
 | 
					                                'value' => data_get($username, 'value'),
 | 
				
			||||||
 | 
					                                'rules' => 'required',
 | 
				
			||||||
 | 
					                            ],
 | 
				
			||||||
 | 
					                        ]);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    if ($password) {
 | 
				
			||||||
 | 
					                        $data = $data->merge([
 | 
				
			||||||
 | 
					                            'Password' => [
 | 
				
			||||||
 | 
					                                'key' => 'LABEL_STUDIO_PASSWORD',
 | 
				
			||||||
 | 
					                                'value' => data_get($password, 'value'),
 | 
				
			||||||
 | 
					                                'rules' => 'required',
 | 
				
			||||||
 | 
					                                'isPassword' => true,
 | 
				
			||||||
 | 
					                            ],
 | 
				
			||||||
 | 
					                        ]);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    $fields->put('Label Studio', $data->toArray());
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                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([
 | 
				
			||||||
 | 
					                        'Email' => [
 | 
				
			||||||
 | 
					                            'key' => 'IN_USER_EMAIL',
 | 
				
			||||||
 | 
					                            'value' => data_get($email, 'value'),
 | 
				
			||||||
 | 
					                            'rules' => 'required|email',
 | 
				
			||||||
 | 
					                        ],
 | 
				
			||||||
 | 
					                    ]);
 | 
				
			||||||
 | 
					                    $password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_INVOICENINJAUSER')->first();
 | 
				
			||||||
 | 
					                    $data = $data->merge([
 | 
				
			||||||
 | 
					                        'Password' => [
 | 
				
			||||||
 | 
					                            'key' => 'IN_PASSWORD',
 | 
				
			||||||
 | 
					                            'value' => data_get($password, 'value'),
 | 
				
			||||||
 | 
					                            'rules' => 'required',
 | 
				
			||||||
 | 
					                            'isPassword' => true,
 | 
				
			||||||
 | 
					                        ],
 | 
				
			||||||
 | 
					                    ]);
 | 
				
			||||||
 | 
					                    $fields->put('Invoice Ninja', $data->toArray());
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                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([
 | 
				
			||||||
@@ -323,7 +423,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();
 | 
				
			||||||
@@ -358,7 +458,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([
 | 
				
			||||||
@@ -381,7 +481,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();
 | 
				
			||||||
@@ -405,7 +505,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([
 | 
				
			||||||
@@ -428,7 +528,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([
 | 
				
			||||||
@@ -451,7 +551,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();
 | 
				
			||||||
@@ -477,7 +577,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();
 | 
				
			||||||
@@ -501,7 +601,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();
 | 
				
			||||||
@@ -554,7 +654,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();
 | 
				
			||||||
@@ -580,7 +680,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) {
 | 
				
			||||||
@@ -594,7 +694,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();
 | 
				
			||||||
@@ -654,45 +754,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();
 | 
				
			||||||
@@ -758,7 +821,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) {
 | 
				
			||||||
@@ -782,7 +845,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) {
 | 
				
			||||||
@@ -808,7 +871,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) {
 | 
				
			||||||
@@ -831,15 +894,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'];
 | 
				
			||||||
@@ -877,7 +980,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'];
 | 
				
			||||||
@@ -927,7 +1030,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'];
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -332,8 +332,12 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
 | 
				
			|||||||
            if (preg_match('/traefik\.http\.middlewares\.(.*?)(\.|$)/', $item, $matches)) {
 | 
					            if (preg_match('/traefik\.http\.middlewares\.(.*?)(\.|$)/', $item, $matches)) {
 | 
				
			||||||
                return $matches[1];
 | 
					                return $matches[1];
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            if (preg_match('/coolify\.traefik\.middlewares=(.*)/', $item, $matches)) {
 | 
				
			||||||
 | 
					                return explode(',', $matches[1]);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
        })->filter()
 | 
					        })->flatten()
 | 
				
			||||||
 | 
					        ->filter()
 | 
				
			||||||
        ->unique();
 | 
					        ->unique();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    foreach ($domains as $loop => $domain) {
 | 
					    foreach ($domains as $loop => $domain) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -522,6 +522,11 @@ function sslip(Server $server)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function get_service_templates(bool $force = false): Collection
 | 
					function get_service_templates(bool $force = false): Collection
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    if (isDev()) {
 | 
				
			||||||
 | 
					        $services = File::get(base_path('templates/service-templates.json'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return collect(json_decode($services))->sortKeys();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    if ($force) {
 | 
					    if ($force) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            $response = Http::retry(3, 1000)->get(config('constants.services.official'));
 | 
					            $response = Http::retry(3, 1000)->get(config('constants.services.official'));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@ return [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // The release version of your application
 | 
					    // The release version of your application
 | 
				
			||||||
    // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
 | 
					    // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
 | 
				
			||||||
    'release' => '4.0.0-beta.356',
 | 
					    'release' => '4.0.0-beta.357',
 | 
				
			||||||
    // When left empty or `null` the Laravel environment will be used
 | 
					    // When left empty or `null` the Laravel environment will be used
 | 
				
			||||||
    'environment' => config('app.env'),
 | 
					    'environment' => config('app.env'),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,3 @@
 | 
				
			|||||||
<?php
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
return '4.0.0-beta.356';
 | 
					return '4.0.0-beta.357';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
  "auth.register": "S'enregistrer",
 | 
					  "auth.register": "S'enregistrer",
 | 
				
			||||||
  "auth.registration_disabled": "L'enregistrement est désactivé. Merci de contacter l'administateur.",
 | 
					  "auth.registration_disabled": "L'enregistrement est désactivé. Merci de contacter l'administateur.",
 | 
				
			||||||
  "auth.reset_password": "Réinitialiser le mot de passe",
 | 
					  "auth.reset_password": "Réinitialiser le mot de passe",
 | 
				
			||||||
  "auth.failed": "Aucune correspondance n'a été trouvé pour les informations d'identification renseignées.",
 | 
					  "auth.failed": "Aucune correspondance n'a été trouvée pour les informations d'identification renseignées.",
 | 
				
			||||||
  "auth.failed.callback": "Erreur lors du processus de retour de la plateforme de connexion.",
 | 
					  "auth.failed.callback": "Erreur lors du processus de retour de la plateforme de connexion.",
 | 
				
			||||||
  "auth.failed.password": "Le mot de passe renseigné est incorrect.",
 | 
					  "auth.failed.password": "Le mot de passe renseigné est incorrect.",
 | 
				
			||||||
  "auth.failed.email": "Aucun utilisateur avec cette adresse email n'a été trouvé.",
 | 
					  "auth.failed.email": "Aucun utilisateur avec cette adresse email n'a été trouvé.",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@
 | 
				
			|||||||
            "version": "4.0.0-beta.355"
 | 
					            "version": "4.0.0-beta.355"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "helper": {
 | 
					        "helper": {
 | 
				
			||||||
            "version": "1.0.1"
 | 
					            "version": "1.0.2"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "realtime": {
 | 
					        "realtime": {
 | 
				
			||||||
            "version": "1.0.3"
 | 
					            "version": "1.0.3"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						@@ -10,7 +10,7 @@
 | 
				
			|||||||
                "@xterm/addon-fit": "^0.10.0",
 | 
					                "@xterm/addon-fit": "^0.10.0",
 | 
				
			||||||
                "@xterm/xterm": "^5.5.0",
 | 
					                "@xterm/xterm": "^5.5.0",
 | 
				
			||||||
                "alpinejs": "3.14.0",
 | 
					                "alpinejs": "3.14.0",
 | 
				
			||||||
                "cookie": "^0.6.0",
 | 
					                "cookie": "^0.7.0",
 | 
				
			||||||
                "dotenv": "^16.4.5",
 | 
					                "dotenv": "^16.4.5",
 | 
				
			||||||
                "ioredis": "5.4.1",
 | 
					                "ioredis": "5.4.1",
 | 
				
			||||||
                "node-pty": "^1.0.0",
 | 
					                "node-pty": "^1.0.0",
 | 
				
			||||||
@@ -960,10 +960,9 @@
 | 
				
			|||||||
            "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
 | 
					            "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "node_modules/cookie": {
 | 
					        "node_modules/cookie": {
 | 
				
			||||||
            "version": "0.6.0",
 | 
					            "version": "0.7.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.0.tgz",
 | 
				
			||||||
            "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
 | 
					            "integrity": "sha512-qCf+V4dtlNhSRXGAZatc1TasyFO6GjohcOul807YOb5ik3+kQSnb4d7iajeCL8QHaJ4uZEjCgiCJerKXwdRVlQ==",
 | 
				
			||||||
            "license": "MIT",
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "node": ">= 0.6"
 | 
					                "node": ">= 0.6"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,7 @@
 | 
				
			|||||||
        "@xterm/addon-fit": "^0.10.0",
 | 
					        "@xterm/addon-fit": "^0.10.0",
 | 
				
			||||||
        "@xterm/xterm": "^5.5.0",
 | 
					        "@xterm/xterm": "^5.5.0",
 | 
				
			||||||
        "alpinejs": "3.14.0",
 | 
					        "alpinejs": "3.14.0",
 | 
				
			||||||
        "cookie": "^0.6.0",
 | 
					        "cookie": "^0.7.0",
 | 
				
			||||||
        "dotenv": "^16.4.5",
 | 
					        "dotenv": "^16.4.5",
 | 
				
			||||||
        "ioredis": "5.4.1",
 | 
					        "ioredis": "5.4.1",
 | 
				
			||||||
        "node-pty": "^1.0.0",
 | 
					        "node-pty": "^1.0.0",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								public/svgs/clickhouse.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					   <svg width="215" height="90" viewBox="0 0 100 43" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_378_10860)"><rect x="2.70837" y="2.875" width="2.24992" height="20.2493" rx="0.236664" fill="currentColor" /><rect x="7.2085" y="2.875" width="2.24992" height="20.2493" rx="0.236664" fill="currentColor" /><rect x="11.7086" y="2.875" width="2.24992" height="20.2493" rx="0.236664" fill="currentColor" /><rect x="16.2076" y="2.875" width="2.24992" height="20.2493" rx="0.236664" fill="currentColor" /><rect x="20.7087" y="10.7502" width="2.24992" height="4.49985" rx="0.236664" fill="currentColor" /></g></svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 642 B  | 
							
								
								
									
										
											BIN
										
									
								
								public/svgs/coolify.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.1 KiB  | 
							
								
								
									
										10
									
								
								public/svgs/dozzle.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
 | 
				
			||||||
 | 
					<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="256px" height="256px" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" xmlns:xlink="http://www.w3.org/1999/xlink">
 | 
				
			||||||
 | 
					<g><path style="opacity:1" fill="#222222" d="M -0.5,-0.5 C 84.8333,-0.5 170.167,-0.5 255.5,-0.5C 255.5,84.8333 255.5,170.167 255.5,255.5C 170.167,255.5 84.8333,255.5 -0.5,255.5C -0.5,170.167 -0.5,84.8333 -0.5,-0.5 Z"/></g>
 | 
				
			||||||
 | 
					<g><path style="opacity:1" fill="#fbda56" d="M 161.5,179.5 C 160.957,179.56 160.624,179.893 160.5,180.5C 184.157,181.5 207.824,181.833 231.5,181.5C 231.5,186.833 231.5,192.167 231.5,197.5C 199.167,197.5 166.833,197.5 134.5,197.5C 134.813,194.753 134.48,192.086 133.5,189.5C 132.893,189.624 132.56,189.957 132.5,190.5C 115.506,204.774 95.8393,210.94 73.5,209C 58.1984,207.118 42.8651,205.618 27.5,204.5C 32.8364,149.128 38.5031,93.795 44.5,38.5C 59.7916,40.3257 75.1249,41.8257 90.5,43C 113.794,44.8067 132.127,55.14 145.5,74C 173.165,74.5 200.831,74.6666 228.5,74.5C 228.91,80.6208 228.41,86.6208 227,92.5C 205.158,121.53 183.324,150.53 161.5,179.5 Z"/></g>
 | 
				
			||||||
 | 
					<g><path style="opacity:1" fill="#222222" d="M 64.5,58.5 C 74.4468,59.9949 84.4468,61.1616 94.5,62C 117.983,67.1515 131.483,81.6515 135,105.5C 135.624,124.968 132.958,143.968 127,162.5C 119.558,178.614 107.058,187.781 89.5,190C 76.8083,190.293 64.1416,189.793 51.5,188.5C 56.0225,145.186 60.3558,101.852 64.5,58.5 Z"/></g>
 | 
				
			||||||
 | 
					<g><path style="opacity:1" fill="#252422" d="M 153.5,93.5 C 169.328,92.3386 185.328,92.1719 201.5,93C 185,114.833 168.5,136.667 152,158.5C 155.973,140.11 157.307,121.443 156,102.5C 155.34,99.322 154.507,96.322 153.5,93.5 Z"/></g>
 | 
				
			||||||
 | 
					<g><path style="opacity:1" fill="#6d6133" d="M 161.5,179.5 C 185.167,180.167 208.833,180.833 232.5,181.5C 232.167,181.5 231.833,181.5 231.5,181.5C 207.824,181.833 184.157,181.5 160.5,180.5C 160.624,179.893 160.957,179.56 161.5,179.5 Z"/></g>
 | 
				
			||||||
 | 
					<g><path style="opacity:1" fill="#d6ba4d" d="M 231.5,181.5 C 231.833,181.5 232.167,181.5 232.5,181.5C 232.5,187.167 232.5,192.833 232.5,198.5C 199.5,198.5 166.5,198.5 133.5,198.5C 133.806,195.615 133.473,192.948 132.5,190.5C 132.56,189.957 132.893,189.624 133.5,189.5C 134.48,192.086 134.813,194.753 134.5,197.5C 166.833,197.5 199.167,197.5 231.5,197.5C 231.5,192.167 231.5,186.833 231.5,181.5 Z"/></g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 2.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/svgs/easyappointments.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 25 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/svgs/getoutline.jpeg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.5 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/svgs/labelstudio.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.8 KiB  | 
							
								
								
									
										1
									
								
								public/svgs/libreoffice.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 10 KiB  | 
							
								
								
									
										8
									
								
								public/svgs/nitropage.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					<svg width="64" height="64" version="1.1" viewBox="0 0 16.933 16.933" xmlns="http://www.w3.org/2000/svg">
 | 
				
			||||||
 | 
					  <rect transform="matrix(1 0 -.16885 .98564 0 0)" x="2.6887" y="1.2563" width="14.457" height="14.667" fill="#581c87" style="paint-order:stroke fill markers"/>
 | 
				
			||||||
 | 
					  <text x="0.74027044" y="12.170821" display="none" fill="#ffffff" font-family="'Liberation Sans'" font-size="10.583px" font-weight="bold" letter-spacing="-.66146px" stroke-width="4.2333" word-spacing="0px" xml:space="preserve"><tspan x="0.74027044" y="12.170821" fill="#ffffff" font-family="'Jost*'" font-size="10.583px" font-style="italic" font-weight="900" stroke-width="4.2333" style="paint-order:stroke fill markers">NP</tspan></text>
 | 
				
			||||||
 | 
					  <g fill="#fff" stroke-width="4.2333" aria-label="NP">
 | 
				
			||||||
 | 
					    <path d="m7.1008 4.7625-0.59266 3.3655-4.0322-3.7147-1.3229 7.7576h2.1907l0.58208-3.3655 4.0428 3.7147 1.3229-7.7576z" style="paint-order:stroke fill markers"/>
 | 
				
			||||||
 | 
					    <path d="m10.027 4.7625-1.27 7.4083h2.2966l0.39158-2.3283h0.62442c1.9156-0.021167 3.2385-0.89958 3.3867-2.54 0.14817-1.6192-0.79375-2.5188-2.6564-2.54zm2.5717 1.8415c0.48683 0.010583 0.75141 0.26458 0.67733 0.68791-0.08467 0.45508-0.508 0.6985-1.016 0.6985h-0.49742l0.24342-1.3864z" style="paint-order:stroke fill markers"/>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 1.2 KiB  | 
							
								
								
									
										14
									
								
								public/svgs/ollama.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
 | 
				
			||||||
 | 
					<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="4096px" height="4096px" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality; fill-rule:evenodd; clip-rule:evenodd" xmlns:xlink="http://www.w3.org/1999/xlink">
 | 
				
			||||||
 | 
					<g><path style="opacity:0.999" fill="#fefefe" d="M 1984.5,-0.5 C 2026.5,-0.5 2068.5,-0.5 2110.5,-0.5C 2537.4,15.5079 2922.4,149.008 3265.5,400C 3560.04,620.244 3781.2,898.744 3929,1235.5C 4031.4,1474.76 4086.9,1724.43 4095.5,1984.5C 4095.5,2026.5 4095.5,2068.5 4095.5,2110.5C 4079.61,2533.7 3948.11,2916.03 3701,3257.5C 3593.06,3404.12 3467.89,3534.62 3325.5,3649C 3314.27,3657.74 3302.94,3666.24 3291.5,3674.5C 3294.9,3533.77 3270.4,3398.11 3218,3267.5C 3213.27,3256.38 3208.27,3245.38 3203,3234.5C 3199.86,3228.11 3198.2,3221.44 3198,3214.5C 3233.37,3166.09 3260.04,3113.09 3278,3055.5C 3315.81,2931.9 3329.15,2805.57 3318,2676.5C 3312.19,2588.11 3293.86,2502.44 3263,2419.5C 3248.74,2385.4 3232.58,2352.23 3214.5,2320C 3228.7,2298.44 3242.54,2276.6 3256,2254.5C 3306.49,2163.1 3334.16,2065.1 3339,1960.5C 3347.09,1770.12 3293.75,1599.45 3179,1448.5C 3152.35,1414.84 3123.18,1383.34 3091.5,1354C 3073.96,1338.79 3056.13,1323.96 3038,1309.5C 3037.33,1303.83 3037.33,1298.17 3038,1292.5C 3071.33,1118.01 3070.66,943.681 3036,769.5C 3022.49,704.637 3000.82,642.637 2971,583.5C 2948.49,539.65 2918.65,501.484 2881.5,469C 2825.8,423.008 2762.8,409.008 2692.5,427C 2651.4,440.793 2615.9,463.293 2586,494.5C 2546.73,537.991 2515.73,586.991 2493,641.5C 2466.37,705.666 2447.04,771.999 2435,840.5C 2428.17,878.941 2423.17,917.608 2420,956.5C 2419.88,958.573 2418.88,959.907 2417,960.5C 2399.1,950.801 2381.27,940.967 2363.5,931C 2153.62,824.176 1943.62,823.842 1733.5,930C 1715.06,940.301 1696.56,950.467 1678,960.5C 1676.35,960.18 1675.35,959.18 1675,957.5C 1667.31,849.014 1643.31,744.347 1603,643.5C 1581.9,592.477 1553.57,546.144 1518,504.5C 1488.61,471.396 1453.44,446.562 1412.5,430C 1388.07,422.647 1363.07,419.147 1337.5,419.5C 1322.44,419.049 1307.78,421.215 1293.5,426C 1244.84,441.668 1204.68,469.502 1173,509.5C 1141.62,549.221 1116.62,592.887 1098,640.5C 1066.87,721.373 1047.53,805.04 1040,891.5C 1026.67,1023.93 1032.01,1155.6 1056,1286.5C 1057.33,1293.8 1058,1301.14 1058,1308.5C 887.035,1442.34 787.369,1617.67 759,1834.5C 747.069,1944.53 758.735,2051.86 794,2156.5C 807.02,2192.21 823.02,2226.54 842,2259.5C 854.715,2279.77 867.548,2299.93 880.5,2320C 836.781,2396.64 806.948,2478.47 791,2565.5C 783.711,2603.19 779.045,2641.19 777,2679.5C 776.333,2731.83 776.333,2784.17 777,2836.5C 782.248,2934.22 803.581,3028.22 841,3118.5C 856.12,3152.76 874.787,3184.76 897,3214.5C 897.611,3218.68 896.944,3222.68 895,3226.5C 830.268,3368.77 799.768,3518.1 803.5,3674.5C 556.783,3485.22 362.616,3252.55 221,2976.5C 83.5748,2704.13 9.74149,2415.47 -0.5,2110.5C -0.5,2068.5 -0.5,2026.5 -0.5,1984.5C 15.5079,1557.6 149.008,1172.6 400,829.5C 620.244,534.963 898.744,313.796 1235.5,166C 1474.76,63.6006 1724.43,8.10056 1984.5,-0.5 Z"/></g>
 | 
				
			||||||
 | 
					<g><path style="opacity:1" fill="#000000" d="M 3291.5,3674.5 C 3219.32,3730.61 3143.32,3781.28 3063.5,3826.5C 3086.34,3778.48 3098.17,3727.82 3099,3674.5C 3102.6,3547.82 3078.26,3426.82 3026,3311.5C 3012.26,3283.68 2998.26,3256.01 2984,3228.5C 2983.33,3211.83 2983.33,3195.17 2984,3178.5C 2986.77,3167.3 2991.43,3156.97 2998,3147.5C 3011.32,3131.52 3025.32,3116.18 3040,3101.5C 3055.7,3082.12 3068.37,3060.78 3078,3037.5C 3102.95,2974.82 3118.62,2909.82 3125,2842.5C 3135.67,2731.91 3124.67,2623.58 3092,2517.5C 3079.64,2478.12 3061.97,2441.45 3039,2407.5C 3031.38,2397.54 3023.38,2387.88 3015,2378.5C 2984.39,2332.41 2986.72,2288.07 3022,2245.5C 3066.42,2200.01 3099.09,2147.01 3120,2086.5C 3154.85,1979.03 3156.52,1871.03 3125,1762.5C 3089.97,1643.55 3024.14,1545.72 2927.5,1469C 2862.72,1419.8 2789.72,1390.13 2708.5,1380C 2686.83,1378.03 2665.16,1378.03 2643.5,1380C 2623.56,1383.05 2603.56,1385.55 2583.5,1387.5C 2544.15,1385.92 2515.31,1367.92 2497,1333.5C 2488.47,1313.24 2478.81,1293.57 2468,1274.5C 2451.43,1251.93 2434.1,1229.93 2416,1208.5C 2343.7,1135.91 2257.86,1085.74 2158.5,1058C 2140.99,1053.57 2123.33,1049.9 2105.5,1047C 2033.1,1038.03 1962.77,1046.03 1894.5,1071C 1825.56,1096.11 1763.56,1132.45 1708.5,1180C 1668.06,1216.42 1635.23,1258.58 1610,1306.5C 1603.43,1325.64 1593.77,1342.98 1581,1358.5C 1561.48,1377.23 1538.15,1386.57 1511,1386.5C 1493.39,1385.7 1475.89,1383.87 1458.5,1381C 1393.37,1374.82 1330.71,1384.49 1270.5,1410C 1181.85,1448.98 1109.68,1508.15 1054,1587.5C 957.404,1727.48 927.071,1880.82 963,2047.5C 983.321,2126.03 1021.65,2194.03 1078,2251.5C 1102.43,2283.23 1107.43,2317.89 1093,2355.5C 1089.44,2363.62 1085.11,2371.29 1080,2378.5C 1052.63,2408.91 1031.3,2443.25 1016,2481.5C 996.087,2532.48 982.42,2585.15 975,2639.5C 958.127,2755.12 965.46,2869.12 997,2981.5C 1005.9,3012.21 1017.9,3041.54 1033,3069.5C 1039.84,3080.51 1047.17,3091.18 1055,3101.5C 1069.68,3116.18 1083.68,3131.52 1097,3147.5C 1103.4,3157.04 1108.07,3167.37 1111,3178.5C 1111.67,3195.17 1111.67,3211.83 1111,3228.5C 1085.66,3274.84 1063.33,3322.51 1044,3371.5C 1005.13,3479.61 989.794,3590.94 998,3705.5C 1001.44,3737.36 1008.44,3768.36 1019,3798.5C 1022.7,3808.23 1027.2,3817.56 1032.5,3826.5C 952.208,3781.54 875.874,3730.87 803.5,3674.5C 799.768,3518.1 830.268,3368.77 895,3226.5C 896.944,3222.68 897.611,3218.68 897,3214.5C 874.787,3184.76 856.12,3152.76 841,3118.5C 803.581,3028.22 782.248,2934.22 777,2836.5C 776.333,2784.17 776.333,2731.83 777,2679.5C 779.045,2641.19 783.711,2603.19 791,2565.5C 806.948,2478.47 836.781,2396.64 880.5,2320C 867.548,2299.93 854.715,2279.77 842,2259.5C 823.02,2226.54 807.02,2192.21 794,2156.5C 758.735,2051.86 747.069,1944.53 759,1834.5C 787.369,1617.67 887.035,1442.34 1058,1308.5C 1058,1301.14 1057.33,1293.8 1056,1286.5C 1032.01,1155.6 1026.67,1023.93 1040,891.5C 1047.53,805.04 1066.87,721.373 1098,640.5C 1116.62,592.887 1141.62,549.221 1173,509.5C 1204.68,469.502 1244.84,441.668 1293.5,426C 1307.78,421.215 1322.44,419.049 1337.5,419.5C 1363.07,419.147 1388.07,422.647 1412.5,430C 1453.44,446.562 1488.61,471.396 1518,504.5C 1553.57,546.144 1581.9,592.477 1603,643.5C 1643.31,744.347 1667.31,849.014 1675,957.5C 1675.35,959.18 1676.35,960.18 1678,960.5C 1696.56,950.467 1715.06,940.301 1733.5,930C 1943.62,823.842 2153.62,824.176 2363.5,931C 2381.27,940.967 2399.1,950.801 2417,960.5C 2418.88,959.907 2419.88,958.573 2420,956.5C 2423.17,917.608 2428.17,878.941 2435,840.5C 2447.04,771.999 2466.37,705.666 2493,641.5C 2515.73,586.991 2546.73,537.991 2586,494.5C 2615.9,463.293 2651.4,440.793 2692.5,427C 2762.8,409.008 2825.8,423.008 2881.5,469C 2918.65,501.484 2948.49,539.65 2971,583.5C 3000.82,642.637 3022.49,704.637 3036,769.5C 3070.66,943.681 3071.33,1118.01 3038,1292.5C 3037.33,1298.17 3037.33,1303.83 3038,1309.5C 3056.13,1323.96 3073.96,1338.79 3091.5,1354C 3123.18,1383.34 3152.35,1414.84 3179,1448.5C 3293.75,1599.45 3347.09,1770.12 3339,1960.5C 3334.16,2065.1 3306.49,2163.1 3256,2254.5C 3242.54,2276.6 3228.7,2298.44 3214.5,2320C 3232.58,2352.23 3248.74,2385.4 3263,2419.5C 3293.86,2502.44 3312.19,2588.11 3318,2676.5C 3329.15,2805.57 3315.81,2931.9 3278,3055.5C 3260.04,3113.09 3233.37,3166.09 3198,3214.5C 3198.2,3221.44 3199.86,3228.11 3203,3234.5C 3208.27,3245.38 3213.27,3256.38 3218,3267.5C 3270.4,3398.11 3294.9,3533.77 3291.5,3674.5 Z"/></g>
 | 
				
			||||||
 | 
					<g><path style="opacity:1" fill="#fefefe" d="M 1343.5,613.5 C 1345.86,613.337 1348.19,613.503 1350.5,614C 1363.25,622.08 1374.08,632.247 1383,644.5C 1406.08,678.657 1424.41,715.323 1438,754.5C 1469.67,849.867 1486.01,947.867 1487,1048.5C 1487.67,1077.83 1487.67,1107.17 1487,1136.5C 1475.83,1153 1464.67,1169.5 1453.5,1186C 1407.83,1184.32 1362.5,1187.32 1317.5,1195C 1293.64,1199.88 1269.98,1205.55 1246.5,1212C 1244.5,1212.67 1242.5,1212.67 1240.5,1212C 1237.69,1200.67 1235.52,1189.17 1234,1177.5C 1220.98,1067.87 1222.98,958.541 1240,849.5C 1250.18,786.973 1269.18,727.306 1297,670.5C 1306.8,651.693 1319.3,634.86 1334.5,620C 1337.57,617.812 1340.57,615.645 1343.5,613.5 Z"/></g>
 | 
				
			||||||
 | 
					<g><path style="opacity:1" fill="#fefefe" d="M 2743.5,613.5 C 2746.98,613.184 2750.31,613.684 2753.5,615C 2767.13,624.964 2778.3,637.13 2787,651.5C 2807.31,685.784 2822.97,722.118 2834,760.5C 2858.32,848.257 2870.16,937.757 2869.5,1029C 2869.08,1081 2865.91,1132.83 2860,1184.5C 2858.99,1193.9 2857.16,1203.06 2854.5,1212C 2852.5,1212.67 2850.5,1212.67 2848.5,1212C 2813.95,1202.49 2778.95,1195.16 2743.5,1190C 2709.57,1187.05 2675.57,1185.71 2641.5,1186C 2630.33,1169.5 2619.17,1153 2608,1136.5C 2606.33,1076.74 2607.99,1017.07 2613,957.5C 2620.37,882.341 2637.04,809.341 2663,738.5C 2676.24,703.018 2693.9,670.018 2716,639.5C 2724.1,629.559 2733.27,620.893 2743.5,613.5 Z"/></g>
 | 
				
			||||||
 | 
					<g><path style="opacity:1" fill="#fefefe" d="M 3063.5,3826.5 C 2768.17,3994.26 2450.5,4083.93 2110.5,4095.5C 2068.5,4095.5 2026.5,4095.5 1984.5,4095.5C 1663.69,4084.63 1361.69,4003.8 1078.5,3853C 1062.94,3844.39 1047.61,3835.56 1032.5,3826.5C 1027.2,3817.56 1022.7,3808.23 1019,3798.5C 1008.44,3768.36 1001.44,3737.36 998,3705.5C 989.794,3590.94 1005.13,3479.61 1044,3371.5C 1063.33,3322.51 1085.66,3274.84 1111,3228.5C 1111.67,3211.83 1111.67,3195.17 1111,3178.5C 1108.07,3167.37 1103.4,3157.04 1097,3147.5C 1083.68,3131.52 1069.68,3116.18 1055,3101.5C 1047.17,3091.18 1039.84,3080.51 1033,3069.5C 1017.9,3041.54 1005.9,3012.21 997,2981.5C 965.46,2869.12 958.127,2755.12 975,2639.5C 982.42,2585.15 996.087,2532.48 1016,2481.5C 1031.3,2443.25 1052.63,2408.91 1080,2378.5C 1085.11,2371.29 1089.44,2363.62 1093,2355.5C 1107.43,2317.89 1102.43,2283.23 1078,2251.5C 1021.65,2194.03 983.321,2126.03 963,2047.5C 927.071,1880.82 957.404,1727.48 1054,1587.5C 1109.68,1508.15 1181.85,1448.98 1270.5,1410C 1330.71,1384.49 1393.37,1374.82 1458.5,1381C 1475.89,1383.87 1493.39,1385.7 1511,1386.5C 1538.15,1386.57 1561.48,1377.23 1581,1358.5C 1593.77,1342.98 1603.43,1325.64 1610,1306.5C 1635.23,1258.58 1668.06,1216.42 1708.5,1180C 1763.56,1132.45 1825.56,1096.11 1894.5,1071C 1962.77,1046.03 2033.1,1038.03 2105.5,1047C 2123.33,1049.9 2140.99,1053.57 2158.5,1058C 2257.86,1085.74 2343.7,1135.91 2416,1208.5C 2434.1,1229.93 2451.43,1251.93 2468,1274.5C 2478.81,1293.57 2488.47,1313.24 2497,1333.5C 2515.31,1367.92 2544.15,1385.92 2583.5,1387.5C 2603.56,1385.55 2623.56,1383.05 2643.5,1380C 2665.16,1378.03 2686.83,1378.03 2708.5,1380C 2789.72,1390.13 2862.72,1419.8 2927.5,1469C 3024.14,1545.72 3089.97,1643.55 3125,1762.5C 3156.52,1871.03 3154.85,1979.03 3120,2086.5C 3099.09,2147.01 3066.42,2200.01 3022,2245.5C 2986.72,2288.07 2984.39,2332.41 3015,2378.5C 3023.38,2387.88 3031.38,2397.54 3039,2407.5C 3061.97,2441.45 3079.64,2478.12 3092,2517.5C 3124.67,2623.58 3135.67,2731.91 3125,2842.5C 3118.62,2909.82 3102.95,2974.82 3078,3037.5C 3068.37,3060.78 3055.7,3082.12 3040,3101.5C 3025.32,3116.18 3011.32,3131.52 2998,3147.5C 2991.43,3156.97 2986.77,3167.3 2984,3178.5C 2983.33,3195.17 2983.33,3211.83 2984,3228.5C 2998.26,3256.01 3012.26,3283.68 3026,3311.5C 3078.26,3426.82 3102.6,3547.82 3099,3674.5C 3098.17,3727.82 3086.34,3778.48 3063.5,3826.5 Z"/></g>
 | 
				
			||||||
 | 
					<g><path style="opacity:1" fill="#000000" d="M 2012.5,1851.5 C 2112.37,1846.89 2208.04,1864.39 2299.5,1904C 2385.62,1942.45 2455.79,2000.28 2510,2077.5C 2542.75,2125.73 2563.75,2178.73 2573,2236.5C 2586.91,2380.14 2536.41,2494.97 2421.5,2581C 2340.82,2637.34 2251.15,2668.01 2152.5,2673C 2079.17,2674.97 2005.83,2674.97 1932.5,2673C 1826.08,2665.77 1731.75,2628.77 1649.5,2562C 1545.11,2470.64 1503.61,2356.14 1525,2218.5C 1543.42,2138.98 1581.08,2070.31 1638,2012.5C 1724.73,1929.05 1827.89,1877.89 1947.5,1859C 1969.31,1856.53 1990.98,1854.03 2012.5,1851.5 Z"/></g>
 | 
				
			||||||
 | 
					<g><path style="opacity:1" fill="#000000" d="M 1379.5,1875.5 C 1434.55,1872.44 1476.05,1894.44 1504,1941.5C 1507.73,1949.96 1511.73,1958.29 1516,1966.5C 1522.92,2031.46 1501.09,2084.29 1450.5,2125C 1425.26,2142.77 1397.26,2149.44 1366.5,2145C 1313.36,2136.83 1277.86,2107.33 1260,2056.5C 1249.49,1997.03 1266.32,1946.86 1310.5,1906C 1330.89,1889.8 1353.89,1879.64 1379.5,1875.5 Z"/></g>
 | 
				
			||||||
 | 
					<g><path style="opacity:1" fill="#000000" d="M 2687.5,1875.5 C 2742.89,1873.11 2785.39,1895.11 2815,1941.5C 2832.9,1972.49 2840.57,2005.82 2838,2041.5C 2828.41,2090.75 2799.91,2123.59 2752.5,2140C 2699.54,2155.81 2655.04,2142.98 2619,2101.5C 2597.87,2076.91 2584.54,2048.58 2579,2016.5C 2578.33,1999.83 2578.33,1983.17 2579,1966.5C 2593.13,1927.71 2618.96,1899.87 2656.5,1883C 2666.74,1879.52 2677.07,1877.02 2687.5,1875.5 Z"/></g>
 | 
				
			||||||
 | 
					<g><path style="opacity:1" fill="#fefefe" d="M 2018.5,1983.5 C 2118.82,1978 2211.82,2001.16 2297.5,2053C 2340.25,2081.75 2376.41,2117.25 2406,2159.5C 2433.84,2203.86 2446.84,2252.19 2445,2304.5C 2439.12,2354.58 2419.45,2398.25 2386,2435.5C 2362.54,2461.31 2335.37,2482.15 2304.5,2498C 2251.11,2526.6 2194.11,2541.6 2133.5,2543C 2075.5,2543.67 2017.5,2543.67 1959.5,2543C 1884.97,2540.6 1816.97,2518.6 1755.5,2477C 1725.83,2455.33 1701,2429.16 1681,2398.5C 1637.86,2320.42 1639.19,2243.09 1685,2166.5C 1733.44,2091.82 1799.94,2039.99 1884.5,2011C 1927.96,1995.22 1972.62,1986.05 2018.5,1983.5 Z"/></g>
 | 
				
			||||||
 | 
					<g><path style="opacity:1" fill="#000000" d="M 1964.5,2160.5 C 1974.84,2160.33 1985.17,2160.5 1995.5,2161C 1999.17,2162 2002.83,2163 2006.5,2164C 2019.36,2170.6 2032.03,2177.43 2044.5,2184.5C 2051.61,2180.57 2058.61,2176.4 2065.5,2172C 2084.44,2160.58 2104.77,2157.25 2126.5,2162C 2154.24,2173.76 2165.74,2194.6 2161,2224.5C 2159.39,2229.33 2157.39,2234 2155,2238.5C 2141.4,2256.86 2124.57,2271.36 2104.5,2282C 2095.83,2289.2 2093,2298.36 2096,2309.5C 2097.52,2320.59 2099.52,2331.59 2102,2342.5C 2102.67,2352.17 2102.67,2361.83 2102,2371.5C 2097.45,2391.05 2085.28,2402.88 2065.5,2407C 2048.08,2407.98 2030.75,2407.31 2013.5,2405C 1996.6,2395.27 1986.6,2380.77 1983.5,2361.5C 1986.88,2342.54 1990.05,2323.54 1993,2304.5C 1994.81,2296.58 1992.98,2289.75 1987.5,2284C 1971.14,2274.9 1956.31,2263.73 1943,2250.5C 1918.23,2221.25 1920.06,2193.75 1948.5,2168C 1953.54,2164.64 1958.88,2162.14 1964.5,2160.5 Z"/></g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 14 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/svgs/organizr.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 14 KiB  | 
							
								
								
									
										1
									
								
								public/svgs/postgresql.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 12 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/svgs/soketi.jpeg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 18 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/svgs/soketi.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.6 KiB  | 
							
								
								
									
										17
									
								
								public/svgs/supertokens.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					<svg xmlns="http://www.w3.org/2000/svg" width="44.869" height="40.302" viewBox="0 0 44.869 40.302">
 | 
				
			||||||
 | 
					  <g id="Group_10325" data-name="Group 10325" transform="translate(0.516)">
 | 
				
			||||||
 | 
					    <path id="Exclusion_1" data-name="Exclusion 1" d="M18.621,36.98c-.1,0-.2,0-.305-.008a7.383,7.383,0,0,1-3.67-1.338c-.308-.207-.615-.429-.912-.644l-.027-.019a16.427,16.427,0,0,0-1.965-1.286,7.348,7.348,0,0,0-3.4-.847l-.165,0a5.86,5.86,0,0,0-1.338.135A1.959,1.959,0,0,0,5.934,34.7a3.214,3.214,0,0,0,.3,1.18,3.066,3.066,0,0,1,.274.709h0c-.034,0-.122-.108-.289-.313-.665-.82-2.428-2.995-4.791-3.458A1.76,1.76,0,0,1,.306,30.1C6.2,21.434,6.931,18.338,9.672,6.822l.238-1q.261-1.1.55-2.3A1.773,1.773,0,0,1,11.5,2.3L14.818.918a1.759,1.759,0,0,1,.676-.135,1.8,1.8,0,0,1,.275.021A14.322,14.322,0,0,1,20.989,0h2.3a14.32,14.32,0,0,1,5.219.8,1.77,1.77,0,0,0-1.017.539l-10,.758h0l-.7-.757A1.773,1.773,0,0,0,15.77.805a5.9,5.9,0,0,0-1.814,1.1c-1.308,1.2-1.972,3.351-1.972,6.406V20.836c0,3.056.664,5.213,1.972,6.408,1.377,1.262,3.743,1.9,7.033,1.9h2.3c3.29,0,5.656-.64,7.033-1.9,1.308-1.2,1.972-3.354,1.972-6.408V8.31c0-3.053-.664-5.208-1.972-6.406A5.912,5.912,0,0,0,28.508.8a1.825,1.825,0,0,1,.274-.021,1.749,1.749,0,0,1,.675.135L32.779,2.3a1.773,1.773,0,0,1,1.036,1.223c.613,2.556,1.133,4.837,1.511,6.5,2.1,9.24,2.891,12.7,8.2,20.511a1.759,1.759,0,0,1-1.115,2.718A8.073,8.073,0,0,0,37.9,36.443c-.108.139-.155.2-.168.2a2.225,2.225,0,0,1,.195-.49l.118-.273a3.243,3.243,0,0,0,.293-1.18,1.9,1.9,0,0,0-.657-1.524,10.157,10.157,0,0,0-2.225-.28q-.118,0-.237,0a3.506,3.506,0,0,0-2.887,1.172,5,5,0,0,0-.3.455l-.013.022a4.346,4.346,0,0,1-.365.543,1.328,1.328,0,0,1-1.083.532A4.472,4.472,0,0,1,28.737,35c-.242-.122-.44-.222-.632-.3a5.773,5.773,0,0,0-2.236-.523,3.7,3.7,0,0,0-.643.055,7.689,7.689,0,0,0-2.771,1.336c-.194.126-.386.252-.579.374A6.007,6.007,0,0,1,18.621,36.98Z" transform="translate(0 2.822)" fill="#f93" stroke="rgba(0,0,0,0)" stroke-width="1"/>
 | 
				
			||||||
 | 
					    <g id="Group_4056" data-name="Group 4056" transform="translate(5.914 22.19)">
 | 
				
			||||||
 | 
					      <path id="Path_14227" data-name="Path 14227" d="M698.042,466.44l.162-2.728,2.46-.713,1.006,3.181A4.743,4.743,0,0,0,698.042,466.44Z" transform="translate(-680.16 -451.111)" fill="#db902e"/>
 | 
				
			||||||
 | 
					      <path id="Path_14229" data-name="Path 14229" d="M660.956,448.452c0,.064,0,1.019.007,1.1-1.971-.35-3.581.3-3.53,1.77h-.017V450.9c-.081-2.846,1.322-5.229,2.111-7.863.647-2.175.943-8.8,1.467-6.608a14.459,14.459,0,0,1-.037,5.614,23.229,23.229,0,0,0,0,3.2Z" transform="translate(-657.412 -435.988)" fill="#db902e"/>
 | 
				
			||||||
 | 
					      <path id="Path_14231" data-name="Path 14231" d="M722.715,448.452c0,.064,0,1.019-.007,1.1,1.724.09,3.581.3,3.53,1.77h.017V450.9c.081-2.846-1.322-5.229-2.11-7.863-.647-2.175-.943-8.8-1.467-6.608a14.438,14.438,0,0,0,.038,5.614,23.287,23.287,0,0,1,0,3.2Z" transform="translate(-693.804 -435.988)" fill="#db902e"/>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g id="Group_1803" data-name="Group 1803" transform="translate(9.16)">
 | 
				
			||||||
 | 
					      <path id="Path_14233" data-name="Path 14233" d="M678.914,391.217c3.483,0,4.746.813,5.128,1.162.671.615,1.056,2.193,1.056,4.328v12.525c0,2.135-.385,3.712-1.057,4.328-.381.349-1.643,1.161-5.127,1.161h-2.3c-3.483,0-4.746-.812-5.129-1.163-.671-.614-1.055-2.191-1.055-4.326V396.707c0-2.135.385-3.713,1.056-4.328.382-.349,1.645-1.162,5.128-1.162h2.3m0-5.644h-2.3q-6.052,0-8.94,2.644t-2.888,8.49v12.525q0,5.846,2.888,8.49t8.94,2.644h2.3q6.054,0,8.94-2.644t2.888-8.49V396.707q0-5.846-2.888-8.49t-8.94-2.644Z" transform="translate(-664.788 -385.573)" fill="#1a1a1a"/>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					    <g id="Group_1804" data-name="Group 1804" transform="translate(19.692 15.337)">
 | 
				
			||||||
 | 
					      <ellipse id="Ellipse_669" data-name="Ellipse 669" cx="2.445" cy="2.445" rx="2.445" ry="2.445" transform="translate(0 0)" fill="#1a1a1a"/>
 | 
				
			||||||
 | 
					      <path id="Path_14234" data-name="Path 14234" d="M693.3,432.955h-2.286a.517.517,0,0,1-.514-.566l.47-4.836a.516.516,0,0,1,.514-.466h1.344a.516.516,0,0,1,.514.466l.47,4.836A.517.517,0,0,1,693.3,432.955Z" transform="translate(-689.717 -424.151)" fill="#1a1a1a"/>
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 3.9 KiB  | 
							
								
								
									
										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  | 
@@ -2,7 +2,7 @@
 | 
				
			|||||||
    'transition-all duration-150 box-without-bg dark:bg-coolgray-100 bg-white group',
 | 
					    'transition-all duration-150 box-without-bg dark:bg-coolgray-100 bg-white group',
 | 
				
			||||||
    'hover:border-l-coollabs cursor-pointer' => !$upgrade,
 | 
					    'hover:border-l-coollabs cursor-pointer' => !$upgrade,
 | 
				
			||||||
    'hover:border-l-red-500 cursor-not-allowed' => $upgrade,
 | 
					    'hover:border-l-red-500 cursor-not-allowed' => $upgrade,
 | 
				
			||||||
]) @if (!$upgrade) wire:click={{ $wire }} @endif>
 | 
					])>
 | 
				
			||||||
    <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 ">
 | 
				
			||||||
@@ -20,11 +20,6 @@
 | 
				
			|||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    @isset($documentation)
 | 
					    @isset($documentation)
 | 
				
			||||||
        <div class="flex-1"></div>
 | 
					        <div class="flex-1"></div>
 | 
				
			||||||
        <div class="flex items-center px-2 " title="Read the documentation.">
 | 
					        {{ $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="{{ $documentation }}" target="_blank">
 | 
					 | 
				
			||||||
                Docs
 | 
					 | 
				
			||||||
            </a>
 | 
					 | 
				
			||||||
        </div>
 | 
					 | 
				
			||||||
    @endisset
 | 
					    @endisset
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,7 @@
 | 
				
			|||||||
            <livewire:server.proxy.status :server="$server" />
 | 
					            <livewire:server.proxy.status :server="$server" />
 | 
				
			||||||
        @endif
 | 
					        @endif
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    <div class="subtitle">{{ data_get($server, 'name') }}.</div>
 | 
					    <div class="subtitle">{{ data_get($server, 'name') }}</div>
 | 
				
			||||||
    <div class="navbar-main">
 | 
					    <div class="navbar-main">
 | 
				
			||||||
        <nav class="flex items-center gap-6 overflow-x-scroll sm:overflow-x-hidden scrollbar min-h-10 whitespace-nowrap">
 | 
					        <nav class="flex items-center gap-6 overflow-x-scroll sm:overflow-x-hidden scrollbar min-h-10 whitespace-nowrap">
 | 
				
			||||||
            <a class="{{ request()->routeIs('server.show') ? 'dark:text-white' : '' }}"
 | 
					            <a class="{{ request()->routeIs('server.show') ? 'dark:text-white' : '' }}"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,7 @@
 | 
				
			|||||||
        <div class="grid grid-cols-1 gap-2 xl:grid-cols-2">
 | 
					        <div class="grid grid-cols-1 gap-2 xl:grid-cols-2">
 | 
				
			||||||
            @foreach ($projects as $project)
 | 
					            @foreach ($projects as $project)
 | 
				
			||||||
                <div class="gap-2 border border-transparent cursor-pointer box group"
 | 
					                <div class="gap-2 border border-transparent cursor-pointer box group"
 | 
				
			||||||
                    onclick="gotoProject('{{ $project->uuid }}','{{ $project->default_environment() }}')">
 | 
					                    onclick="gotoProject('{{ $project->uuid }}','{{ $project->default_environment }}')">
 | 
				
			||||||
                    <div class="flex flex-1 mx-6">
 | 
					                    <div class="flex flex-1 mx-6">
 | 
				
			||||||
                        <div class="flex flex-col justify-center flex-1">
 | 
					                        <div class="flex flex-col justify-center flex-1">
 | 
				
			||||||
                            <div class="box-title">{{ $project->name }}</div>
 | 
					                            <div class="box-title">{{ $project->name }}</div>
 | 
				
			||||||
@@ -33,7 +33,7 @@
 | 
				
			|||||||
                        </div>
 | 
					                        </div>
 | 
				
			||||||
                        <div class="flex items-center justify-center gap-2 text-xs font-bold">
 | 
					                        <div class="flex items-center justify-center gap-2 text-xs font-bold">
 | 
				
			||||||
                            <a class="hover:underline"
 | 
					                            <a class="hover:underline"
 | 
				
			||||||
                                href="{{ route('project.resource.create', ['project_uuid' => $project->uuid, 'environment_name' => data_get($project, 'default_environment()', 'production')]) }}">
 | 
					                                href="{{ route('project.resource.create', ['project_uuid' => $project->uuid, 'environment_name' => data_get($project, 'default_environment', 'production')]) }}">
 | 
				
			||||||
                                <span class="p-2 font-bold">+ Add Resource</span>
 | 
					                                <span class="p-2 font-bold">+ Add Resource</span>
 | 
				
			||||||
                            </a>
 | 
					                            </a>
 | 
				
			||||||
                            <a class="hover:underline"
 | 
					                            <a class="hover:underline"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,35 +9,59 @@
 | 
				
			|||||||
        </x-modal-input>
 | 
					        </x-modal-input>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    <div class="subtitle">All your projects are here.</div>
 | 
					    <div class="subtitle">All your projects are here.</div>
 | 
				
			||||||
    <div class="grid gap-2 lg:grid-cols-2">
 | 
					    <div x-data="searchComponent()">
 | 
				
			||||||
        @forelse ($projects as $project)
 | 
					        <x-forms.input placeholder="Search for name, description..." x-model="search" id="null" />
 | 
				
			||||||
            <div class="box group" onclick="gotoProject('{{ $project->uuid }}', '{{ $project->default_environment() }}')">
 | 
					        <div class="grid grid-cols-2 gap-4 pt-4">
 | 
				
			||||||
                <div class="flex flex-col justify-center flex-1 mx-6">
 | 
					            <template x-if="allFilteredItems.length === 0">
 | 
				
			||||||
                    <div class="box-title">{{ $project->name }}</div>
 | 
					                <div>No project found with the search term "<span x-text="search"></span>".</div>
 | 
				
			||||||
                    <div class="box-description ">
 | 
					            </template>
 | 
				
			||||||
                        {{ $project->description }}</div>
 | 
					
 | 
				
			||||||
 | 
					            <template x-for="item in allFilteredItems" :key="item.uuid">
 | 
				
			||||||
 | 
					                <div class="box group" @click="gotoProject(item)">
 | 
				
			||||||
 | 
					                    <div class="flex flex-col justify-center flex-1 mx-6">
 | 
				
			||||||
 | 
					                        <div class="box-title" x-text="item.name"></div>
 | 
				
			||||||
 | 
					                        <div class="box-description ">
 | 
				
			||||||
 | 
					                            <div x-text="item.description"></div>
 | 
				
			||||||
 | 
					                        </div>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
                <div class="flex items-center justify-center gap-2 pt-4 pb-2 mr-4 text-xs lg:py-0 lg:justify-normal">
 | 
					            </template>
 | 
				
			||||||
                    <a class="mx-4 font-bold hover:underline"
 | 
					        </div>
 | 
				
			||||||
                        href="{{ route('project.edit', ['project_uuid' => data_get($project, 'uuid')]) }}">
 | 
					 | 
				
			||||||
                        Settings
 | 
					 | 
				
			||||||
                    </a>
 | 
					 | 
				
			||||||
                </div>
 | 
					 | 
				
			||||||
            </div>
 | 
					 | 
				
			||||||
        @empty
 | 
					 | 
				
			||||||
            <div>
 | 
					 | 
				
			||||||
                <div>No project found.</div>
 | 
					 | 
				
			||||||
            </div>
 | 
					 | 
				
			||||||
        @endforelse
 | 
					 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <script>
 | 
					    <script>
 | 
				
			||||||
    function gotoProject(uuid, environment) {
 | 
					        function sortFn(a, b) {
 | 
				
			||||||
        if (environment) {
 | 
					            return a.name.localeCompare(b.name)
 | 
				
			||||||
            window.location.href = '/project/' + uuid + '/' + environment;
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            window.location.href = '/project/' + uuid;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					
 | 
				
			||||||
</script>
 | 
					        function searchComponent() {
 | 
				
			||||||
 | 
					            return {
 | 
				
			||||||
 | 
					                search: '',
 | 
				
			||||||
 | 
					                projects: @js($projects),
 | 
				
			||||||
 | 
					                filterAndSort(items) {
 | 
				
			||||||
 | 
					                    if (this.search === '') {
 | 
				
			||||||
 | 
					                        return Object.values(items).sort(sortFn);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    const searchLower = this.search.toLowerCase();
 | 
				
			||||||
 | 
					                    return Object.values(items).filter(item => {
 | 
				
			||||||
 | 
					                        return (item.name?.toLowerCase().includes(searchLower) ||
 | 
				
			||||||
 | 
					                            item.description?.toLowerCase().includes(searchLower))
 | 
				
			||||||
 | 
					                    }).sort(sortFn);
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                get allFilteredItems() {
 | 
				
			||||||
 | 
					                    return [
 | 
				
			||||||
 | 
					                        this.projects,
 | 
				
			||||||
 | 
					                    ].flatMap((items) => this.filterAndSort(items));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        function gotoProject(item) {
 | 
				
			||||||
 | 
					            if (item.default_environment) {
 | 
				
			||||||
 | 
					                window.location.href = '/project/' + item.uuid + '/' + item.default_environment;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                window.location.href = '/project/' + item.uuid;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    </script>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,6 +50,10 @@
 | 
				
			|||||||
        <div x-data="searchComponent()">
 | 
					        <div x-data="searchComponent()">
 | 
				
			||||||
            <x-forms.input placeholder="Search for name, fqdn..." x-model="search" id="null" />
 | 
					            <x-forms.input placeholder="Search for name, fqdn..." x-model="search" id="null" />
 | 
				
			||||||
            <div class="grid grid-cols-1 gap-4 pt-4 lg:grid-cols-2 xl:grid-cols-3">
 | 
					            <div class="grid grid-cols-1 gap-4 pt-4 lg:grid-cols-2 xl:grid-cols-3">
 | 
				
			||||||
 | 
					                <template x-if="allFilteredItems.length === 0">
 | 
				
			||||||
 | 
					                    <div>No resource found with the search term "<span x-text="search"></span>".</div>
 | 
				
			||||||
 | 
					                </template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                <template x-for="item in allFilteredItems" :key="item.uuid">
 | 
					                <template x-for="item in allFilteredItems" :key="item.uuid">
 | 
				
			||||||
                    <span>
 | 
					                    <span>
 | 
				
			||||||
                        <a class="h-24 box group" :href="item.hrefLink">
 | 
					                        <a class="h-24 box group" :href="item.hrefLink">
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,9 +5,8 @@
 | 
				
			|||||||
# port: 9000
 | 
					# port: 9000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
services:
 | 
					services:
 | 
				
			||||||
 | 
					 | 
				
			||||||
  authentik-server:
 | 
					  authentik-server:
 | 
				
			||||||
    image: ghcr.io/goauthentik/server:${AUTHENTIK_TAG:-2024.2.2}
 | 
					    image: ghcr.io/goauthentik/server:${AUTHENTIK_TAG:-2024.8.0}
 | 
				
			||||||
    restart: unless-stopped
 | 
					    restart: unless-stopped
 | 
				
			||||||
    command: server
 | 
					    command: server
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
@@ -36,7 +35,7 @@ services:
 | 
				
			|||||||
      redis:
 | 
					      redis:
 | 
				
			||||||
        condition: service_healthy
 | 
					        condition: service_healthy
 | 
				
			||||||
  authentik-worker:
 | 
					  authentik-worker:
 | 
				
			||||||
    image: ghcr.io/goauthentik/server:${AUTHENTIK_TAG:-2024.2.2}
 | 
					    image: ghcr.io/goauthentik/server:${AUTHENTIK_TAG:-2024.8.0}
 | 
				
			||||||
    restart: unless-stopped
 | 
					    restart: unless-stopped
 | 
				
			||||||
    command: worker
 | 
					    command: worker
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
@@ -73,7 +72,7 @@ services:
 | 
				
			|||||||
      redis:
 | 
					      redis:
 | 
				
			||||||
        condition: service_healthy
 | 
					        condition: service_healthy
 | 
				
			||||||
  postgresql:
 | 
					  postgresql:
 | 
				
			||||||
    image: docker.io/library/postgres:12-alpine
 | 
					    image: docker.io/library/postgres:16-alpine
 | 
				
			||||||
    restart: unless-stopped
 | 
					    restart: unless-stopped
 | 
				
			||||||
    healthcheck:
 | 
					    healthcheck:
 | 
				
			||||||
      test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
 | 
					      test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
 | 
				
			||||||
@@ -85,7 +84,7 @@ services:
 | 
				
			|||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRESQL}
 | 
					      - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRESQL}
 | 
				
			||||||
      - POSTGRES_USER=${SERVICE_USER_POSTGRESQL}
 | 
					      - POSTGRES_USER=${SERVICE_USER_POSTGRESQL}
 | 
				
			||||||
      - POSTGRES_DB=${POSTGRES_DB:-authentik}
 | 
					      - POSTGRES_DB=authentik
 | 
				
			||||||
  redis:
 | 
					  redis:
 | 
				
			||||||
    image: docker.io/library/redis:alpine
 | 
					    image: docker.io/library/redis:alpine
 | 
				
			||||||
    command: --save 60 1 --loglevel warning
 | 
					    command: --save 60 1 --loglevel warning
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,19 +15,19 @@ services:
 | 
				
			|||||||
      - SECRET_KEY_BASE=$SERVICE_PASSWORD_CHATWOOT
 | 
					      - SECRET_KEY_BASE=$SERVICE_PASSWORD_CHATWOOT
 | 
				
			||||||
      - FRONTEND_URL=${SERVICE_FQDN_CHATWOOT}
 | 
					      - FRONTEND_URL=${SERVICE_FQDN_CHATWOOT}
 | 
				
			||||||
      - DEFAULT_LOCALE=${CHATWOOT_DEFAULT_LOCALE}
 | 
					      - DEFAULT_LOCALE=${CHATWOOT_DEFAULT_LOCALE}
 | 
				
			||||||
      - FORCE_SSL=false
 | 
					      - FORCE_SSL=${FORCE_SSL:-false}
 | 
				
			||||||
      - ENABLE_ACCOUNT_SIGNUP=false
 | 
					      - ENABLE_ACCOUNT_SIGNUP=${ENABLE_ACCOUNT_SIGNUP:-false}
 | 
				
			||||||
      - REDIS_URL=redis://default@redis:6379
 | 
					      - REDIS_URL=redis://default@redis:6379
 | 
				
			||||||
      - REDIS_PASSWORD=$SERVICE_PASSWORD_REDIS
 | 
					      - REDIS_PASSWORD=$SERVICE_PASSWORD_REDIS
 | 
				
			||||||
      - REDIS_OPENSSL_VERIFY_MODE=none
 | 
					      - REDIS_OPENSSL_VERIFY_MODE=${REDIS_OPENSSL_VERIFY_MODE:-none}
 | 
				
			||||||
      - POSTGRES_DATABASE=chatwoot
 | 
					      - POSTGRES_DATABASE=${POSTGRES_DB:-chatwoot}
 | 
				
			||||||
      - POSTGRES_HOST=postgres
 | 
					      - POSTGRES_HOST=${POSTGRES_HOST:-postgres}
 | 
				
			||||||
      - POSTGRES_USERNAME=$SERVICE_USER_POSTGRES_USER
 | 
					      - POSTGRES_USERNAME=$SERVICE_USER_POSTGRES
 | 
				
			||||||
      - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
 | 
					      - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
 | 
				
			||||||
      - RAILS_MAX_THREADS=5
 | 
					      - RAILS_MAX_THREADS=${RAILS_MAX_THREADS:-5}
 | 
				
			||||||
      - NODE_ENV=production
 | 
					      - NODE_ENV=${NODE_ENV:-production}
 | 
				
			||||||
      - RAILS_ENV=production
 | 
					      - RAILS_ENV=${RAILS_ENV:-production}
 | 
				
			||||||
      - INSTALLATION_ENV=docker
 | 
					      - INSTALLATION_ENV=${INSTALLATION_ENV:-docker}
 | 
				
			||||||
      - MAILER_SENDER_EMAIL=${CHATWOOT_MAILER_SENDER_EMAIL}
 | 
					      - MAILER_SENDER_EMAIL=${CHATWOOT_MAILER_SENDER_EMAIL}
 | 
				
			||||||
      - SMTP_ADDRESS=${CHATWOOT_SMTP_ADDRESS}
 | 
					      - SMTP_ADDRESS=${CHATWOOT_SMTP_ADDRESS}
 | 
				
			||||||
      - SMTP_AUTHENTICATION=${CHATWOOT_SMTP_AUTHENTICATION}
 | 
					      - SMTP_AUTHENTICATION=${CHATWOOT_SMTP_AUTHENTICATION}
 | 
				
			||||||
@@ -36,7 +36,7 @@ services:
 | 
				
			|||||||
      - SMTP_PORT=${CHATWOOT_SMTP_PORT}
 | 
					      - SMTP_PORT=${CHATWOOT_SMTP_PORT}
 | 
				
			||||||
      - SMTP_USERNAME=${CHATWOOT_SMTP_USERNAME}
 | 
					      - SMTP_USERNAME=${CHATWOOT_SMTP_USERNAME}
 | 
				
			||||||
      - SMTP_PASSWORD=${CHATWOOT_SMTP_PASSWORD}
 | 
					      - SMTP_PASSWORD=${CHATWOOT_SMTP_PASSWORD}
 | 
				
			||||||
      - ACTIVE_STORAGE_SERVICE=local
 | 
					      - ACTIVE_STORAGE_SERVICE=${ACTIVE_STORAGE_SERVICE:-local}
 | 
				
			||||||
    entrypoint: docker/entrypoints/rails.sh
 | 
					    entrypoint: docker/entrypoints/rails.sh
 | 
				
			||||||
    command: sh -c "bundle exec rails db:chatwoot_prepare && bundle exec rails s -p 3000 -b 0.0.0.0"
 | 
					    command: sh -c "bundle exec rails db:chatwoot_prepare && bundle exec rails s -p 3000 -b 0.0.0.0"
 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
@@ -56,19 +56,19 @@ services:
 | 
				
			|||||||
      - SECRET_KEY_BASE=$SERVICE_PASSWORD_CHATWOOT
 | 
					      - SECRET_KEY_BASE=$SERVICE_PASSWORD_CHATWOOT
 | 
				
			||||||
      - FRONTEND_URL=${SERVICE_FQDN_CHATWOOT}
 | 
					      - FRONTEND_URL=${SERVICE_FQDN_CHATWOOT}
 | 
				
			||||||
      - DEFAULT_LOCALE=${CHATWOOT_DEFAULT_LOCALE}
 | 
					      - DEFAULT_LOCALE=${CHATWOOT_DEFAULT_LOCALE}
 | 
				
			||||||
      - FORCE_SSL=false
 | 
					      - FORCE_SSL=${FORCE_SSL:-false}
 | 
				
			||||||
      - ENABLE_ACCOUNT_SIGNUP=false
 | 
					      - ENABLE_ACCOUNT_SIGNUP=${ENABLE_ACCOUNT_SIGNUP:-false}
 | 
				
			||||||
      - REDIS_URL=redis://default@redis:6379
 | 
					      - REDIS_URL=redis://default@redis:6379
 | 
				
			||||||
      - REDIS_PASSWORD=$SERVICE_PASSWORD_REDIS
 | 
					      - REDIS_PASSWORD=$SERVICE_PASSWORD_REDIS
 | 
				
			||||||
      - REDIS_OPENSSL_VERIFY_MODE=none
 | 
					      - REDIS_OPENSSL_VERIFY_MODE=${REDIS_OPENSSL_VERIFY_MODE:-none}
 | 
				
			||||||
      - POSTGRES_DATABASE=chatwoot
 | 
					      - POSTGRES_DATABASE=${POSTGRES_DB:-chatwoot}
 | 
				
			||||||
      - POSTGRES_HOST=postgres
 | 
					      - POSTGRES_HOST=${POSTGRES_HOST:-postgres}
 | 
				
			||||||
      - POSTGRES_USERNAME=$SERVICE_USER_POSTGRES_USER
 | 
					      - POSTGRES_USERNAME=$SERVICE_USER_POSTGRES
 | 
				
			||||||
      - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
 | 
					      - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
 | 
				
			||||||
      - RAILS_MAX_THREADS=5
 | 
					      - RAILS_MAX_THREADS=${RAILS_MAX_THREADS:-5}
 | 
				
			||||||
      - NODE_ENV=production
 | 
					      - NODE_ENV=${NODE_ENV:-production}
 | 
				
			||||||
      - RAILS_ENV=production
 | 
					      - RAILS_ENV=${RAILS_ENV:-production}
 | 
				
			||||||
      - INSTALLATION_ENV=docker
 | 
					      - INSTALLATION_ENV=${INSTALLATION_ENV:-docker}
 | 
				
			||||||
      - MAILER_SENDER_EMAIL=${CHATWOOT_MAILER_SENDER_EMAIL}
 | 
					      - MAILER_SENDER_EMAIL=${CHATWOOT_MAILER_SENDER_EMAIL}
 | 
				
			||||||
      - SMTP_ADDRESS=${CHATWOOT_SMTP_ADDRESS}
 | 
					      - SMTP_ADDRESS=${CHATWOOT_SMTP_ADDRESS}
 | 
				
			||||||
      - SMTP_AUTHENTICATION=${CHATWOOT_SMTP_AUTHENTICATION}
 | 
					      - SMTP_AUTHENTICATION=${CHATWOOT_SMTP_AUTHENTICATION}
 | 
				
			||||||
@@ -77,7 +77,7 @@ services:
 | 
				
			|||||||
      - SMTP_PORT=${CHATWOOT_SMTP_PORT}
 | 
					      - SMTP_PORT=${CHATWOOT_SMTP_PORT}
 | 
				
			||||||
      - SMTP_USERNAME=${CHATWOOT_SMTP_USERNAME}
 | 
					      - SMTP_USERNAME=${CHATWOOT_SMTP_USERNAME}
 | 
				
			||||||
      - SMTP_PASSWORD=${CHATWOOT_SMTP_PASSWORD}
 | 
					      - SMTP_PASSWORD=${CHATWOOT_SMTP_PASSWORD}
 | 
				
			||||||
      - ACTIVE_STORAGE_SERVICE=local
 | 
					      - ACTIVE_STORAGE_SERVICE=${ACTIVE_STORAGE_SERVICE:-local}
 | 
				
			||||||
    command: ['bundle', 'exec', 'sidekiq', '-C', 'config/sidekiq.yml']
 | 
					    command: ['bundle', 'exec', 'sidekiq', '-C', 'config/sidekiq.yml']
 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - sidekiq-data:/app/storage
 | 
					      - sidekiq-data:/app/storage
 | 
				
			||||||
@@ -93,11 +93,11 @@ services:
 | 
				
			|||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - postgres-data:/var/lib/postgresql/data
 | 
					      - postgres-data:/var/lib/postgresql/data
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - POSTGRES_DB=chatwoot
 | 
					      - POSTGRES_DB=${POSTGRES_DB:-chatwoot}
 | 
				
			||||||
      - POSTGRES_USER=$SERVICE_USER_POSTGRES_USER
 | 
					      - POSTGRES_USER=$SERVICE_USER_POSTGRES
 | 
				
			||||||
      - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
 | 
					      - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
 | 
				
			||||||
    healthcheck:
 | 
					    healthcheck:
 | 
				
			||||||
      test: ["CMD-SHELL", "pg_isready -U $SERVICE_USER_POSTGRES_USER -d chatwoot -h 127.0.0.1"]
 | 
					      test: ["CMD-SHELL", "pg_isready -U $SERVICE_USER_POSTGRES -d chatwoot -h 127.0.0.1"]
 | 
				
			||||||
      interval: 30s
 | 
					      interval: 30s
 | 
				
			||||||
      timeout: 10s
 | 
					      timeout: 10s
 | 
				
			||||||
      retries: 5
 | 
					      retries: 5
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,10 +6,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
services:
 | 
					services:
 | 
				
			||||||
  directus:
 | 
					  directus:
 | 
				
			||||||
    image: directus/directus:10
 | 
					    image: directus/directus:11
 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - directus-uploads:/directus/uploads
 | 
					      - directus-uploads:/directus/uploads
 | 
				
			||||||
      - directus-extensions:/directus/extensions
 | 
					      - directus-extensions:/directus/extensions
 | 
				
			||||||
 | 
					      - directus-templates:/directus/templates
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - SERVICE_FQDN_DIRECTUS_8055
 | 
					      - SERVICE_FQDN_DIRECTUS_8055
 | 
				
			||||||
      - KEY=$SERVICE_BASE64_64_KEY
 | 
					      - KEY=$SERVICE_BASE64_64_KEY
 | 
				
			||||||
@@ -37,6 +38,7 @@ services:
 | 
				
			|||||||
        condition: service_healthy
 | 
					        condition: service_healthy
 | 
				
			||||||
  postgresql:
 | 
					  postgresql:
 | 
				
			||||||
    image: postgis/postgis:16-3.4-alpine
 | 
					    image: postgis/postgis:16-3.4-alpine
 | 
				
			||||||
 | 
					    platform: linux/amd64
 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - directus-postgresql-data:/var/lib/postgresql/data
 | 
					      - directus-postgresql-data:/var/lib/postgresql/data
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,11 +6,12 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
services:
 | 
					services:
 | 
				
			||||||
  directus:
 | 
					  directus:
 | 
				
			||||||
    image: directus/directus:10
 | 
					    image: directus/directus:11
 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - directus-uploads:/directus/uploads
 | 
					 | 
				
			||||||
      - directus-database:/directus/database
 | 
					      - directus-database:/directus/database
 | 
				
			||||||
 | 
					      - directus-uploads:/directus/uploads
 | 
				
			||||||
      - directus-extensions:/directus/extensions
 | 
					      - directus-extensions:/directus/extensions
 | 
				
			||||||
 | 
					      - directus-templates:/directus/templates
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - SERVICE_FQDN_DIRECTUS_8055
 | 
					      - SERVICE_FQDN_DIRECTUS_8055
 | 
				
			||||||
      - KEY=$SERVICE_BASE64_64_KEY
 | 
					      - KEY=$SERVICE_BASE64_64_KEY
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										32
									
								
								templates/compose/dozzle-with-auth.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					# ignore: true
 | 
				
			||||||
 | 
					# documentation: https://dozzle.dev/
 | 
				
			||||||
 | 
					# slogan: Dozzle is a simple and lightweight web UI for Docker logs.
 | 
				
			||||||
 | 
					# tags: dozzle,docker,logs,web-ui
 | 
				
			||||||
 | 
					# logo: svgs/dozzle.svg
 | 
				
			||||||
 | 
					# port: 8080
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  dozzle:
 | 
				
			||||||
 | 
					    image: amir20/dozzle:latest
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - SERVICE_FQDN_DOZZLE_8080
 | 
				
			||||||
 | 
					      - DOZZLE_AUTH_PROVIDER=simple
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - /var/run/docker.sock:/var/run/docker.sock
 | 
				
			||||||
 | 
					      - type: bind
 | 
				
			||||||
 | 
					        source: /data/users.yml
 | 
				
			||||||
 | 
					        target: /data/users.yml
 | 
				
			||||||
 | 
					        content: |
 | 
				
			||||||
 | 
					          users:
 | 
				
			||||||
 | 
					            # "admin" here is username
 | 
				
			||||||
 | 
					            admin:
 | 
				
			||||||
 | 
					              name: "Admin"
 | 
				
			||||||
 | 
					              # Just sha-256 which can be computed with "echo -n password | shasum -a 256"
 | 
				
			||||||
 | 
					              password: "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8"
 | 
				
			||||||
 | 
					              email: me@email.net
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD", "/dozzle", "healthcheck"]
 | 
				
			||||||
 | 
					      interval: 3s
 | 
				
			||||||
 | 
					      timeout: 30s
 | 
				
			||||||
 | 
					      retries: 5
 | 
				
			||||||
 | 
					      start_period: 30s
 | 
				
			||||||
							
								
								
									
										19
									
								
								templates/compose/dozzle.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					# documentation: https://dozzle.dev/guide/getting-started#running-with-docker
 | 
				
			||||||
 | 
					# slogan: Dozzle is a simple and lightweight web UI for Docker logs.
 | 
				
			||||||
 | 
					# tags: dozzle,docker,logs,web-ui
 | 
				
			||||||
 | 
					# logo: svgs/dozzle.svg
 | 
				
			||||||
 | 
					# port: 8080
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  dozzle:
 | 
				
			||||||
 | 
					    image: amir20/dozzle:latest
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - SERVICE_FQDN_DOZZLE_8080
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - /var/run/docker.sock:/var/run/docker.sock
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD", "/dozzle", "healthcheck"]
 | 
				
			||||||
 | 
					      interval: 3s
 | 
				
			||||||
 | 
					      timeout: 30s
 | 
				
			||||||
 | 
					      retries: 5
 | 
				
			||||||
 | 
					      start_period: 30s
 | 
				
			||||||
							
								
								
									
										35
									
								
								templates/compose/easyappointments.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,35 @@
 | 
				
			|||||||
 | 
					# documentation: https://easyappointments.org/
 | 
				
			||||||
 | 
					# slogan: Schedule Anything. Let's start with easy! Get the best free online appointment scheduler on your server, today.
 | 
				
			||||||
 | 
					# tags: calendar, scheduling, database
 | 
				
			||||||
 | 
					# logo: svgs/easyappointments.png
 | 
				
			||||||
 | 
					# port: 80
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  easyappointments:
 | 
				
			||||||
 | 
					    image: alextselegidis/easyappointments:latest
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - SERVICE_FQDN_EASYAPPOINTMENTS_80
 | 
				
			||||||
 | 
					      - BASE_URL=${SERVICE_FQDN_EASYAPPOINTMENTS}
 | 
				
			||||||
 | 
					      - DB_HOST=mysql
 | 
				
			||||||
 | 
					      - DB_NAME=easyappointments
 | 
				
			||||||
 | 
					      - DB_USERNAME=root
 | 
				
			||||||
 | 
					      - DB_PASSWORD=${SERVICE_PASSWORD_EASYAPPOINTMENTS}
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      - mysql
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD", "curl", "-f", "http://127.0.0.1"]
 | 
				
			||||||
 | 
					      interval: 2s
 | 
				
			||||||
 | 
					      timeout: 10s
 | 
				
			||||||
 | 
					      retries: 30
 | 
				
			||||||
 | 
					  mysql:
 | 
				
			||||||
 | 
					    image: mysql:8
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - easyappointments-mysql-data:/var/lib/mysql
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - MYSQL_ROOT_PASSWORD=${SERVICE_PASSWORD_EASYAPPOINTMENTS}
 | 
				
			||||||
 | 
					      - MYSQL_DATABASE=easyappointments
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1"]
 | 
				
			||||||
 | 
					      interval: 5s
 | 
				
			||||||
 | 
					      timeout: 20s
 | 
				
			||||||
 | 
					      retries: 10
 | 
				
			||||||
							
								
								
									
										87
									
								
								templates/compose/getoutline.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,87 @@
 | 
				
			|||||||
 | 
					# documentation: https://docs.getoutline.com/s/hosting/doc/hosting-outline-nipGaCRBDu
 | 
				
			||||||
 | 
					# slogan: Your team’s knowledge base
 | 
				
			||||||
 | 
					# tags: knowledge base, documentation
 | 
				
			||||||
 | 
					# logo: svgs/getoutline.jpeg
 | 
				
			||||||
 | 
					# port: 3000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  outline:
 | 
				
			||||||
 | 
					    image: docker.getoutline.com/outlinewiki/outline:latest
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - storage-data:/var/lib/outline/data
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      postgres:
 | 
				
			||||||
 | 
					        condition: service_healthy
 | 
				
			||||||
 | 
					      redis:
 | 
				
			||||||
 | 
					        condition: service_healthy
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - SERVICE_FQDN_OUTLINE_3000
 | 
				
			||||||
 | 
					      - NODE_ENV=production
 | 
				
			||||||
 | 
					      - SECRET_KEY=${SERVICE_BASE64_OUTLINE}
 | 
				
			||||||
 | 
					      - UTILS_SECRET=${SERVICE_PASSWORD_64_OUTLINE}
 | 
				
			||||||
 | 
					      - DATABASE_URL=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_64_POSTGRES}@postgres:5432/${POSTGRES_DATABASE:-outline}
 | 
				
			||||||
 | 
					      - REDIS_URL=redis://:${SERVICE_PASSWORD_64_REDIS}@redis:6379
 | 
				
			||||||
 | 
					      - URL=${SERVICE_FQDN_OUTLINE_3000}
 | 
				
			||||||
 | 
					      - PORT=${OUTLINE_PORT:-3000}
 | 
				
			||||||
 | 
					      - FILE_STORAGE=${FILE_STORAGE:-local}
 | 
				
			||||||
 | 
					      - FILE_STORAGE_LOCAL_ROOT_DIR=${FILE_STORAGE_LOCAL_ROOT_DIR:-/var/lib/outline/data}
 | 
				
			||||||
 | 
					      - FILE_STORAGE_UPLOAD_MAX_SIZE=${FILE_STORAGE_UPLOAD_MAX_SIZE:-2000}
 | 
				
			||||||
 | 
					      - FILE_STORAGE_IMPORT_MAX_SIZE=${FILE_STORAGE_IMPORT_MAX_SIZE:-100}
 | 
				
			||||||
 | 
					      - FILE_STORAGE_WORKSPACE_IMPORT_MAX_SIZE=${FILE_STORAGE_WORKSPACE_IMPORT_MAX_SIZE}
 | 
				
			||||||
 | 
					      - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
 | 
				
			||||||
 | 
					      - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
 | 
				
			||||||
 | 
					      - AWS_REGION=${AWS_REGION}
 | 
				
			||||||
 | 
					      - AWS_S3_ACCELERATE_URL=${AWS_S3_ACCELERATE_URL}
 | 
				
			||||||
 | 
					      - AWS_S3_UPLOAD_BUCKET_URL=${AWS_S3_UPLOAD_BUCKET_URL}
 | 
				
			||||||
 | 
					      - AWS_S3_UPLOAD_BUCKET_NAME=${AWS_S3_UPLOAD_BUCKET_NAME}
 | 
				
			||||||
 | 
					      - AWS_S3_FORCE_PATH_STYLE=${AWS_S3_FORCE_PATH_STYLE:-true}
 | 
				
			||||||
 | 
					      - AWS_S3_ACL=${AWS_S3_ACL:-private}
 | 
				
			||||||
 | 
					      - SLACK_CLIENT_ID=${SLACK_CLIENT_ID}
 | 
				
			||||||
 | 
					      - SLACK_CLIENT_SECRET=${SLACK_CLIENT_SECRET}
 | 
				
			||||||
 | 
					      - GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID}
 | 
				
			||||||
 | 
					      - GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET}
 | 
				
			||||||
 | 
					      - AZURE_CLIENT_ID=${AZURE_CLIENT_ID}
 | 
				
			||||||
 | 
					      - AZURE_CLIENT_SECRET=${AZURE_CLIENT_SECRET}
 | 
				
			||||||
 | 
					      - AZURE_RESOURCE_APP_ID=${AZURE_RESOURCE_APP_ID}
 | 
				
			||||||
 | 
					      - OIDC_CLIENT_ID=${OIDC_CLIENT_ID}
 | 
				
			||||||
 | 
					      - OIDC_CLIENT_SECRET=${OIDC_CLIENT_SECRET}
 | 
				
			||||||
 | 
					      - OIDC_AUTH_URI=${OIDC_AUTH_URI}
 | 
				
			||||||
 | 
					      - OIDC_TOKEN_URI=${OIDC_TOKEN_URI}
 | 
				
			||||||
 | 
					      - OIDC_USERINFO_URI=${OIDC_USERINFO_URI}
 | 
				
			||||||
 | 
					      - OIDC_LOGOUT_URI=${OIDC_LOGOUT_URI}
 | 
				
			||||||
 | 
					      - OIDC_USERNAME_CLAIM=${OIDC_USERNAME_CLAIM}
 | 
				
			||||||
 | 
					      - OIDC_DISPLAY_NAME=${OIDC_DISPLAY_NAME}
 | 
				
			||||||
 | 
					      - OIDC_SCOPES=${OIDC_SCOPES}
 | 
				
			||||||
 | 
					      - GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID}    
 | 
				
			||||||
 | 
					      - GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}
 | 
				
			||||||
 | 
					      - GITHUB_APP_NAME=${GITHUB_APP_NAME}
 | 
				
			||||||
 | 
					      - GITHUB_APP_ID=${GITHUB_APP_ID}
 | 
				
			||||||
 | 
					      - GITHUB_APP_PRIVATE_KEY=${GITHUB_APP_PRIVATE_KEY}
 | 
				
			||||||
 | 
					      - PGSSLMODE=${PGSSLMODE:-disable}
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      disable: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  redis:
 | 
				
			||||||
 | 
					    image: redis:alpine
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - REDIS_PASSWORD=${SERVICE_PASSWORD_64_REDIS}
 | 
				
			||||||
 | 
					    command: ["redis-server", "--requirepass", "${SERVICE_PASSWORD_64_REDIS}"]
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD", "redis-cli", "-a", "${SERVICE_PASSWORD_64_REDIS}", "PING"]
 | 
				
			||||||
 | 
					      interval: 10s
 | 
				
			||||||
 | 
					      timeout: 30s
 | 
				
			||||||
 | 
					      retries: 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  postgres:
 | 
				
			||||||
 | 
					    image: postgres:12-alpine
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - database-data:/var/lib/postgresql/data
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - POSTGRES_USER=${SERVICE_USER_POSTGRES}
 | 
				
			||||||
 | 
					      - POSTGRES_PASSWORD=${SERVICE_PASSWORD_64_POSTGRES}
 | 
				
			||||||
 | 
					      - POSTGRES_DB=${POSTGRES_DATABASE:-outline}
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD", "pg_isready", "-U", "${SERVICE_USER_POSTGRES}", "-d", "${POSTGRES_DATABASE:-outline}"]
 | 
				
			||||||
 | 
					      interval: 30s
 | 
				
			||||||
 | 
					      timeout: 20s
 | 
				
			||||||
 | 
					      retries: 3
 | 
				
			||||||
@@ -1,4 +1,3 @@
 | 
				
			|||||||
# ignore: true
 | 
					 | 
				
			||||||
# documentation: https://invoiceninja.github.io/selfhost.html
 | 
					# documentation: https://invoiceninja.github.io/selfhost.html
 | 
				
			||||||
# slogan: The leading open-source invoicing platform
 | 
					# slogan: The leading open-source invoicing platform
 | 
				
			||||||
# tags: invoicing, billing, accounting, finance, self-hosted
 | 
					# tags: invoicing, billing, accounting, finance, self-hosted
 | 
				
			||||||
@@ -11,18 +10,20 @@ services:
 | 
				
			|||||||
      - SERVICE_FQDN_INVOICENINJA
 | 
					      - SERVICE_FQDN_INVOICENINJA
 | 
				
			||||||
      - APP_ENV=${APP_ENV:-production}
 | 
					      - APP_ENV=${APP_ENV:-production}
 | 
				
			||||||
      - APP_URL=${SERVICE_FQDN_INVOICENINJA}
 | 
					      - APP_URL=${SERVICE_FQDN_INVOICENINJA}
 | 
				
			||||||
      - APP_KEY=${SERVICE_REALBASE64_INVOICENINJA}
 | 
					      - APP_KEY=base64:${SERVICE_REALBASE64_INVOICENINJA}
 | 
				
			||||||
      - APP_DEBUG=${APP_DEBUG:-false}
 | 
					      - APP_DEBUG=${APP_DEBUG:-false}
 | 
				
			||||||
      - REQUIRE_HTTPS=${REQUIRE_HTTPS:-false}
 | 
					      - REQUIRE_HTTPS=${REQUIRE_HTTPS:-false}
 | 
				
			||||||
      - PHANTOMJS_PDF_GENERATION=${PHANTOMJS_PDF_GENERATION:-false}
 | 
					      - PHANTOMJS_PDF_GENERATION=${PHANTOMJS_PDF_GENERATION:-false}
 | 
				
			||||||
      - PDF_GENERATOR=${PDF_GENERATOR:-snappdf}
 | 
					      - PDF_GENERATOR=${PDF_GENERATOR:-snappdf}
 | 
				
			||||||
      - TRUSTED_PROXIES=${TRUSTED_PROXIES:-*}
 | 
					      - TRUSTED_PROXIES=${TRUSTED_PROXIES:-*}
 | 
				
			||||||
      - QUEUE_CONNECTION=${QUEUE_CONNECTION:-database}
 | 
					      - QUEUE_CONNECTION=${QUEUE_CONNECTION:-database}
 | 
				
			||||||
 | 
					      - IN_USER_EMAIL=${IN_USER_EMAIL:-admin@example.com}
 | 
				
			||||||
 | 
					      - IN_PASSWORD=${SERVICE_PASSWORD_INVOICENINJAUSER}
 | 
				
			||||||
      - DB_HOST=${DB_HOST:-mariadb}
 | 
					      - DB_HOST=${DB_HOST:-mariadb}
 | 
				
			||||||
      - DB_PORT=${DB_PORT:-3306}
 | 
					      - DB_PORT=${DB_PORT:-3306}
 | 
				
			||||||
      - DB_DATABASE=${DB_DATABASE:-invoiceninja}
 | 
					      - DB_DATABASE=${DB_DATABASE:-invoiceninja}
 | 
				
			||||||
      - DB_USERNAME=$SERVICE_USER_INVOICENINJA
 | 
					      - DB_USERNAME=$SERVICE_USER_MARIADB
 | 
				
			||||||
      - DB_PASSWORD=$SERVICE_PASSWORD_INVOICENINJA
 | 
					      - DB_PASSWORD=$SERVICE_PASSWORD_MARIADB
 | 
				
			||||||
    healthcheck:
 | 
					    healthcheck:
 | 
				
			||||||
      test: ['CMD', 'echo', 'ok']
 | 
					      test: ['CMD', 'echo', 'ok']
 | 
				
			||||||
      interval: 5s
 | 
					      interval: 5s
 | 
				
			||||||
@@ -31,6 +32,52 @@ services:
 | 
				
			|||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - invoice-ninja-public:/var/www/app/public
 | 
					      - invoice-ninja-public:/var/www/app/public
 | 
				
			||||||
      - invoice-ninja-storage:/var/www/app/storage
 | 
					      - invoice-ninja-storage:/var/www/app/storage
 | 
				
			||||||
 | 
					      - type: bind
 | 
				
			||||||
 | 
					        source: ./supervisord.conf
 | 
				
			||||||
 | 
					        target: /etc/supervisord.conf
 | 
				
			||||||
 | 
					        content: |
 | 
				
			||||||
 | 
					          [supervisord]
 | 
				
			||||||
 | 
					          nodaemon=true
 | 
				
			||||||
 | 
					          pidfile=/tmp/supervisord.pid
 | 
				
			||||||
 | 
					          logfile=/dev/null ; nodaemon will cause logs to go to stdout
 | 
				
			||||||
 | 
					          logfile_maxbytes=0
 | 
				
			||||||
 | 
					          loglevel=info
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          [program:php-fpm]
 | 
				
			||||||
 | 
					          redirect_stderr=true
 | 
				
			||||||
 | 
					          stdout_logfile=/dev/stdout
 | 
				
			||||||
 | 
					          stdout_logfile_maxbytes=0
 | 
				
			||||||
 | 
					          stderr_logfile=/dev/stderr
 | 
				
			||||||
 | 
					          stderr_logfile_maxbytes=0
 | 
				
			||||||
 | 
					          command=php artisan serve --host 0.0.0.0 --port 9000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          [program:scheduler]
 | 
				
			||||||
 | 
					          autorestart=true
 | 
				
			||||||
 | 
					          redirect_stderr=true
 | 
				
			||||||
 | 
					          stdout_logfile=/dev/stdout
 | 
				
			||||||
 | 
					          stdout_logfile_maxbytes=0
 | 
				
			||||||
 | 
					          stderr_logfile=/dev/stderr
 | 
				
			||||||
 | 
					          stderr_logfile_maxbytes=0
 | 
				
			||||||
 | 
					          command=php artisan schedule:work
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          [program:queue-worker]
 | 
				
			||||||
 | 
					          process_name=%(program_name)s_%(process_num)02d
 | 
				
			||||||
 | 
					          autorestart=true
 | 
				
			||||||
 | 
					          redirect_stderr=true
 | 
				
			||||||
 | 
					          stdout_logfile=/dev/stdout
 | 
				
			||||||
 | 
					          stdout_logfile_maxbytes=0
 | 
				
			||||||
 | 
					          stderr_logfile=/dev/stderr
 | 
				
			||||||
 | 
					          stderr_logfile_maxbytes=0
 | 
				
			||||||
 | 
					          numprocs=2
 | 
				
			||||||
 | 
					          command=php artisan queue:work --sleep=3 --tries=1 --memory=256 --timeout=3600
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          [eventlistener:shutdown]
 | 
				
			||||||
 | 
					          command=shutdown.sh
 | 
				
			||||||
 | 
					          events=PROCESS_STATE_STOPPED, PROCESS_STATE_EXITED, PROCESS_STATE_FATAL
 | 
				
			||||||
 | 
					          stdout_logfile=/dev/stdout
 | 
				
			||||||
 | 
					          stdout_logfile_maxbytes=0
 | 
				
			||||||
 | 
					          stderr_logfile=/dev/stderr
 | 
				
			||||||
 | 
					          stderr_logfile_maxbytes=0
 | 
				
			||||||
      - type: bind
 | 
					      - type: bind
 | 
				
			||||||
        source: ./php.ini
 | 
					        source: ./php.ini
 | 
				
			||||||
        target: /usr/local/etc/php/php.ini
 | 
					        target: /usr/local/etc/php/php.ini
 | 
				
			||||||
@@ -52,7 +99,6 @@ services:
 | 
				
			|||||||
          ; opcache.jit=1205
 | 
					          ; opcache.jit=1205
 | 
				
			||||||
          ; opcache.memory_consumption=1024M
 | 
					          ; opcache.memory_consumption=1024M
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
          post_max_size = 60M
 | 
					          post_max_size = 60M
 | 
				
			||||||
          upload_max_filesize = 50M
 | 
					          upload_max_filesize = 50M
 | 
				
			||||||
          memory_limit=512M
 | 
					          memory_limit=512M
 | 
				
			||||||
@@ -86,10 +132,10 @@ services:
 | 
				
			|||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - mariadb-data:/var/lib/mysql
 | 
					      - mariadb-data:/var/lib/mysql
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - MYSQL_ROOT_PASSWORD=$SERVICE_PASSWORD_ROOT
 | 
					      - MYSQL_ROOT_PASSWORD=$SERVICE_PASSWORD_MARIADBROOT
 | 
				
			||||||
      - MYSQL_DATABASE=${DB_DATABASE:-invoiceninja}
 | 
					      - MYSQL_DATABASE=${DB_DATABASE:-invoiceninja}
 | 
				
			||||||
      - MYSQL_USER=$SERVICE_USER_INVOICENINJA
 | 
					      - MYSQL_USER=$SERVICE_USER_MARIADB
 | 
				
			||||||
      - MYSQL_PASSWORD=$SERVICE_PASSWORD_INVOICENINJA
 | 
					      - MYSQL_PASSWORD=$SERVICE_PASSWORD_MARIADB
 | 
				
			||||||
    healthcheck:
 | 
					    healthcheck:
 | 
				
			||||||
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
 | 
					      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
 | 
				
			||||||
      interval: 5s
 | 
					      interval: 5s
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										47
									
								
								templates/compose/labelstudio.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,47 @@
 | 
				
			|||||||
 | 
					# documentation: https://labelstud.io/guide/
 | 
				
			||||||
 | 
					# slogan: Label Studio is a multi-type data labeling and annotation tool with standardized output format
 | 
				
			||||||
 | 
					# tags: workflow, orchestration, data-pipeline, python, labelstudio, ai, elasticsearch, datasets, data, machine-learning, data-science, nlp, images, vision
 | 
				
			||||||
 | 
					# logo: svgs/labelstudio.png
 | 
				
			||||||
 | 
					# port: 8080
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  labelstudio:
 | 
				
			||||||
 | 
					    image: heartexlabs/label-studio:latest
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      postgres:
 | 
				
			||||||
 | 
					        condition: service_healthy
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - SERVICE_FQDN_LABELSTUDIO_8080
 | 
				
			||||||
 | 
					      - DJANGO_DB=${DJANGO_DB:-default}
 | 
				
			||||||
 | 
					      - POSTGRE_NAME=${POSTGRES_DB:-labelstudio}
 | 
				
			||||||
 | 
					      - POSTGRE_USER=${SERVICE_USER_POSTGRES}
 | 
				
			||||||
 | 
					      - POSTGRE_PASSWORD=${SERVICE_PASSWORD_POSTGRES}
 | 
				
			||||||
 | 
					      - POSTGRE_PORT=5432
 | 
				
			||||||
 | 
					      - POSTGRE_HOST=postgres
 | 
				
			||||||
 | 
					      - LABEL_STUDIO_HOST=${SERVICE_FQDN_LABELSTUDIO}
 | 
				
			||||||
 | 
					      - SSRF_PROTECTION_ENABLED=${SSRF_PROTECTION_ENABLED:-true}
 | 
				
			||||||
 | 
					      - LABEL_STUDIO_DISABLE_SIGNUP_WITHOUT_LINK=${LABEL_STUDIO_DISABLE_SIGNUP_WITHOUT_LINK:-true}
 | 
				
			||||||
 | 
					      - DATA_UPLOAD_MAX_NUMBER_FILES=${DATA_UPLOAD_MAX_NUMBER_FILES:-10000}
 | 
				
			||||||
 | 
					      - LABEL_STUDIO_USERNAME=${LABEL_STUDIO_USERNAME:-admin@example.com}
 | 
				
			||||||
 | 
					      - LABEL_STUDIO_PASSWORD=${SERVICE_PASSWORD_LABELSTUDIO}
 | 
				
			||||||
 | 
					      - LABEL_STUDIO_DISABLE_SIGNUP_WITHOUT_LINK=${LABEL_STUDIO_DISABLE_SIGNUP_WITHOUT_LINK:-true}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - labelstudio-data:/label-studio/data
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"]
 | 
				
			||||||
 | 
					      interval: 5s
 | 
				
			||||||
 | 
					      timeout: 20s
 | 
				
			||||||
 | 
					      retries: 3
 | 
				
			||||||
 | 
					  postgres:
 | 
				
			||||||
 | 
					    image: postgres:16-alpine
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - POSTGRES_USER=${SERVICE_USER_POSTGRES}
 | 
				
			||||||
 | 
					      - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}
 | 
				
			||||||
 | 
					      - POSTGRES_DB=${POSTGRES_DB:-labelstudio}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - pg-data:/var/lib/postgresql/data
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD-SHELL", "pg_isready -h localhost -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
 | 
				
			||||||
 | 
					      interval: 5s
 | 
				
			||||||
 | 
					      timeout: 20s
 | 
				
			||||||
 | 
					      retries: 3
 | 
				
			||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										21
									
								
								templates/compose/libreoffice.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					# documentation: https://docs.linuxserver.io/images/docker-libreoffice/
 | 
				
			||||||
 | 
					# slogan: LibreOffice is a free and powerful office suite.
 | 
				
			||||||
 | 
					# tags: office,document,spreadsheet,presentation,open-source
 | 
				
			||||||
 | 
					# logo: svgs/libreoffice.svg
 | 
				
			||||||
 | 
					# port: 3000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  libreoffice:
 | 
				
			||||||
 | 
					    image: lscr.io/linuxserver/libreoffice:latest
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - SERVICE_FQDN_LIBREOFFICE_3000
 | 
				
			||||||
 | 
					      - PUID=${PUID:-1000}
 | 
				
			||||||
 | 
					      - PGID=${PGID:-1000}
 | 
				
			||||||
 | 
					      - TZ=${TZ:-Etc/UTC}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - libreoffice-config:/config
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD", "wget", "-q", "--spider", "http://localhost:3000"]
 | 
				
			||||||
 | 
					      interval: 30s
 | 
				
			||||||
 | 
					      timeout: 10s
 | 
				
			||||||
 | 
					      retries: 3
 | 
				
			||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										37
									
								
								templates/compose/nitropage-with-postgresql.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					# documentation: https://nitropage.com
 | 
				
			||||||
 | 
					# slogan: Nitropage is an extensible visual website builder, offering a growing collection of versatile building blocks, focal-point image cropping and sovereign font management.
 | 
				
			||||||
 | 
					# tags: nitropage, builder, editor, wysiwyg, cms, content, management
 | 
				
			||||||
 | 
					# logo: svgs/nitropage.svg
 | 
				
			||||||
 | 
					# port: 3000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  nitropage:
 | 
				
			||||||
 | 
					    image: codeberg.org/nitropage/nitropage
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - SERVICE_FQDN_NITROPAGE_3000
 | 
				
			||||||
 | 
					      - NP_AUTH_SALT=${SERVICE_BASE64_SALT}
 | 
				
			||||||
 | 
					      - NP_AUTH_PASSWORD=${SERVICE_PASSWORD_64_SESSION}
 | 
				
			||||||
 | 
					      - DATABASE_URL=postgresql://${SERVICE_USER_POSTGRESQL}:${SERVICE_PASSWORD_POSTGRESQL}@postgresql:5432/${POSTGRESQL_DATABASE:-nitropage}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - nitropage-data:/app/.data
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      postgresql:
 | 
				
			||||||
 | 
					        condition: service_healthy
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD", "curl", "-f", "http://127.0.0.1:3000/admin"]
 | 
				
			||||||
 | 
					      interval: 2s
 | 
				
			||||||
 | 
					      timeout: 10s
 | 
				
			||||||
 | 
					      retries: 15
 | 
				
			||||||
 | 
					  postgresql:
 | 
				
			||||||
 | 
					    image: postgres:16-alpine
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - nitropage-postgresql-data:/var/lib/postgresql/data
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - POSTGRES_USER=${SERVICE_USER_POSTGRESQL}
 | 
				
			||||||
 | 
					      - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRESQL}
 | 
				
			||||||
 | 
					      - POSTGRES_DB=${POSTGRESQL_DATABASE:-nitropage}
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
 | 
				
			||||||
 | 
					      interval: 5s
 | 
				
			||||||
 | 
					      timeout: 20s
 | 
				
			||||||
 | 
					      retries: 10
 | 
				
			||||||
							
								
								
									
										21
									
								
								templates/compose/nitropage.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					# documentation: https://nitropage.com
 | 
				
			||||||
 | 
					# slogan: Nitropage is an extensible visual website builder, offering a growing collection of versatile building blocks, focal-point image cropping and sovereign font management.
 | 
				
			||||||
 | 
					# tags: nitropage, builder, editor, wysiwyg, cms, content, management
 | 
				
			||||||
 | 
					# logo: svgs/nitropage.svg
 | 
				
			||||||
 | 
					# port: 3000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  nitropage:
 | 
				
			||||||
 | 
					    image: codeberg.org/nitropage/nitropage:sqlite
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - SERVICE_FQDN_NITROPAGE_3000
 | 
				
			||||||
 | 
					      - NP_AUTH_SALT=${SERVICE_BASE64_SALT}
 | 
				
			||||||
 | 
					      - NP_AUTH_PASSWORD=${SERVICE_PASSWORD_64_SESSION}
 | 
				
			||||||
 | 
					      - DATABASE_URL=file:../../.data/dev.db
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - nitropage-data:/app/.data
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD", "curl", "-f", "http://127.0.0.1:3000/admin"]
 | 
				
			||||||
 | 
					      interval: 2s
 | 
				
			||||||
 | 
					      timeout: 10s
 | 
				
			||||||
 | 
					      retries: 15
 | 
				
			||||||
							
								
								
									
										34
									
								
								templates/compose/ollama-with-open-webui.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					# documentation: https://docs.openwebui.com
 | 
				
			||||||
 | 
					# slogan: Ollama with Open Web UI integrates AI model deployment with a user-friendly interface.
 | 
				
			||||||
 | 
					# tags: ollama,ai,models,deployment,open-web-ui,integration
 | 
				
			||||||
 | 
					# logo: svgs/ollama.svg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  ollama-api:
 | 
				
			||||||
 | 
					    image: "ollama/ollama:latest"
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - "ollama:/root/.ollama"
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD", "ollama", "list"]
 | 
				
			||||||
 | 
					      interval: 5s
 | 
				
			||||||
 | 
					      timeout: 30s
 | 
				
			||||||
 | 
					      retries: 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  open-webui:
 | 
				
			||||||
 | 
					    image: "ghcr.io/open-webui/open-webui:main"
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - "open-webui:/app/backend/data"
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      - ollama-api
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - SERVICE_FQDN_OLLAMA_8080
 | 
				
			||||||
 | 
					      - OLLAMA_BASE_URL=http://ollama-api:11434
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test:
 | 
				
			||||||
 | 
					        - CMD
 | 
				
			||||||
 | 
					        - curl
 | 
				
			||||||
 | 
					        - "-f"
 | 
				
			||||||
 | 
					        - "http://127.0.0.1:8080"
 | 
				
			||||||
 | 
					      interval: 5s
 | 
				
			||||||
 | 
					      timeout: 30s
 | 
				
			||||||
 | 
					      retries: 10
 | 
				
			||||||
							
								
								
									
										19
									
								
								templates/compose/organizr.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					# documentation: https://docs.organizr.app/
 | 
				
			||||||
 | 
					# slogan: Homelab Services Organizer
 | 
				
			||||||
 | 
					# tags: tool
 | 
				
			||||||
 | 
					# logo: svgs/organizr.png
 | 
				
			||||||
 | 
					# port: 80
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  organizr:
 | 
				
			||||||
 | 
					    image: organizr/organizr:latest
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - SERVICE_FQDN_ORGANIZR_80
 | 
				
			||||||
 | 
					      - branch=${branch:-v2-master}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - organizr-data:/config
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD-SHELL", "curl -sf http://localhost:80 || exit 1"]
 | 
				
			||||||
 | 
					      interval: 10s
 | 
				
			||||||
 | 
					      timeout: 1s
 | 
				
			||||||
 | 
					      retries: 3
 | 
				
			||||||
@@ -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}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,6 +7,7 @@
 | 
				
			|||||||
services:
 | 
					services:
 | 
				
			||||||
  rabbitmq:
 | 
					  rabbitmq:
 | 
				
			||||||
    image: rabbitmq:3-management
 | 
					    image: rabbitmq:3-management
 | 
				
			||||||
 | 
					    hostname: "rabbitmq"
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - SERVICE_FQDN_RABBITMQ_15672
 | 
					      - SERVICE_FQDN_RABBITMQ_15672
 | 
				
			||||||
      - RABBITMQ_DEFAULT_USER=$SERVICE_USER_RABBITMQ
 | 
					      - RABBITMQ_DEFAULT_USER=$SERVICE_USER_RABBITMQ
 | 
				
			||||||
@@ -16,6 +17,8 @@ services:
 | 
				
			|||||||
      - ${PORT}:5672
 | 
					      - ${PORT}:5672
 | 
				
			||||||
    healthcheck:
 | 
					    healthcheck:
 | 
				
			||||||
      test: rabbitmq-diagnostics -q ping
 | 
					      test: rabbitmq-diagnostics -q ping
 | 
				
			||||||
      interval: 30s
 | 
					      interval: 5s
 | 
				
			||||||
      timeout: 30s
 | 
					      timeout: 30s
 | 
				
			||||||
      retries: 3
 | 
					      retries: 10
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - rabbitmq-data:/var/lib/rabbitmq/
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,12 +10,12 @@ services:
 | 
				
			|||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - SERVICE_FQDN_REACTIVERESUME_3000
 | 
					      - SERVICE_FQDN_REACTIVERESUME_3000
 | 
				
			||||||
      - PUBLIC_URL=$SERVICE_FQDN_REACTIVERESUME
 | 
					      - PUBLIC_URL=$SERVICE_FQDN_REACTIVERESUME
 | 
				
			||||||
      - STORAGE_URL=http://minio
 | 
					      - 'STORAGE_URL=${SERVICE_FQDN_MINIO}/default'
 | 
				
			||||||
      - DATABASE_URL=postgresql://$SERVICE_USER_POSTGRES:$SERVICE_PASSWORD_POSTGRES@postgres:5432/${POSTGRES_DB:-postgres}
 | 
					      - DATABASE_URL=postgresql://$SERVICE_USER_POSTGRES:$SERVICE_PASSWORD_POSTGRES@postgres:5432/${POSTGRES_DB:-postgres}
 | 
				
			||||||
      - ACCESS_TOKEN_SECRET=$SERVICE_PASSWORD_ACCESSTOKEN
 | 
					      - ACCESS_TOKEN_SECRET=$SERVICE_PASSWORD_ACCESSTOKEN
 | 
				
			||||||
      - REFRESH_TOKEN_SECRET=$SERVICE_PASSWORD_REFRESHTOKEN
 | 
					      - REFRESH_TOKEN_SECRET=$SERVICE_PASSWORD_REFRESHTOKEN
 | 
				
			||||||
      - CHROME_TOKEN=$SERVICE_PASSWORD_CHROMETOKEN
 | 
					      - CHROME_TOKEN=$SERVICE_PASSWORD_CHROMETOKEN
 | 
				
			||||||
      - CHROME_URL=ws://chrome:3000
 | 
					      - CHROME_URL=ws://chrome:3000/chrome
 | 
				
			||||||
      - REDIS_URL=redis://redis:6379
 | 
					      - REDIS_URL=redis://redis:6379
 | 
				
			||||||
      - STORAGE_ENDPOINT=minio
 | 
					      - STORAGE_ENDPOINT=minio
 | 
				
			||||||
      - STORAGE_PORT=9000
 | 
					      - STORAGE_PORT=9000
 | 
				
			||||||
@@ -24,8 +24,8 @@ services:
 | 
				
			|||||||
      - STORAGE_ACCESS_KEY=$SERVICE_USER_MINIO
 | 
					      - STORAGE_ACCESS_KEY=$SERVICE_USER_MINIO
 | 
				
			||||||
      - STORAGE_SECRET_KEY=$SERVICE_PASSWORD_MINIO
 | 
					      - STORAGE_SECRET_KEY=$SERVICE_PASSWORD_MINIO
 | 
				
			||||||
      - STORAGE_USE_SSL=false
 | 
					      - STORAGE_USE_SSL=false
 | 
				
			||||||
      - DISABLE_SIGNUPS=$SERVICE_DISABLE_SIGNUPS
 | 
					      - 'DISABLE_SIGNUPS=${SERVICE_DISABLE_SIGNUPS:-false}'
 | 
				
			||||||
      - DISABLE_EMAIL_AUTH=$SERVICE_DISABLE_EMAIL_AUTH
 | 
					      - 'DISABLE_EMAIL_AUTH=${SERVICE_DISABLE_EMAIL_AUTH:-false}'
 | 
				
			||||||
    depends_on:
 | 
					    depends_on:
 | 
				
			||||||
      - postgres
 | 
					      - postgres
 | 
				
			||||||
      - minio
 | 
					      - minio
 | 
				
			||||||
@@ -45,9 +45,10 @@ services:
 | 
				
			|||||||
      retries: 10
 | 
					      retries: 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  minio:
 | 
					  minio:
 | 
				
			||||||
    image: quay.io/minio/minio:latest
 | 
					    image: minio/minio
 | 
				
			||||||
    command: server /data --console-address ":9001"
 | 
					    command: server /data --console-address ":9001"
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
 | 
					      - SERVICE_FQDN_MINIO_9000
 | 
				
			||||||
      - MINIO_ROOT_USER=$SERVICE_USER_MINIO
 | 
					      - MINIO_ROOT_USER=$SERVICE_USER_MINIO
 | 
				
			||||||
      - MINIO_ROOT_PASSWORD=$SERVICE_PASSWORD_MINIO
 | 
					      - MINIO_ROOT_PASSWORD=$SERVICE_PASSWORD_MINIO
 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								templates/compose/soketi.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					# documentation: https://docs.soketi.app
 | 
				
			||||||
 | 
					# slogan: Soketi is your simple, fast, and resilient open-source WebSockets server.
 | 
				
			||||||
 | 
					# tags: websockets,open,source,messaging
 | 
				
			||||||
 | 
					# logo: svgs/soketi.jpeg
 | 
				
			||||||
 | 
					# port: 6001
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  soketi:
 | 
				
			||||||
 | 
					    image: "quay.io/soketi/soketi:1.4-16-debian"
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - SERVICE_FQDN_SOKETI_6001
 | 
				
			||||||
 | 
					      - SOKETI_DEBUG=${DEBUG:-0}
 | 
				
			||||||
 | 
					      - SOKETI_DEFAULT_APP_ID=${SOKETI_APP_ID}
 | 
				
			||||||
 | 
					      - SOKETI_DEFAULT_APP_KEY=${SOKETI_APP_KEY}
 | 
				
			||||||
 | 
					      - SOKETI_DEFAULT_APP_SECRET=${SOKETI_APP_SECRET}
 | 
				
			||||||
 | 
					      - SOKETI_PUSHER_SCHEME=${SOKETI_PUSHER_SCHEME:-https}
 | 
				
			||||||
 | 
					      - SOKETI_DEFAULT_APP_ENABLE_CLIENT_MESSAGES=${DEFAULT_APP_ENABLE_CLIENT_MESSAGES}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD-SHELL", "curl -f http://localhost:6001/ || exit 1"]
 | 
				
			||||||
 | 
					      interval: 5s
 | 
				
			||||||
 | 
					      timeout: 20s
 | 
				
			||||||
 | 
					      retries: 3
 | 
				
			||||||
							
								
								
									
										40
									
								
								templates/compose/supertokens-with-mysql.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					# documentation: https://supertokens.com/docs/guides
 | 
				
			||||||
 | 
					# slogan: An open-source authentication solution that simplifies the implementation of secure user authentication and session management for web and mobile applications.
 | 
				
			||||||
 | 
					# tags: supertokens,login,authentication,authorization,oauth,user-management,session-management,access-control,otp,magic-link,passwordless
 | 
				
			||||||
 | 
					# logo: svgs/supertokens.svg
 | 
				
			||||||
 | 
					# port: 3567
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  supertokens:
 | 
				
			||||||
 | 
					    image: 'registry.supertokens.io/supertokens/supertokens-mysql:latest'
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      mysql:
 | 
				
			||||||
 | 
					        condition: service_healthy
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - SERVICE_FQDN_SUPERTOKENS_3567
 | 
				
			||||||
 | 
					      - API_KEYS=${API_KEYS:-}
 | 
				
			||||||
 | 
					      - MYSQL_CONNECTION_URI=mysql://$SERVICE_USER_MYSQL:$SERVICE_PASSWORD_MYSQL@mysql:3306/${MYSQL_DATABASE:-supertokens}
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: "bash -c 'exec 3<>/dev/tcp/127.0.0.1/3567 && echo -e \"GET /hello HTTP/1.1\\r\\nhost: 127.0.0.1:3567\\r\\nConnection: close\\r\\n\\r\\n\" >&3 && cat <&3 | grep \"Hello\"'\n"
 | 
				
			||||||
 | 
					      interval: 10s
 | 
				
			||||||
 | 
					      timeout: 5s
 | 
				
			||||||
 | 
					      retries: 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mysql:
 | 
				
			||||||
 | 
					    image: 'mysql:latest'
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - MYSQL_ROOT_PASSWORD=$SERVICE_PASSWORD_MYSQL
 | 
				
			||||||
 | 
					      - MYSQL_USER=$SERVICE_USER_MYSQL
 | 
				
			||||||
 | 
					      - MYSQL_PASSWORD=$SERVICE_PASSWORD_MYSQL
 | 
				
			||||||
 | 
					      - MYSQL_DATABASE=${MYSQL_DATABASE:-supertokens}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - 'supertokens-mysql-data:/var/lib/mysql'
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test:
 | 
				
			||||||
 | 
					        - CMD
 | 
				
			||||||
 | 
					        - mysqladmin
 | 
				
			||||||
 | 
					        - ping
 | 
				
			||||||
 | 
					        - '-h'
 | 
				
			||||||
 | 
					        - localhost
 | 
				
			||||||
 | 
					      timeout: 20s
 | 
				
			||||||
 | 
					      retries: 10
 | 
				
			||||||
							
								
								
									
										34
									
								
								templates/compose/supertokens-with-postgresql.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					# documentation: https://supertokens.com/docs/guides
 | 
				
			||||||
 | 
					# slogan: An open-source authentication solution that simplifies the implementation of secure user authentication and session management for web and mobile applications.
 | 
				
			||||||
 | 
					# tags: supertokens,login,authentication,authorization,oauth,user-management,session-management,access-control,otp,magic-link,passwordless
 | 
				
			||||||
 | 
					# logo: svgs/supertokens.svg
 | 
				
			||||||
 | 
					# port: 3567
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  supertokens:
 | 
				
			||||||
 | 
					    image: registry.supertokens.io/supertokens/supertokens-postgresql:latest
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      postgres:
 | 
				
			||||||
 | 
					        condition: service_healthy
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - SERVICE_FQDN_SUPERTOKENS_3567
 | 
				
			||||||
 | 
					      - API_KEYS=${API_KEYS:-}
 | 
				
			||||||
 | 
					      - POSTGRESQL_CONNECTION_URI="postgresql://$SERVICE_USER_POSTGRESQL:$SERVICE_PASSWORD_POSTGRESQL@postgres:5432/${POSTGRES_DB:-supertokens}"
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: "bash -c 'exec 3<>/dev/tcp/127.0.0.1/3567 && echo -e \"GET /hello HTTP/1.1\\r\\nhost: 127.0.0.1:3567\\r\\nConnection: close\\r\\n\\r\\n\" >&3 && cat <&3 | grep \"Hello\"'\n"
 | 
				
			||||||
 | 
					      interval: 10s
 | 
				
			||||||
 | 
					      timeout: 5s
 | 
				
			||||||
 | 
					      retries: 5
 | 
				
			||||||
 | 
					  postgres:
 | 
				
			||||||
 | 
					    image: postgres:16
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - POSTGRES_USER=$SERVICE_USER_POSTGRESQL
 | 
				
			||||||
 | 
					      - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRESQL
 | 
				
			||||||
 | 
					      - POSTGRES_DB=${POSTGRES_DB:-supertokens}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - supertokens-postgres-data:/var/lib/postgresql/data
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD", "pg_isready", "-U", "$SERVICE_USER_POSTGRESQL", "-d", "${POSTGRES_DB:-supertokens}"]
 | 
				
			||||||
 | 
					      interval: 5s
 | 
				
			||||||
 | 
					      timeout: 5s
 | 
				
			||||||
 | 
					      retries: 5
 | 
				
			||||||
@@ -4,8 +4,6 @@
 | 
				
			|||||||
# logo: svgs/unstructured.png
 | 
					# logo: svgs/unstructured.png
 | 
				
			||||||
# port: 8000
 | 
					# port: 8000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
version: "3"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
services:
 | 
					services:
 | 
				
			||||||
  unstructured:
 | 
					  unstructured:
 | 
				
			||||||
    image: "downloads.unstructured.io/unstructured-io/unstructured-api:latest"
 | 
					    image: "downloads.unstructured.io/unstructured-io/unstructured-api:latest"
 | 
				
			||||||
@@ -17,8 +15,7 @@ services:
 | 
				
			|||||||
        - CMD
 | 
					        - CMD
 | 
				
			||||||
        - wget
 | 
					        - wget
 | 
				
			||||||
        - "-qO-"
 | 
					        - "-qO-"
 | 
				
			||||||
        - "--spider"
 | 
					 | 
				
			||||||
        - "http://0.0.0.0:8000/healthcheck"
 | 
					        - "http://0.0.0.0:8000/healthcheck"
 | 
				
			||||||
      interval: 15s
 | 
					      interval: 5s
 | 
				
			||||||
      timeout: 15s
 | 
					      timeout: 30s
 | 
				
			||||||
      retries: 3
 | 
					      retries: 10
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,14 +4,12 @@
 | 
				
			|||||||
# logo: svgs/weaviate.png
 | 
					# logo: svgs/weaviate.png
 | 
				
			||||||
# port: 8080
 | 
					# port: 8080
 | 
				
			||||||
 | 
					
 | 
				
			||||||
version: "3"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
services:
 | 
					services:
 | 
				
			||||||
  weaviate:
 | 
					  weaviate:
 | 
				
			||||||
    image: "cr.weaviate.io/semitechnologies/weaviate:1.26.4"
 | 
					    image: "cr.weaviate.io/semitechnologies/weaviate:1.26.4"
 | 
				
			||||||
    restart: always
 | 
					 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - "weaviate_data:/var/lib/weaviate"
 | 
					      - "weaviate-data:/var/lib/weaviate"
 | 
				
			||||||
    command:
 | 
					    command:
 | 
				
			||||||
      - "--host"
 | 
					      - "--host"
 | 
				
			||||||
      - 0.0.0.0
 | 
					      - 0.0.0.0
 | 
				
			||||||
@@ -21,20 +19,20 @@ services:
 | 
				
			|||||||
      - http
 | 
					      - http
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - SERVICE_FQDN_WEAVIATE_8080
 | 
					      - SERVICE_FQDN_WEAVIATE_8080
 | 
				
			||||||
      - DISABLE_TELEMETRY=true
 | 
					      - DISABLE_TELEMETRY=${DISABLE_TELEMETRY:-true}
 | 
				
			||||||
      - QUERY_DEFAULTS_LIMIT=1000
 | 
					      - QUERY_DEFAULTS_LIMIT=${QUERY_DEFAULTS_LIMIT:-1000}
 | 
				
			||||||
      - LOG_LEVEL=info
 | 
					      - LOG_LEVEL=${LOG_LEVEL:-info}
 | 
				
			||||||
      - GOMEMLIMIT=${GOMEMLIMIT:-1024MiB}
 | 
					      - GOMEMLIMIT=${GOMEMLIMIT:-1024MiB}
 | 
				
			||||||
      - GOMAXPROCS=${GOMAXPROCS:-2}
 | 
					      - GOMAXPROCS=${GOMAXPROCS:-2}
 | 
				
			||||||
      - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=false
 | 
					      - AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=${AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED:-false}
 | 
				
			||||||
      - AUTHORIZATION_ADMINLIST_USERS=${AUTHORIZATION_ADMINLIST_USERS:-admin@example.com}
 | 
					      - AUTHORIZATION_ADMINLIST_USERS=${AUTHORIZATION_ADMINLIST_USERS:-admin@example.com}
 | 
				
			||||||
      - AUTHENTICATION_APIKEY_USERS=${AUTHENTICATION_APIKEY_USERS:-admin@example.com}
 | 
					      - AUTHENTICATION_APIKEY_USERS=${AUTHENTICATION_APIKEY_USERS:-admin@example.com}
 | 
				
			||||||
      - AUTHENTICATION_APIKEY_ENABLED=true
 | 
					      - AUTHENTICATION_APIKEY_ENABLED=${AUTHENTICATION_APIKEY_ENABLED:-true}
 | 
				
			||||||
      - "AUTHENTICATION_APIKEY_ALLOWED_KEYS=${SERVICE_PASSWORD_APIKEYS}"
 | 
					      - AUTHENTICATION_APIKEY_ALLOWED_KEYS=${SERVICE_PASSWORD_APIKEYS}
 | 
				
			||||||
      - PERSISTENCE_DATA_PATH=/var/lib/weaviate
 | 
					      - PERSISTENCE_DATA_PATH=/var/lib/weaviate
 | 
				
			||||||
      - DEFAULT_VECTORIZER_MODULE=none
 | 
					      - DEFAULT_VECTORIZER_MODULE=${DEFAULT_VECTORIZER_MODULE:-none}
 | 
				
			||||||
      - ENABLE_MODULES=${ENABLE_MODULES:-text2vec-openai,generative-openai,qna-openai}
 | 
					      - ENABLE_MODULES=${ENABLE_MODULES:-text2vec-openai,generative-openai,qna-openai}
 | 
				
			||||||
      - CLUSTER_HOSTNAME=node1
 | 
					      - CLUSTER_HOSTNAME=${CLUSTER_HOSTNAME:-node1}
 | 
				
			||||||
    healthcheck:
 | 
					    healthcheck:
 | 
				
			||||||
      test:
 | 
					      test:
 | 
				
			||||||
        - CMD
 | 
					        - CMD
 | 
				
			||||||
@@ -43,8 +41,5 @@ services:
 | 
				
			|||||||
        - "--spider"
 | 
					        - "--spider"
 | 
				
			||||||
        - "http://localhost:8080/v1/.well-known/ready"
 | 
					        - "http://localhost:8080/v1/.well-known/ready"
 | 
				
			||||||
      interval: 5s
 | 
					      interval: 5s
 | 
				
			||||||
      timeout: 5s
 | 
					      timeout: 30s
 | 
				
			||||||
      retries: 3
 | 
					      retries: 10
 | 
				
			||||||
 | 
					 | 
				
			||||||
volumes:
 | 
					 | 
				
			||||||
  weaviate_data: null
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,22 +1,18 @@
 | 
				
			|||||||
# documentation: https://www.windmill.dev/docs/
 | 
					# documentation: https://www.windmill.dev/docs/
 | 
				
			||||||
# slogan: Windmill is a developer platform to build production-grade multi-steps automations and internal apps.\
 | 
					# slogan: Windmill is a developer platform to build production-grade multi-steps automations and internal apps.
 | 
				
			||||||
# info: Login as admin@windmill.dev / changeme to setup the instance & accounts and give yourself super-admin privileges.
 | 
					 | 
				
			||||||
# tags: windmill,workflow,automation,developer,platform
 | 
					# tags: windmill,workflow,automation,developer,platform
 | 
				
			||||||
# logo: svgs/windmill.svg
 | 
					# logo: svgs/windmill.svg
 | 
				
			||||||
# port: 8000
 | 
					# port: 8000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
version: "3.7"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
services:
 | 
					services:
 | 
				
			||||||
  db:
 | 
					  db:
 | 
				
			||||||
    image: postgres:16
 | 
					    image: postgres:16
 | 
				
			||||||
    shm_size: 1g
 | 
					    shm_size: 1g
 | 
				
			||||||
    restart: unless-stopped
 | 
					 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - db_data:/var/lib/postgresql/data
 | 
					      - db_data:/var/lib/postgresql/data
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      POSTGRES_PASSWORD: $SERVICE_PASSWORD_WINDMILL_POSTGRES
 | 
					      - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
 | 
				
			||||||
      POSTGRES_DB: windmill
 | 
					      - POSTGRES_DB=${POSTGRES_DB:-windmill}
 | 
				
			||||||
    healthcheck:
 | 
					    healthcheck:
 | 
				
			||||||
      test: ["CMD-SHELL", "pg_isready -U postgres"]
 | 
					      test: ["CMD-SHELL", "pg_isready -U postgres"]
 | 
				
			||||||
      interval: 10s
 | 
					      interval: 10s
 | 
				
			||||||
@@ -26,22 +22,27 @@ services:
 | 
				
			|||||||
  windmill_server:
 | 
					  windmill_server:
 | 
				
			||||||
    image: ghcr.io/windmill-labs/windmill:main
 | 
					    image: ghcr.io/windmill-labs/windmill:main
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - SERVICE_FQDN_WINDMILL
 | 
					      - SERVICE_FQDN_WINDMILL_8000
 | 
				
			||||||
      - DATABASE_URL=postgres://postgres:$SERVICE_PASSWORD_WINDMILL_POSTGRES@db/windmill
 | 
					      - DATABASE_URL=postgres://postgres:$SERVICE_PASSWORD_POSTGRES@db/windmill
 | 
				
			||||||
      - MODE=server
 | 
					      - MODE=${MODE:-server}
 | 
				
			||||||
      - BASE_URL=$SERVICE_FQDN_WINDMILL
 | 
					      - BASE_URL=$SERVICE_FQDN_WINDMILL
 | 
				
			||||||
    depends_on:
 | 
					    depends_on:
 | 
				
			||||||
      db:
 | 
					      db:
 | 
				
			||||||
        condition: service_healthy
 | 
					        condition: service_healthy
 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - worker_logs:/tmp/windmill/logs
 | 
					      - worker_logs:/tmp/windmill/logs
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
 | 
				
			||||||
 | 
					      interval: 30s
 | 
				
			||||||
 | 
					      timeout: 10s
 | 
				
			||||||
 | 
					      retries: 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  windmill_worker_1:
 | 
					  windmill_worker_1:
 | 
				
			||||||
    image: ghcr.io/windmill-labs/windmill:main
 | 
					    image: ghcr.io/windmill-labs/windmill:main
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - DATABASE_URL=postgres://postgres:$SERVICE_PASSWORD_WINDMILL_POSTGRES@db/windmill
 | 
					      - DATABASE_URL=postgres://postgres:$SERVICE_PASSWORD_POSTGRES@db/windmill
 | 
				
			||||||
      - MODE=worker
 | 
					      - MODE=${MODE:-worker}
 | 
				
			||||||
      - WORKER_GROUP=default
 | 
					      - WORKER_GROUP=${WORKER_GROUP:-default}
 | 
				
			||||||
    depends_on:
 | 
					    depends_on:
 | 
				
			||||||
      db:
 | 
					      db:
 | 
				
			||||||
        condition: service_healthy
 | 
					        condition: service_healthy
 | 
				
			||||||
@@ -49,13 +50,18 @@ services:
 | 
				
			|||||||
      - /var/run/docker.sock:/var/run/docker.sock
 | 
					      - /var/run/docker.sock:/var/run/docker.sock
 | 
				
			||||||
      - worker_dependency_cache:/tmp/windmill/cache
 | 
					      - worker_dependency_cache:/tmp/windmill/cache
 | 
				
			||||||
      - worker_logs:/tmp/windmill/logs
 | 
					      - worker_logs:/tmp/windmill/logs
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD-SHELL", "exit 0"]
 | 
				
			||||||
 | 
					      interval: 30s
 | 
				
			||||||
 | 
					      timeout: 10s
 | 
				
			||||||
 | 
					      retries: 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  windmill_worker_2:
 | 
					  windmill_worker_2:
 | 
				
			||||||
    image: ghcr.io/windmill-labs/windmill:main
 | 
					    image: ghcr.io/windmill-labs/windmill:main
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - DATABASE_URL=postgres://postgres:$SERVICE_PASSWORD_WINDMILL_POSTGRES@db/windmill
 | 
					      - DATABASE_URL=postgres://postgres:$SERVICE_PASSWORD_POSTGRES@db/windmill
 | 
				
			||||||
      - MODE=worker
 | 
					      - MODE=${MODE:-worker}
 | 
				
			||||||
      - WORKER_GROUP=default
 | 
					      - WORKER_GROUP=${WORKER_GROUP:-default}
 | 
				
			||||||
    depends_on:
 | 
					    depends_on:
 | 
				
			||||||
      db:
 | 
					      db:
 | 
				
			||||||
        condition: service_healthy
 | 
					        condition: service_healthy
 | 
				
			||||||
@@ -63,13 +69,18 @@ services:
 | 
				
			|||||||
      - /var/run/docker.sock:/var/run/docker.sock
 | 
					      - /var/run/docker.sock:/var/run/docker.sock
 | 
				
			||||||
      - worker_dependency_cache:/tmp/windmill/cache
 | 
					      - worker_dependency_cache:/tmp/windmill/cache
 | 
				
			||||||
      - worker_logs:/tmp/windmill/logs
 | 
					      - worker_logs:/tmp/windmill/logs
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD-SHELL", "exit 0"]
 | 
				
			||||||
 | 
					      interval: 30s
 | 
				
			||||||
 | 
					      timeout: 10s
 | 
				
			||||||
 | 
					      retries: 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  windmill_worker_3:
 | 
					  windmill_worker_3:
 | 
				
			||||||
    image: ghcr.io/windmill-labs/windmill:main
 | 
					    image: ghcr.io/windmill-labs/windmill:main
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - DATABASE_URL=postgres://postgres:$SERVICE_PASSWORD_WINDMILL_POSTGRES@db/windmill
 | 
					      - DATABASE_URL=postgres://postgres:$SERVICE_PASSWORD_POSTGRES@db/windmill
 | 
				
			||||||
      - MODE=worker
 | 
					      - MODE=${MODE:-worker}
 | 
				
			||||||
      - WORKER_GROUP=default
 | 
					      - WORKER_GROUP=${WORKER_GROUP:-default}
 | 
				
			||||||
    depends_on:
 | 
					    depends_on:
 | 
				
			||||||
      db:
 | 
					      db:
 | 
				
			||||||
        condition: service_healthy
 | 
					        condition: service_healthy
 | 
				
			||||||
@@ -77,22 +88,37 @@ services:
 | 
				
			|||||||
      - /var/run/docker.sock:/var/run/docker.sock
 | 
					      - /var/run/docker.sock:/var/run/docker.sock
 | 
				
			||||||
      - worker_dependency_cache:/tmp/windmill/cache
 | 
					      - worker_dependency_cache:/tmp/windmill/cache
 | 
				
			||||||
      - worker_logs:/tmp/windmill/logs
 | 
					      - worker_logs:/tmp/windmill/logs
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD-SHELL", "exit 0"]
 | 
				
			||||||
 | 
					      interval: 30s
 | 
				
			||||||
 | 
					      timeout: 10s
 | 
				
			||||||
 | 
					      retries: 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  windmill_worker_native:
 | 
					  windmill_worker_native:
 | 
				
			||||||
    image: ghcr.io/windmill-labs/windmill:main
 | 
					    image: ghcr.io/windmill-labs/windmill:main
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - DATABASE_URL=postgres://postgres:$SERVICE_PASSWORD_WINDMILL_POSTGRES@db/windmill
 | 
					      - DATABASE_URL=postgres://postgres:$SERVICE_PASSWORD_POSTGRES@db/windmill
 | 
				
			||||||
      - MODE=worker
 | 
					      - MODE=${MODE:-worker}
 | 
				
			||||||
      - WORKER_GROUP=native
 | 
					      - WORKER_GROUP=${WORKER_GROUP:-native}
 | 
				
			||||||
      - NUM_WORKERS=8
 | 
					      - NUM_WORKERS=${NUM_WORKERS:-8}
 | 
				
			||||||
      - SLEEP_QUEUE=200
 | 
					      - SLEEP_QUEUE=${SLEEP_QUEUE:-200}
 | 
				
			||||||
    depends_on:
 | 
					    depends_on:
 | 
				
			||||||
      db:
 | 
					      db:
 | 
				
			||||||
        condition: service_healthy
 | 
					        condition: service_healthy
 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - worker_logs:/tmp/windmill/logs
 | 
					      - worker_logs:/tmp/windmill/logs
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD-SHELL", "exit 0"]
 | 
				
			||||||
 | 
					      interval: 30s
 | 
				
			||||||
 | 
					      timeout: 10s
 | 
				
			||||||
 | 
					      retries: 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  lsp:
 | 
					  lsp:
 | 
				
			||||||
    image: ghcr.io/windmill-labs/windmill-lsp:latest
 | 
					    image: ghcr.io/windmill-labs/windmill-lsp:latest
 | 
				
			||||||
    volumes:
 | 
					    volumes:
 | 
				
			||||||
      - lsp_cache:/root/.cache
 | 
					      - lsp_cache:/root/.cache
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD-SHELL", "exit 0"]
 | 
				
			||||||
 | 
					      interval: 30s
 | 
				
			||||||
 | 
					      timeout: 10s
 | 
				
			||||||
 | 
					      retries: 3
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +1,13 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    "coolify": {
 | 
					    "coolify": {
 | 
				
			||||||
        "v4": {
 | 
					        "v4": {
 | 
				
			||||||
            "version": "4.0.0-beta.356"
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        "nightly": {
 | 
					 | 
				
			||||||
            "version": "4.0.0-beta.357"
 | 
					            "version": "4.0.0-beta.357"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        "nightly": {
 | 
				
			||||||
 | 
					            "version": "4.0.0-beta.358"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        "helper": {
 | 
					        "helper": {
 | 
				
			||||||
            "version": "1.0.1"
 | 
					            "version": "1.0.2"
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "realtime": {
 | 
					        "realtime": {
 | 
				
			||||||
            "version": "1.0.3"
 | 
					            "version": "1.0.3"
 | 
				
			||||||
 
 | 
				
			|||||||