mirror of
https://github.com/coollabsio/coolify.git
synced 2026-10-28 17:44:36 +08:00
Sentry self-hosted (getsentry/self-hosted 26.8.0) could not be deployed as a Docker Compose application. Three separate problems blocked it: - YAML collection aliases: the first fix raised the limit to 256 only in Application::oldRawParser(). The safety check added in v4.4.0 (validateDockerComposeForInjection) and all other Compose parse calls still used the Symfony default of 128, so the Sentry file (133 aliases) failed with "Maximum number of collection aliases (128) exceeded". Add parseDockerComposeYaml() and use it for every Compose parse. - Argument list too long: the deployment job sent the generated Compose file as base64 inside the SSH command. Linux limits one argument to 128 KiB, and the Sentry file is about 370 KB. execute_remote_command() now accepts an 'input' key that streams content over SSH stdin, and the job writes the Compose file with it. - A list-style build arg without a value (build.args: [SENTRY_IMAGE]) merged into a map environment kept its numeric key, so Docker Compose rejected the file with "non-string key in ...environment: 0". It now becomes NAME with no value, as in Compose. Closes #11725
64 lines
2.2 KiB
PHP
64 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace App\Traits;
|
|
|
|
use Symfony\Component\Yaml\Yaml;
|
|
|
|
trait EnvironmentVariableProtection
|
|
{
|
|
/**
|
|
* Check if an environment variable is protected from deletion
|
|
*
|
|
* @param string $key The environment variable key to check
|
|
* @return bool True if the variable is protected, false otherwise
|
|
*/
|
|
protected function isProtectedEnvironmentVariable(string $key): bool
|
|
{
|
|
return str($key)->startsWith('SERVICE_FQDN_') || str($key)->startsWith('SERVICE_URL_') || str($key)->startsWith('SERVICE_NAME_');
|
|
}
|
|
|
|
/**
|
|
* Check if an environment variable is used in Docker Compose
|
|
*
|
|
* @param string $key The environment variable key to check
|
|
* @param string|null $dockerCompose The Docker Compose YAML content
|
|
* @return array [bool $isUsed, string $reason] Whether the variable is used and the reason if it is
|
|
*/
|
|
protected function isEnvironmentVariableUsedInDockerCompose(string $key, ?string $dockerCompose): array
|
|
{
|
|
if (empty($dockerCompose)) {
|
|
return [false, ''];
|
|
}
|
|
|
|
try {
|
|
$dockerComposeData = parseDockerComposeYaml($dockerCompose);
|
|
$dockerEnvVars = data_get($dockerComposeData, 'services.*.environment');
|
|
|
|
foreach ($dockerEnvVars as $serviceEnvs) {
|
|
if (! is_array($serviceEnvs)) {
|
|
continue;
|
|
}
|
|
|
|
// Check for direct variable usage
|
|
foreach ($serviceEnvs as $env => $value) {
|
|
if ($env === $key) {
|
|
return [true, "Environment variable '{$key}' is used directly in the Docker Compose file."];
|
|
}
|
|
}
|
|
|
|
// Check for variable references in values
|
|
foreach ($serviceEnvs as $env => $value) {
|
|
if (is_string($value) && str_contains($value, '$'.$key)) {
|
|
return [true, "Environment variable '{$key}' is referenced in the Docker Compose file."];
|
|
}
|
|
}
|
|
}
|
|
} catch (\Exception $e) {
|
|
// If there's an error parsing the Docker Compose file, we'll assume it's not used
|
|
return [false, ''];
|
|
}
|
|
|
|
return [false, ''];
|
|
}
|
|
}
|