mirror of
https://github.com/ershisan99/coolify.git
synced 2026-01-01 20:59:24 +00:00
Compare commits
21 Commits
v4.0.0-bet
...
v4.0.0-bet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b6531cdb10 | ||
|
|
0eef4a5fa1 | ||
|
|
42baaf8f2d | ||
|
|
08d9dff8eb | ||
|
|
01b3aab9bc | ||
|
|
fde34ef178 | ||
|
|
5195abec94 | ||
|
|
aa79acd09e | ||
|
|
67011ccd72 | ||
|
|
e2cd7fe17e | ||
|
|
4c0624f489 | ||
|
|
8c033250b1 | ||
|
|
05b5a6fddf | ||
|
|
df5bde7b8e | ||
|
|
ca5f52c48c | ||
|
|
3656adf059 | ||
|
|
4381792b05 | ||
|
|
0a3c20b08a | ||
|
|
4ab3f41665 | ||
|
|
10356a4376 | ||
|
|
98c2056f53 |
@@ -56,7 +56,7 @@ class Handler extends ExceptionHandler
|
|||||||
{
|
{
|
||||||
$this->reportable(function (Throwable $e) {
|
$this->reportable(function (Throwable $e) {
|
||||||
if (isDev()) {
|
if (isDev()) {
|
||||||
// return;
|
return;
|
||||||
}
|
}
|
||||||
if ($e instanceof RuntimeException) {
|
if ($e instanceof RuntimeException) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
|
|||||||
private string $deployment_uuid;
|
private string $deployment_uuid;
|
||||||
private int $pull_request_id;
|
private int $pull_request_id;
|
||||||
private string $commit;
|
private string $commit;
|
||||||
|
private bool $rollback;
|
||||||
private bool $force_rebuild;
|
private bool $force_rebuild;
|
||||||
private bool $restart_only;
|
private bool $restart_only;
|
||||||
|
|
||||||
@@ -117,6 +118,7 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
|
|||||||
$this->deployment_uuid = $this->application_deployment_queue->deployment_uuid;
|
$this->deployment_uuid = $this->application_deployment_queue->deployment_uuid;
|
||||||
$this->pull_request_id = $this->application_deployment_queue->pull_request_id;
|
$this->pull_request_id = $this->application_deployment_queue->pull_request_id;
|
||||||
$this->commit = $this->application_deployment_queue->commit;
|
$this->commit = $this->application_deployment_queue->commit;
|
||||||
|
$this->rollback = $this->application_deployment_queue->rollback;
|
||||||
$this->force_rebuild = $this->application_deployment_queue->force_rebuild;
|
$this->force_rebuild = $this->application_deployment_queue->force_rebuild;
|
||||||
$this->restart_only = $this->application_deployment_queue->restart_only;
|
$this->restart_only = $this->application_deployment_queue->restart_only;
|
||||||
$this->only_this_server = $this->application_deployment_queue->only_this_server;
|
$this->only_this_server = $this->application_deployment_queue->only_this_server;
|
||||||
@@ -767,6 +769,9 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
|
|||||||
$envs->push("SOURCE_COMMIT=unknown");
|
$envs->push("SOURCE_COMMIT=unknown");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$envs = $envs->sort(function ($a, $b) {
|
||||||
|
return strpos($a, '$') === false ? -1 : 1;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($envs->isEmpty()) {
|
if ($envs->isEmpty()) {
|
||||||
@@ -786,9 +791,18 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
|
|||||||
"save" => "dotenv"
|
"save" => "dotenv"
|
||||||
]);
|
]);
|
||||||
if (str($this->saved_outputs->get('dotenv'))->isNotEmpty()) {
|
if (str($this->saved_outputs->get('dotenv'))->isNotEmpty()) {
|
||||||
|
$base64_dotenv = base64_encode($this->saved_outputs->get('dotenv')->value());
|
||||||
$this->execute_remote_command(
|
$this->execute_remote_command(
|
||||||
[
|
[
|
||||||
"echo '{$this->saved_outputs->get('dotenv')->value()}' | tee $this->configuration_dir/.env > /dev/null"
|
"echo '{$base64_dotenv}' | base64 -d | tee $this->configuration_dir/.env > /dev/null"
|
||||||
|
]
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->execute_remote_command(
|
||||||
|
[
|
||||||
|
"command" => "rm -f $this->configuration_dir/.env",
|
||||||
|
"hidden" => true,
|
||||||
|
"ignore_errors" => true
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -1059,7 +1073,7 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if ($this->saved_outputs->get('git_commit_sha')) {
|
if ($this->saved_outputs->get('git_commit_sha') && !$this->rollback) {
|
||||||
$this->commit = $this->saved_outputs->get('git_commit_sha')->before("\t");
|
$this->commit = $this->saved_outputs->get('git_commit_sha')->before("\t");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1225,8 +1239,10 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted
|
|||||||
if ($this->pull_request_id !== 0) {
|
if ($this->pull_request_id !== 0) {
|
||||||
$labels = collect(generateLabelsApplication($this->application, $this->preview));
|
$labels = collect(generateLabelsApplication($this->application, $this->preview));
|
||||||
}
|
}
|
||||||
|
$labels = $labels->map(function ($value, $key) {
|
||||||
|
return escapeDollarSign($value);
|
||||||
|
});
|
||||||
$labels = $labels->merge(defaultLabels($this->application->id, $this->application->uuid, $this->pull_request_id))->toArray();
|
$labels = $labels->merge(defaultLabels($this->application->id, $this->application->uuid, $this->pull_request_id))->toArray();
|
||||||
|
|
||||||
// Check for custom HEALTHCHECK
|
// Check for custom HEALTHCHECK
|
||||||
$this->custom_healthcheck_found = false;
|
$this->custom_healthcheck_found = false;
|
||||||
if ($this->application->build_pack === 'dockerfile' || $this->application->dockerfile) {
|
if ($this->application->build_pack === 'dockerfile' || $this->application->dockerfile) {
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ class Rollback extends Component
|
|||||||
{
|
{
|
||||||
$this->parameters = get_route_parameters();
|
$this->parameters = get_route_parameters();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function rollbackImage($commit)
|
public function rollbackImage($commit)
|
||||||
{
|
{
|
||||||
$deployment_uuid = new Cuid2(7);
|
$deployment_uuid = new Cuid2(7);
|
||||||
@@ -27,6 +26,7 @@ class Rollback extends Component
|
|||||||
application: $this->application,
|
application: $this->application,
|
||||||
deployment_uuid: $deployment_uuid,
|
deployment_uuid: $deployment_uuid,
|
||||||
commit: $commit,
|
commit: $commit,
|
||||||
|
rollback: true,
|
||||||
force_rebuild: false,
|
force_rebuild: false,
|
||||||
);
|
);
|
||||||
return redirect()->route('project.application.deployment.show', [
|
return redirect()->route('project.application.deployment.show', [
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ class StackForm extends Component
|
|||||||
$this->validationAttributes["fields.$key.value"] = $fieldKey;
|
$this->validationAttributes["fields.$key.value"] = $fieldKey;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->fields = $this->fields->sort();
|
$this->fields = $this->fields->sortDesc();
|
||||||
}
|
}
|
||||||
public function saveCompose($raw)
|
public function saveCompose($raw)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -69,13 +69,14 @@ class Configuration extends Component
|
|||||||
}
|
}
|
||||||
$this->validate();
|
$this->validate();
|
||||||
|
|
||||||
if ($this->settings->is_dns_validation_enabled) {
|
if ($this->settings->is_dns_validation_enabled && $this->settings->fqdn) {
|
||||||
|
ray('asdf');
|
||||||
if (!validate_dns_entry($this->settings->fqdn, $this->server)) {
|
if (!validate_dns_entry($this->settings->fqdn, $this->server)) {
|
||||||
$this->dispatch('error', "Validating DNS ({$this->settings->fqdn}) failed.<br><br>Make sure you have added the DNS records correctly.<br><br>Check this <a target='_blank' class='underline dark:text-white' href='https://coolify.io/docs/knowledge-base/dns-configuration'>documentation</a> for further help.");
|
$this->dispatch('error', "Validating DNS ({$this->settings->fqdn}) failed.<br><br>Make sure you have added the DNS records correctly.<br><br>Check this <a target='_blank' class='underline dark:text-white' href='https://coolify.io/docs/knowledge-base/dns-configuration'>documentation</a> for further help.");
|
||||||
$error_show = true;
|
$error_show = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
check_domain_usage(domain: $this->settings->fqdn);
|
if ($this->settings->fqdn) check_domain_usage(domain: $this->settings->fqdn);
|
||||||
$this->settings->custom_dns_servers = str($this->settings->custom_dns_servers)->replaceEnd(',', '')->trim();
|
$this->settings->custom_dns_servers = str($this->settings->custom_dns_servers)->replaceEnd(',', '')->trim();
|
||||||
$this->settings->custom_dns_servers = str($this->settings->custom_dns_servers)->trim()->explode(',')->map(function ($dns) {
|
$this->settings->custom_dns_servers = str($this->settings->custom_dns_servers)->trim()->explode(',')->map(function ($dns) {
|
||||||
return str($dns)->trim()->lower();
|
return str($dns)->trim()->lower();
|
||||||
|
|||||||
@@ -150,6 +150,29 @@ class Service extends BaseModel
|
|||||||
foreach ($applications as $application) {
|
foreach ($applications as $application) {
|
||||||
$image = str($application->image)->before(':')->value();
|
$image = str($application->image)->before(':')->value();
|
||||||
switch ($image) {
|
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'):
|
case str($image)?->contains('logto'):
|
||||||
$data = collect([]);
|
$data = collect([]);
|
||||||
$logto_endpoint = $this->environment_variables()->where('key', 'LOGTO_ENDPOINT')->first();
|
$logto_endpoint = $this->environment_variables()->where('key', 'LOGTO_ENDPOINT')->first();
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ use App\Models\StandaloneDocker;
|
|||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
use Spatie\Url\Url;
|
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)
|
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, bool $rollback = false)
|
||||||
{
|
{
|
||||||
$application_id = $application->id;
|
$application_id = $application->id;
|
||||||
$deployment_link = Url::fromString($application->link() . "/deployment/{$deployment_uuid}");
|
$deployment_link = Url::fromString($application->link() . "/deployment/{$deployment_uuid}");
|
||||||
@@ -38,6 +38,7 @@ function queue_application_deployment(Application $application, string $deployme
|
|||||||
'is_webhook' => $is_webhook,
|
'is_webhook' => $is_webhook,
|
||||||
'restart_only' => $restart_only,
|
'restart_only' => $restart_only,
|
||||||
'commit' => $commit,
|
'commit' => $commit,
|
||||||
|
'rollback' => $rollback,
|
||||||
'git_type' => $git_type,
|
'git_type' => $git_type,
|
||||||
'only_this_server' => $only_this_server
|
'only_this_server' => $only_this_server
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ function remote_process(
|
|||||||
if ($server->isNonRoot()) {
|
if ($server->isNonRoot()) {
|
||||||
$command = parseCommandsByLineForSudo(collect($command), $server);
|
$command = parseCommandsByLineForSudo(collect($command), $server);
|
||||||
}
|
}
|
||||||
ray($command);
|
|
||||||
$command_string = implode("\n", $command);
|
$command_string = implode("\n", $command);
|
||||||
if (auth()->user()) {
|
if (auth()->user()) {
|
||||||
$teams = auth()->user()->teams->pluck('id');
|
$teams = auth()->user()->teams->pluck('id');
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ return [
|
|||||||
|
|
||||||
// The release version of your application
|
// The release version of your application
|
||||||
// Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
|
// 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.263',
|
||||||
// When left empty or `null` the Laravel environment will be used
|
// When left empty or `null` the Laravel environment will be used
|
||||||
'environment' => config('app.env'),
|
'environment' => config('app.env'),
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
return '4.0.0-beta.259';
|
return '4.0.0-beta.263';
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('application_deployment_queues', function (Blueprint $table) {
|
||||||
|
$table->boolean('rollback')->default(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('application_deployment_queues', function (Blueprint $table) {
|
||||||
|
$table->dropColumn('rollback');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -95,7 +95,7 @@ services:
|
|||||||
expose:
|
expose:
|
||||||
- "${APP_PORT:-8000}"
|
- "${APP_PORT:-8000}"
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: curl --fail http://localhost:80/api/health || exit 1
|
test: curl --fail http://127.0.0.1:80/api/health || exit 1
|
||||||
interval: 5s
|
interval: 5s
|
||||||
retries: 10
|
retries: 10
|
||||||
timeout: 2s
|
timeout: 2s
|
||||||
@@ -142,7 +142,7 @@ services:
|
|||||||
SOKETI_DEFAULT_APP_KEY: "${PUSHER_APP_KEY}"
|
SOKETI_DEFAULT_APP_KEY: "${PUSHER_APP_KEY}"
|
||||||
SOKETI_DEFAULT_APP_SECRET: "${PUSHER_APP_SECRET}"
|
SOKETI_DEFAULT_APP_SECRET: "${PUSHER_APP_SECRET}"
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: wget -qO- http://localhost:6001/ready || exit 1
|
test: wget -qO- http://127.0.0.1:6001/ready || exit 1
|
||||||
interval: 5s
|
interval: 5s
|
||||||
retries: 10
|
retries: 10
|
||||||
timeout: 2s
|
timeout: 2s
|
||||||
|
|||||||
@@ -83,48 +83,48 @@
|
|||||||
<livewire:project.application.general :application="$application" />
|
<livewire:project.application.general :application="$application" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'swarm'" class="h-full">
|
<div x-cloak x-show="activeTab === 'swarm'" class="h-full">
|
||||||
<livewire:project.application.swarm :application="$application" lazy />
|
<livewire:project.application.swarm :application="$application" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'advanced'" class="h-full">
|
<div x-cloak x-show="activeTab === 'advanced'" class="h-full">
|
||||||
<livewire:project.application.advanced :application="$application" lazy />
|
<livewire:project.application.advanced :application="$application" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'environment-variables'">
|
<div x-cloak x-show="activeTab === 'environment-variables'">
|
||||||
<livewire:project.shared.environment-variable.all :resource="$application" lazy />
|
<livewire:project.shared.environment-variable.all :resource="$application" />
|
||||||
</div>
|
</div>
|
||||||
@if ($application->git_based())
|
@if ($application->git_based())
|
||||||
<div x-cloak x-show="activeTab === 'source'">
|
<div x-cloak x-show="activeTab === 'source'">
|
||||||
<livewire:project.application.source :application="$application" lazy />
|
<livewire:project.application.source :application="$application" />
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
<div x-cloak x-show="activeTab === 'servers'">
|
<div x-cloak x-show="activeTab === 'servers'">
|
||||||
<livewire:project.shared.destination :resource="$application" :servers="$servers" lazy />
|
<livewire:project.shared.destination :resource="$application" :servers="$servers" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'storages'">
|
<div x-cloak x-show="activeTab === 'storages'">
|
||||||
<livewire:project.service.storage :resource="$application" lazy />
|
<livewire:project.service.storage :resource="$application" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'webhooks'">
|
<div x-cloak x-show="activeTab === 'webhooks'">
|
||||||
<livewire:project.shared.webhooks :resource="$application" lazy />
|
<livewire:project.shared.webhooks :resource="$application" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'previews'">
|
<div x-cloak x-show="activeTab === 'previews'">
|
||||||
<livewire:project.application.previews :application="$application" lazy />
|
<livewire:project.application.previews :application="$application" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'health'">
|
<div x-cloak x-show="activeTab === 'health'">
|
||||||
<livewire:project.shared.health-checks :resource="$application" lazy />
|
<livewire:project.shared.health-checks :resource="$application" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'rollback'">
|
<div x-cloak x-show="activeTab === 'rollback'">
|
||||||
<livewire:project.application.rollback :application="$application" lazy />
|
<livewire:project.application.rollback :application="$application" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'resource-limits'">
|
<div x-cloak x-show="activeTab === 'resource-limits'">
|
||||||
<livewire:project.shared.resource-limits :resource="$application" lazy />
|
<livewire:project.shared.resource-limits :resource="$application" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'scheduled-tasks'">
|
<div x-cloak x-show="activeTab === 'scheduled-tasks'">
|
||||||
<livewire:project.shared.scheduled-task.all :resource="$application" lazy />
|
<livewire:project.shared.scheduled-task.all :resource="$application" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'resource-operations'">
|
<div x-cloak x-show="activeTab === 'resource-operations'">
|
||||||
<livewire:project.shared.resource-operations :resource="$application" lazy />
|
<livewire:project.shared.resource-operations :resource="$application" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'tags'">
|
<div x-cloak x-show="activeTab === 'tags'">
|
||||||
<livewire:project.shared.tags :resource="$application" lazy />
|
<livewire:project.shared.tags :resource="$application" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'danger'">
|
<div x-cloak x-show="activeTab === 'danger'">
|
||||||
<livewire:project.shared.danger :resource="$application" />
|
<livewire:project.shared.danger :resource="$application" />
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
<div class="pb-4">Previews</div>
|
<div class="pb-4">Previews</div>
|
||||||
<div class="flex flex-wrap gap-6">
|
<div class="flex flex-wrap gap-6">
|
||||||
@foreach ($application->previews as $preview)
|
@foreach ($application->previews as $preview)
|
||||||
<div class="flex flex-col p-4 dark:bg-coolgray-200">
|
<div class="flex flex-col p-4 dark:bg-coolgray-100">
|
||||||
<div class="flex gap-2">PR #{{ data_get($preview, 'pull_request_id') }} |
|
<div class="flex gap-2">PR #{{ data_get($preview, 'pull_request_id') }} |
|
||||||
@if (Str::of(data_get($preview, 'status'))->startsWith('running'))
|
@if (Str::of(data_get($preview, 'status'))->startsWith('running'))
|
||||||
<x-status.running :status="data_get($preview, 'status')" />
|
<x-status.running :status="data_get($preview, 'status')" />
|
||||||
@@ -86,18 +86,20 @@
|
|||||||
Redeploy
|
Redeploy
|
||||||
@endif
|
@endif
|
||||||
</x-forms.button>
|
</x-forms.button>
|
||||||
<a
|
@if (count($parameters) > 0)
|
||||||
href="{{ route('project.application.deployment.index', [...$parameters, 'pull_request_id' => data_get($preview, 'pull_request_id')]) }}">
|
<a
|
||||||
<x-forms.button class="dark:bg-coolgray-500">
|
href="{{ route('project.application.deployment.index', [...$parameters, 'pull_request_id' => data_get($preview, 'pull_request_id')]) }}">
|
||||||
Deployment Logs
|
<x-forms.button class="dark:bg-coolgray-500">
|
||||||
</x-forms.button>
|
Deployment Logs
|
||||||
</a>
|
</x-forms.button>
|
||||||
<a
|
</a>
|
||||||
href="{{ route('project.application.logs', [...$parameters, 'pull_request_id' => data_get($preview, 'pull_request_id')]) }}">
|
<a
|
||||||
<x-forms.button class="dark:bg-coolgray-500">
|
href="{{ route('project.application.logs', [...$parameters, 'pull_request_id' => data_get($preview, 'pull_request_id')]) }}">
|
||||||
Application Logs
|
<x-forms.button class="dark:bg-coolgray-500">
|
||||||
</x-forms.button>
|
Application Logs
|
||||||
</a>
|
</x-forms.button>
|
||||||
|
</a>
|
||||||
|
@endif
|
||||||
<x-forms.button isError class="dark:bg-coolgray-500"
|
<x-forms.button isError class="dark:bg-coolgray-500"
|
||||||
wire:click="stop({{ data_get($preview, 'pull_request_id') }})">Delete
|
wire:click="stop({{ data_get($preview, 'pull_request_id') }})">Delete
|
||||||
</x-forms.button>
|
</x-forms.button>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<div class="flex flex-wrap">
|
<div class="flex flex-wrap">
|
||||||
@forelse ($images as $image)
|
@forelse ($images as $image)
|
||||||
<div class="w-2/4 p-2">
|
<div class="w-2/4 p-2">
|
||||||
<div class="bg-white border rounded dark:border-bg-black dark:bg-coolgray-100">
|
<div class="bg-white border rounded dark:border-black dark:bg-coolgray-100">
|
||||||
<div class="p-2">
|
<div class="p-2">
|
||||||
<div class="">
|
<div class="">
|
||||||
@if (data_get($image, 'is_current'))
|
@if (data_get($image, 'is_current'))
|
||||||
|
|||||||
@@ -75,7 +75,8 @@
|
|||||||
<x-modal-input title="Edit Domains">
|
<x-modal-input title="Edit Domains">
|
||||||
<x-slot:content>
|
<x-slot:content>
|
||||||
<span class="cursor-pointer">
|
<span class="cursor-pointer">
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="w-4 h-4 dark:text-warning text-coollabs"
|
<svg xmlns="http://www.w3.org/2000/svg"
|
||||||
|
class="w-4 h-4 dark:text-warning text-coollabs"
|
||||||
viewBox="0 0 24 24">
|
viewBox="0 0 24 24">
|
||||||
<g fill="none" stroke="currentColor"
|
<g fill="none" stroke="currentColor"
|
||||||
stroke-linecap="round" stroke-linejoin="round"
|
stroke-linecap="round" stroke-linejoin="round"
|
||||||
@@ -89,7 +90,8 @@
|
|||||||
</span>
|
</span>
|
||||||
</x-slot:content>
|
</x-slot:content>
|
||||||
<livewire:project.service.edit-domain
|
<livewire:project.service.edit-domain
|
||||||
applicationId="{{ $application->id }}" wire:key="edit-domain-{{ $application->id }}" />
|
applicationId="{{ $application->id }}"
|
||||||
|
wire:key="edit-domain-{{ $application->id }}" />
|
||||||
</x-modal-input>
|
</x-modal-input>
|
||||||
</span>
|
</span>
|
||||||
@endif
|
@endif
|
||||||
@@ -160,29 +162,29 @@
|
|||||||
<span class="dark:text-warning">Please modify storage layout in your Docker Compose file.</span>
|
<span class="dark:text-warning">Please modify storage layout in your Docker Compose file.</span>
|
||||||
@foreach ($applications as $application)
|
@foreach ($applications as $application)
|
||||||
<livewire:project.service.storage wire:key="application-{{ $application->id }}"
|
<livewire:project.service.storage wire:key="application-{{ $application->id }}"
|
||||||
:resource="$application" lazy />
|
:resource="$application" />
|
||||||
@endforeach
|
@endforeach
|
||||||
@foreach ($databases as $database)
|
@foreach ($databases as $database)
|
||||||
<livewire:project.service.storage wire:key="database-{{ $database->id }}" :resource="$database" lazy />
|
<livewire:project.service.storage wire:key="database-{{ $database->id }}" :resource="$database" />
|
||||||
@endforeach
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'webhooks'">
|
<div x-cloak x-show="activeTab === 'webhooks'">
|
||||||
<livewire:project.shared.webhooks :resource="$service" lazy />
|
<livewire:project.shared.webhooks :resource="$service" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'logs'">
|
<div x-cloak x-show="activeTab === 'logs'">
|
||||||
<livewire:project.shared.logs :resource="$service" />
|
<livewire:project.shared.logs :resource="$service" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'execute-command'">
|
<div x-cloak x-show="activeTab === 'execute-command'">
|
||||||
<livewire:project.shared.execute-container-command :resource="$service" />
|
<livewire:project.shared.execute-container-command :resource="$service" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'environment-variables'">
|
<div x-cloak x-show="activeTab === 'environment-variables'">
|
||||||
<livewire:project.shared.environment-variable.all :resource="$service" lazy />
|
<livewire:project.shared.environment-variable.all :resource="$service" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'resource-operations'">
|
<div x-cloak x-show="activeTab === 'resource-operations'">
|
||||||
<livewire:project.shared.resource-operations :resource="$service" lazy />
|
<livewire:project.shared.resource-operations :resource="$service" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'tags'">
|
<div x-cloak x-show="activeTab === 'tags'">
|
||||||
<livewire:project.shared.tags :resource="$service" lazy />
|
<livewire:project.shared.tags :resource="$service" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'danger'">
|
<div x-cloak x-show="activeTab === 'danger'">
|
||||||
<livewire:project.shared.danger :resource="$service" />
|
<livewire:project.shared.danger :resource="$service" />
|
||||||
|
|||||||
@@ -23,10 +23,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="grid grid-cols-2 gap-2">
|
<div class="grid grid-cols-2 gap-2">
|
||||||
@foreach ($fields as $serviceName => $field)
|
@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' }}"
|
<x-forms.input type="{{ data_get($field, 'isPassword') ? 'password' : 'text' }}"
|
||||||
required="{{ str(data_get($field, 'rules'))?->contains('required') }}"
|
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>
|
id="fields.{{ $serviceName }}.value"></x-forms.input>
|
||||||
@endforeach
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# documentation: https://appsmith.com
|
# documentation: https://appsmith.com
|
||||||
# slogan: Appsmith is low-code application platform for building internal tools.
|
# slogan: A low-code application platform for building internal tools.
|
||||||
# tags: lowcode,nocode,no,low,platform
|
# tags: lowcode,nocode,no,low,platform
|
||||||
# logo: svgs/appsmith.svg
|
# logo: svgs/appsmith.svg
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# documentation: https://appwrite.io
|
# documentation: https://appwrite.io
|
||||||
# slogan: Appwrite is backend-as-a-service platform that simplifies the web & mobile app development.
|
# slogan: A backend-as-a-service platform that simplifies the web & mobile app development.
|
||||||
# env_file: appwrite.env
|
# env_file: appwrite.env
|
||||||
# tags: backend-as-a-service, platform
|
# tags: backend-as-a-service, platform
|
||||||
# logo: svgs/appwrite.svg
|
# logo: svgs/appwrite.svg
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# documentation: https://docs.baby-buddy.net
|
# documentation: https://docs.baby-buddy.net
|
||||||
# slogan: Baby Buddy helps parents track their baby's daily activities, growth, and health with ease.
|
# slogan: It helps parents track their baby's daily activities, growth, and health with ease.
|
||||||
# tags: baby, parents, health, growth, activities
|
# tags: baby, parents, health, growth, activities
|
||||||
# logo: svgs/babybuddy.png
|
# logo: svgs/babybuddy.png
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# documentation: https://github.com/linuxserver/budge
|
# documentation: https://github.com/linuxserver/budge
|
||||||
# slogan: Budge is a budgeting personal finance app.
|
# slogan: A budgeting personal finance app.
|
||||||
# tags: personal finance, budgeting, expense tracking
|
# tags: personal finance, budgeting, expense tracking
|
||||||
|
|
||||||
services:
|
services:
|
||||||
|
|||||||
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
|
||||||
File diff suppressed because one or more lines are too long
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"coolify": {
|
"coolify": {
|
||||||
"v4": {
|
"v4": {
|
||||||
"version": "4.0.0-beta.259"
|
"version": "4.0.0-beta.263"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user