diff --git a/app/Http/Controllers/Webhook/Github.php b/app/Http/Controllers/Webhook/Github.php
index 02ba017ca..373d89918 100644
--- a/app/Http/Controllers/Webhook/Github.php
+++ b/app/Http/Controllers/Webhook/Github.php
@@ -266,6 +266,10 @@ class Github extends Controller
if (Str::isMatch('/refs\/heads\/*/', $branch)) {
$branch = Str::after($branch, 'refs/heads/');
}
+ $added_files = data_get($payload, 'commits.*.added');
+ $removed_files = data_get($payload, 'commits.*.removed');
+ $modified_files = data_get($payload, 'commits.*.modified');
+ $changed_files = collect($added_files)->concat($removed_files)->concat($modified_files)->unique()->flatten();
ray('Webhook GitHub Push Event: ' . $id . ' with branch: ' . $branch);
}
if ($x_github_event === 'pull_request') {
@@ -298,32 +302,50 @@ class Github extends Controller
$isFunctional = $application->destination->server->isFunctional();
if (!$isFunctional) {
$return_payloads->push([
- 'application' => $application->name,
'status' => 'failed',
'message' => 'Server is not functional.',
+ 'application_uuid' => $application->uuid,
+ 'application_name' => $application->name,
]);
continue;
}
if ($x_github_event === 'push') {
if ($application->isDeployable()) {
- ray('Deploying ' . $application->name . ' with branch ' . $branch);
- $deployment_uuid = new Cuid2(7);
- queue_application_deployment(
- application: $application,
- deployment_uuid: $deployment_uuid,
- force_rebuild: false,
- is_webhook: true
- );
- $return_payloads->push([
- 'application' => $application->name,
- 'status' => 'success',
- 'message' => 'Deployment queued.',
- ]);
+ $watch_files_trigger = $application->watchPathCheck($changed_files);
+ if (!$watch_files_trigger) {
+ $paths = str($application->watch_paths)->explode("\n");
+ $return_payloads->push([
+ 'status' => 'failed',
+ 'message' => 'Changed files do not match watch paths. Ignoring deployment.',
+ 'application_uuid' => $application->uuid,
+ 'application_name' => $application->name,
+ 'details' => [
+ 'changed_files' => $changed_files,
+ 'watch_paths' => $paths,
+ ],
+ ]);
+ } else {
+ ray('Deploying ' . $application->name . ' with branch ' . $branch);
+ $deployment_uuid = new Cuid2(7);
+ queue_application_deployment(
+ application: $application,
+ deployment_uuid: $deployment_uuid,
+ force_rebuild: false,
+ is_webhook: true,
+ );
+ $return_payloads->push([
+ 'status' => 'success',
+ 'message' => 'Deployment queued.',
+ 'application_uuid' => $application->uuid,
+ 'application_name' => $application->name,
+ ]);
+ }
} else {
$return_payloads->push([
- 'application' => $application->name,
'status' => 'failed',
'message' => 'Deployments disabled.',
+ 'application_uuid' => $application->uuid,
+ 'application_name' => $application->name,
]);
}
}
diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php
index 0c6b6eecb..356006983 100644
--- a/app/Jobs/ApplicationDeploymentJob.php
+++ b/app/Jobs/ApplicationDeploymentJob.php
@@ -234,7 +234,7 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
$this->build_server = $this->server;
$this->original_server = $this->server;
}
- if ($this->restart_only && $this->application->build_pack !== 'dockerimage') {
+ if ($this->restart_only && $this->application->build_pack !== 'dockerimage' && $this->application->build_pack !== 'dockerfile') {
$this->just_restart();
if ($this->server->isProxyShouldRun()) {
dispatch(new ContainerStatusJob($this->server));
@@ -326,17 +326,19 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
],
);
$this->generate_image_names();
- if (!$this->force_rebuild) {
- $this->check_image_locally_or_remotely();
- if (str($this->saved_outputs->get('local_image_found'))->isNotEmpty() && !$this->application->isConfigurationChanged()) {
- $this->create_workdir();
- $this->application_deployment_queue->addLogEntry("No configuration changed & image found ({$this->production_image_name}) with the same Git Commit SHA. Build step skipped.");
- $this->generate_compose_file();
- $this->push_to_docker_registry();
- $this->rolling_update();
- return;
- }
- }
+
+ // Always rebuild dockerfile based container.
+ // if (!$this->force_rebuild) {
+ // $this->check_image_locally_or_remotely();
+ // if (str($this->saved_outputs->get('local_image_found'))->isNotEmpty() && !$this->application->isConfigurationChanged()) {
+ // $this->create_workdir();
+ // $this->application_deployment_queue->addLogEntry("No configuration changed & image found ({$this->production_image_name}) with the same Git Commit SHA. Build step skipped.");
+ // $this->generate_compose_file();
+ // $this->push_to_docker_registry();
+ // $this->rolling_update();
+ // return;
+ // }
+ // }
$this->generate_compose_file();
$this->generate_build_env_variables();
$this->add_build_env_variables_to_dockerfile();
@@ -467,17 +469,17 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
$this->set_base_dir();
$this->generate_image_names();
$this->clone_repository();
- if (!$this->force_rebuild) {
- $this->check_image_locally_or_remotely();
- if (str($this->saved_outputs->get('local_image_found'))->isNotEmpty() && !$this->application->isConfigurationChanged()) {
- $this->create_workdir();
- $this->application_deployment_queue->addLogEntry("No configuration changed & image found ({$this->production_image_name}) with the same Git Commit SHA. Build step skipped.");
- $this->generate_compose_file();
- $this->push_to_docker_registry();
- $this->rolling_update();
- return;
- }
- }
+ // if (!$this->force_rebuild) {
+ // $this->check_image_locally_or_remotely();
+ // if (str($this->saved_outputs->get('local_image_found'))->isNotEmpty() && !$this->application->isConfigurationChanged()) {
+ // $this->create_workdir();
+ // $this->application_deployment_queue->addLogEntry("No configuration changed & image found ({$this->production_image_name}) with the same Git Commit SHA. Build step skipped.");
+ // $this->generate_compose_file();
+ // $this->push_to_docker_registry();
+ // $this->rolling_update();
+ // return;
+ // }
+ // }
$this->cleanup_git();
$this->generate_compose_file();
$this->generate_build_env_variables();
diff --git a/app/Livewire/Admin/Index.php b/app/Livewire/Admin/Index.php
index 60bd6f5ea..b72bc8e35 100644
--- a/app/Livewire/Admin/Index.php
+++ b/app/Livewire/Admin/Index.php
@@ -8,7 +8,31 @@ use Livewire\Component;
class Index extends Component
{
- public $users = [];
+ public $active_subscribers = [];
+ public $inactive_subscribers = [];
+ public $search = '';
+ public function submitSearch() {
+ if ($this->search !== "") {
+ $this->inactive_subscribers = User::whereDoesntHave('teams', function ($query) {
+ $query->whereRelation('subscription', 'stripe_subscription_id', '!=', null);
+ })->where(function ($query) {
+ $query->where('name', 'like', "%{$this->search}%")
+ ->orWhere('email', 'like', "%{$this->search}%");
+ })->get()->filter(function ($user) {
+ return $user->id !== 0;
+ });
+ $this->active_subscribers = User::whereHas('teams', function ($query) {
+ $query->whereRelation('subscription', 'stripe_subscription_id', '!=', null);
+ })->where(function ($query) {
+ $query->where('name', 'like', "%{$this->search}%")
+ ->orWhere('email', 'like', "%{$this->search}%");
+ })->get()->filter(function ($user) {
+ return $user->id !== 0;
+ });
+ } else {
+ $this->getSubscribers();
+ }
+ }
public function mount()
{
if (!isCloud()) {
@@ -17,7 +41,15 @@ class Index extends Component
if (auth()->user()->id !== 0) {
return redirect()->route('dashboard');
}
- $this->users = User::whereHas('teams', function ($query) {
+ $this->getSubscribers();
+ }
+ public function getSubscribers() {
+ $this->inactive_subscribers = User::whereDoesntHave('teams', function ($query) {
+ $query->whereRelation('subscription', 'stripe_subscription_id', '!=', null);
+ })->get()->filter(function ($user) {
+ return $user->id !== 0;
+ });
+ $this->active_subscribers = User::whereHas('teams', function ($query) {
$query->whereRelation('subscription', 'stripe_subscription_id', '!=', null);
})->get()->filter(function ($user) {
return $user->id !== 0;
diff --git a/app/Livewire/Project/Application/General.php b/app/Livewire/Project/Application/General.php
index 9485cdd03..c6b8f2e51 100644
--- a/app/Livewire/Project/Application/General.php
+++ b/app/Livewire/Project/Application/General.php
@@ -73,6 +73,7 @@ class General extends Component
'application.settings.is_static' => 'boolean|required',
'application.settings.is_raw_compose_deployment_enabled' => 'boolean|required',
'application.settings.is_build_server_enabled' => 'boolean|required',
+ 'application.watch_paths' => 'nullable',
];
protected $validationAttributes = [
'application.name' => 'name',
@@ -108,6 +109,7 @@ class General extends Component
'application.settings.is_static' => 'Is static',
'application.settings.is_raw_compose_deployment_enabled' => 'Is raw compose deployment enabled',
'application.settings.is_build_server_enabled' => 'Is build server enabled',
+ 'application.watch_paths' => 'Watch paths',
];
public function mount()
{
diff --git a/app/Livewire/Project/New/GithubPrivateRepository.php b/app/Livewire/Project/New/GithubPrivateRepository.php
index 7d59cfb04..322fd4a4e 100644
--- a/app/Livewire/Project/New/GithubPrivateRepository.php
+++ b/app/Livewire/Project/New/GithubPrivateRepository.php
@@ -7,14 +7,12 @@ use App\Models\GithubApp;
use App\Models\Project;
use App\Models\StandaloneDocker;
use App\Models\SwarmDocker;
-use App\Traits\SaveFromRedirect;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Route;
use Livewire\Component;
class GithubPrivateRepository extends Component
{
- use SaveFromRedirect;
public $current_step = 'github_apps';
public $github_apps;
public GithubApp $github_app;
diff --git a/app/Livewire/Project/New/Select.php b/app/Livewire/Project/New/Select.php
index b1842547e..2662cff09 100644
--- a/app/Livewire/Project/New/Select.php
+++ b/app/Livewire/Project/New/Select.php
@@ -70,6 +70,10 @@ class Select extends Component
// }
// }
+ public function updatedSearch()
+ {
+ $this->loadServices();
+ }
public function loadServices(bool $force = false)
{
try {
diff --git a/app/Livewire/Project/Service/ServiceApplicationView.php b/app/Livewire/Project/Service/ServiceApplicationView.php
index 0b3a4cef6..70a8662d5 100644
--- a/app/Livewire/Project/Service/ServiceApplicationView.php
+++ b/app/Livewire/Project/Service/ServiceApplicationView.php
@@ -59,7 +59,11 @@ class ServiceApplicationView extends Component
$this->validate();
$this->application->save();
updateCompose($this->application);
- $this->dispatch('success', 'Service saved.');
+ if (str($this->application->fqdn)->contains(',')) {
+ $this->dispatch('warning', 'Some services do not support multiple domains, which can lead to problems and is NOT RECOMMENDED.');
+ } else {
+ $this->dispatch('success', 'Service saved.');
+ }
} catch (\Throwable $e) {
return handleError($e, $this);
} finally {
diff --git a/app/Livewire/Security/PrivateKey/Show.php b/app/Livewire/Security/PrivateKey/Show.php
index 0540b2e29..0a292731b 100644
--- a/app/Livewire/Security/PrivateKey/Show.php
+++ b/app/Livewire/Security/PrivateKey/Show.php
@@ -8,7 +8,7 @@ use Livewire\Component;
class Show extends Component
{
public PrivateKey $private_key;
- public $public_key;
+ public $public_key = "Loading...";
protected $rules = [
'private_key.name' => 'required|string',
'private_key.description' => 'nullable|string',
@@ -25,11 +25,13 @@ class Show extends Component
{
try {
$this->private_key = PrivateKey::ownedByCurrentTeam(['name', 'description', 'private_key', 'is_git_related'])->whereUuid(request()->private_key_uuid)->firstOrFail();
- $this->public_key = $this->private_key->publicKey();
}catch(\Throwable $e) {
return handleError($e, $this);
}
}
+ public function loadPublicKey() {
+ $this->public_key = $this->private_key->publicKey();
+ }
public function delete()
{
try {
diff --git a/app/Livewire/Server/Resources.php b/app/Livewire/Server/Resources.php
index f781418d9..1c8a8267e 100644
--- a/app/Livewire/Server/Resources.php
+++ b/app/Livewire/Server/Resources.php
@@ -42,7 +42,11 @@ class Resources extends Component
$this->dispatch('success', 'Resource statuses refreshed.');
}
public function loadUnmanagedContainers() {
- $this->unmanagedContainers = $this->server->loadUnmanagedContainers();
+ try {
+ $this->unmanagedContainers = $this->server->loadUnmanagedContainers();
+ } catch (\Throwable $e) {
+ return handleError($e, $this);
+ }
}
public function mount() {
$this->unmanagedContainers = collect();
diff --git a/app/Livewire/Subscription/Index.php b/app/Livewire/Subscription/Index.php
index c87f7d0b6..1444187ac 100644
--- a/app/Livewire/Subscription/Index.php
+++ b/app/Livewire/Subscription/Index.php
@@ -15,7 +15,7 @@ class Index extends Component
if (!isCloud()) {
return redirect(RouteServiceProvider::HOME);
}
- if (data_get(currentTeam(), 'subscription')) {
+ if (data_get(currentTeam(), 'subscription') && isSubscriptionActive()) {
return redirect()->route('subscription.show');
}
$this->settings = InstanceSettings::get();
diff --git a/app/Models/Application.php b/app/Models/Application.php
index bc3b27bb0..fc03f8b1e 100644
--- a/app/Models/Application.php
+++ b/app/Models/Application.php
@@ -6,6 +6,7 @@ use App\Enums\ApplicationDeploymentStatus;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Support\Collection;
use Spatie\Activitylog\Models\Activity;
use Illuminate\Support\Str;
use RuntimeException;
@@ -903,4 +904,24 @@ class Application extends BaseModel
: explode(',', $this->fqdn),
);
}
+ public function watchPaths(): Attribute
+ {
+ return Attribute::make(
+ set: function ($value) {
+ if ($value) {
+ return trim($value);
+ }
+ }
+ );
+ }
+ public function watchPathCheck(Collection $modified_files): bool
+ {
+ $watch_paths = collect(explode("\n", $this->watch_paths));
+ $matches = $modified_files->filter(function ($file) use ($watch_paths) {
+ return $watch_paths->contains(function ($glob) use ($file) {
+ return fnmatch($glob, $file);
+ });
+ });
+ return $matches->count() > 0;
+ }
}
diff --git a/app/Models/EnvironmentVariable.php b/app/Models/EnvironmentVariable.php
index 611543b2d..32277769e 100644
--- a/app/Models/EnvironmentVariable.php
+++ b/app/Models/EnvironmentVariable.php
@@ -25,19 +25,18 @@ class EnvironmentVariable extends Model
static::created(function (EnvironmentVariable $environment_variable) {
if ($environment_variable->application_id && !$environment_variable->is_preview) {
$found = ModelsEnvironmentVariable::where('key', $environment_variable->key)->where('application_id', $environment_variable->application_id)->where('is_preview', true)->first();
- $application = Application::find($environment_variable->application_id);
- if ($application->build_pack === 'dockerfile') {
- return;
- }
if (!$found) {
- ModelsEnvironmentVariable::create([
- 'key' => $environment_variable->key,
- 'value' => $environment_variable->value,
- 'is_build_time' => $environment_variable->is_build_time,
- 'is_multiline' => $environment_variable->is_multiline,
- 'application_id' => $environment_variable->application_id,
- 'is_preview' => true
- ]);
+ $application = Application::find($environment_variable->application_id);
+ if ($application->build_pack !== 'dockerfile') {
+ ModelsEnvironmentVariable::create([
+ 'key' => $environment_variable->key,
+ 'value' => $environment_variable->value,
+ 'is_build_time' => $environment_variable->is_build_time,
+ 'is_multiline' => $environment_variable->is_multiline,
+ 'application_id' => $environment_variable->application_id,
+ 'is_preview' => true
+ ]);
+ }
}
}
$environment_variable->update([
diff --git a/app/Models/Server.php b/app/Models/Server.php
index 08235a26d..cbe895936 100644
--- a/app/Models/Server.php
+++ b/app/Models/Server.php
@@ -550,21 +550,21 @@ $schema://$host {
}
public function loadUnmanagedContainers()
{
- if ($this->isFunctional()) {
- $containers = instant_remote_process(["docker ps -a --format '{{json .}}' "], $this);
- $containers = format_docker_command_output_to_json($containers);
- $containers = $containers->map(function ($container) {
- $labels = data_get($container, 'Labels');
- if (!str($labels)->contains("coolify.managed")) {
- return $container;
- }
- return null;
- });
- $containers = $containers->filter();
- return collect($containers);
- } else {
- return collect([]);
- }
+ if ($this->isFunctional()) {
+ $containers = instant_remote_process(["docker ps -a --format '{{json .}}' "], $this);
+ $containers = format_docker_command_output_to_json($containers);
+ $containers = $containers->map(function ($container) {
+ $labels = data_get($container, 'Labels');
+ if (!str($labels)->contains("coolify.managed")) {
+ return $container;
+ }
+ return null;
+ });
+ $containers = $containers->filter();
+ return collect($containers);
+ } else {
+ return collect([]);
+ }
}
public function hasDefinedResources()
{
diff --git a/bootstrap/helpers/applications.php b/bootstrap/helpers/applications.php
index bf3f15514..8d810da0f 100644
--- a/bootstrap/helpers/applications.php
+++ b/bootstrap/helpers/applications.php
@@ -6,6 +6,7 @@ use App\Models\Application;
use App\Models\ApplicationDeploymentQueue;
use App\Models\Server;
use App\Models\StandaloneDocker;
+use Illuminate\Support\Collection;
use Spatie\Url\Url;
function queue_application_deployment(Application $application, string $deployment_uuid, int | null $pull_request_id = 0, string $commit = 'HEAD', bool $force_rebuild = false, bool $is_webhook = false, bool $restart_only = false, ?string $git_type = null, bool $no_questions_asked = false, Server $server = null, StandaloneDocker $destination = null, bool $only_this_server = false)
diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php
index 023a65107..baee4ce15 100644
--- a/bootstrap/helpers/shared.php
+++ b/bootstrap/helpers/shared.php
@@ -282,7 +282,7 @@ function base_url(bool $withPort = true): string
function isSubscribed()
{
- return auth()->user()->currentTeam()->subscription()->exists() || auth()->user()->isInstanceAdmin();
+ return isSubscriptionActive() || auth()->user()->isInstanceAdmin();
}
function isDev(): bool
{
diff --git a/bootstrap/helpers/subscriptions.php b/bootstrap/helpers/subscriptions.php
index 928bbbcaf..5158c4e7e 100644
--- a/bootstrap/helpers/subscriptions.php
+++ b/bootstrap/helpers/subscriptions.php
@@ -66,7 +66,7 @@ function isSubscriptionActive()
// return $subscription->paddle_status === 'active';
// }
if (isStripe()) {
- return $subscription->stripe_invoice_paid === true && $subscription->stripe_cancel_at_period_end === false;
+ return $subscription->stripe_invoice_paid === true;
}
return false;
}
diff --git a/config/sentry.php b/config/sentry.php
index 89345d082..bef8d46c8 100644
--- a/config/sentry.php
+++ b/config/sentry.php
@@ -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.248',
+ 'release' => '4.0.0-beta.249',
// When left empty or `null` the Laravel environment will be used
'environment' => config('app.env'),
diff --git a/config/version.php b/config/version.php
index 642ee812d..cabb9ad06 100644
--- a/config/version.php
+++ b/config/version.php
@@ -1,3 +1,3 @@
longText('watch_paths')->nullable();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('applications', function (Blueprint $table) {
+ $table->dropColumn('watch_paths');
+ });
+ }
+};
diff --git a/resources/css/app.css b/resources/css/app.css
index b7965ebbc..371efd8ed 100644
--- a/resources/css/app.css
+++ b/resources/css/app.css
@@ -13,7 +13,7 @@ body {
.input,
.select {
- @apply text-black dark:bg-coolgray-100 dark:text-white ring-neutral-300 dark:ring-coolgray-300;
+ @apply text-black dark:bg-coolgray-100 dark:text-white ring-neutral-200 dark:ring-coolgray-300;
}
/* Readonly */
@@ -41,7 +41,7 @@ option {
}
.button {
- @apply flex items-center justify-center gap-2 px-3 py-1 text-sm text-white normal-case rounded cursor-pointer hover:bg-black/80 bg-coolgray-200 hover:bg-coolgray-500 hover:text-white disabled:bg-coolgray-100/10 disabled:cursor-not-allowed min-w-fit focus:outline-1 dark:disabled:text-neutral-600;
+ @apply flex items-center justify-center gap-2 px-2 py-1 text-sm text-black normal-case border rounded cursor-pointer bg-neutral-200/50 border-neutral-300 hover:bg-neutral-300 dark:bg-coolgray-200 dark:text-white dark:hover:text-white dark:hover:bg-coolgray-500 dark:border-black hover:text-black disabled:bg-coolgray-100/10 disabled:cursor-not-allowed min-w-fit focus:outline-1 dark:disabled:text-neutral-600;
}
button[isError]:not(:disabled) {
@@ -78,7 +78,7 @@ label {
}
table {
- @apply min-w-full divide-y dark:divide-coolgray-200 divide-neutral-300;
+ @apply min-w-full divide-y dark:divide-coolgray-200 divide-neutral-300 ;
}
thead {
@@ -90,7 +90,7 @@ tbody {
}
tr {
- @apply text-neutral-400;
+ @apply text-black dark:text-neutral-400 dark:hover:bg-black hover:bg-neutral-200;
}
tr th {
@@ -203,6 +203,9 @@ tr td:first-child {
.box-without-bg {
@apply flex p-2 transition-colors dark:hover:text-white hover:no-underline min-h-[4rem] border border-neutral-200 dark:border-black;
}
+.box-without-bg-without-border {
+ @apply flex p-2 transition-colors dark:hover:text-white hover:no-underline min-h-[4rem] ;
+}
.on-box {
@apply rounded hover:bg-neutral-300 dark:hover:bg-coolgray-500/20;
diff --git a/resources/views/components/internal-link.blade.php b/resources/views/components/internal-link.blade.php
index 19fe52635..cedea2a40 100644
--- a/resources/views/components/internal-link.blade.php
+++ b/resources/views/components/internal-link.blade.php
@@ -1 +1,3 @@
-
+
diff --git a/resources/views/components/pricing-plans.blade.php b/resources/views/components/pricing-plans.blade.php
index ca71bf93e..5977323f2 100644
--- a/resources/views/components/pricing-plans.blade.php
+++ b/resources/views/components/pricing-plans.blade.php
@@ -48,7 +48,7 @@
diff --git a/resources/views/livewire/admin/index.blade.php b/resources/views/livewire/admin/index.blade.php
index 5964097c6..99abdf0e5 100644
--- a/resources/views/livewire/admin/index.blade.php
+++ b/resources/views/livewire/admin/index.blade.php
@@ -1,17 +1,31 @@
{{ $user->name }} {{ $user->email }} No active subscribers {{ $user->name }} {{ $user->email }} No inactive subscribersAdmin Dashboard
Who am I now?
- {{ auth()->user()->name }}
- Users
+ Active Subscribers
Inactive Subscribers
+
COMMAND:
{{ $line['command'] }}
OUTPUT:
@endif @if (str($line['output'])->contains('http://') || str($line['output'])->contains('https://'))
diff --git a/resources/views/livewire/project/application/general.blade.php b/resources/views/livewire/project/application/general.blade.php
index 44578c23c..e89431365 100644
--- a/resources/views/livewire/project/application/general.blade.php
+++ b/resources/views/livewire/project/application/general.blade.php
@@ -148,7 +148,8 @@
id="application.start_command" label="Start Command" />