diff --git a/app/Http/Livewire/Project/Application/Previews.php b/app/Http/Livewire/Project/Application/Previews.php
index a5459a7bbf..1c96740111 100644
--- a/app/Http/Livewire/Project/Application/Previews.php
+++ b/app/Http/Livewire/Project/Application/Previews.php
@@ -25,7 +25,7 @@ public function mount()
public function load_prs()
{
try {
- ['rate_limit_remaining' => $rate_limit_remaining, 'data' => $data] = git_api(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/pulls");
+ ['rate_limit_remaining' => $rate_limit_remaining, 'data' => $data] = githubApi(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/pulls");
$this->rate_limit_remaining = $rate_limit_remaining;
$this->pull_requests = $data->sortBy('number')->values();
} catch (\Throwable $e) {
diff --git a/app/Http/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php b/app/Http/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php
index cf8f56642a..522eb8845e 100644
--- a/app/Http/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php
+++ b/app/Http/Livewire/Project/New/GithubPrivateRepositoryDeployKey.php
@@ -11,6 +11,7 @@
use App\Models\SwarmDocker;
use Livewire\Component;
use Spatie\Url\Url;
+use Illuminate\Support\Str;
class GithubPrivateRepositoryDeployKey extends Component
{
@@ -29,7 +30,7 @@ class GithubPrivateRepositoryDeployKey extends Component
public string $repository_url;
public string $branch;
protected $rules = [
- 'repository_url' => 'required|url',
+ 'repository_url' => 'required',
'branch' => 'required|string',
'port' => 'required|numeric',
'is_static' => 'required|boolean',
@@ -43,8 +44,8 @@ class GithubPrivateRepositoryDeployKey extends Component
'publish_directory' => 'Publish directory',
];
private object $repository_url_parsed;
- private GithubApp|GitlabApp|null $git_source = null;
- private string $git_host;
+ private GithubApp|GitlabApp|string $git_source = 'other';
+ private ?string $git_host = null;
private string $git_repository;
public function mount()
@@ -92,21 +93,38 @@ public function submit()
$project = Project::where('uuid', $this->parameters['project_uuid'])->first();
$environment = $project->load(['environments'])->environments->where('name', $this->parameters['environment_name'])->first();
- $application_init = [
- 'name' => generate_random_name(),
- 'git_repository' => $this->git_repository,
- 'git_branch' => $this->branch,
- 'git_full_url' => "git@$this->git_host:$this->git_repository.git",
- 'build_pack' => 'nixpacks',
- 'ports_exposes' => $this->port,
- 'publish_directory' => $this->publish_directory,
- 'environment_id' => $environment->id,
- 'destination_id' => $destination->id,
- 'destination_type' => $destination_class,
- 'private_key_id' => $this->private_key_id,
- 'source_id' => $this->git_source->id,
- 'source_type' => $this->git_source->getMorphClass()
- ];
+ if ($this->git_source === 'other') {
+ $application_init = [
+ 'name' => generate_random_name(),
+ 'git_repository' => $this->git_repository,
+ 'git_branch' => $this->branch,
+ 'git_full_url' => $this->git_repository,
+ 'build_pack' => 'nixpacks',
+ 'ports_exposes' => $this->port,
+ 'publish_directory' => $this->publish_directory,
+ 'environment_id' => $environment->id,
+ 'destination_id' => $destination->id,
+ 'destination_type' => $destination_class,
+ 'private_key_id' => $this->private_key_id,
+ ];
+ } else {
+ $application_init = [
+ 'name' => generate_random_name(),
+ 'git_repository' => $this->git_repository,
+ 'git_branch' => $this->branch,
+ 'git_full_url' => "git@$this->git_host:$this->git_repository.git",
+ 'build_pack' => 'nixpacks',
+ 'ports_exposes' => $this->port,
+ 'publish_directory' => $this->publish_directory,
+ 'environment_id' => $environment->id,
+ 'destination_id' => $destination->id,
+ 'destination_type' => $destination_class,
+ 'private_key_id' => $this->private_key_id,
+ 'source_id' => $this->git_source->id,
+ 'source_type' => $this->git_source->getMorphClass()
+ ];
+ }
+
$application = Application::create($application_init);
$application->settings->is_static = $this->is_static;
$application->settings->save();
@@ -134,10 +152,13 @@ private function get_git_source()
if ($this->git_host == 'github.com') {
$this->git_source = GithubApp::where('name', 'Public GitHub')->first();
- } elseif ($this->git_host == 'gitlab.com') {
- $this->git_source = GitlabApp::where('name', 'Public GitLab')->first();
- } elseif ($this->git_host == 'bitbucket.org') {
- // Not supported yet
+ return;
+ }
+ if (Str::of($this->repository_url)->startsWith('http')) {
+ $this->git_host = $this->repository_url_parsed->getHost();
+ $this->git_repository = $this->repository_url_parsed->getSegment(1) . '/' . $this->repository_url_parsed->getSegment(2);
+ $this->git_repository = Str::finish("git@$this->git_host:$this->git_repository", '.git');
}
+ $this->git_source = 'other';
}
}
diff --git a/app/Http/Livewire/Project/New/PublicGitRepository.php b/app/Http/Livewire/Project/New/PublicGitRepository.php
index 837c32abef..7a206fae43 100644
--- a/app/Http/Livewire/Project/New/PublicGitRepository.php
+++ b/app/Http/Livewire/Project/New/PublicGitRepository.php
@@ -27,9 +27,10 @@ class PublicGitRepository extends Component
public int $rate_limit_remaining = 0;
public $rate_limit_reset = 0;
private object $repository_url_parsed;
- public GithubApp|GitlabApp|null $git_source = null;
+ public GithubApp|GitlabApp|string $git_source = 'other';
public string $git_host;
public string $git_repository;
+
protected $rules = [
'repository_url' => 'required|url',
'port' => 'required|numeric',
@@ -64,7 +65,10 @@ public function instantSave()
}
$this->emit('success', 'Application settings updated!');
}
-
+ public function load_any_git()
+ {
+ $this->branch_found = true;
+ }
public function load_branch()
{
try {
@@ -99,21 +103,23 @@ private function get_git_source()
if ($this->git_host == 'github.com') {
$this->git_source = GithubApp::where('name', 'Public GitHub')->first();
- } elseif ($this->git_host == 'gitlab.com') {
- $this->git_source = GitlabApp::where('name', 'Public GitLab')->first();
- } elseif ($this->git_host == 'bitbucket.org') {
- // Not supported yet
- }
- if (is_null($this->git_source)) {
- throw new \Exception('Git source not found. What?!');
+ return;
}
+ $this->git_repository = $this->repository_url;
+ $this->git_source = 'other';
}
private function get_branch()
{
- ['rate_limit_remaining' => $this->rate_limit_remaining, 'rate_limit_reset' => $this->rate_limit_reset] = git_api(source: $this->git_source, endpoint: "/repos/{$this->git_repository}/branches/{$this->git_branch}");
- $this->rate_limit_reset = Carbon::parse((int)$this->rate_limit_reset)->format('Y-M-d H:i:s');
- $this->branch_found = true;
+ if ($this->git_source === 'other') {
+ $this->branch_found = true;
+ return;
+ }
+ if ($this->git_source->getMorphClass() === 'App\Models\GithubApp') {
+ ['rate_limit_remaining' => $this->rate_limit_remaining, 'rate_limit_reset' => $this->rate_limit_reset] = githubApi(source: $this->git_source, endpoint: "/repos/{$this->git_repository}/branches/{$this->git_branch}");
+ $this->rate_limit_reset = Carbon::parse((int)$this->rate_limit_reset)->format('Y-M-d H:i:s');
+ $this->branch_found = true;
+ }
}
public function submit()
@@ -136,19 +142,34 @@ public function submit()
$project = Project::where('uuid', $project_uuid)->first();
$environment = $project->load(['environments'])->environments->where('name', $environment_name)->first();
- $application_init = [
- 'name' => generate_application_name($this->git_repository, $this->git_branch),
- 'git_repository' => $this->git_repository,
- 'git_branch' => $this->git_branch,
- 'build_pack' => 'nixpacks',
- 'ports_exposes' => $this->port,
- 'publish_directory' => $this->publish_directory,
- 'environment_id' => $environment->id,
- 'destination_id' => $destination->id,
- 'destination_type' => $destination_class,
- 'source_id' => $this->git_source->id,
- 'source_type' => $this->git_source->getMorphClass()
- ];
+ if ($this->git_source === 'other') {
+ $application_init = [
+ 'name' => generate_application_name($this->git_repository, $this->git_branch),
+ 'git_repository' => $this->git_repository,
+ 'git_branch' => $this->git_branch,
+ 'build_pack' => 'nixpacks',
+ 'ports_exposes' => $this->port,
+ 'publish_directory' => $this->publish_directory,
+ 'environment_id' => $environment->id,
+ 'destination_id' => $destination->id,
+ 'destination_type' => $destination_class,
+ ];
+ } else {
+ $application_init = [
+ 'name' => generate_application_name($this->git_repository, $this->git_branch),
+ 'git_repository' => $this->git_repository,
+ 'git_branch' => $this->git_branch,
+ 'build_pack' => 'nixpacks',
+ 'ports_exposes' => $this->port,
+ 'publish_directory' => $this->publish_directory,
+ 'environment_id' => $environment->id,
+ 'destination_id' => $destination->id,
+ 'destination_type' => $destination_class,
+ 'source_id' => $this->git_source->id,
+ 'source_type' => $this->git_source->getMorphClass()
+ ];
+ }
+
$application = Application::create($application_init);
diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php
index f05739379e..fc0387357c 100644
--- a/app/Jobs/ApplicationDeploymentJob.php
+++ b/app/Jobs/ApplicationDeploymentJob.php
@@ -45,7 +45,7 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
private string $commit;
private bool $force_rebuild;
- private GithubApp|GitlabApp $source;
+ private GithubApp|GitlabApp|string $source = 'other';
private StandaloneDocker|SwarmDocker $destination;
private Server $server;
private ApplicationPreview|null $preview = null;
@@ -80,7 +80,10 @@ public function __construct(int $application_deployment_queue_id)
$this->commit = $this->application_deployment_queue->commit;
$this->force_rebuild = $this->application_deployment_queue->force_rebuild;
- $this->source = $this->application->source->getMorphClass()::where('id', $this->application->source->id)->first();
+ $source = data_get($this->application, 'source');
+ if ($source) {
+ $this->source = $source->getMorphClass()::where('id', $this->application->source->id)->first();
+ }
$this->destination = $this->application->destination->getMorphClass()::where('id', $this->application->destination->id)->first();
$this->server = $this->destination->server;
@@ -89,7 +92,7 @@ public function __construct(int $application_deployment_queue_id)
$this->configuration_dir = application_configuration_dir() . "/{$this->application->uuid}";
$this->is_debug_enabled = $this->application->settings->is_debug_enabled;
- ray($this->basedir,$this->workdir);
+ ray($this->basedir, $this->workdir);
$this->container_name = generateApplicationContainerName($this->application, $this->pull_request_id);
savePrivateKeyToFs($this->server);
$this->saved_outputs = collect();
@@ -162,12 +165,12 @@ public function handle(): void
]
);
}
- // $this->execute_remote_command(
- // [
- // "docker rm -f {$this->deployment_uuid} >/dev/null 2>&1",
- // "hidden" => true,
- // ]
- // );
+ $this->execute_remote_command(
+ [
+ "docker rm -f {$this->deployment_uuid} >/dev/null 2>&1",
+ "hidden" => true,
+ ]
+ );
}
}
private function deploy_docker_compose()
@@ -459,6 +462,13 @@ private function importing_git_repository()
]);
return $commands->implode(' && ');
}
+ if ($this->application->deploymentType() === 'other') {
+ $git_clone_command = "{$git_clone_command} {$this->application->git_repository} {$this->basedir}";
+ $git_clone_command = $this->set_git_import_settings($git_clone_command);
+ $commands->push(executeInDocker($this->deployment_uuid, $git_clone_command));
+ ray($commands);
+ return $commands->implode(' && ');
+ }
}
private function set_git_import_settings($git_clone_command)
diff --git a/app/Jobs/ApplicationPullRequestUpdateJob.php b/app/Jobs/ApplicationPullRequestUpdateJob.php
index 851c04169d..dbe0ff81c0 100755
--- a/app/Jobs/ApplicationPullRequestUpdateJob.php
+++ b/app/Jobs/ApplicationPullRequestUpdateJob.php
@@ -66,7 +66,7 @@ public function handle()
private function update_comment()
{
- ['data' => $data] = git_api(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/issues/comments/{$this->preview->pull_request_issue_comment_id}", method: 'patch', data: [
+ ['data' => $data] = githubApi(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/issues/comments/{$this->preview->pull_request_issue_comment_id}", method: 'patch', data: [
'body' => $this->body,
], throwError: false);
if (data_get($data, 'message') === 'Not Found') {
@@ -77,7 +77,7 @@ private function update_comment()
private function create_comment()
{
- ['data' => $data] = git_api(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/issues/{$this->pull_request_id}/comments", method: 'post', data: [
+ ['data' => $data] = githubApi(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/issues/{$this->pull_request_id}/comments", method: 'post', data: [
'body' => $this->body,
]);
$this->preview->pull_request_issue_comment_id = $data['id'];
diff --git a/app/Models/Application.php b/app/Models/Application.php
index af2db98ee1..3f5eb54d59 100644
--- a/app/Models/Application.php
+++ b/app/Models/Application.php
@@ -68,6 +68,7 @@ public function gitBranchLocation(): Attribute
if (!is_null($this->source?->html_url) && !is_null($this->git_repository) && !is_null($this->git_branch)) {
return "{$this->source->html_url}/{$this->git_repository}/tree/{$this->git_branch}";
}
+ return $this->git_repository;
}
);
@@ -80,6 +81,7 @@ public function gitCommits(): Attribute
if (!is_null($this->source?->html_url) && !is_null($this->git_repository) && !is_null($this->git_branch)) {
return "{$this->source->html_url}/{$this->git_repository}/commits/{$this->git_branch}";
}
+ return $this->git_repository;
}
);
}
@@ -224,6 +226,8 @@ public function deploymentType()
return 'deploy_key';
} else if (data_get($this, 'source')) {
return 'source';
+ } else {
+ return 'other';
}
throw new \Exception('No deployment type found');
}
@@ -239,6 +243,7 @@ public function git_based(): bool
if ($this->dockerfile) {
return false;
}
+
return true;
}
public function isHealthcheckDisabled(): bool
diff --git a/bootstrap/helpers/github.php b/bootstrap/helpers/github.php
index 5c36f091da..16ac3671a3 100644
--- a/bootstrap/helpers/github.php
+++ b/bootstrap/helpers/github.php
@@ -50,7 +50,7 @@ function generate_github_jwt_token(GithubApp $source)
return $issuedToken;
}
-function git_api(GithubApp|GitlabApp $source, string $endpoint, string $method = 'get', array|null $data = null, bool $throwError = true)
+function githubApi(GithubApp|GitlabApp $source, string $endpoint, string $method = 'get', array|null $data = null, bool $throwError = true)
{
if ($source->getMorphClass() == 'App\Models\GithubApp') {
if ($source->is_public) {
diff --git a/config/sentry.php b/config/sentry.php
index 25eda3bcb4..337e904e10 100644
--- a/config/sentry.php
+++ b/config/sentry.php
@@ -7,7 +7,7 @@
// 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.68',
+ 'release' => '4.0.0-beta.69',
// 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 9877f77ef2..0dafd3ed99 100644
--- a/config/version.php
+++ b/config/version.php
@@ -1,3 +1,3 @@
boolean('smtp_notifications_deployments')->default(true)->change();
+ $table->boolean('smtp_notifications_status_changes')->default(true)->change();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('teams', function (Blueprint $table) {
+ $table->boolean('smtp_notifications_deployments')->default(false)->change();
+ $table->boolean('smtp_notifications_status_changes')->default(false)->change();
+ });
+ }
+};
diff --git a/docker/coolify-helper/Dockerfile b/docker/coolify-helper/Dockerfile
index 5ff46888bb..0202991898 100644
--- a/docker/coolify-helper/Dockerfile
+++ b/docker/coolify-helper/Dockerfile
@@ -8,9 +8,9 @@ ARG DOCKER_COMPOSE_VERSION=2.21.0
# https://github.com/docker/buildx/releases
ARG DOCKER_BUILDX_VERSION=0.11.2
# https://github.com/buildpacks/pack/releases
-ARG PACK_VERSION=0.30.0
+ARG PACK_VERSION=0.31.0
# https://github.com/railwayapp/nixpacks/releases
-ARG NIXPACKS_VERSION=1.16.0
+ARG NIXPACKS_VERSION=1.17.0
USER root
WORKDIR /artifacts
diff --git a/lang/en.json b/lang/en.json
index 6908255fd6..1f4fbdb745 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -20,5 +20,5 @@
"input.code": "One-time code",
"input.recovery_code": "Recovery code",
"button.save": "Save",
- "repository.url": "Examples
https://github.com/coollabsio/coolify-examples main branch will be selected
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify branch will be selected"
-}
\ No newline at end of file
+ "repository.url": "Examples
For Public repositories, use https://....
For Private repositories, use git@....
https://github.com/coollabsio/coolify-examples main branch will be selected
https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify nodejs-fastify branch will be selected.
https://gitea.com/sedlav/expressjs.git main branch will be selected.
https://gitlab.com/andrasbacsai/nodejs-example.git main branch will be selected."
+}
diff --git a/resources/views/components/emails/footer.blade.php b/resources/views/components/emails/footer.blade.php
index fba408caee..199aa96c14 100644
--- a/resources/views/components/emails/footer.blade.php
+++ b/resources/views/components/emails/footer.blade.php
@@ -3,4 +3,4 @@
Thank you,
{{ config('app.name') ?? 'Coolify' }}
-{{ Illuminate\Mail\Markdown::parse('[Contact Support](https://docs.coollabs.io/contact)') }}
+{{ Illuminate\Mail\Markdown::parse('[Contact Support](https://coolify.io/docs/contact)') }}
diff --git a/resources/views/components/pricing-plans.blade.php b/resources/views/components/pricing-plans.blade.php
index 9b1070e2d4..c80a2353ec 100644
--- a/resources/views/components/pricing-plans.blade.php
+++ b/resources/views/components/pricing-plans.blade.php
@@ -81,7 +81,7 @@ class="grid max-w-sm grid-cols-1 -mt-16 divide-y divide-coolgray-500 isolate gap
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z"
clip-rule="evenodd" />
- 1 server