@@ -767,6 +767,9 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
 | 
				
			|||||||
                    $envs->push("SOURCE_COMMIT=unknown");
 | 
					                    $envs->push("SOURCE_COMMIT=unknown");
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            $envs = $envs->sort(function ($a, $b) {
 | 
				
			||||||
 | 
					                return strpos($a, '$') === false ? -1 : 1;
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if ($envs->isEmpty()) {
 | 
					        if ($envs->isEmpty()) {
 | 
				
			||||||
@@ -791,6 +794,14 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
 | 
				
			|||||||
                    "echo '{$this->saved_outputs->get('dotenv')->value()}' | tee $this->configuration_dir/.env > /dev/null"
 | 
					                    "echo '{$this->saved_outputs->get('dotenv')->value()}' | tee $this->configuration_dir/.env > /dev/null"
 | 
				
			||||||
                ]
 | 
					                ]
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            $this->execute_remote_command(
 | 
				
			||||||
 | 
					                [
 | 
				
			||||||
 | 
					                    "command" => "rm -f $this->configuration_dir/.env",
 | 
				
			||||||
 | 
					                    "hidden" => true,
 | 
				
			||||||
 | 
					                    "ignore_errors" => true
 | 
				
			||||||
 | 
					                ]
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        $envs_base64 = base64_encode($envs->implode("\n"));
 | 
					        $envs_base64 = base64_encode($envs->implode("\n"));
 | 
				
			||||||
        $this->execute_remote_command(
 | 
					        $this->execute_remote_command(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -42,7 +42,7 @@ class StackForm extends Component
 | 
				
			|||||||
                $this->validationAttributes["fields.$key.value"] = $fieldKey;
 | 
					                $this->validationAttributes["fields.$key.value"] = $fieldKey;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        $this->fields = $this->fields->sort();
 | 
					        $this->fields = $this->fields->sortDesc();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    public function saveCompose($raw)
 | 
					    public function saveCompose($raw)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -150,6 +150,29 @@ class Service extends BaseModel
 | 
				
			|||||||
        foreach ($applications as $application) {
 | 
					        foreach ($applications as $application) {
 | 
				
			||||||
            $image = str($application->image)->before(':')->value();
 | 
					            $image = str($application->image)->before(':')->value();
 | 
				
			||||||
            switch ($image) {
 | 
					            switch ($image) {
 | 
				
			||||||
 | 
					                case str($image)?->contains('tolgee'):
 | 
				
			||||||
 | 
					                    $data = collect([]);
 | 
				
			||||||
 | 
					                    $admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_TOLGEE')->first();
 | 
				
			||||||
 | 
					                    $data = $data->merge([
 | 
				
			||||||
 | 
					                        'Admin User' => [
 | 
				
			||||||
 | 
					                            'key' => 'TOLGEE_AUTHENTICATION_INITIAL_USERNAME',
 | 
				
			||||||
 | 
					                            'value' => 'admin',
 | 
				
			||||||
 | 
					                            'readonly' => true,
 | 
				
			||||||
 | 
					                            'rules' => 'required',
 | 
				
			||||||
 | 
					                        ],
 | 
				
			||||||
 | 
					                    ]);
 | 
				
			||||||
 | 
					                    if ($admin_password) {
 | 
				
			||||||
 | 
					                        $data = $data->merge([
 | 
				
			||||||
 | 
					                            'Admin Password' => [
 | 
				
			||||||
 | 
					                                'key' => 'SERVICE_PASSWORD_TOLGEE',
 | 
				
			||||||
 | 
					                                'value' => data_get($admin_password, 'value'),
 | 
				
			||||||
 | 
					                                'rules' => 'required',
 | 
				
			||||||
 | 
					                                'isPassword' => true,
 | 
				
			||||||
 | 
					                            ],
 | 
				
			||||||
 | 
					                        ]);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    $fields->put('Tolgee', $data);
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
                case str($image)?->contains('logto'):
 | 
					                case str($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();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,6 @@ function remote_process(
 | 
				
			|||||||
    if ($server->isNonRoot()) {
 | 
					    if ($server->isNonRoot()) {
 | 
				
			||||||
        $command = parseCommandsByLineForSudo(collect($command), $server);
 | 
					        $command = parseCommandsByLineForSudo(collect($command), $server);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ray($command);
 | 
					 | 
				
			||||||
    $command_string = implode("\n", $command);
 | 
					    $command_string = implode("\n", $command);
 | 
				
			||||||
    if (auth()->user()) {
 | 
					    if (auth()->user()) {
 | 
				
			||||||
        $teams = auth()->user()->teams->pluck('id');
 | 
					        $teams = auth()->user()->teams->pluck('id');
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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.259',
 | 
					    'release' => '4.0.0-beta.260',
 | 
				
			||||||
    // 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.259';
 | 
					return '4.0.0-beta.260';
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,10 +23,11 @@
 | 
				
			|||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="grid grid-cols-2 gap-2">
 | 
					        <div class="grid grid-cols-2 gap-2">
 | 
				
			||||||
            @foreach ($fields as $serviceName => $field)
 | 
					            @foreach ($fields as $serviceName => $field)
 | 
				
			||||||
 | 
					                <div class="flex items-center gap-2"><span
 | 
				
			||||||
 | 
					                        class="font-bold">{{ data_get($field, 'serviceName') }}</span>{{ data_get($field, 'name') }}<x-helper
 | 
				
			||||||
 | 
					                        helper="Variable name: {{ $serviceName }}" /></div>
 | 
				
			||||||
                <x-forms.input type="{{ data_get($field, 'isPassword') ? 'password' : 'text' }}"
 | 
					                <x-forms.input type="{{ data_get($field, 'isPassword') ? 'password' : 'text' }}"
 | 
				
			||||||
                    required="{{ str(data_get($field, 'rules'))?->contains('required') }}"
 | 
					                    required="{{ str(data_get($field, 'rules'))?->contains('required') }}"
 | 
				
			||||||
                    helper="Variable name: {{ $serviceName }}"
 | 
					 | 
				
			||||||
                    label="{{ data_get($field, 'serviceName') }} {{ data_get($field, 'name') }}"
 | 
					 | 
				
			||||||
                    id="fields.{{ $serviceName }}.value"></x-forms.input>
 | 
					                    id="fields.{{ $serviceName }}.value"></x-forms.input>
 | 
				
			||||||
            @endforeach
 | 
					            @endforeach
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										42
									
								
								templates/compose/tolgee.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								templates/compose/tolgee.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					# documentation: https://tolgee.io/
 | 
				
			||||||
 | 
					# slogan: Tolgee is a localization management platform for developers and translators.
 | 
				
			||||||
 | 
					# tags: localization,translation,management,platform
 | 
				
			||||||
 | 
					# logo: svgs/tolgee.svg
 | 
				
			||||||
 | 
					# port: 8080
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					services:
 | 
				
			||||||
 | 
					  tolgee:
 | 
				
			||||||
 | 
					    image: tolgee/tolgee
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - SERVICE_FQDN_TOLGEE_8080
 | 
				
			||||||
 | 
					      - TOLGEE_AUTHENTICATION_ENABLED=true
 | 
				
			||||||
 | 
					      - TOLGEE_AUTHENTICATION_INITIAL_PASSWORD=$SERVICE_PASSWORD_TOLGEE
 | 
				
			||||||
 | 
					      - TOLGEE_AUTHENTICATION_INITIAL_USERNAME=admin
 | 
				
			||||||
 | 
					      - TOLGEE_AUTHENTICATION_JWT_SECRET=$SERVICE_PASSWORD_JWT
 | 
				
			||||||
 | 
					      - TOLGEE_POSTGRES_AUTOSTART_ENABLED=false
 | 
				
			||||||
 | 
					      - SPRING_DATASOURCE_URL=jdbc:postgresql://postgresql:5432/${POSTGRES_DB:-tolgee}
 | 
				
			||||||
 | 
					      - SPRING_DATASOURCE_USERNAME=${SERVICE_USER_POSTGRESQL}
 | 
				
			||||||
 | 
					      - SPRING_DATASOURCE_PASSWORD=${SERVICE_PASSWORD_POSTGRESQL}
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - tolgee-data:/data
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080"]
 | 
				
			||||||
 | 
					      interval: 5s
 | 
				
			||||||
 | 
					      timeout: 20s
 | 
				
			||||||
 | 
					      retries: 10
 | 
				
			||||||
 | 
					    depends_on:
 | 
				
			||||||
 | 
					      postgresql:
 | 
				
			||||||
 | 
					        condition: service_healthy
 | 
				
			||||||
 | 
					  postgresql:
 | 
				
			||||||
 | 
					    image: postgres:16-alpine
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      - tolgee-postgresql-data:/var/lib/postgresql/data
 | 
				
			||||||
 | 
					    environment:
 | 
				
			||||||
 | 
					      - POSTGRES_USER=${SERVICE_USER_POSTGRESQL}
 | 
				
			||||||
 | 
					      - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRESQL}
 | 
				
			||||||
 | 
					      - POSTGRES_DB=${POSTGRESQL_DATABASE:-tolgee}
 | 
				
			||||||
 | 
					    healthcheck:
 | 
				
			||||||
 | 
					      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
 | 
				
			||||||
 | 
					      interval: 5s
 | 
				
			||||||
 | 
					      timeout: 20s
 | 
				
			||||||
 | 
					      retries: 10
 | 
				
			||||||
@@ -867,6 +867,20 @@
 | 
				
			|||||||
        "minversion": "0.0.0",
 | 
					        "minversion": "0.0.0",
 | 
				
			||||||
        "port": "8384"
 | 
					        "port": "8384"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "tolgee": {
 | 
				
			||||||
 | 
					        "documentation": "https:\/\/tolgee.io\/",
 | 
				
			||||||
 | 
					        "slogan": "Tolgee is a localization management platform for developers and translators.",
 | 
				
			||||||
 | 
					        "compose": "c2VydmljZXM6CiAgdG9sZ2VlOgogICAgaW1hZ2U6IHRvbGdlZS90b2xnZWUKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9UT0xHRUVfODA4MAogICAgICAtIFRPTEdFRV9BVVRIRU5USUNBVElPTl9FTkFCTEVEPXRydWUKICAgICAgLSBUT0xHRUVfQVVUSEVOVElDQVRJT05fSU5JVElBTF9QQVNTV09SRD0kU0VSVklDRV9QQVNTV09SRF9UT0xHRUUKICAgICAgLSBUT0xHRUVfQVVUSEVOVElDQVRJT05fSU5JVElBTF9VU0VSTkFNRT1hZG1pbgogICAgICAtIFRPTEdFRV9BVVRIRU5USUNBVElPTl9KV1RfU0VDUkVUPSRTRVJWSUNFX1BBU1NXT1JEX0pXVAogICAgICAtIFRPTEdFRV9QT1NUR1JFU19BVVRPU1RBUlRfRU5BQkxFRD1mYWxzZQogICAgICAtICdTUFJJTkdfREFUQVNPVVJDRV9VUkw9amRiYzpwb3N0Z3Jlc3FsOi8vcG9zdGdyZXNxbDo1NDMyLyR7UE9TVEdSRVNfREI6LXRvbGdlZX0nCiAgICAgIC0gJ1NQUklOR19EQVRBU09VUkNFX1VTRVJOQU1FPSR7U0VSVklDRV9VU0VSX1BPU1RHUkVTUUx9JwogICAgICAtICdTUFJJTkdfREFUQVNPVVJDRV9QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVNRTH0nCiAgICB2b2x1bWVzOgogICAgICAtICd0b2xnZWUtZGF0YTovZGF0YScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSB3Z2V0CiAgICAgICAgLSAnLXEnCiAgICAgICAgLSAnLS1zcGlkZXInCiAgICAgICAgLSAnaHR0cDovL2xvY2FsaG9zdDo4MDgwJwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMjBzCiAgICAgIHJldHJpZXM6IDEwCiAgICBkZXBlbmRzX29uOgogICAgICBwb3N0Z3Jlc3FsOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgcG9zdGdyZXNxbDoKICAgIGltYWdlOiAncG9zdGdyZXM6MTYtYWxwaW5lJwogICAgdm9sdW1lczoKICAgICAgLSAndG9sZ2VlLXBvc3RncmVzcWwtZGF0YTovdmFyL2xpYi9wb3N0Z3Jlc3FsL2RhdGEnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSAnUE9TVEdSRVNfVVNFUj0ke1NFUlZJQ0VfVVNFUl9QT1NUR1JFU1FMfScKICAgICAgLSAnUE9TVEdSRVNfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTUUx9JwogICAgICAtICdQT1NUR1JFU19EQj0ke1BPU1RHUkVTUUxfREFUQUJBU0U6LXRvbGdlZX0nCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRC1TSEVMTAogICAgICAgIC0gJ3BnX2lzcmVhZHkgLVUgJCR7UE9TVEdSRVNfVVNFUn0gLWQgJCR7UE9TVEdSRVNfREJ9JwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMjBzCiAgICAgIHJldHJpZXM6IDEwCg==",
 | 
				
			||||||
 | 
					        "tags": [
 | 
				
			||||||
 | 
					            "localization",
 | 
				
			||||||
 | 
					            "translation",
 | 
				
			||||||
 | 
					            "management",
 | 
				
			||||||
 | 
					            "platform"
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        "logo": "svgs\/tolgee.svg",
 | 
				
			||||||
 | 
					        "minversion": "0.0.0",
 | 
				
			||||||
 | 
					        "port": "8080"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "trigger-with-external-database": {
 | 
					    "trigger-with-external-database": {
 | 
				
			||||||
        "documentation": "https:\/\/trigger.dev",
 | 
					        "documentation": "https:\/\/trigger.dev",
 | 
				
			||||||
        "slogan": "The open source Background Jobs framework for TypeScript",
 | 
					        "slogan": "The open source Background Jobs framework for TypeScript",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    "coolify": {
 | 
					    "coolify": {
 | 
				
			||||||
        "v4": {
 | 
					        "v4": {
 | 
				
			||||||
            "version": "4.0.0-beta.259"
 | 
					            "version": "4.0.0-beta.260"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user