diff --git a/app/Http/Controllers/Api/ApplicationsController.php b/app/Http/Controllers/Api/ApplicationsController.php
index b9c854ea1..cd640df17 100644
--- a/app/Http/Controllers/Api/ApplicationsController.php
+++ b/app/Http/Controllers/Api/ApplicationsController.php
@@ -2532,8 +2532,11 @@ class ApplicationsController extends Controller
if ($env->is_shown_once != $request->is_shown_once) {
$env->is_shown_once = $request->is_shown_once;
}
- if ($request->has('is_buildtime_only') && $env->is_buildtime_only != $request->is_buildtime_only) {
- $env->is_buildtime_only = $request->is_buildtime_only;
+ if ($request->has('is_runtime') && $env->is_runtime != $request->is_runtime) {
+ $env->is_runtime = $request->is_runtime;
+ }
+ if ($request->has('is_buildtime') && $env->is_buildtime != $request->is_buildtime) {
+ $env->is_buildtime = $request->is_buildtime;
}
$env->save();
@@ -2559,8 +2562,11 @@ class ApplicationsController extends Controller
if ($env->is_shown_once != $request->is_shown_once) {
$env->is_shown_once = $request->is_shown_once;
}
- if ($request->has('is_buildtime_only') && $env->is_buildtime_only != $request->is_buildtime_only) {
- $env->is_buildtime_only = $request->is_buildtime_only;
+ if ($request->has('is_runtime') && $env->is_runtime != $request->is_runtime) {
+ $env->is_runtime = $request->is_runtime;
+ }
+ if ($request->has('is_buildtime') && $env->is_buildtime != $request->is_buildtime) {
+ $env->is_buildtime = $request->is_buildtime;
}
$env->save();
@@ -2723,8 +2729,11 @@ class ApplicationsController extends Controller
if ($env->is_shown_once != $item->get('is_shown_once')) {
$env->is_shown_once = $item->get('is_shown_once');
}
- if ($item->has('is_buildtime_only') && $env->is_buildtime_only != $item->get('is_buildtime_only')) {
- $env->is_buildtime_only = $item->get('is_buildtime_only');
+ if ($item->has('is_runtime') && $env->is_runtime != $item->get('is_runtime')) {
+ $env->is_runtime = $item->get('is_runtime');
+ }
+ if ($item->has('is_buildtime') && $env->is_buildtime != $item->get('is_buildtime')) {
+ $env->is_buildtime = $item->get('is_buildtime');
}
$env->save();
} else {
@@ -2735,7 +2744,8 @@ class ApplicationsController extends Controller
'is_literal' => $is_literal,
'is_multiline' => $is_multi_line,
'is_shown_once' => $is_shown_once,
- 'is_buildtime_only' => $item->get('is_buildtime_only', false),
+ 'is_runtime' => $item->get('is_runtime', true),
+ 'is_buildtime' => $item->get('is_buildtime', true),
'resourceable_type' => get_class($application),
'resourceable_id' => $application->id,
]);
@@ -2753,8 +2763,11 @@ class ApplicationsController extends Controller
if ($env->is_shown_once != $item->get('is_shown_once')) {
$env->is_shown_once = $item->get('is_shown_once');
}
- if ($item->has('is_buildtime_only') && $env->is_buildtime_only != $item->get('is_buildtime_only')) {
- $env->is_buildtime_only = $item->get('is_buildtime_only');
+ if ($item->has('is_runtime') && $env->is_runtime != $item->get('is_runtime')) {
+ $env->is_runtime = $item->get('is_runtime');
+ }
+ if ($item->has('is_buildtime') && $env->is_buildtime != $item->get('is_buildtime')) {
+ $env->is_buildtime = $item->get('is_buildtime');
}
$env->save();
} else {
@@ -2765,7 +2778,8 @@ class ApplicationsController extends Controller
'is_literal' => $is_literal,
'is_multiline' => $is_multi_line,
'is_shown_once' => $is_shown_once,
- 'is_buildtime_only' => $item->get('is_buildtime_only', false),
+ 'is_runtime' => $item->get('is_runtime', true),
+ 'is_buildtime' => $item->get('is_buildtime', true),
'resourceable_type' => get_class($application),
'resourceable_id' => $application->id,
]);
@@ -2904,7 +2918,8 @@ class ApplicationsController extends Controller
'is_literal' => $request->is_literal ?? false,
'is_multiline' => $request->is_multiline ?? false,
'is_shown_once' => $request->is_shown_once ?? false,
- 'is_buildtime_only' => $request->is_buildtime_only ?? false,
+ 'is_runtime' => $request->is_runtime ?? true,
+ 'is_buildtime' => $request->is_buildtime ?? true,
'resourceable_type' => get_class($application),
'resourceable_id' => $application->id,
]);
@@ -2927,7 +2942,8 @@ class ApplicationsController extends Controller
'is_literal' => $request->is_literal ?? false,
'is_multiline' => $request->is_multiline ?? false,
'is_shown_once' => $request->is_shown_once ?? false,
- 'is_buildtime_only' => $request->is_buildtime_only ?? false,
+ 'is_runtime' => $request->is_runtime ?? true,
+ 'is_buildtime' => $request->is_buildtime ?? true,
'resourceable_type' => get_class($application),
'resourceable_id' => $application->id,
]);
diff --git a/app/Livewire/Project/Shared/EnvironmentVariable/Add.php b/app/Livewire/Project/Shared/EnvironmentVariable/Add.php
index 9d5a5a39f..23a2cd59d 100644
--- a/app/Livewire/Project/Shared/EnvironmentVariable/Add.php
+++ b/app/Livewire/Project/Shared/EnvironmentVariable/Add.php
@@ -23,7 +23,9 @@ class Add extends Component
public bool $is_literal = false;
- public bool $is_buildtime_only = false;
+ public bool $is_runtime = true;
+
+ public bool $is_buildtime = true;
protected $listeners = ['clearAddEnv' => 'clear'];
@@ -32,7 +34,8 @@ class Add extends Component
'value' => 'nullable',
'is_multiline' => 'required|boolean',
'is_literal' => 'required|boolean',
- 'is_buildtime_only' => 'required|boolean',
+ 'is_runtime' => 'required|boolean',
+ 'is_buildtime' => 'required|boolean',
];
protected $validationAttributes = [
@@ -40,7 +43,8 @@ class Add extends Component
'value' => 'value',
'is_multiline' => 'multiline',
'is_literal' => 'literal',
- 'is_buildtime_only' => 'buildtime only',
+ 'is_runtime' => 'runtime',
+ 'is_buildtime' => 'buildtime',
];
public function mount()
@@ -56,7 +60,8 @@ class Add extends Component
'value' => $this->value,
'is_multiline' => $this->is_multiline,
'is_literal' => $this->is_literal,
- 'is_buildtime_only' => $this->is_buildtime_only,
+ 'is_runtime' => $this->is_runtime,
+ 'is_buildtime' => $this->is_buildtime,
'is_preview' => $this->is_preview,
]);
$this->clear();
@@ -68,6 +73,7 @@ class Add extends Component
$this->value = '';
$this->is_multiline = false;
$this->is_literal = false;
- $this->is_buildtime_only = false;
+ $this->is_runtime = true;
+ $this->is_buildtime = true;
}
}
diff --git a/app/Livewire/Project/Shared/EnvironmentVariable/All.php b/app/Livewire/Project/Shared/EnvironmentVariable/All.php
index a71400f4c..639c025c7 100644
--- a/app/Livewire/Project/Shared/EnvironmentVariable/All.php
+++ b/app/Livewire/Project/Shared/EnvironmentVariable/All.php
@@ -221,7 +221,8 @@ class All extends Component
$environment->value = $data['value'];
$environment->is_multiline = $data['is_multiline'] ?? false;
$environment->is_literal = $data['is_literal'] ?? false;
- $environment->is_buildtime_only = $data['is_buildtime_only'] ?? false;
+ $environment->is_runtime = $data['is_runtime'] ?? true;
+ $environment->is_buildtime = $data['is_buildtime'] ?? true;
$environment->is_preview = $data['is_preview'] ?? false;
$environment->resourceable_id = $this->resource->id;
$environment->resourceable_type = $this->resource->getMorphClass();
diff --git a/app/Livewire/Project/Shared/EnvironmentVariable/Show.php b/app/Livewire/Project/Shared/EnvironmentVariable/Show.php
index ab70b70f4..0d0467c13 100644
--- a/app/Livewire/Project/Shared/EnvironmentVariable/Show.php
+++ b/app/Livewire/Project/Shared/EnvironmentVariable/Show.php
@@ -38,7 +38,9 @@ class Show extends Component
public bool $is_shown_once = false;
- public bool $is_buildtime_only = false;
+ public bool $is_runtime = true;
+
+ public bool $is_buildtime = true;
public bool $is_required = false;
@@ -58,7 +60,8 @@ class Show extends Component
'is_multiline' => 'required|boolean',
'is_literal' => 'required|boolean',
'is_shown_once' => 'required|boolean',
- 'is_buildtime_only' => 'required|boolean',
+ 'is_runtime' => 'required|boolean',
+ 'is_buildtime' => 'required|boolean',
'real_value' => 'nullable',
'is_required' => 'required|boolean',
];
@@ -102,7 +105,8 @@ class Show extends Component
} else {
$this->validate();
$this->env->is_required = $this->is_required;
- $this->env->is_buildtime_only = $this->is_buildtime_only;
+ $this->env->is_runtime = $this->is_runtime;
+ $this->env->is_buildtime = $this->is_buildtime;
$this->env->is_shared = $this->is_shared;
}
$this->env->key = $this->key;
@@ -117,7 +121,8 @@ class Show extends Component
$this->is_multiline = $this->env->is_multiline;
$this->is_literal = $this->env->is_literal;
$this->is_shown_once = $this->env->is_shown_once;
- $this->is_buildtime_only = $this->env->is_buildtime_only ?? false;
+ $this->is_runtime = $this->env->is_runtime ?? true;
+ $this->is_buildtime = $this->env->is_buildtime ?? true;
$this->is_required = $this->env->is_required ?? false;
$this->is_really_required = $this->env->is_really_required ?? false;
$this->is_shared = $this->env->is_shared ?? false;
diff --git a/app/Models/Application.php b/app/Models/Application.php
index 1f48e0211..07df53687 100644
--- a/app/Models/Application.php
+++ b/app/Models/Application.php
@@ -932,11 +932,11 @@ class Application extends BaseModel
public function isConfigurationChanged(bool $save = false)
{
- $newConfigHash = base64_encode($this->fqdn.$this->git_repository.$this->git_branch.$this->git_commit_sha.$this->build_pack.$this->static_image.$this->install_command.$this->build_command.$this->start_command.$this->ports_exposes.$this->ports_mappings.$this->base_directory.$this->publish_directory.$this->dockerfile.$this->dockerfile_location.$this->custom_labels.$this->custom_docker_run_options.$this->dockerfile_target_build.$this->redirect.$this->custom_nginx_configuration.$this->custom_labels);
+ $newConfigHash = base64_encode($this->fqdn.$this->git_repository.$this->git_branch.$this->git_commit_sha.$this->build_pack.$this->static_image.$this->install_command.$this->build_command.$this->start_command.$this->ports_exposes.$this->ports_mappings.$this->base_directory.$this->publish_directory.$this->dockerfile.$this->dockerfile_location.$this->custom_labels.$this->custom_docker_run_options.$this->dockerfile_target_build.$this->redirect.$this->custom_nginx_configuration.$this->custom_labels.$this->settings->use_build_secrets);
if ($this->pull_request_id === 0 || $this->pull_request_id === null) {
- $newConfigHash .= json_encode($this->environment_variables()->get(['value', 'is_multiline', 'is_literal'])->sort());
+ $newConfigHash .= json_encode($this->environment_variables()->get(['value', 'is_multiline', 'is_literal', 'is_buildtime', 'is_runtime'])->sort());
} else {
- $newConfigHash .= json_encode($this->environment_variables_preview->get(['value', 'is_multiline', 'is_literal'])->sort());
+ $newConfigHash .= json_encode($this->environment_variables_preview->get(['value', 'is_multiline', 'is_literal', 'is_buildtime', 'is_runtime'])->sort());
}
$newConfigHash = md5($newConfigHash);
$oldConfigHash = data_get($this, 'config_hash');
diff --git a/app/Models/EnvironmentVariable.php b/app/Models/EnvironmentVariable.php
index 85fcdcecb..80399a16b 100644
--- a/app/Models/EnvironmentVariable.php
+++ b/app/Models/EnvironmentVariable.php
@@ -17,7 +17,8 @@ use OpenApi\Attributes as OA;
'is_literal' => ['type' => 'boolean'],
'is_multiline' => ['type' => 'boolean'],
'is_preview' => ['type' => 'boolean'],
- 'is_buildtime_only' => ['type' => 'boolean'],
+ 'is_runtime' => ['type' => 'boolean'],
+ 'is_buildtime' => ['type' => 'boolean'],
'is_shared' => ['type' => 'boolean'],
'is_shown_once' => ['type' => 'boolean'],
'key' => ['type' => 'string'],
@@ -37,13 +38,14 @@ class EnvironmentVariable extends BaseModel
'value' => 'encrypted',
'is_multiline' => 'boolean',
'is_preview' => 'boolean',
- 'is_buildtime_only' => 'boolean',
+ 'is_runtime' => 'boolean',
+ 'is_buildtime' => 'boolean',
'version' => 'string',
'resourceable_type' => 'string',
'resourceable_id' => 'integer',
];
- protected $appends = ['real_value', 'is_shared', 'is_really_required'];
+ protected $appends = ['real_value', 'is_shared', 'is_really_required', 'is_nixpacks', 'is_coolify'];
protected static function booted()
{
@@ -137,6 +139,32 @@ class EnvironmentVariable extends BaseModel
);
}
+ protected function isNixpacks(): Attribute
+ {
+ return Attribute::make(
+ get: function () {
+ if (str($this->key)->startsWith('NIXPACKS_')) {
+ return true;
+ }
+
+ return false;
+ }
+ );
+ }
+
+ protected function isCoolify(): Attribute
+ {
+ return Attribute::make(
+ get: function () {
+ if (str($this->key)->startsWith('SERVICE_')) {
+ return true;
+ }
+
+ return false;
+ }
+ );
+ }
+
protected function isShared(): Attribute
{
return Attribute::make(
diff --git a/database/migrations/2025_09_18_080152_add_runtime_and_buildtime_to_environment_variables_table.php b/database/migrations/2025_09_18_080152_add_runtime_and_buildtime_to_environment_variables_table.php
new file mode 100644
index 000000000..6fd4bfed6
--- /dev/null
+++ b/database/migrations/2025_09_18_080152_add_runtime_and_buildtime_to_environment_variables_table.php
@@ -0,0 +1,67 @@
+boolean('is_runtime')->default(true)->after('is_buildtime_only');
+ $table->boolean('is_buildtime')->default(true)->after('is_runtime');
+ });
+
+ // Migrate existing data from is_buildtime_only to new fields
+ DB::table('environment_variables')
+ ->where('is_buildtime_only', true)
+ ->update([
+ 'is_runtime' => false,
+ 'is_buildtime' => true,
+ ]);
+
+ DB::table('environment_variables')
+ ->where('is_buildtime_only', false)
+ ->update([
+ 'is_runtime' => true,
+ 'is_buildtime' => true,
+ ]);
+
+ // Remove the old is_buildtime_only column
+ Schema::table('environment_variables', function (Blueprint $table) {
+ $table->dropColumn('is_buildtime_only');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('environment_variables', function (Blueprint $table) {
+ // Re-add the is_buildtime_only column
+ $table->boolean('is_buildtime_only')->default(false)->after('is_preview');
+ });
+
+ // Restore data to is_buildtime_only based on new fields
+ DB::table('environment_variables')
+ ->where('is_runtime', false)
+ ->where('is_buildtime', true)
+ ->update(['is_buildtime_only' => true]);
+
+ DB::table('environment_variables')
+ ->where('is_runtime', true)
+ ->update(['is_buildtime_only' => false]);
+
+ // Remove new columns
+ Schema::table('environment_variables', function (Blueprint $table) {
+ $table->dropColumn(['is_runtime', 'is_buildtime']);
+ });
+ }
+};
diff --git a/resources/views/livewire/project/shared/environment-variable/add.blade.php b/resources/views/livewire/project/shared/environment-variable/add.blade.php
index 5af9e6318..cd156634e 100644
--- a/resources/views/livewire/project/shared/environment-variable/add.blade.php
+++ b/resources/views/livewire/project/shared/environment-variable/add.blade.php
@@ -3,15 +3,18 @@