@@ -767,6 +767,9 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
 | 
			
		||||
                    $envs->push("SOURCE_COMMIT=unknown");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            $envs = $envs->sort(function ($a, $b) {
 | 
			
		||||
                return strpos($a, '$') === false ? -1 : 1;
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        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"
 | 
			
		||||
                ]
 | 
			
		||||
            );
 | 
			
		||||
        } else {
 | 
			
		||||
            $this->execute_remote_command(
 | 
			
		||||
                [
 | 
			
		||||
                    "command" => "rm -f $this->configuration_dir/.env",
 | 
			
		||||
                    "hidden" => true,
 | 
			
		||||
                    "ignore_errors" => true
 | 
			
		||||
                ]
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
        $envs_base64 = base64_encode($envs->implode("\n"));
 | 
			
		||||
        $this->execute_remote_command(
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@ class StackForm extends Component
 | 
			
		||||
                $this->validationAttributes["fields.$key.value"] = $fieldKey;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        $this->fields = $this->fields->sort();
 | 
			
		||||
        $this->fields = $this->fields->sortDesc();
 | 
			
		||||
    }
 | 
			
		||||
    public function saveCompose($raw)
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -150,6 +150,29 @@ class Service extends BaseModel
 | 
			
		||||
        foreach ($applications as $application) {
 | 
			
		||||
            $image = str($application->image)->before(':')->value();
 | 
			
		||||
            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'):
 | 
			
		||||
                    $data = collect([]);
 | 
			
		||||
                    $logto_endpoint = $this->environment_variables()->where('key', 'LOGTO_ENDPOINT')->first();
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,6 @@ function remote_process(
 | 
			
		||||
    if ($server->isNonRoot()) {
 | 
			
		||||
        $command = parseCommandsByLineForSudo(collect($command), $server);
 | 
			
		||||
    }
 | 
			
		||||
    ray($command);
 | 
			
		||||
    $command_string = implode("\n", $command);
 | 
			
		||||
    if (auth()->user()) {
 | 
			
		||||
        $teams = auth()->user()->teams->pluck('id');
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ return [
 | 
			
		||||
 | 
			
		||||
    // The release version of your application
 | 
			
		||||
    // 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
 | 
			
		||||
    'environment' => config('app.env'),
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,3 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
return '4.0.0-beta.259';
 | 
			
		||||
return '4.0.0-beta.260';
 | 
			
		||||
 
 | 
			
		||||
@@ -23,10 +23,11 @@
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="grid grid-cols-2 gap-2">
 | 
			
		||||
            @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' }}"
 | 
			
		||||
                    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>
 | 
			
		||||
            @endforeach
 | 
			
		||||
        </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",
 | 
			
		||||
        "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": {
 | 
			
		||||
        "documentation": "https:\/\/trigger.dev",
 | 
			
		||||
        "slogan": "The open source Background Jobs framework for TypeScript",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
{
 | 
			
		||||
    "coolify": {
 | 
			
		||||
        "v4": {
 | 
			
		||||
            "version": "4.0.0-beta.259"
 | 
			
		||||
            "version": "4.0.0-beta.260"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user