diff --git a/.dockerignore b/.dockerignore index 2eba3cb46..0adca0b32 100644 --- a/.dockerignore +++ b/.dockerignore @@ -24,3 +24,4 @@ yarn-error.log /.ssh .ignition.json .env.dusk.local +docker/coolify-realtime/node_modules diff --git a/.gitattributes b/.gitattributes index fcb21d396..c48a5898b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8,4 +8,4 @@ /.github export-ignore CHANGELOG.md export-ignore -.styleci.yml export-ignore +.styleci.yml export-ignore \ No newline at end of file diff --git a/.github/workflows/coolify-production-build.yml b/.github/workflows/coolify-production-build.yml index 7017b4897..5271143ec 100644 --- a/.github/workflows/coolify-production-build.yml +++ b/.github/workflows/coolify-production-build.yml @@ -11,7 +11,7 @@ on: - docker/coolify-helper/Dockerfile - docker/coolify-realtime/Dockerfile - docker/testing-host/Dockerfile - - templates/service-templates.json + - templates/** env: GITHUB_REGISTRY: ghcr.io @@ -41,7 +41,7 @@ jobs: - name: Get Version id: version run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getVersion.php)"|xargs >> $GITHUB_OUTPUT] + echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getVersion.php)"|xargs >> $GITHUB_OUTPUT - name: Build and Push Image uses: docker/build-push-action@v6 @@ -76,7 +76,7 @@ jobs: - name: Get Version id: version run: | - echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getVersion.php)"|xargs >> $GITHUB_OUTPUT] + echo "VERSION=$(docker run --rm -v "$(pwd):/app" -w /app php:8.2-alpine3.16 php bootstrap/getVersion.php)"|xargs >> $GITHUB_OUTPUT - name: Build and Push Image uses: docker/build-push-action@v6 diff --git a/.github/workflows/coolify-realtime-next.yml b/.github/workflows/coolify-realtime-next.yml index 7e937d17a..ef247170f 100644 --- a/.github/workflows/coolify-realtime-next.yml +++ b/.github/workflows/coolify-realtime-next.yml @@ -8,6 +8,7 @@ on: - docker/coolify-realtime/Dockerfile - docker/coolify-realtime/terminal-server.js - docker/coolify-realtime/package.json + - docker/coolify-realtime/package-lock.json - docker/coolify-realtime/soketi-entrypoint.sh env: diff --git a/.github/workflows/coolify-realtime.yml b/.github/workflows/coolify-realtime.yml index 97bfd52eb..9654a21b0 100644 --- a/.github/workflows/coolify-realtime.yml +++ b/.github/workflows/coolify-realtime.yml @@ -8,6 +8,7 @@ on: - docker/coolify-realtime/Dockerfile - docker/coolify-realtime/terminal-server.js - docker/coolify-realtime/package.json + - docker/coolify-realtime/package-lock.json - docker/coolify-realtime/soketi-entrypoint.sh env: diff --git a/.github/workflows/coolify-staging-build.yml b/.github/workflows/coolify-staging-build.yml index 6e4d4adc3..2c57a36a3 100644 --- a/.github/workflows/coolify-staging-build.yml +++ b/.github/workflows/coolify-staging-build.yml @@ -11,7 +11,7 @@ on: - docker/coolify-helper/Dockerfile - docker/coolify-realtime/Dockerfile - docker/testing-host/Dockerfile - - templates/service-templates.json + - templates/** env: GITHUB_REGISTRY: ghcr.io diff --git a/.gitignore b/.gitignore index 1a021ab3e..d7ee7e96c 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,5 @@ _ide_helper_models.php scripts/load-test/* .ignition.json .env.dusk.local +docker/coolify-realtime/node_modules +.DS_Store diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index 6fd6797b5..000000000 --- a/.gitpod.yml +++ /dev/null @@ -1,65 +0,0 @@ -tasks: - - name: Setup Spin environment and Composer dependencies - # Fix because of https://github.com/gitpod-io/gitpod/issues/16614 - before: sudo curl -o /usr/local/bin/docker-compose -fsSL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-$(uname -m) - init: | - cp .env.development.example .env && - sed -i "s#APP_URL=http://localhost#APP_URL=$(gp url 8000)#g" .env - sed -i "s#USERID=#USERID=33333#g" .env - sed -i "s#GROUPID=#GROUPID=33333#g" .env - composer install --ignore-platform-reqs - ./vendor/bin/spin up -d - ./vendor/bin/spin exec -u webuser coolify php artisan key:generate - ./vendor/bin/spin exec -u webuser coolify php artisan storage:link - ./vendor/bin/spin exec -u webuser coolify php artisan migrate:fresh --seed - cat .coolify-logo - gp sync-done spin-is-ready - - - name: Install Node dependencies and run Vite - command: | - echo "Waiting for Sail environment to boot up." - gp sync-await spin-is-ready - ./vendor/bin/spin exec vite npm install - ./vendor/bin/spin exec vite npm run dev -- --host - - - name: Laravel Queue Worker, listening to code changes - command: | - echo "Waiting for Sail environment to boot up." - gp sync-await spin-is-ready - ./vendor/bin/spin exec -u webuser coolify php artisan queue:listen - -ports: - - port: 5432 - onOpen: ignore - name: PostgreSQL - visibility: public - - port: 5173 - onOpen: ignore - visibility: public - name: Node Server for Vite - - port: 8000 - onOpen: ignore - visibility: public - name: Coolify - -# Configure vscode -vscode: - extensions: - - bmewburn.vscode-intelephense-client - - ikappas.composer - - ms-azuretools.vscode-docker - - ecmel.vscode-html-css - - MehediDracula.php-namespace-resolver - - wmaurer.change-case - - Equinusocio.vsc-community-material-theme - - EditorConfig.EditorConfig - - streetsidesoftware.code-spell-checker - - rangav.vscode-thunder-client - - PKief.material-icon-theme - - cierra.livewire-vscode - - lennardv.livewire-goto-updated - - bradlc.vscode-tailwindcss - - heybourn.headwind - - adrianwilczynski.alpine-js-intellisense - - amiralizadeh9480.laravel-extra-intellisense - - shufo.vscode-blade-formatter diff --git a/README.md b/README.md index 14a741088..8868bcea6 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,9 @@ curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash ``` You can find the installation script source [here](./scripts/install.sh). +> [!NOTE] +> Please refer to the [docs](https://coolify.io/docs/installation) for more information about the installation. + # Support Contact us at [coolify.io/docs/contact](https://coolify.io/docs/contact). @@ -121,7 +124,6 @@ By subscribing to the cloud version, you get the Coolify server for the same pri - Better support - Less maintenance for you - # Recognitions
@@ -138,6 +140,13 @@ By subscribing to the cloud version, you get the Coolify server for the same pri
+ {{ $message }} 400 {{ $exception->getMessage() }} The request could not be understood by the server due to
+ malformed syntax.
+ 500 There has been an error, we are working on it.
This will install the latest Docker Engine on your server, configure a few things to be able
- to run optimal. Warning! Disabling two step confirmation reduces security (as anyone can easily delete anything) and
+ increases
+ the risk of accidental actions. This is not recommended for production servers. Warning! Disabling two step confirmation reduces security (as anyone can easily delete anything) and increases
- the
- risk of accidental actions. This is not recommended for production servers.
+# Core Maintainers
+
+| Andras Bacsai | Peak |
+|------------|------------|
+|
|
|
+|
|
|
+
# Repo Activity

diff --git a/RELEASE.md b/RELEASE.md
index d9f05f17d..bc159b040 100644
--- a/RELEASE.md
+++ b/RELEASE.md
@@ -1,6 +1,6 @@
# Coolify Release Guide
-This guide outlines the release process for Coolify, intended for developers and those interested in understanding how releases are managed and deployed.
+This guide outlines the release process for Coolify, intended for developers and those interested in understanding how Coolify releases are managed and deployed.
## Table of Contents
- [Release Process](#release-process)
@@ -19,19 +19,19 @@ This guide outlines the release process for Coolify, intended for developers and
- Improvements, fixes, and new features are developed on the `next` branch or separate feature branches.
2. **Merging to `main`**
- - Once ready, changes are merged from the `next` branch into the `main` branch.
+ - Once ready, changes are merged from the `next` branch into the `main` branch (via a pull request).
3. **Building the Release**
- - After merging to `main`, GitHub Actions automatically builds release images for all architectures and pushes them to the GitHub Container Registry with the version tag and the `latest` tag.
+ - After merging to `main`, GitHub Actions automatically builds release images for all architectures and pushes them to the GitHub Container Registry and Docker Hub with the specific version tag and the `latest` tag.
4. **Creating a GitHub Release**
- A new GitHub release is manually created with details of the changes made in the version.
5. **Updating the CDN**
- - To make a new version publicly available, the version information on the CDN needs to be updated: [https://cdn.coollabs.io/coolify/versions.json](https://cdn.coollabs.io/coolify/versions.json)
+ - To make a new version publicly available, the version information on the CDN needs to be updated manually. After that the new version number will be available at [https://cdn.coollabs.io/coolify/versions.json](https://cdn.coollabs.io/coolify/versions.json).
> [!NOTE]
-> The CDN update may not occur immediately after the GitHub release. It can take hours or even days due to additional testing, stability checks, or potential hotfixes. **The update becomes available only after the CDN is updated.**
+> The CDN update may not occur immediately after the GitHub release. It can take hours or even days due to additional testing, stability checks, or potential hotfixes. **The update becomes available only after the CDN is updated. After the CDN is updated, a discord announcement will be made in the Production Release channel.**
## Version Types
@@ -39,10 +39,10 @@ This guide outlines the release process for Coolify, intended for developers and
Check this documentation for further help.
Error: '.$error);
-
- return;
- }
- }
-
- public function validateServer($install = true)
- {
- $this->server->update([
- 'validation_logs' => null,
- ]);
- $this->dispatch('init', $install);
- }
-
- public function submit()
- {
- try {
- if (isCloud() && ! isDev()) {
- $this->validate();
- $this->validate([
- 'server.ip' => 'required',
- ]);
- } else {
- $this->validate();
- }
- $uniqueIPs = Server::all()->reject(function (Server $server) {
- return $server->id === $this->server->id;
- })->pluck('ip')->toArray();
- if (in_array($this->server->ip, $uniqueIPs)) {
- $this->dispatch('error', 'IP address is already in use by another team.');
-
- return;
- }
- refresh_server_connection($this->server->privateKey);
- $this->server->settings->wildcard_domain = $this->wildcard_domain;
- $currentTimezone = $this->server->settings->getOriginal('server_timezone');
- $newTimezone = $this->server->settings->server_timezone;
- if ($currentTimezone !== $newTimezone || $currentTimezone === '') {
- $this->server->settings->server_timezone = $newTimezone;
- }
- $this->server->settings->save();
- $this->server->save();
-
- $this->dispatch('success', 'Server updated.');
- } catch (\Throwable $e) {
- return handleError($e, $this);
- }
- }
-}
diff --git a/app/Livewire/Server/LogDrains.php b/app/Livewire/Server/LogDrains.php
index fb8ef329f..6599149c4 100644
--- a/app/Livewire/Server/LogDrains.php
+++ b/app/Livewire/Server/LogDrains.php
@@ -5,38 +5,38 @@ namespace App\Livewire\Server;
use App\Actions\Server\StartLogDrain;
use App\Actions\Server\StopLogDrain;
use App\Models\Server;
-use Livewire\Attributes\Rule;
+use Livewire\Attributes\Validate;
use Livewire\Component;
class LogDrains extends Component
{
public Server $server;
- #[Rule(['boolean'])]
+ #[Validate(['boolean'])]
public bool $isLogDrainNewRelicEnabled = false;
- #[Rule(['boolean'])]
+ #[Validate(['boolean'])]
public bool $isLogDrainCustomEnabled = false;
- #[Rule(['boolean'])]
+ #[Validate(['boolean'])]
public bool $isLogDrainAxiomEnabled = false;
- #[Rule(['string', 'nullable'])]
+ #[Validate(['string', 'nullable'])]
public ?string $logDrainNewRelicLicenseKey = null;
- #[Rule(['url', 'nullable'])]
+ #[Validate(['url', 'nullable'])]
public ?string $logDrainNewRelicBaseUri = null;
- #[Rule(['string', 'nullable'])]
+ #[Validate(['string', 'nullable'])]
public ?string $logDrainAxiomDatasetName = null;
- #[Rule(['string', 'nullable'])]
+ #[Validate(['string', 'nullable'])]
public ?string $logDrainAxiomApiKey = null;
- #[Rule(['string', 'nullable'])]
+ #[Validate(['string', 'nullable'])]
public ?string $logDrainCustomConfig = null;
- #[Rule(['string', 'nullable'])]
+ #[Validate(['string', 'nullable'])]
public ?string $logDrainCustomConfigParser = null;
public function mount(string $server_uuid)
@@ -52,7 +52,7 @@ class LogDrains extends Component
public function syncData(bool $toModel = false)
{
if ($toModel) {
- $this->validate();
+ $this->customValidation();
$this->server->settings->is_logdrain_newrelic_enabled = $this->isLogDrainNewRelicEnabled;
$this->server->settings->is_logdrain_axiom_enabled = $this->isLogDrainAxiomEnabled;
$this->server->settings->is_logdrain_custom_enabled = $this->isLogDrainCustomEnabled;
@@ -79,6 +79,44 @@ class LogDrains extends Component
}
}
+ public function customValidation()
+ {
+ if ($this->isLogDrainNewRelicEnabled) {
+ try {
+ $this->validate([
+ 'logDrainNewRelicLicenseKey' => ['required'],
+ 'logDrainNewRelicBaseUri' => ['required', 'url'],
+ ]);
+ } catch (\Throwable $e) {
+ $this->isLogDrainNewRelicEnabled = false;
+
+ throw $e;
+ }
+ } elseif ($this->isLogDrainAxiomEnabled) {
+ try {
+ $this->validate([
+ 'logDrainAxiomDatasetName' => ['required'],
+ 'logDrainAxiomApiKey' => ['required'],
+ ]);
+ } catch (\Throwable $e) {
+ $this->isLogDrainAxiomEnabled = false;
+
+ throw $e;
+ }
+ } elseif ($this->isLogDrainCustomEnabled) {
+ try {
+ $this->validate([
+ 'logDrainCustomConfig' => ['required'],
+ 'logDrainCustomConfigParser' => ['string', 'nullable'],
+ ]);
+ } catch (\Throwable $e) {
+ $this->isLogDrainCustomEnabled = false;
+
+ throw $e;
+ }
+ }
+ }
+
public function instantSave()
{
try {
diff --git a/app/Livewire/Server/New/ByIp.php b/app/Livewire/Server/New/ByIp.php
index f80152435..5f60c5db5 100644
--- a/app/Livewire/Server/New/ByIp.php
+++ b/app/Livewire/Server/New/ByIp.php
@@ -6,64 +6,60 @@ use App\Enums\ProxyTypes;
use App\Models\Server;
use App\Models\Team;
use Illuminate\Support\Collection;
+use Livewire\Attributes\Locked;
+use Livewire\Attributes\Validate;
use Livewire\Component;
class ByIp extends Component
{
+ #[Locked]
public $private_keys;
+ #[Locked]
public $limit_reached;
+ #[Validate('nullable|integer', as: 'Private Key')]
public ?int $private_key_id = null;
+ #[Validate('nullable|string', as: 'Private Key Name')]
public $new_private_key_name;
+ #[Validate('nullable|string', as: 'Private Key Description')]
public $new_private_key_description;
+ #[Validate('nullable|string', as: 'Private Key Value')]
public $new_private_key_value;
+ #[Validate('required|string', as: 'Name')]
public string $name;
+ #[Validate('nullable|string', as: 'Description')]
public ?string $description = null;
+ #[Validate('required|string', as: 'IP Address/Domain')]
public string $ip;
+ #[Validate('required|string', as: 'User')]
public string $user = 'root';
+ #[Validate('required|integer|between:1,65535', as: 'Port')]
public int $port = 22;
+ #[Validate('required|boolean', as: 'Swarm Manager')]
public bool $is_swarm_manager = false;
+ #[Validate('required|boolean', as: 'Swarm Worker')]
public bool $is_swarm_worker = false;
+ #[Validate('nullable|integer', as: 'Swarm Cluster')]
public $selected_swarm_cluster = null;
+ #[Validate('required|boolean', as: 'Build Server')]
public bool $is_build_server = false;
+ #[Locked]
public Collection $swarm_managers;
- protected $rules = [
- 'name' => 'required|string',
- 'description' => 'nullable|string',
- 'ip' => 'required',
- 'user' => 'required|string',
- 'port' => 'required|integer',
- 'is_swarm_manager' => 'required|boolean',
- 'is_swarm_worker' => 'required|boolean',
- 'is_build_server' => 'required|boolean',
- ];
-
- protected $validationAttributes = [
- 'name' => 'Name',
- 'description' => 'Description',
- 'ip' => 'IP Address/Domain',
- 'user' => 'User',
- 'port' => 'Port',
- 'is_swarm_manager' => 'Swarm Manager',
- 'is_swarm_worker' => 'Swarm Worker',
- 'is_build_server' => 'Build Server',
- ];
-
public function mount()
{
$this->name = generate_random_name();
@@ -88,6 +84,12 @@ class ByIp extends Component
{
$this->validate();
try {
+ if (Server::where('team_id', currentTeam()->id)
+ ->where('ip', $this->ip)
+ ->exists()) {
+ return $this->dispatch('error', 'This IP/Domain is already in use by another server in your team.');
+ }
+
if (is_null($this->private_key_id)) {
return $this->dispatch('error', 'You must select a private key');
}
diff --git a/app/Livewire/Server/Proxy.php b/app/Livewire/Server/Proxy.php
index 5364eeb04..5d2f851db 100644
--- a/app/Livewire/Server/Proxy.php
+++ b/app/Livewire/Server/Proxy.php
@@ -4,7 +4,6 @@ namespace App\Livewire\Server;
use App\Actions\Proxy\CheckConfiguration;
use App\Actions\Proxy\SaveConfiguration;
-use App\Actions\Proxy\StartProxy;
use App\Models\Server;
use Livewire\Component;
@@ -46,14 +45,13 @@ class Proxy extends Component
public function selectProxy($proxy_type)
{
- $this->server->proxy->set('status', 'exited');
- $this->server->proxy->set('type', $proxy_type);
- $this->server->save();
- $this->selectedProxy = $this->server->proxy->type;
- if ($this->server->proxySet()) {
- StartProxy::run($this->server, false);
+ try {
+ $this->server->changeProxy($proxy_type, async: false);
+ $this->selectedProxy = $this->server->proxy->type;
+ $this->dispatch('proxyStatusUpdated');
+ } catch (\Throwable $e) {
+ return handleError($e, $this);
}
- $this->dispatch('proxyStatusUpdated');
}
public function instantSave()
diff --git a/app/Livewire/Server/Show.php b/app/Livewire/Server/Show.php
index 2e4b67cc6..a5544489d 100644
--- a/app/Livewire/Server/Show.php
+++ b/app/Livewire/Server/Show.php
@@ -5,79 +5,81 @@ namespace App\Livewire\Server;
use App\Actions\Server\StartSentinel;
use App\Actions\Server\StopSentinel;
use App\Models\Server;
-use Livewire\Attributes\Rule;
+use Livewire\Attributes\Locked;
+use Livewire\Attributes\Validate;
use Livewire\Component;
class Show extends Component
{
public Server $server;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public string $name;
- #[Rule(['nullable'])]
- public ?string $description;
+ #[Validate(['nullable'])]
+ public ?string $description = null;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public string $ip;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public string $user;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public string $port;
- #[Rule(['nullable'])]
+ #[Validate(['nullable'])]
public ?string $validationLogs = null;
- #[Rule(['nullable', 'url'])]
- public ?string $wildcardDomain;
+ #[Validate(['nullable', 'url'])]
+ public ?string $wildcardDomain = null;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public bool $isReachable;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public bool $isUsable;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public bool $isSwarmManager;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public bool $isSwarmWorker;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public bool $isBuildServer;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public bool $isMetricsEnabled;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public string $sentinelToken;
- #[Rule(['nullable'])]
- public ?string $sentinelUpdatedAt;
+ #[Validate(['nullable'])]
+ public ?string $sentinelUpdatedAt = null;
- #[Rule(['required', 'integer', 'min:1'])]
+ #[Validate(['required', 'integer', 'min:1'])]
public int $sentinelMetricsRefreshRateSeconds;
- #[Rule(['required', 'integer', 'min:1'])]
+ #[Validate(['required', 'integer', 'min:1'])]
public int $sentinelMetricsHistoryDays;
- #[Rule(['required', 'integer', 'min:10'])]
+ #[Validate(['required', 'integer', 'min:10'])]
public int $sentinelPushIntervalSeconds;
- #[Rule(['nullable', 'url'])]
- public ?string $sentinelCustomUrl;
+ #[Validate(['nullable', 'url'])]
+ public ?string $sentinelCustomUrl = null;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public bool $isSentinelEnabled;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public bool $isSentinelDebugEnabled;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public string $serverTimezone;
+ #[Locked]
public array $timezones;
public function getListeners()
@@ -85,8 +87,8 @@ class Show extends Component
$teamId = auth()->user()->currentTeam()->id;
return [
- "echo-private:team.{$teamId},CloudflareTunnelConfigured" => '$refresh',
- 'refreshServerShow' => '$refresh',
+ "echo-private:team.{$teamId},CloudflareTunnelConfigured" => 'refresh',
+ 'refreshServerShow' => 'refresh',
];
}
@@ -105,6 +107,15 @@ class Show extends Component
{
if ($toModel) {
$this->validate();
+
+ if (Server::where('team_id', currentTeam()->id)
+ ->where('ip', $this->ip)
+ ->where('id', '!=', $this->server->id)
+ ->exists()) {
+ $this->ip = $this->server->ip;
+ throw new \Exception('This IP/Domain is already in use by another server in your team.');
+ }
+
$this->server->name = $this->name;
$this->server->description = $this->description;
$this->server->ip = $this->ip;
@@ -114,6 +125,7 @@ class Show extends Component
$this->server->save();
$this->server->settings->is_swarm_manager = $this->isSwarmManager;
+ $this->server->settings->wildcard_domain = $this->wildcardDomain;
$this->server->settings->is_swarm_worker = $this->isSwarmWorker;
$this->server->settings->is_build_server = $this->isBuildServer;
$this->server->settings->is_metrics_enabled = $this->isMetricsEnabled;
@@ -124,7 +136,14 @@ class Show extends Component
$this->server->settings->sentinel_custom_url = $this->sentinelCustomUrl;
$this->server->settings->is_sentinel_enabled = $this->isSentinelEnabled;
$this->server->settings->is_sentinel_debug_enabled = $this->isSentinelDebugEnabled;
- $this->server->settings->server_timezone = $this->serverTimezone;
+
+ if (! validate_timezone($this->serverTimezone)) {
+ $this->serverTimezone = config('app.timezone');
+ throw new \Exception('Invalid timezone.');
+ } else {
+ $this->server->settings->server_timezone = $this->serverTimezone;
+ }
+
$this->server->settings->save();
} else {
$this->name = $this->server->name;
@@ -132,6 +151,7 @@ class Show extends Component
$this->ip = $this->server->ip;
$this->user = $this->server->user;
$this->port = $this->server->port;
+
$this->wildcardDomain = $this->server->settings->wildcard_domain;
$this->isReachable = $this->server->settings->is_reachable;
$this->isUsable = $this->server->settings->is_usable;
@@ -151,6 +171,12 @@ class Show extends Component
}
}
+ public function refresh()
+ {
+ $this->syncData();
+ $this->dispatch('$refresh');
+ }
+
public function validateServer($install = true)
{
try {
diff --git a/app/Livewire/Server/ValidateAndInstall.php b/app/Livewire/Server/ValidateAndInstall.php
index 8c5bc23ed..791ef9350 100644
--- a/app/Livewire/Server/ValidateAndInstall.php
+++ b/app/Livewire/Server/ValidateAndInstall.php
@@ -159,7 +159,8 @@ class ValidateAndInstall extends Component
$this->dispatch('refreshBoardingIndex');
$this->dispatch('success', 'Server validated.');
} else {
- $this->error = 'Docker Engine version is not 22+. Please install Docker manually before continuing: documentation.';
+ $requiredDockerVersion = str(config('constants.docker.minimum_required_version'))->before('.');
+ $this->error = 'Minimum Docker Engine version '.$requiredDockerVersion.' is not instaled. Please install Docker manually before continuing: documentation.';
$this->server->update([
'validation_logs' => $this->error,
]);
diff --git a/app/Livewire/Settings/Index.php b/app/Livewire/Settings/Index.php
index 0a6c5bae6..55ba49867 100644
--- a/app/Livewire/Settings/Index.php
+++ b/app/Livewire/Settings/Index.php
@@ -8,7 +8,7 @@ use App\Models\Server;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Livewire\Attributes\Locked;
-use Livewire\Attributes\Rule;
+use Livewire\Attributes\Validate;
use Livewire\Component;
class Index extends Component
@@ -20,58 +20,58 @@ class Index extends Component
#[Locked]
public $timezones;
- #[Rule('boolean')]
+ #[Validate('boolean')]
public bool $is_auto_update_enabled;
- #[Rule('nullable|string|max:255')]
+ #[Validate('nullable|string|max:255')]
public ?string $fqdn = null;
- #[Rule('nullable|string|max:255')]
+ #[Validate('nullable|string|max:255')]
public ?string $resale_license = null;
- #[Rule('required|integer|min:1025|max:65535')]
+ #[Validate('required|integer|min:1025|max:65535')]
public int $public_port_min;
- #[Rule('required|integer|min:1025|max:65535')]
+ #[Validate('required|integer|min:1025|max:65535')]
public int $public_port_max;
- #[Rule('nullable|string')]
+ #[Validate('nullable|string')]
public ?string $custom_dns_servers = null;
- #[Rule('nullable|string|max:255')]
+ #[Validate('nullable|string|max:255')]
public ?string $instance_name = null;
- #[Rule('nullable|string')]
+ #[Validate('nullable|string')]
public ?string $allowed_ips = null;
- #[Rule('nullable|string')]
+ #[Validate('nullable|string')]
public ?string $public_ipv4 = null;
- #[Rule('nullable|string')]
+ #[Validate('nullable|string')]
public ?string $public_ipv6 = null;
- #[Rule('string')]
+ #[Validate('string')]
public string $auto_update_frequency;
- #[Rule('string')]
+ #[Validate('string')]
public string $update_check_frequency;
- #[Rule('required|string|timezone')]
+ #[Validate('required|string|timezone')]
public string $instance_timezone;
- #[Rule('boolean')]
+ #[Validate('boolean')]
public bool $do_not_track;
- #[Rule('boolean')]
+ #[Validate('boolean')]
public bool $is_registration_enabled;
- #[Rule('boolean')]
+ #[Validate('boolean')]
public bool $is_dns_validation_enabled;
- #[Rule('boolean')]
+ #[Validate('boolean')]
public bool $is_api_enabled;
- #[Rule('boolean')]
+ #[Validate('boolean')]
public bool $disable_two_step_confirmation;
public function render()
@@ -139,6 +139,14 @@ class Index extends Component
$error_show = false;
$this->server = Server::findOrFail(0);
$this->resetErrorBag();
+
+ if (! validate_timezone($this->instance_timezone)) {
+ $this->instance_timezone = config('app.timezone');
+ throw new \Exception('Invalid timezone.');
+ } else {
+ $this->settings->instance_timezone = $this->instance_timezone;
+ }
+
if ($this->settings->public_port_min > $this->settings->public_port_max) {
$this->addError('settings.public_port_min', 'The minimum port must be lower than the maximum port.');
diff --git a/app/Livewire/Settings/License.php b/app/Livewire/Settings/License.php
deleted file mode 100644
index 79f8269f3..000000000
--- a/app/Livewire/Settings/License.php
+++ /dev/null
@@ -1,58 +0,0 @@
- 'nullable',
- 'settings.is_resale_license_active' => 'nullable',
- ];
-
- protected $validationAttributes = [
- 'settings.resale_license' => 'License',
- 'instance_id' => 'Instance Id (Do not change this)',
- 'settings.is_resale_license_active' => 'Is License Active',
- ];
-
- public function mount()
- {
- if (! isCloud()) {
- abort(404);
- }
- if (! isInstanceAdmin()) {
- return redirect()->route('home');
- }
- $this->instance_id = config('app.id');
- $this->settings = instanceSettings();
- }
-
- public function render()
- {
- return view('livewire.settings.license');
- }
-
- public function submit()
- {
- $this->validate();
- $this->settings->save();
- if ($this->settings->resale_license) {
- try {
- CheckResaleLicense::run();
- $this->dispatch('reloadWindow');
- } catch (\Throwable $e) {
- session()->flash('error', 'Something went wrong. Please contact support.
Error: '.$e->getMessage());
-
- return redirect()->route('settings.license');
- }
- }
- }
-}
diff --git a/app/Livewire/SettingsBackup.php b/app/Livewire/SettingsBackup.php
index 38f7e548a..1b0599ffe 100644
--- a/app/Livewire/SettingsBackup.php
+++ b/app/Livewire/SettingsBackup.php
@@ -8,7 +8,7 @@ use App\Models\ScheduledDatabaseBackup;
use App\Models\Server;
use App\Models\StandalonePostgresql;
use Livewire\Attributes\Locked;
-use Livewire\Attributes\Rule;
+use Livewire\Attributes\Validate;
use Livewire\Component;
class SettingsBackup extends Component
@@ -25,19 +25,19 @@ class SettingsBackup extends Component
#[Locked]
public $executions = [];
- #[Rule(['required'])]
+ #[Validate(['required'])]
public string $uuid;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public string $name;
- #[Rule(['nullable'])]
+ #[Validate(['nullable'])]
public ?string $description = null;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public string $postgres_user;
- #[Rule(['required'])]
+ #[Validate(['required'])]
public string $postgres_password;
public function mount()
@@ -99,6 +99,14 @@ class SettingsBackup extends Component
$this->database->refresh();
$this->backup->refresh();
$this->s3s = S3Storage::whereTeamId(0)->get();
+
+ $this->uuid = $this->database->uuid;
+ $this->name = $this->database->name;
+ $this->description = $this->database->description;
+ $this->postgres_user = $this->database->postgres_user;
+ $this->postgres_password = $this->database->postgres_password;
+ $this->executions = $this->backup->executions;
+
} catch (\Exception $e) {
return handleError($e, $this);
}
diff --git a/app/Livewire/SettingsEmail.php b/app/Livewire/SettingsEmail.php
index 2a017ed34..61f720b3a 100644
--- a/app/Livewire/SettingsEmail.php
+++ b/app/Livewire/SettingsEmail.php
@@ -3,44 +3,44 @@
namespace App\Livewire;
use App\Models\InstanceSettings;
-use Livewire\Attributes\Rule;
+use Livewire\Attributes\Validate;
use Livewire\Component;
class SettingsEmail extends Component
{
public InstanceSettings $settings;
- #[Rule(['boolean'])]
+ #[Validate(['boolean'])]
public bool $smtpEnabled = false;
- #[Rule(['nullable', 'string'])]
+ #[Validate(['nullable', 'string'])]
public ?string $smtpHost = null;
- #[Rule(['nullable', 'numeric', 'min:1', 'max:65535'])]
+ #[Validate(['nullable', 'numeric', 'min:1', 'max:65535'])]
public ?int $smtpPort = null;
- #[Rule(['nullable', 'string'])]
+ #[Validate(['nullable', 'string'])]
public ?string $smtpEncryption = null;
- #[Rule(['nullable', 'string'])]
+ #[Validate(['nullable', 'string'])]
public ?string $smtpUsername = null;
- #[Rule(['nullable'])]
+ #[Validate(['nullable'])]
public ?string $smtpPassword = null;
- #[Rule(['nullable', 'numeric'])]
+ #[Validate(['nullable', 'numeric'])]
public ?int $smtpTimeout = null;
- #[Rule(['nullable', 'email'])]
+ #[Validate(['nullable', 'email'])]
public ?string $smtpFromAddress = null;
- #[Rule(['nullable', 'string'])]
+ #[Validate(['nullable', 'string'])]
public ?string $smtpFromName = null;
- #[Rule(['boolean'])]
+ #[Validate(['boolean'])]
public bool $resendEnabled = false;
- #[Rule(['nullable', 'string'])]
+ #[Validate(['nullable', 'string'])]
public ?string $resendApiKey = null;
public function mount()
@@ -63,6 +63,8 @@ class SettingsEmail extends Component
$this->settings->smtp_username = $this->smtpUsername;
$this->settings->smtp_password = $this->smtpPassword;
$this->settings->smtp_timeout = $this->smtpTimeout;
+ $this->settings->smtp_from_address = $this->smtpFromAddress;
+ $this->settings->smtp_from_name = $this->smtpFromName;
$this->settings->resend_enabled = $this->resendEnabled;
$this->settings->resend_api_key = $this->resendApiKey;
diff --git a/app/Livewire/Source/Github/Create.php b/app/Livewire/Source/Github/Create.php
index 103c5c9fb..136d3525e 100644
--- a/app/Livewire/Source/Github/Create.php
+++ b/app/Livewire/Source/Github/Create.php
@@ -23,7 +23,7 @@ class Create extends Component
public function mount()
{
- $this->name = substr(generate_random_name(), 0, 34); // GitHub Apps names can only be 34 characters long
+ $this->name = substr(generate_random_name(), 0, 30);
}
public function createGitHubApp()
diff --git a/app/Livewire/Subscription/PricingPlans.php b/app/Livewire/Subscription/PricingPlans.php
index 9186cc978..6b2d3fb36 100644
--- a/app/Livewire/Subscription/PricingPlans.php
+++ b/app/Livewire/Subscription/PricingPlans.php
@@ -2,6 +2,7 @@
namespace App\Livewire\Subscription;
+use Illuminate\Support\Facades\Auth;
use Livewire\Component;
use Stripe\Checkout\Session;
use Stripe\Stripe;
@@ -26,7 +27,7 @@ class PricingPlans extends Component
$payload = [
'allow_promotion_codes' => true,
'billing_address_collection' => 'required',
- 'client_reference_id' => auth()->user()->id.':'.currentTeam()->id,
+ 'client_reference_id' => Auth::id().':'.currentTeam()->id,
'line_items' => [[
'price' => $priceId,
'adjustable_quantity' => [
@@ -43,7 +44,7 @@ class PricingPlans extends Component
],
'subscription_data' => [
'metadata' => [
- 'user_id' => auth()->user()->id,
+ 'user_id' => Auth::id(),
'team_id' => currentTeam()->id,
],
],
@@ -60,7 +61,7 @@ class PricingPlans extends Component
'name' => 'auto',
];
} else {
- $payload['customer_email'] = auth()->user()->email;
+ $payload['customer_email'] = Auth::user()->email;
}
$session = Session::create($payload);
diff --git a/app/Livewire/Tags/Index.php b/app/Livewire/Tags/Index.php
deleted file mode 100644
index 116f19e4e..000000000
--- a/app/Livewire/Tags/Index.php
+++ /dev/null
@@ -1,82 +0,0 @@
- 'updateDeployments'];
-
- public function render()
- {
- return view('livewire.tags.index');
- }
-
- public function mount()
- {
- $this->tags = Tag::ownedByCurrentTeam()->get()->unique('name')->sortBy('name');
- if ($this->tag) {
- $this->tagUpdated();
- }
- }
-
- public function updateDeployments($deployments)
- {
- $this->deploymentsPerTagPerServer = $deployments;
- }
-
- public function tagUpdated()
- {
- if ($this->tag === '') {
- return;
- }
- $sanitizedTag = htmlspecialchars($this->tag, ENT_QUOTES, 'UTF-8');
- $tag = $this->tags->where('name', $sanitizedTag)->first();
- if (! $tag) {
- $this->dispatch('error', 'Tag ('.e($sanitizedTag).') not found.');
- $this->tag = '';
-
- return;
- }
- $this->webhook = generateTagDeployWebhook($tag->name);
- $this->applications = $tag->applications()->get();
- $this->services = $tag->services()->get();
- }
-
- public function redeployAll()
- {
- try {
- $this->applications->each(function ($resource) {
- $deploy = new DeployController;
- $deploy->deploy_resource($resource);
- });
- $this->services->each(function ($resource) {
- $deploy = new DeployController;
- $deploy->deploy_resource($resource);
- });
- $this->dispatch('success', 'Mass deployment started.');
- } catch (\Exception $e) {
- return handleError($e, $this);
- }
- }
-}
diff --git a/app/Livewire/Tags/Show.php b/app/Livewire/Tags/Show.php
index 0dffcce57..fc5b13374 100644
--- a/app/Livewire/Tags/Show.php
+++ b/app/Livewire/Tags/Show.php
@@ -5,43 +5,57 @@ namespace App\Livewire\Tags;
use App\Http\Controllers\Api\DeployController;
use App\Models\ApplicationDeploymentQueue;
use App\Models\Tag;
+use Illuminate\Support\Collection;
+use Livewire\Attributes\Locked;
use Livewire\Attributes\Title;
use Livewire\Component;
#[Title('Tags | Coolify')]
class Show extends Component
{
- public $tags;
+ #[Locked]
+ public ?string $tagName = null;
- public Tag $tag;
+ #[Locked]
+ public ?Collection $tags = null;
- public $applications;
+ #[Locked]
+ public ?Tag $tag = null;
- public $services;
+ #[Locked]
+ public ?Collection $applications = null;
- public $webhook = null;
+ #[Locked]
+ public ?Collection $services = null;
- public $deployments_per_tag_per_server = [];
+ #[Locked]
+ public ?string $webhook = null;
+
+ #[Locked]
+ public ?array $deploymentsPerTagPerServer = null;
public function mount()
{
- $this->tags = Tag::ownedByCurrentTeam()->get()->unique('name')->sortBy('name');
- $tag = $this->tags->where('name', request()->tag_name)->first();
- if (! $tag) {
- return redirect()->route('tags.index');
+ try {
+ $this->tags = Tag::ownedByCurrentTeam()->get()->unique('name')->sortBy('name');
+ if (str($this->tagName)->isNotEmpty()) {
+ $tag = $this->tags->where('name', $this->tagName)->first();
+ $this->webhook = generateTagDeployWebhook($tag->name);
+ $this->applications = $tag->applications()->get();
+ $this->services = $tag->services()->get();
+ $this->tag = $tag;
+ $this->getDeployments();
+ }
+ } catch (\Exception $e) {
+ return handleError($e, $this);
}
- $this->webhook = generateTagDeployWebhook($tag->name);
- $this->applications = $tag->applications()->get();
- $this->services = $tag->services()->get();
- $this->tag = $tag;
- $this->get_deployments();
}
- public function get_deployments()
+ public function getDeployments()
{
try {
$resource_ids = $this->applications->pluck('id');
- $this->deployments_per_tag_per_server = ApplicationDeploymentQueue::whereIn('status', ['in_progress', 'queued'])->whereIn('application_id', $resource_ids)->get([
+ $this->deploymentsPerTagPerServer = ApplicationDeploymentQueue::whereIn('status', ['in_progress', 'queued'])->whereIn('application_id', $resource_ids)->get([
'id',
'application_id',
'application_name',
@@ -56,7 +70,7 @@ class Show extends Component
}
}
- public function redeploy_all()
+ public function redeployAll()
{
try {
$message = collect([]);
diff --git a/app/Livewire/Team/Create.php b/app/Livewire/Team/Create.php
index 992833da5..f805d6122 100644
--- a/app/Livewire/Team/Create.php
+++ b/app/Livewire/Team/Create.php
@@ -3,28 +3,21 @@
namespace App\Livewire\Team;
use App\Models\Team;
+use Livewire\Attributes\Validate;
use Livewire\Component;
class Create extends Component
{
+ #[Validate(['required', 'min:3', 'max:255'])]
public string $name = '';
+ #[Validate(['nullable', 'min:3', 'max:255'])]
public ?string $description = null;
- protected $rules = [
- 'name' => 'required|min:3|max:255',
- 'description' => 'nullable|min:3|max:255',
- ];
-
- protected $validationAttributes = [
- 'name' => 'name',
- 'description' => 'description',
- ];
-
public function submit()
{
- $this->validate();
try {
+ $this->validate();
$team = Team::create([
'name' => $this->name,
'description' => $this->description,
diff --git a/app/Livewire/Team/Index.php b/app/Livewire/Team/Index.php
index 45600dbfe..0972e7364 100644
--- a/app/Livewire/Team/Index.php
+++ b/app/Livewire/Team/Index.php
@@ -4,6 +4,7 @@ namespace App\Livewire\Team;
use App\Models\Team;
use App\Models\TeamInvitation;
+use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Livewire\Component;
@@ -55,7 +56,7 @@ class Index extends Component
$currentTeam->delete();
$currentTeam->members->each(function ($user) use ($currentTeam) {
- if ($user->id === auth()->user()->id) {
+ if ($user->id === Auth::id()) {
return;
}
$user->teams()->detach($currentTeam);
diff --git a/app/Livewire/Terminal/Index.php b/app/Livewire/Terminal/Index.php
index 945b25714..a24a237c5 100644
--- a/app/Livewire/Terminal/Index.php
+++ b/app/Livewire/Terminal/Index.php
@@ -14,13 +14,25 @@ class Index extends Component
public $containers = [];
+ public bool $isLoadingContainers = true;
+
public function mount()
{
if (! auth()->user()->isAdmin()) {
abort(403);
}
$this->servers = Server::isReachable()->get();
- $this->containers = $this->getAllActiveContainers();
+ }
+
+ public function loadContainers()
+ {
+ try {
+ $this->containers = $this->getAllActiveContainers();
+ } catch (\Exception $e) {
+ return handleError($e, $this);
+ } finally {
+ $this->isLoadingContainers = false;
+ }
}
private function getAllActiveContainers()
diff --git a/app/Livewire/Upgrade.php b/app/Livewire/Upgrade.php
index 88ed88cb7..e50085c64 100644
--- a/app/Livewire/Upgrade.php
+++ b/app/Livewire/Upgrade.php
@@ -23,6 +23,9 @@ class Upgrade extends Component
try {
$this->latestVersion = get_latest_version_of_coolify();
$this->isUpgradeAvailable = data_get(InstanceSettings::get(), 'new_version_available', false);
+ if (isDev()) {
+ $this->isUpgradeAvailable = true;
+ }
} catch (\Throwable $e) {
return handleError($e, $this);
}
diff --git a/app/Livewire/Waitlist/Index.php b/app/Livewire/Waitlist/Index.php
index 422415449..0524b495c 100644
--- a/app/Livewire/Waitlist/Index.php
+++ b/app/Livewire/Waitlist/Index.php
@@ -27,7 +27,7 @@ class Index extends Component
public function mount()
{
- if (config('coolify.waitlist') == false) {
+ if (config('constants.waitlist.enabled') == false) {
return redirect()->route('register');
}
$this->waitingInLine = Waitlist::whereVerified(true)->count();
diff --git a/app/Models/Application.php b/app/Models/Application.php
index 91abf2e3a..c284528f1 100644
--- a/app/Models/Application.php
+++ b/app/Models/Application.php
@@ -98,6 +98,7 @@ use Visus\Cuid2\Cuid2;
'updated_at' => ['type' => 'string', 'format' => 'date-time', 'description' => 'The date and time when the application was last updated.'],
'deleted_at' => ['type' => 'string', 'format' => 'date-time', 'nullable' => true, 'description' => 'The date and time when the application was deleted.'],
'compose_parsing_version' => ['type' => 'string', 'description' => 'How Coolify parse the compose file.'],
+ 'custom_nginx_configuration' => ['type' => 'string', 'nullable' => true, 'description' => 'Custom Nginx configuration base64 encoded.'],
]
)]
@@ -114,11 +115,11 @@ class Application extends BaseModel
protected static function booted()
{
static::saving(function ($application) {
- if ($application->fqdn === '') {
- $application->fqdn = null;
- }
$payload = [];
if ($application->isDirty('fqdn')) {
+ if ($application->fqdn === '') {
+ $application->fqdn = null;
+ }
$payload['fqdn'] = $application->fqdn;
}
if ($application->isDirty('install_command')) {
@@ -139,6 +140,11 @@ class Application extends BaseModel
if ($application->isDirty('status')) {
$payload['last_online_at'] = now();
}
+ if ($application->isDirty('custom_nginx_configuration')) {
+ if ($application->custom_nginx_configuration === '') {
+ $payload['custom_nginx_configuration'] = null;
+ }
+ }
if (count($payload) > 0) {
$application->forceFill($payload);
}
@@ -172,6 +178,11 @@ class Application extends BaseModel
return Application::whereRelation('environment.project.team', 'id', $teamId)->orderBy('name');
}
+ public static function ownedByCurrentTeam()
+ {
+ return Application::whereRelation('environment.project.team', 'id', currentTeam()->id)->orderBy('name');
+ }
+
public function getContainersToStop(bool $previewDeployments = false): array
{
$containers = $previewDeployments
@@ -627,6 +638,14 @@ class Application extends BaseModel
);
}
+ public function customNginxConfiguration(): Attribute
+ {
+ return Attribute::make(
+ set: fn ($value) => base64_encode($value),
+ get: fn ($value) => base64_decode($value),
+ );
+ }
+
public function portsExposesArray(): Attribute
{
return Attribute::make(
@@ -857,7 +876,7 @@ class Application extends BaseModel
public function isConfigurationChanged(bool $save = false)
{
- $newConfigHash = $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;
+ $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);
if ($this->pull_request_id === 0 || $this->pull_request_id === null) {
$newConfigHash .= json_encode($this->environment_variables()->get('value')->sort());
} else {
@@ -887,21 +906,7 @@ class Application extends BaseModel
public function customRepository()
{
- preg_match('/(?<=:)\d+(?=\/)/', $this->git_repository, $matches);
- $port = 22;
- if (count($matches) === 1) {
- $port = $matches[0];
- $gitHost = str($this->git_repository)->before(':');
- $gitRepo = str($this->git_repository)->after('/');
- $repository = "$gitHost:$gitRepo";
- } else {
- $repository = $this->git_repository;
- }
-
- return [
- 'repository' => $repository,
- 'port' => $port,
- ];
+ return convertGitUrl($this->git_repository, $this->deploymentType(), $this->source);
}
public function generateBaseDir(string $uuid)
@@ -934,6 +939,122 @@ class Application extends BaseModel
return $git_clone_command;
}
+ public function getGitRemoteStatus(string $deployment_uuid)
+ {
+ try {
+ ['commands' => $lsRemoteCommand] = $this->generateGitLsRemoteCommands(deployment_uuid: $deployment_uuid, exec_in_docker: false);
+ instant_remote_process([$lsRemoteCommand], $this->destination->server, true);
+
+ return [
+ 'is_accessible' => true,
+ 'error' => null,
+ ];
+ } catch (\RuntimeException $ex) {
+ return [
+ 'is_accessible' => false,
+ 'error' => $ex->getMessage(),
+ ];
+ }
+ }
+
+ public function generateGitLsRemoteCommands(string $deployment_uuid, bool $exec_in_docker = true)
+ {
+ $branch = $this->git_branch;
+ ['repository' => $customRepository, 'port' => $customPort] = $this->customRepository();
+ $commands = collect([]);
+ $base_command = 'git ls-remote';
+
+ if ($this->deploymentType() === 'source') {
+ $source_html_url = data_get($this, 'source.html_url');
+ $url = parse_url(filter_var($source_html_url, FILTER_SANITIZE_URL));
+ $source_html_url_host = $url['host'];
+ $source_html_url_scheme = $url['scheme'];
+
+ if ($this->source->getMorphClass() == 'App\Models\GithubApp') {
+ if ($this->source->is_public) {
+ $fullRepoUrl = "{$this->source->html_url}/{$customRepository}";
+ $base_command = "{$base_command} {$this->source->html_url}/{$customRepository}";
+ } else {
+ $github_access_token = generate_github_installation_token($this->source);
+
+ if ($exec_in_docker) {
+ $base_command = "{$base_command} $source_html_url_scheme://x-access-token:$github_access_token@$source_html_url_host/{$customRepository}.git";
+ $fullRepoUrl = "$source_html_url_scheme://x-access-token:$github_access_token@$source_html_url_host/{$customRepository}.git";
+ } else {
+ $base_command = "{$base_command} $source_html_url_scheme://x-access-token:$github_access_token@$source_html_url_host/{$customRepository}";
+ $fullRepoUrl = "$source_html_url_scheme://x-access-token:$github_access_token@$source_html_url_host/{$customRepository}";
+ }
+ }
+
+ if ($exec_in_docker) {
+ $commands->push(executeInDocker($deployment_uuid, $base_command));
+ } else {
+ $commands->push($base_command);
+ }
+
+ return [
+ 'commands' => $commands->implode(' && '),
+ 'branch' => $branch,
+ 'fullRepoUrl' => $fullRepoUrl,
+ ];
+ }
+ }
+
+ if ($this->deploymentType() === 'deploy_key') {
+ $fullRepoUrl = $customRepository;
+ $private_key = data_get($this, 'private_key.private_key');
+ if (is_null($private_key)) {
+ throw new RuntimeException('Private key not found. Please add a private key to the application and try again.');
+ }
+ $private_key = base64_encode($private_key);
+ $base_comamnd = "GIT_SSH_COMMAND=\"ssh -o ConnectTimeout=30 -p {$customPort} -o Port={$customPort} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa\" {$base_command} {$customRepository}";
+
+ if ($exec_in_docker) {
+ $commands = collect([
+ executeInDocker($deployment_uuid, 'mkdir -p /root/.ssh'),
+ executeInDocker($deployment_uuid, "echo '{$private_key}' | base64 -d | tee /root/.ssh/id_rsa > /dev/null"),
+ executeInDocker($deployment_uuid, 'chmod 600 /root/.ssh/id_rsa'),
+ ]);
+ } else {
+ $commands = collect([
+ 'mkdir -p /root/.ssh',
+ "echo '{$private_key}' | base64 -d | tee /root/.ssh/id_rsa > /dev/null",
+ 'chmod 600 /root/.ssh/id_rsa',
+ ]);
+ }
+
+ if ($exec_in_docker) {
+ $commands->push(executeInDocker($deployment_uuid, $base_comamnd));
+ } else {
+ $commands->push($base_comamnd);
+ }
+
+ return [
+ 'commands' => $commands->implode(' && '),
+ 'branch' => $branch,
+ 'fullRepoUrl' => $fullRepoUrl,
+ ];
+ }
+
+ if ($this->deploymentType() === 'other') {
+ $fullRepoUrl = $customRepository;
+ $base_command = "{$base_command} {$customRepository}";
+ $base_command = $this->setGitImportSettings($deployment_uuid, $base_command, public: true);
+
+ if ($exec_in_docker) {
+ $commands->push(executeInDocker($deployment_uuid, $base_command));
+ } else {
+ $commands->push($base_command);
+ }
+
+ return [
+ 'commands' => $commands->implode(' && '),
+ 'branch' => $branch,
+ 'fullRepoUrl' => $fullRepoUrl,
+ ];
+ }
+ }
+
public function generateGitImportCommands(string $deployment_uuid, int $pull_request_id = 0, ?string $git_type = null, bool $exec_in_docker = true, bool $only_checkout = false, ?string $custom_base_dir = null, ?string $commit = null)
{
$branch = $this->git_branch;
@@ -1195,6 +1316,11 @@ class Application extends BaseModel
$workdir = rtrim($this->base_directory, '/');
$composeFile = $this->docker_compose_location;
$fileList = collect([".$workdir$composeFile"]);
+ $gitRemoteStatus = $this->getGitRemoteStatus(deployment_uuid: $uuid);
+ if (! $gitRemoteStatus['is_accessible']) {
+ throw new \RuntimeException("Failed to read Git source:\n\n{$gitRemoteStatus['error']}");
+ }
+
$commands = collect([
"rm -rf /tmp/{$uuid}",
"mkdir -p /tmp/{$uuid}",
diff --git a/app/Models/PrivateKey.php b/app/Models/PrivateKey.php
index 065746ede..80015d87f 100644
--- a/app/Models/PrivateKey.php
+++ b/app/Models/PrivateKey.php
@@ -218,10 +218,12 @@ class PrivateKey extends BaseModel
private static function fingerprintExists($fingerprint, $excludeId = null)
{
- $query = self::where('fingerprint', $fingerprint);
+ $query = self::query()
+ ->where('fingerprint', $fingerprint)
+ ->where('id', '!=', $excludeId);
- if (! is_null($excludeId)) {
- $query->where('id', '!=', $excludeId);
+ if (currentTeam()) {
+ $query->where('team_id', currentTeam()->id);
}
return $query->exists();
diff --git a/app/Models/Project.php b/app/Models/Project.php
index 3a09b0b8f..f27e6c208 100644
--- a/app/Models/Project.php
+++ b/app/Models/Project.php
@@ -122,9 +122,18 @@ class Project extends BaseModel
return $this->hasManyThrough(StandaloneMariadb::class, Environment::class);
}
- public function resource_count()
+ public function isEmpty()
{
- return $this->applications()->count() + $this->postgresqls()->count() + $this->redis()->count() + $this->mongodbs()->count() + $this->mysqls()->count() + $this->mariadbs()->count() + $this->keydbs()->count() + $this->dragonflies()->count() + $this->clickhouses()->count() + $this->services()->count();
+ return $this->applications()->count() == 0 &&
+ $this->redis()->count() == 0 &&
+ $this->postgresqls()->count() == 0 &&
+ $this->mysqls()->count() == 0 &&
+ $this->keydbs()->count() == 0 &&
+ $this->dragonflies()->count() == 0 &&
+ $this->clickhouses()->count() == 0 &&
+ $this->mariadbs()->count() == 0 &&
+ $this->mongodbs()->count() == 0 &&
+ $this->services()->count() == 0;
}
public function databases()
diff --git a/app/Models/Server.php b/app/Models/Server.php
index cb1baa15f..64d7b88d1 100644
--- a/app/Models/Server.php
+++ b/app/Models/Server.php
@@ -2,6 +2,7 @@
namespace App\Models;
+use App\Actions\Proxy\StartProxy;
use App\Actions\Server\InstallDocker;
use App\Actions\Server\StartSentinel;
use App\Enums\ProxyTypes;
@@ -26,22 +27,23 @@ use Symfony\Component\Yaml\Yaml;
description: 'Server model',
type: 'object',
properties: [
- 'id' => ['type' => 'integer'],
- 'uuid' => ['type' => 'string'],
- 'name' => ['type' => 'string'],
- 'description' => ['type' => 'string'],
- 'ip' => ['type' => 'string'],
- 'user' => ['type' => 'string'],
- 'port' => ['type' => 'integer'],
- 'proxy' => ['type' => 'object'],
- 'high_disk_usage_notification_sent' => ['type' => 'boolean'],
- 'unreachable_notification_sent' => ['type' => 'boolean'],
- 'unreachable_count' => ['type' => 'integer'],
- 'validation_logs' => ['type' => 'string'],
- 'log_drain_notification_sent' => ['type' => 'boolean'],
- 'swarm_cluster' => ['type' => 'string'],
- 'delete_unused_volumes' => ['type' => 'boolean'],
- 'delete_unused_networks' => ['type' => 'boolean'],
+ 'id' => ['type' => 'integer', 'description' => 'The server ID.'],
+ 'uuid' => ['type' => 'string', 'description' => 'The server UUID.'],
+ 'name' => ['type' => 'string', 'description' => 'The server name.'],
+ 'description' => ['type' => 'string', 'description' => 'The server description.'],
+ 'ip' => ['type' => 'string', 'description' => 'The IP address.'],
+ 'user' => ['type' => 'string', 'description' => 'The user.'],
+ 'port' => ['type' => 'integer', 'description' => 'The port number.'],
+ 'proxy' => ['type' => 'object', 'description' => 'The proxy configuration.'],
+ 'proxy_type' => ['type' => 'string', 'enum' => ['traefik', 'caddy', 'none'], 'description' => 'The proxy type.'],
+ 'high_disk_usage_notification_sent' => ['type' => 'boolean', 'description' => 'The flag to indicate if the high disk usage notification has been sent.'],
+ 'unreachable_notification_sent' => ['type' => 'boolean', 'description' => 'The flag to indicate if the unreachable notification has been sent.'],
+ 'unreachable_count' => ['type' => 'integer', 'description' => 'The unreachable count for your server.'],
+ 'validation_logs' => ['type' => 'string', 'description' => 'The validation logs.'],
+ 'log_drain_notification_sent' => ['type' => 'boolean', 'description' => 'The flag to indicate if the log drain notification has been sent.'],
+ 'swarm_cluster' => ['type' => 'string', 'description' => 'The swarm cluster configuration.'],
+ 'delete_unused_volumes' => ['type' => 'boolean', 'description' => 'The flag to indicate if the unused volumes should be deleted.'],
+ 'delete_unused_networks' => ['type' => 'boolean', 'description' => 'The flag to indicate if the unused networks should be deleted.'],
]
)]
@@ -64,7 +66,7 @@ class Server extends BaseModel
$server->forceFill($payload);
});
static::saved(function ($server) {
- if ($server->privateKey->isDirty()) {
+ if ($server->privateKey?->isDirty()) {
refresh_server_connection($server->privateKey);
}
});
@@ -457,7 +459,7 @@ $schema://$host {
public function proxyPath()
{
- $base_path = config('coolify.base_config_path');
+ $base_path = config('constants.coolify.base_config_path');
$proxyType = $this->proxyType();
$proxy_path = "$base_path/proxy";
// TODO: should use /traefik for already exisiting configurations?
@@ -969,10 +971,10 @@ $schema://$host {
public function serverStatus(): bool
{
- if ($this->isFunctional() === false) {
+ if ($this->status() === false) {
return false;
}
- if ($this->status() === false) {
+ if ($this->isFunctional() === false) {
return false;
}
@@ -981,9 +983,6 @@ $schema://$host {
public function status(): bool
{
- if ($this->isFunctional() === false) {
- return false;
- }
['uptime' => $uptime] = $this->validateConnection(false);
if ($uptime === false) {
foreach ($this->applications() as $application) {
@@ -1227,7 +1226,7 @@ $schema://$host {
return str($this->ip)->contains(':');
}
- public function restartSentinel(bool $async = true): void
+ public function restartSentinel(bool $async = true)
{
try {
if ($async) {
@@ -1236,7 +1235,7 @@ $schema://$host {
StartSentinel::run($this, true);
}
} catch (\Throwable $e) {
- loggy('Error restarting Sentinel: '.$e->getMessage());
+ return handleError($e);
}
}
@@ -1249,4 +1248,25 @@ $schema://$host {
{
return instant_remote_process(['docker restart '.$containerName], $this, false);
}
+
+ public function changeProxy(string $proxyType, bool $async = true)
+ {
+ $validProxyTypes = collect(ProxyTypes::cases())->map(function ($proxyType) {
+ return str($proxyType->value)->lower();
+ });
+ if ($validProxyTypes->contains(str($proxyType)->lower())) {
+ $this->proxy->set('type', str($proxyType)->upper());
+ $this->proxy->set('status', 'exited');
+ $this->save();
+ if ($this->proxySet()) {
+ if ($async) {
+ StartProxy::dispatch($this);
+ } else {
+ StartProxy::run($this);
+ }
+ }
+ } else {
+ throw new \Exception('Invalid proxy type.');
+ }
+ }
}
diff --git a/app/Models/ServerSetting.php b/app/Models/ServerSetting.php
index bca16536e..fc2c5a0f4 100644
--- a/app/Models/ServerSetting.php
+++ b/app/Models/ServerSetting.php
@@ -4,6 +4,7 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Facades\Log;
use OpenApi\Attributes as OA;
#[OA\Schema(
@@ -63,13 +64,13 @@ class ServerSetting extends Model
static::creating(function ($setting) {
try {
if (str($setting->sentinel_token)->isEmpty()) {
- $setting->generateSentinelToken(save: false);
+ $setting->generateSentinelToken(save: false, ignoreEvent: true);
}
if (str($setting->sentinel_custom_url)->isEmpty()) {
- $setting->generateSentinelUrl(save: false);
+ $setting->generateSentinelUrl(save: false, ignoreEvent: true);
}
} catch (\Throwable $e) {
- loggy('Error creating server setting: '.$e->getMessage());
+ Log::error('Error creating server setting: '.$e->getMessage());
}
});
static::updated(function ($settings) {
@@ -88,7 +89,7 @@ class ServerSetting extends Model
});
}
- public function generateSentinelToken(bool $save = true)
+ public function generateSentinelToken(bool $save = true, bool $ignoreEvent = false)
{
$data = [
'server_uuid' => $this->server->uuid,
@@ -97,13 +98,17 @@ class ServerSetting extends Model
$encrypted = encrypt($token);
$this->sentinel_token = $encrypted;
if ($save) {
- $this->save();
+ if ($ignoreEvent) {
+ $this->saveQuietly();
+ } else {
+ $this->save();
+ }
}
return $token;
}
- public function generateSentinelUrl(bool $save = true)
+ public function generateSentinelUrl(bool $save = true, bool $ignoreEvent = false)
{
$domain = null;
$settings = InstanceSettings::get();
@@ -118,7 +123,11 @@ class ServerSetting extends Model
}
$this->sentinel_custom_url = $domain;
if ($save) {
- $this->save();
+ if ($ignoreEvent) {
+ $this->saveQuietly();
+ } else {
+ $this->save();
+ }
}
return $domain;
diff --git a/app/Models/Service.php b/app/Models/Service.php
index f88a23641..6d3d2024b 100644
--- a/app/Models/Service.php
+++ b/app/Models/Service.php
@@ -133,6 +133,11 @@ class Service extends BaseModel
return $this->morphToMany(Tag::class, 'taggable');
}
+ public static function ownedByCurrentTeam()
+ {
+ return Service::whereRelation('environment.project.team', 'id', currentTeam()->id)->orderBy('name');
+ }
+
public function getContainersToStop(): array
{
$containersToStop = [];
@@ -1166,7 +1171,7 @@ class Service extends BaseModel
$services = get_service_templates();
$service = data_get($services, str($this->name)->beforeLast('-')->value, []);
- return data_get($service, 'documentation', config('constants.docs.base_url'));
+ return data_get($service, 'documentation', config('constants.urls.docs'));
}
public function applications()
diff --git a/app/Models/ServiceApplication.php b/app/Models/ServiceApplication.php
index 305913068..5cafc9042 100644
--- a/app/Models/ServiceApplication.php
+++ b/app/Models/ServiceApplication.php
@@ -37,6 +37,11 @@ class ServiceApplication extends BaseModel
return ServiceApplication::whereRelation('service.environment.project.team', 'id', $teamId)->orderBy('name');
}
+ public static function ownedByCurrentTeam()
+ {
+ return ServiceApplication::whereRelation('service.environment.project.team', 'id', currentTeam()->id)->orderBy('name');
+ }
+
public function isRunning()
{
return str($this->status)->contains('running');
diff --git a/app/Models/ServiceDatabase.php b/app/Models/ServiceDatabase.php
index 6641509dd..5fdd52637 100644
--- a/app/Models/ServiceDatabase.php
+++ b/app/Models/ServiceDatabase.php
@@ -24,6 +24,16 @@ class ServiceDatabase extends BaseModel
});
}
+ public static function ownedByCurrentTeamAPI(int $teamId)
+ {
+ return ServiceDatabase::whereRelation('service.environment.project.team', 'id', $teamId)->orderBy('name');
+ }
+
+ public static function ownedByCurrentTeam()
+ {
+ return ServiceDatabase::whereRelation('service.environment.project.team', 'id', currentTeam()->id)->orderBy('name');
+ }
+
public function restart()
{
$container_id = $this->name.'-'.$this->service->uuid;
diff --git a/app/Models/Team.php b/app/Models/Team.php
index 5b4a80cb1..e21aa3a25 100644
--- a/app/Models/Team.php
+++ b/app/Models/Team.php
@@ -165,14 +165,14 @@ class Team extends Model implements SendsDiscord, SendsEmail
return 0;
}
- return data_get($team, 'limits.serverLimit', 0);
+ return data_get($team, 'limits', 0);
}
public function limits(): Attribute
{
return Attribute::make(
get: function () {
- if (config('coolify.self_hosted') || $this->id === 0) {
+ if (config('constants.coolify.self_hosted') || $this->id === 0) {
$subscription = 'self-hosted';
} else {
$subscription = data_get($this, 'subscription');
@@ -187,9 +187,8 @@ class Team extends Model implements SendsDiscord, SendsEmail
} else {
$serverLimit = config('constants.limits.server')[strtolower($subscription)];
}
- $sharedEmailEnabled = config('constants.limits.email')[strtolower($subscription)];
- return ['serverLimit' => $serverLimit, 'sharedEmailEnabled' => $sharedEmailEnabled];
+ return $serverLimit ?? 2;
}
);
@@ -258,8 +257,15 @@ class Team extends Model implements SendsDiscord, SendsEmail
return $this->hasMany(S3Storage::class)->where('is_usable', true);
}
- public function trialEnded()
+ public function subscriptionEnded()
{
+ $this->subscription->update([
+ 'stripe_subscription_id' => null,
+ 'stripe_plan_id' => null,
+ 'stripe_cancel_at_period_end' => false,
+ 'stripe_invoice_paid' => false,
+ 'stripe_trial_already_ended' => false,
+ ]);
foreach ($this->servers as $server) {
$server->settings()->update([
'is_usable' => false,
@@ -268,16 +274,6 @@ class Team extends Model implements SendsDiscord, SendsEmail
}
}
- public function trialEndedButSubscribed()
- {
- foreach ($this->servers as $server) {
- $server->settings()->update([
- 'is_usable' => true,
- 'is_reachable' => true,
- ]);
- }
- }
-
public function isAnyNotificationEnabled()
{
if (isCloud()) {
diff --git a/app/Models/TeamInvitation.php b/app/Models/TeamInvitation.php
index 0f298a829..bc1a90d58 100644
--- a/app/Models/TeamInvitation.php
+++ b/app/Models/TeamInvitation.php
@@ -28,8 +28,8 @@ class TeamInvitation extends Model
public function isValid()
{
$createdAt = $this->created_at;
- $diff = $createdAt->diffInMinutes(now());
- if ($diff <= config('constants.invitation.link.expiration')) {
+ $diff = $createdAt->diffInDays(now());
+ if ($diff <= config('constants.invitation.link.expiration_days')) {
return true;
} else {
$this->delete();
diff --git a/app/Models/User.php b/app/Models/User.php
index ecc4ef6b6..25fb33d66 100644
--- a/app/Models/User.php
+++ b/app/Models/User.php
@@ -10,6 +10,7 @@ use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\URL;
@@ -158,7 +159,7 @@ class User extends Authenticatable implements SendsEmail
public function isAdminFromSession()
{
- if (auth()->user()->id === 0) {
+ if (Auth::id() === 0) {
return true;
}
$teams = $this->teams()->get();
@@ -178,9 +179,9 @@ class User extends Authenticatable implements SendsEmail
public function isInstanceAdmin()
{
- $found_root_team = auth()->user()->teams->filter(function ($team) {
+ $found_root_team = Auth::user()->teams->filter(function ($team) {
if ($team->id == 0) {
- if (! auth()->user()->isAdmin()) {
+ if (! Auth::user()->isAdmin()) {
return false;
}
@@ -195,9 +196,9 @@ class User extends Authenticatable implements SendsEmail
public function currentTeam()
{
- return Cache::remember('team:'.auth()->user()->id, 3600, function () {
- if (is_null(data_get(session('currentTeam'), 'id')) && auth()->user()->teams->count() > 0) {
- return auth()->user()->teams[0];
+ return Cache::remember('team:'.Auth::id(), 3600, function () {
+ if (is_null(data_get(session('currentTeam'), 'id')) && Auth::user()->teams->count() > 0) {
+ return Auth::user()->teams[0];
}
return Team::find(session('currentTeam')->id);
@@ -206,7 +207,7 @@ class User extends Authenticatable implements SendsEmail
public function otherTeams()
{
- return auth()->user()->teams->filter(function ($team) {
+ return Auth::user()->teams->filter(function ($team) {
return $team->id != currentTeam()->id;
});
}
@@ -216,7 +217,7 @@ class User extends Authenticatable implements SendsEmail
if (data_get($this, 'pivot')) {
return $this->pivot->role;
}
- $user = auth()->user()->teams->where('id', currentTeam()->id)->first();
+ $user = Auth::user()->teams->where('id', currentTeam()->id)->first();
return data_get($user, 'pivot.role');
}
diff --git a/app/Notifications/Channels/DiscordChannel.php b/app/Notifications/Channels/DiscordChannel.php
index 3a33d8902..86276fec9 100644
--- a/app/Notifications/Channels/DiscordChannel.php
+++ b/app/Notifications/Channels/DiscordChannel.php
@@ -17,6 +17,6 @@ class DiscordChannel
if (! $webhookUrl) {
return;
}
- dispatch(new SendMessageToDiscordJob($message, $webhookUrl));
+ dispatch(new SendMessageToDiscordJob($message, $webhookUrl))->onQueue('high');
}
}
diff --git a/app/Notifications/Channels/TelegramChannel.php b/app/Notifications/Channels/TelegramChannel.php
index 4b1fa49dd..b3d4e384b 100644
--- a/app/Notifications/Channels/TelegramChannel.php
+++ b/app/Notifications/Channels/TelegramChannel.php
@@ -41,6 +41,6 @@ class TelegramChannel
if (! $telegramToken || ! $chatId || ! $message) {
return;
}
- dispatch(new SendMessageToTelegramJob($message, $buttons, $telegramToken, $chatId, $topicId));
+ dispatch(new SendMessageToTelegramJob($message, $buttons, $telegramToken, $chatId, $topicId))->onQueue('high');
}
}
diff --git a/app/Providers/FortifyServiceProvider.php b/app/Providers/FortifyServiceProvider.php
index e8784bab3..bbbf48345 100644
--- a/app/Providers/FortifyServiceProvider.php
+++ b/app/Providers/FortifyServiceProvider.php
@@ -50,7 +50,7 @@ class FortifyServiceProvider extends ServiceProvider
if (! $settings->is_registration_enabled) {
return redirect()->route('login');
}
- if (config('coolify.waitlist')) {
+ if (config('constants.waitlist.enabled')) {
return redirect()->route('waitlist.index');
} else {
return view('auth.register', [
diff --git a/app/View/Components/Forms/Checkbox.php b/app/View/Components/Forms/Checkbox.php
index 414dbf2ae..0bdebe7e4 100644
--- a/app/View/Components/Forms/Checkbox.php
+++ b/app/View/Components/Forms/Checkbox.php
@@ -17,11 +17,14 @@ class Checkbox extends Component
public ?string $value = null,
public ?string $label = null,
public ?string $helper = null,
+ public string|bool|null $checked = false,
public string|bool $instantSave = false,
public bool $disabled = false,
public string $defaultClass = 'dark:border-neutral-700 text-coolgray-400 focus:ring-warning dark:bg-coolgray-100 rounded cursor-pointer dark:disabled:bg-base dark:disabled:cursor-not-allowed',
) {
- //
+ if ($this->disabled) {
+ $this->defaultClass .= ' opacity-40';
+ }
}
/**
diff --git a/bootstrap/helpers/applications.php b/bootstrap/helpers/applications.php
index b3e8011b9..eb331f8c2 100644
--- a/bootstrap/helpers/applications.php
+++ b/bootstrap/helpers/applications.php
@@ -91,7 +91,7 @@ function next_queuable(string $server_id, string $application_id): bool
$server = Server::find($server_id);
$concurrent_builds = $server->settings->concurrent_builds;
- ray("serverId:{$server->id}", "concurrentBuilds:{$concurrent_builds}", "deployments:{$deployments->count()}", "sameApplicationDeployments:{$same_application_deployments->count()}")->green();
+ // ray("serverId:{$server->id}", "concurrentBuilds:{$concurrent_builds}", "deployments:{$deployments->count()}", "sameApplicationDeployments:{$same_application_deployments->count()}")->green();
if ($deployments->count() > $concurrent_builds) {
return false;
diff --git a/bootstrap/helpers/docker.php b/bootstrap/helpers/docker.php
index 52435703c..da99c5cbd 100644
--- a/bootstrap/helpers/docker.php
+++ b/bootstrap/helpers/docker.php
@@ -109,7 +109,8 @@ function format_docker_envs_to_json($rawOutput)
function checkMinimumDockerEngineVersion($dockerVersion)
{
$majorDockerVersion = str($dockerVersion)->before('.')->value();
- if ($majorDockerVersion <= 22) {
+ $requiredDockerVersion = str(config('constants.docker.minimum_required_version'))->before('.')->value();
+ if ($majorDockerVersion < $requiredDockerVersion) {
$dockerVersion = null;
}
@@ -225,16 +226,18 @@ function generateServiceSpecificFqdns(ServiceApplication|Application $resource)
case $type?->contains('minio'):
$MINIO_BROWSER_REDIRECT_URL = $variables->where('key', 'MINIO_BROWSER_REDIRECT_URL')->first();
$MINIO_SERVER_URL = $variables->where('key', 'MINIO_SERVER_URL')->first();
+
if (is_null($MINIO_BROWSER_REDIRECT_URL) || is_null($MINIO_SERVER_URL)) {
- return $payload;
+ return collect([]);
}
- if (is_null($MINIO_BROWSER_REDIRECT_URL?->value)) {
- $MINIO_BROWSER_REDIRECT_URL?->update([
+
+ if (str($MINIO_BROWSER_REDIRECT_URL->value ?? '')->isEmpty()) {
+ $MINIO_BROWSER_REDIRECT_URL->update([
'value' => generateFqdn($server, 'console-'.$uuid, true),
]);
}
- if (is_null($MINIO_SERVER_URL?->value)) {
- $MINIO_SERVER_URL?->update([
+ if (str($MINIO_SERVER_URL->value ?? '')->isEmpty()) {
+ $MINIO_SERVER_URL->update([
'value' => generateFqdn($server, 'minio-'.$uuid, true),
]);
}
@@ -246,16 +249,18 @@ function generateServiceSpecificFqdns(ServiceApplication|Application $resource)
case $type?->contains('logto'):
$LOGTO_ENDPOINT = $variables->where('key', 'LOGTO_ENDPOINT')->first();
$LOGTO_ADMIN_ENDPOINT = $variables->where('key', 'LOGTO_ADMIN_ENDPOINT')->first();
+
if (is_null($LOGTO_ENDPOINT) || is_null($LOGTO_ADMIN_ENDPOINT)) {
- return $payload;
+ return collect([]);
}
- if (is_null($LOGTO_ENDPOINT?->value)) {
- $LOGTO_ENDPOINT?->update([
+
+ if (str($LOGTO_ENDPOINT->value ?? '')->isEmpty()) {
+ $LOGTO_ENDPOINT->update([
'value' => generateFqdn($server, 'logto-'.$uuid),
]);
}
- if (is_null($LOGTO_ADMIN_ENDPOINT?->value)) {
- $LOGTO_ADMIN_ENDPOINT?->update([
+ if (str($LOGTO_ADMIN_ENDPOINT->value ?? '')->isEmpty()) {
+ $LOGTO_ADMIN_ENDPOINT->update([
'value' => generateFqdn($server, 'logto-admin-'.$uuid),
]);
}
@@ -359,8 +364,11 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
$https_label = "https-{$loop}-{$uuid}-{$service_name}";
}
if (str($image)->contains('ghost')) {
- $labels->push("traefik.http.middlewares.redir-ghost.redirectregex.regex=^{$path}/(.*)");
- $labels->push('traefik.http.middlewares.redir-ghost.redirectregex.replacement=/$1');
+ $labels->push("traefik.http.middlewares.redir-ghost-{$uuid}.redirectregex.regex=^{$path}/(.*)");
+ $labels->push("traefik.http.middlewares.redir-ghost-{$uuid}.redirectregex.replacement=/$1");
+ $labels->push("caddy_{$loop}.handle_path.{$loop}_redir-ghost-{$uuid}.handler=rewrite");
+ $labels->push("caddy_{$loop}.handle_path.{$loop}_redir-ghost-{$uuid}.rewrite.regexp=^{$path}/(.*)");
+ $labels->push("caddy_{$loop}.handle_path.{$loop}_redir-ghost-{$uuid}.rewrite.replacement=/$1");
}
$to_www_name = "{$loop}-{$uuid}-to-www";
@@ -394,7 +402,7 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
$middlewares->push('gzip');
}
if (str($image)->contains('ghost')) {
- $middlewares->push('redir-ghost');
+ $middlewares->push("redir-ghost-{$uuid}");
}
if ($redirect_direction === 'non-www' && str($host)->startsWith('www.')) {
$labels = $labels->merge($redirect_to_non_www);
@@ -417,7 +425,7 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
$middlewares->push('gzip');
}
if (str($image)->contains('ghost')) {
- $middlewares->push('redir-ghost');
+ $middlewares->push("redir-ghost-{$uuid}");
}
if ($redirect_direction === 'non-www' && str($host)->startsWith('www.')) {
$labels = $labels->merge($redirect_to_non_www);
@@ -466,7 +474,7 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
$middlewares->push('gzip');
}
if (str($image)->contains('ghost')) {
- $middlewares->push('redir-ghost');
+ $middlewares->push("redir-ghost-{$uuid}");
}
if ($redirect_direction === 'non-www' && str($host)->startsWith('www.')) {
$labels = $labels->merge($redirect_to_non_www);
@@ -489,7 +497,7 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
$middlewares->push('gzip');
}
if (str($image)->contains('ghost')) {
- $middlewares->push('redir-ghost');
+ $middlewares->push("redir-ghost-{$uuid}");
}
if ($redirect_direction === 'non-www' && str($host)->startsWith('www.')) {
$labels = $labels->merge($redirect_to_non_www);
@@ -654,7 +662,7 @@ function isDatabaseImage(?string $image = null)
return false;
}
-function convert_docker_run_to_compose(?string $custom_docker_run_options = null)
+function convertDockerRunToCompose(?string $custom_docker_run_options = null)
{
$options = [];
$compose_options = collect([]);
@@ -679,9 +687,17 @@ function convert_docker_run_to_compose(?string $custom_docker_run_options = null
'--privileged' => 'privileged',
'--ip' => 'ip',
'--shm-size' => 'shm_size',
+ '--gpus' => 'gpus',
]);
foreach ($matches as $match) {
$option = $match[1];
+ if ($option === '--gpus') {
+ $regexForParsingDeviceIds = '/device=([0-9A-Za-z-,]+)/';
+ preg_match($regexForParsingDeviceIds, $custom_docker_run_options, $device_matches);
+ $value = $device_matches[1] ?? 'all';
+ $options[$option][] = $value;
+ $options[$option] = array_unique($options[$option]);
+ }
if (isset($match[2]) && $match[2] !== '') {
$value = $match[2];
$options[$option][] = $value;
@@ -694,7 +710,6 @@ function convert_docker_run_to_compose(?string $custom_docker_run_options = null
$options = collect($options);
// Easily get mappings from https://github.com/composerize/composerize/blob/master/packages/composerize/src/mappings.js
foreach ($options as $option => $value) {
- // ray($option,$value);
if (! data_get($mapping, $option)) {
continue;
}
@@ -723,6 +738,28 @@ function convert_docker_run_to_compose(?string $custom_docker_run_options = null
if (! is_null($value) && is_array($value) && count($value) > 0) {
$compose_options->put($mapping[$option], $value[0]);
}
+ } elseif ($option === '--gpus') {
+ $payload = [
+ 'driver' => 'nvidia',
+ 'capabilities' => ['gpu'],
+ ];
+ if (! is_null($value) && is_array($value) && count($value) > 0) {
+ if (str($value[0]) != 'all') {
+ if (str($value[0])->contains(',')) {
+ $payload['device_ids'] = str($value[0])->explode(',')->toArray();
+ } else {
+ $payload['device_ids'] = [$value[0]];
+ }
+ }
+ }
+ ray($payload);
+ $compose_options->put('deploy', [
+ 'resources' => [
+ 'reservations' => [
+ 'devices' => [$payload],
+ ],
+ ],
+ ]);
} else {
if ($list_options->contains($option)) {
if ($compose_options->has($mapping[$option])) {
@@ -744,7 +781,7 @@ function convert_docker_run_to_compose(?string $custom_docker_run_options = null
return $compose_options->toArray();
}
-function generate_custom_docker_run_options_for_databases($docker_run_options, $docker_compose, $container_name, $network)
+function generateCustomDockerRunOptionsForDatabases($docker_run_options, $docker_compose, $container_name, $network)
{
$ipv4 = data_get($docker_run_options, 'ip.0');
$ipv6 = data_get($docker_run_options, 'ip6.0');
diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php
index fb4ae3699..dc4924789 100644
--- a/bootstrap/helpers/shared.php
+++ b/bootstrap/helpers/shared.php
@@ -7,6 +7,7 @@ use App\Models\Application;
use App\Models\ApplicationDeploymentQueue;
use App\Models\ApplicationPreview;
use App\Models\EnvironmentVariable;
+use App\Models\GithubApp;
use App\Models\InstanceSettings;
use App\Models\LocalFileVolume;
use App\Models\LocalPersistentVolume;
@@ -35,6 +36,7 @@ use Illuminate\Mail\Message;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Process\Pool;
use Illuminate\Support\Collection;
+use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Http;
@@ -100,12 +102,12 @@ function isInstanceAdmin()
function currentTeam()
{
- return auth()?->user()?->currentTeam() ?? null;
+ return Auth::user()?->currentTeam() ?? null;
}
function showBoarding(): bool
{
- if (auth()->user()?->isMember()) {
+ if (Auth::user()?->isMember()) {
return false;
}
@@ -114,14 +116,14 @@ function showBoarding(): bool
function refreshSession(?Team $team = null): void
{
if (! $team) {
- if (auth()->user()?->currentTeam()) {
- $team = Team::find(auth()->user()->currentTeam()->id);
+ if (Auth::user()->currentTeam()) {
+ $team = Team::find(Auth::user()->currentTeam()->id);
} else {
- $team = User::find(auth()->user()->id)->teams->first();
+ $team = User::find(Auth::id())->teams->first();
}
}
- Cache::forget('team:'.auth()->user()->id);
- Cache::remember('team:'.auth()->user()->id, 3600, function () use ($team) {
+ Cache::forget('team:'.Auth::id());
+ Cache::remember('team:'.Auth::id(), 3600, function () use ($team) {
return $team;
});
session(['currentTeam' => $team]);
@@ -357,7 +359,7 @@ function isDev(): bool
function isCloud(): bool
{
- return ! config('coolify.self_hosted');
+ return ! config('constants.coolify.self_hosted');
}
function translate_cron_expression($expression_to_validate): string
@@ -383,6 +385,11 @@ function validate_cron_expression($expression_to_validate): bool
return $isValid;
}
+
+function validate_timezone(string $timezone): bool
+{
+ return in_array($timezone, timezone_identifiers_list());
+}
function send_internal_notification(string $message): void
{
try {
@@ -987,7 +994,7 @@ function generateEnvValue(string $command, Service|Application|null $service = n
function getRealtime()
{
- $envDefined = env('PUSHER_PORT');
+ $envDefined = config('constants.pusher.port');
if (empty($envDefined)) {
$url = Url::fromString(Request::getSchemeAndHttpHost());
$port = $url->getPort();
@@ -4061,3 +4068,83 @@ function isEmailRateLimited(string $limiterKey, int $decaySeconds = 3600, ?calla
return $rateLimited;
}
+
+function defaultNginxConfiguration(): string
+{
+ return 'server {
+ location / {
+ root /usr/share/nginx/html;
+ index index.html index.htm;
+ try_files $uri $uri.html $uri/index.html $uri/index.htm $uri/ /index.html /index.htm =404;
+ }
+
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root /usr/share/nginx/html;
+ try_files $uri @redirect_to_index;
+ internal;
+ }
+
+ error_page 404 = @handle_404;
+
+ location @handle_404 {
+ root /usr/share/nginx/html;
+ try_files /404.html @redirect_to_index;
+ internal;
+ }
+
+ location @redirect_to_index {
+ return 302 /;
+ }
+}';
+}
+
+function convertGitUrl(string $gitRepository, string $deploymentType, ?GithubApp $source = null): array
+{
+ $repository = $gitRepository;
+ $providerInfo = [
+ 'host' => null,
+ 'user' => 'git',
+ 'port' => 22,
+ 'repository' => $gitRepository,
+ ];
+ $sshMatches = [];
+ $matches = [];
+
+ // Let's try and parse the string to detect if it's a valid SSH string or not
+ preg_match('/((.*?)\:\/\/)?(.*@.*:.*)/', $gitRepository, $sshMatches);
+
+ if ($deploymentType === 'deploy_key' && empty($sshMatches) && $source) {
+ // If this happens, the user may have provided an HTTP URL when they needed an SSH one
+ // Let's try and fix that for known Git providers
+ switch ($source->getMorphClass()) {
+ case \App\Models\GithubApp::class:
+ $providerInfo['host'] = Url::fromString($source->html_url)->getHost();
+ $providerInfo['port'] = $source->custom_port;
+ $providerInfo['user'] = $source->custom_user;
+ break;
+ }
+ if (! empty($providerInfo['host'])) {
+ // Until we do not support more providers with App (like GithubApp), this will be always true, port will be 22
+ if ($providerInfo['port'] === 22) {
+ $repository = "{$providerInfo['user']}@{$providerInfo['host']}:{$providerInfo['repository']}";
+ } else {
+ $repository = "ssh://{$providerInfo['user']}@{$providerInfo['host']}:{$providerInfo['port']}/{$providerInfo['repository']}";
+ }
+ }
+ }
+
+ preg_match('/(?<=:)\d+(?=\/)/', $gitRepository, $matches);
+
+ if (count($matches) === 1) {
+ $providerInfo['port'] = $matches[0];
+ $gitHost = str($gitRepository)->before(':');
+ $gitRepo = str($gitRepository)->after('/');
+ $repository = "$gitHost:$gitRepo";
+ }
+
+ return [
+ 'repository' => $repository,
+ 'port' => $providerInfo['port'],
+ ];
+}
diff --git a/composer.json b/composer.json
index 2bae1149c..694bad882 100644
--- a/composer.json
+++ b/composer.json
@@ -12,14 +12,15 @@
],
"require": {
"php": "^8.2",
+ "3sidedcube/laravel-redoc": "^1.0",
"danharrin/livewire-rate-limiting": "^1.1",
- "doctrine/dbal": "^3.6",
+ "doctrine/dbal": "^4.2",
"guzzlehttp/guzzle": "^7.5.0",
"laravel/fortify": "^1.16.0",
- "laravel/framework": "^11",
+ "laravel/framework": "^11.0",
"laravel/horizon": "^5.29.1",
"laravel/pail": "^1.1",
- "laravel/prompts": "^0.1.6",
+ "laravel/prompts": "^0.1.18|^0.2.0|^0.3.0",
"laravel/sanctum": "^4.0",
"laravel/socialite": "^5.14.0",
"laravel/tinker": "^2.8.1",
@@ -27,7 +28,7 @@
"lcobucci/jwt": "^5.0.0",
"league/flysystem-aws-s3-v3": "^3.0",
"league/flysystem-sftp-v3": "^3.0",
- "livewire/livewire": "3.4.9",
+ "livewire/livewire": "^3.5",
"log1x/laravel-webfonts": "^1.0",
"lorisleiva/laravel-actions": "^2.7",
"nubs/random-name-generator": "^2.2",
@@ -36,17 +37,17 @@
"poliander/cron": "^3.0",
"purplepixie/phpdns": "^2.1",
"pusher/pusher-php-server": "^7.2",
- "resend/resend-laravel": "^0.13.0",
+ "resend/resend-laravel": "^0.15.0",
"sentry/sentry-laravel": "^4.6",
"socialiteproviders/microsoft-azure": "^5.1",
"spatie/laravel-activitylog": "^4.7.3",
- "spatie/laravel-data": "^3.4.3",
- "spatie/laravel-ray": "^1.32.4",
+ "spatie/laravel-data": "^4.11",
+ "spatie/laravel-ray": "^1.37",
"spatie/laravel-schemaless-attributes": "^2.4",
"spatie/url": "^2.2",
- "stripe/stripe-php": "^12.0",
- "symfony/yaml": "^6.2",
- "visus/cuid2": "^2.0.0",
+ "stripe/stripe-php": "^16.2.0",
+ "symfony/yaml": "^7.1.6",
+ "visus/cuid2": "^4.1.0",
"yosymfony/toml": "^1.0",
"zircote/swagger-php": "^4.10"
},
@@ -58,12 +59,12 @@
"laravel/telescope": "^5.2",
"mockery/mockery": "^1.5.1",
"nunomaduro/collision": "^8.1",
- "pestphp/pest": "^2.16",
- "phpstan/phpstan": "^1.10",
- "phpunit/phpunit": "^10.0.19",
- "serversideup/spin": "^1.1.0",
+ "pestphp/pest": "^3.5",
+ "phpstan/phpstan": "^1.12.10",
+ "phpunit/phpunit": "^11.4",
+ "serversideup/spin": "^2.3",
"spatie/laravel-ignition": "^2.1.0",
- "symfony/http-client": "^6.2"
+ "symfony/http-client": "^7.1"
},
"minimum-stability": "stable",
"prefer-stable": true,
@@ -119,4 +120,4 @@
"@php artisan key:generate --ansi"
]
}
-}
\ No newline at end of file
+}
diff --git a/composer.lock b/composer.lock
index fb0dcd018..8ea0d9a5a 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,8 +4,66 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "3f2342fe6b1ba920c8875f8a8fe41962",
+ "content-hash": "f50de759f43a3eefb58ce9ebbb02d33b",
"packages": [
+ {
+ "name": "3sidedcube/laravel-redoc",
+ "version": "v1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/3sidedcube/laravel-redoc.git",
+ "reference": "c33a563885dcdf1e0f623df5a56c106d130261da"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/3sidedcube/laravel-redoc/zipball/c33a563885dcdf1e0f623df5a56c106d130261da",
+ "reference": "c33a563885dcdf1e0f623df5a56c106d130261da",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/routing": "^8.0|^9.0|^10.0|^11.0",
+ "illuminate/support": "^8.0|^9.0|^10.0|^11.0",
+ "php": "^7.4|^8.0|^8.1|^8.2|^8.3"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^3.3",
+ "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "ThreeSidedCube\\LaravelRedoc\\RedocServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "ThreeSidedCube\\LaravelRedoc\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ben Sherred",
+ "role": "Developer"
+ }
+ ],
+ "description": "A lightweight package for rendering API documentation using OpenAPI and Redoc.",
+ "homepage": "https://github.com/3sidedcube/laravel-redoc",
+ "keywords": [
+ "3sidedcube",
+ "laravel-redoc"
+ ],
+ "support": {
+ "issues": "https://github.com/3sidedcube/laravel-redoc/issues",
+ "source": "https://github.com/3sidedcube/laravel-redoc/tree/v1.0.1"
+ },
+ "time": "2024-05-20T11:37:55+00:00"
+ },
{
"name": "amphp/amp",
"version": "v3.0.2",
@@ -867,16 +925,16 @@
},
{
"name": "aws/aws-crt-php",
- "version": "v1.2.6",
+ "version": "v1.2.7",
"source": {
"type": "git",
"url": "https://github.com/awslabs/aws-crt-php.git",
- "reference": "a63485b65b6b3367039306496d49737cf1995408"
+ "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/a63485b65b6b3367039306496d49737cf1995408",
- "reference": "a63485b65b6b3367039306496d49737cf1995408",
+ "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e",
+ "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e",
"shasum": ""
},
"require": {
@@ -915,22 +973,22 @@
],
"support": {
"issues": "https://github.com/awslabs/aws-crt-php/issues",
- "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.6"
+ "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.7"
},
- "time": "2024-06-13T17:21:28+00:00"
+ "time": "2024-10-18T22:15:13+00:00"
},
{
"name": "aws/aws-sdk-php",
- "version": "3.324.0",
+ "version": "3.327.1",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
- "reference": "b258712f0d986e00e1143d55246b6f9e344c7184"
+ "reference": "3d52ec587989b136e486f94eff3dd316465aeb42"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/b258712f0d986e00e1143d55246b6f9e344c7184",
- "reference": "b258712f0d986e00e1143d55246b6f9e344c7184",
+ "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/3d52ec587989b136e486f94eff3dd316465aeb42",
+ "reference": "3d52ec587989b136e486f94eff3dd316465aeb42",
"shasum": ""
},
"require": {
@@ -1013,9 +1071,9 @@
"support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues",
- "source": "https://github.com/aws/aws-sdk-php/tree/3.324.0"
+ "source": "https://github.com/aws/aws-sdk-php/tree/3.327.1"
},
- "time": "2024-10-10T18:06:36+00:00"
+ "time": "2024-11-15T01:53:30+00:00"
},
{
"name": "bacon/bacon-qr-code",
@@ -1133,26 +1191,26 @@
},
{
"name": "carbonphp/carbon-doctrine-types",
- "version": "2.1.0",
+ "version": "3.2.0",
"source": {
"type": "git",
"url": "https://github.com/CarbonPHP/carbon-doctrine-types.git",
- "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb"
+ "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/99f76ffa36cce3b70a4a6abce41dba15ca2e84cb",
- "reference": "99f76ffa36cce3b70a4a6abce41dba15ca2e84cb",
+ "url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d",
+ "reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d",
"shasum": ""
},
"require": {
- "php": "^7.4 || ^8.0"
+ "php": "^8.1"
},
"conflict": {
- "doctrine/dbal": "<3.7.0 || >=4.0.0"
+ "doctrine/dbal": "<4.0.0 || >=5.0.0"
},
"require-dev": {
- "doctrine/dbal": "^3.7.0",
+ "doctrine/dbal": "^4.0.0",
"nesbot/carbon": "^2.71.0 || ^3.0.0",
"phpunit/phpunit": "^10.3"
},
@@ -1182,7 +1240,7 @@
],
"support": {
"issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues",
- "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/2.1.0"
+ "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0"
},
"funding": [
{
@@ -1198,7 +1256,7 @@
"type": "tidelift"
}
],
- "time": "2023-12-11T17:09:12+00:00"
+ "time": "2024-02-09T16:56:22+00:00"
},
{
"name": "danharrin/livewire-rate-limiting",
@@ -1423,142 +1481,44 @@
},
"time": "2024-07-08T12:26:09+00:00"
},
- {
- "name": "doctrine/cache",
- "version": "2.2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/doctrine/cache.git",
- "reference": "1ca8f21980e770095a31456042471a57bc4c68fb"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb",
- "reference": "1ca8f21980e770095a31456042471a57bc4c68fb",
- "shasum": ""
- },
- "require": {
- "php": "~7.1 || ^8.0"
- },
- "conflict": {
- "doctrine/common": ">2.2,<2.4"
- },
- "require-dev": {
- "cache/integration-tests": "dev-master",
- "doctrine/coding-standard": "^9",
- "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
- "psr/cache": "^1.0 || ^2.0 || ^3.0",
- "symfony/cache": "^4.4 || ^5.4 || ^6",
- "symfony/var-exporter": "^4.4 || ^5.4 || ^6"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
- {
- "name": "Roman Borschel",
- "email": "roman@code-factory.org"
- },
- {
- "name": "Benjamin Eberlei",
- "email": "kontakt@beberlei.de"
- },
- {
- "name": "Jonathan Wage",
- "email": "jonwage@gmail.com"
- },
- {
- "name": "Johannes Schmitt",
- "email": "schmittjoh@gmail.com"
- }
- ],
- "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.",
- "homepage": "https://www.doctrine-project.org/projects/cache.html",
- "keywords": [
- "abstraction",
- "apcu",
- "cache",
- "caching",
- "couchdb",
- "memcached",
- "php",
- "redis",
- "xcache"
- ],
- "support": {
- "issues": "https://github.com/doctrine/cache/issues",
- "source": "https://github.com/doctrine/cache/tree/2.2.0"
- },
- "funding": [
- {
- "url": "https://www.doctrine-project.org/sponsorship.html",
- "type": "custom"
- },
- {
- "url": "https://www.patreon.com/phpdoctrine",
- "type": "patreon"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache",
- "type": "tidelift"
- }
- ],
- "time": "2022-05-20T20:07:39+00:00"
- },
{
"name": "doctrine/dbal",
- "version": "3.9.3",
+ "version": "4.2.1",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal.git",
- "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba"
+ "reference": "dadd35300837a3a2184bd47d403333b15d0a9bd0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/dbal/zipball/61446f07fcb522414d6cfd8b1c3e5f9e18c579ba",
- "reference": "61446f07fcb522414d6cfd8b1c3e5f9e18c579ba",
+ "url": "https://api.github.com/repos/doctrine/dbal/zipball/dadd35300837a3a2184bd47d403333b15d0a9bd0",
+ "reference": "dadd35300837a3a2184bd47d403333b15d0a9bd0",
"shasum": ""
},
"require": {
- "composer-runtime-api": "^2",
- "doctrine/cache": "^1.11|^2.0",
"doctrine/deprecations": "^0.5.3|^1",
- "doctrine/event-manager": "^1|^2",
- "php": "^7.4 || ^8.0",
+ "php": "^8.1",
"psr/cache": "^1|^2|^3",
"psr/log": "^1|^2|^3"
},
"require-dev": {
"doctrine/coding-standard": "12.0.0",
"fig/log-test": "^1",
- "jetbrains/phpstorm-stubs": "2023.1",
+ "jetbrains/phpstorm-stubs": "2023.2",
"phpstan/phpstan": "1.12.6",
+ "phpstan/phpstan-phpunit": "1.4.0",
"phpstan/phpstan-strict-rules": "^1.6",
- "phpunit/phpunit": "9.6.20",
- "psalm/plugin-phpunit": "0.18.4",
+ "phpunit/phpunit": "10.5.30",
+ "psalm/plugin-phpunit": "0.19.0",
"slevomat/coding-standard": "8.13.1",
"squizlabs/php_codesniffer": "3.10.2",
- "symfony/cache": "^5.4|^6.0|^7.0",
- "symfony/console": "^4.4|^5.4|^6.0|^7.0",
- "vimeo/psalm": "4.30.0"
+ "symfony/cache": "^6.3.8|^7.0",
+ "symfony/console": "^5.4|^6.3|^7.0",
+ "vimeo/psalm": "5.25.0"
},
"suggest": {
"symfony/console": "For helpful console commands such as SQL execution and import of files."
},
- "bin": [
- "bin/doctrine-dbal"
- ],
"type": "library",
"autoload": {
"psr-4": {
@@ -1611,7 +1571,7 @@
],
"support": {
"issues": "https://github.com/doctrine/dbal/issues",
- "source": "https://github.com/doctrine/dbal/tree/3.9.3"
+ "source": "https://github.com/doctrine/dbal/tree/4.2.1"
},
"funding": [
{
@@ -1627,7 +1587,7 @@
"type": "tidelift"
}
],
- "time": "2024-10-10T17:56:43+00:00"
+ "time": "2024-10-10T18:01:27+00:00"
},
{
"name": "doctrine/deprecations",
@@ -1676,97 +1636,6 @@
},
"time": "2024-01-30T19:34:25+00:00"
},
- {
- "name": "doctrine/event-manager",
- "version": "2.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/doctrine/event-manager.git",
- "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e",
- "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e",
- "shasum": ""
- },
- "require": {
- "php": "^8.1"
- },
- "conflict": {
- "doctrine/common": "<2.9"
- },
- "require-dev": {
- "doctrine/coding-standard": "^12",
- "phpstan/phpstan": "^1.8.8",
- "phpunit/phpunit": "^10.5",
- "vimeo/psalm": "^5.24"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Doctrine\\Common\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
- {
- "name": "Roman Borschel",
- "email": "roman@code-factory.org"
- },
- {
- "name": "Benjamin Eberlei",
- "email": "kontakt@beberlei.de"
- },
- {
- "name": "Jonathan Wage",
- "email": "jonwage@gmail.com"
- },
- {
- "name": "Johannes Schmitt",
- "email": "schmittjoh@gmail.com"
- },
- {
- "name": "Marco Pivetta",
- "email": "ocramius@gmail.com"
- }
- ],
- "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.",
- "homepage": "https://www.doctrine-project.org/projects/event-manager.html",
- "keywords": [
- "event",
- "event dispatcher",
- "event manager",
- "event system",
- "events"
- ],
- "support": {
- "issues": "https://github.com/doctrine/event-manager/issues",
- "source": "https://github.com/doctrine/event-manager/tree/2.0.1"
- },
- "funding": [
- {
- "url": "https://www.doctrine-project.org/sponsorship.html",
- "type": "custom"
- },
- {
- "url": "https://www.patreon.com/phpdoctrine",
- "type": "patreon"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager",
- "type": "tidelift"
- }
- ],
- "time": "2024-05-22T20:47:39+00:00"
- },
{
"name": "doctrine/inflector",
"version": "2.0.10",
@@ -2391,16 +2260,16 @@
},
{
"name": "guzzlehttp/promises",
- "version": "2.0.3",
+ "version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
- "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8"
+ "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8",
- "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
+ "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455",
"shasum": ""
},
"require": {
@@ -2454,7 +2323,7 @@
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
- "source": "https://github.com/guzzle/promises/tree/2.0.3"
+ "source": "https://github.com/guzzle/promises/tree/2.0.4"
},
"funding": [
{
@@ -2470,7 +2339,7 @@
"type": "tidelift"
}
],
- "time": "2024-07-18T10:29:17+00:00"
+ "time": "2024-10-17T10:06:22+00:00"
},
{
"name": "guzzlehttp/psr7",
@@ -2793,16 +2662,16 @@
},
{
"name": "laravel/fortify",
- "version": "v1.24.2",
+ "version": "v1.24.5",
"source": {
"type": "git",
"url": "https://github.com/laravel/fortify.git",
- "reference": "42695c45087e5abb3e173725b4f1ef4956a7b47d"
+ "reference": "bba8c2ecc3fcc78e8632e0d719ae10bef6343eef"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/fortify/zipball/42695c45087e5abb3e173725b4f1ef4956a7b47d",
- "reference": "42695c45087e5abb3e173725b4f1ef4956a7b47d",
+ "url": "https://api.github.com/repos/laravel/fortify/zipball/bba8c2ecc3fcc78e8632e0d719ae10bef6343eef",
+ "reference": "bba8c2ecc3fcc78e8632e0d719ae10bef6343eef",
"shasum": ""
},
"require": {
@@ -2854,20 +2723,20 @@
"issues": "https://github.com/laravel/fortify/issues",
"source": "https://github.com/laravel/fortify"
},
- "time": "2024-09-16T19:20:52+00:00"
+ "time": "2024-11-12T14:51:12+00:00"
},
{
"name": "laravel/framework",
- "version": "v11.27.2",
+ "version": "v11.31.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
- "reference": "a51d1f2b771c542324a3d9b76a98b1bbc75c0ee9"
+ "reference": "365090ed2c68244e3141cdb5e247cdf3dfba2c40"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/a51d1f2b771c542324a3d9b76a98b1bbc75c0ee9",
- "reference": "a51d1f2b771c542324a3d9b76a98b1bbc75c0ee9",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/365090ed2c68244e3141cdb5e247cdf3dfba2c40",
+ "reference": "365090ed2c68244e3141cdb5e247cdf3dfba2c40",
"shasum": ""
},
"require": {
@@ -3063,20 +2932,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
- "time": "2024-10-09T04:17:35+00:00"
+ "time": "2024-11-12T15:36:15+00:00"
},
{
"name": "laravel/horizon",
- "version": "v5.29.1",
+ "version": "v5.29.3",
"source": {
"type": "git",
"url": "https://github.com/laravel/horizon.git",
- "reference": "9f482f21c23ed01c2366d1157843165165579c23"
+ "reference": "a48d242759704e598242074daf0060bbeb6ed46d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/horizon/zipball/9f482f21c23ed01c2366d1157843165165579c23",
- "reference": "9f482f21c23ed01c2366d1157843165165579c23",
+ "url": "https://api.github.com/repos/laravel/horizon/zipball/a48d242759704e598242074daf0060bbeb6ed46d",
+ "reference": "a48d242759704e598242074daf0060bbeb6ed46d",
"shasum": ""
},
"require": {
@@ -3091,6 +2960,7 @@
"ramsey/uuid": "^4.0",
"symfony/console": "^6.0|^7.0",
"symfony/error-handler": "^6.0|^7.0",
+ "symfony/polyfill-php83": "^1.28",
"symfony/process": "^6.0|^7.0"
},
"require-dev": {
@@ -3140,22 +3010,22 @@
],
"support": {
"issues": "https://github.com/laravel/horizon/issues",
- "source": "https://github.com/laravel/horizon/tree/v5.29.1"
+ "source": "https://github.com/laravel/horizon/tree/v5.29.3"
},
- "time": "2024-10-08T18:23:02+00:00"
+ "time": "2024-11-07T21:51:45+00:00"
},
{
"name": "laravel/pail",
- "version": "v1.1.5",
+ "version": "v1.2.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/pail.git",
- "reference": "b33ad8321416fe86efed7bf398f3306c47b4871b"
+ "reference": "353ac12134b98e2e7c3333d916bd3e523931e583"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/pail/zipball/b33ad8321416fe86efed7bf398f3306c47b4871b",
- "reference": "b33ad8321416fe86efed7bf398f3306c47b4871b",
+ "url": "https://api.github.com/repos/laravel/pail/zipball/353ac12134b98e2e7c3333d916bd3e523931e583",
+ "reference": "353ac12134b98e2e7c3333d916bd3e523931e583",
"shasum": ""
},
"require": {
@@ -3170,8 +3040,9 @@
"symfony/console": "^6.0|^7.0"
},
"require-dev": {
+ "laravel/framework": "^10.24|^11.0",
"laravel/pint": "^1.13",
- "orchestra/testbench": "^8.12|^9.0",
+ "orchestra/testbench-core": "^8.12|^9.0",
"pestphp/pest": "^2.20",
"pestphp/pest-plugin-type-coverage": "^2.3",
"phpstan/phpstan": "^1.10",
@@ -3219,25 +3090,25 @@
"issues": "https://github.com/laravel/pail/issues",
"source": "https://github.com/laravel/pail"
},
- "time": "2024-10-15T20:06:24+00:00"
+ "time": "2024-10-23T12:56:23+00:00"
},
{
"name": "laravel/prompts",
- "version": "v0.1.25",
+ "version": "v0.3.2",
"source": {
"type": "git",
"url": "https://github.com/laravel/prompts.git",
- "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95"
+ "reference": "0e0535747c6b8d6d10adca8b68293cf4517abb0f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/prompts/zipball/7b4029a84c37cb2725fc7f011586e2997040bc95",
- "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95",
+ "url": "https://api.github.com/repos/laravel/prompts/zipball/0e0535747c6b8d6d10adca8b68293cf4517abb0f",
+ "reference": "0e0535747c6b8d6d10adca8b68293cf4517abb0f",
"shasum": ""
},
"require": {
+ "composer-runtime-api": "^2.2",
"ext-mbstring": "*",
- "illuminate/collections": "^10.0|^11.0",
"php": "^8.1",
"symfony/console": "^6.2|^7.0"
},
@@ -3246,8 +3117,9 @@
"laravel/framework": ">=10.17.0 <10.25.0"
},
"require-dev": {
+ "illuminate/collections": "^10.0|^11.0",
"mockery/mockery": "^1.5",
- "pestphp/pest": "^2.3",
+ "pestphp/pest": "^2.3|^3.4",
"phpstan/phpstan": "^1.11",
"phpstan/phpstan-mockery": "^1.1"
},
@@ -3257,7 +3129,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "0.1.x-dev"
+ "dev-main": "0.3.x-dev"
}
},
"autoload": {
@@ -3275,9 +3147,9 @@
"description": "Add beautiful and user-friendly forms to your command-line applications.",
"support": {
"issues": "https://github.com/laravel/prompts/issues",
- "source": "https://github.com/laravel/prompts/tree/v0.1.25"
+ "source": "https://github.com/laravel/prompts/tree/v0.3.2"
},
- "time": "2024-08-12T22:06:33+00:00"
+ "time": "2024-11-12T14:59:47+00:00"
},
{
"name": "laravel/sanctum",
@@ -3345,16 +3217,16 @@
},
{
"name": "laravel/serializable-closure",
- "version": "v1.3.5",
+ "version": "v1.3.6",
"source": {
"type": "git",
"url": "https://github.com/laravel/serializable-closure.git",
- "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c"
+ "reference": "f865a58ea3a0107c336b7045104c75243fa59d96"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c",
- "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c",
+ "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/f865a58ea3a0107c336b7045104c75243fa59d96",
+ "reference": "f865a58ea3a0107c336b7045104c75243fa59d96",
"shasum": ""
},
"require": {
@@ -3402,7 +3274,7 @@
"issues": "https://github.com/laravel/serializable-closure/issues",
"source": "https://github.com/laravel/serializable-closure"
},
- "time": "2024-09-23T13:33:08+00:00"
+ "time": "2024-11-11T17:06:04+00:00"
},
{
"name": "laravel/socialite",
@@ -3607,16 +3479,16 @@
},
{
"name": "lcobucci/jwt",
- "version": "5.4.0",
+ "version": "5.4.2",
"source": {
"type": "git",
"url": "https://github.com/lcobucci/jwt.git",
- "reference": "aac4fd512681fd5cb4b77d2105ab7ec700c72051"
+ "reference": "ea1ce71cbf9741e445a5914e2f67cdbb484ff712"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/lcobucci/jwt/zipball/aac4fd512681fd5cb4b77d2105ab7ec700c72051",
- "reference": "aac4fd512681fd5cb4b77d2105ab7ec700c72051",
+ "url": "https://api.github.com/repos/lcobucci/jwt/zipball/ea1ce71cbf9741e445a5914e2f67cdbb484ff712",
+ "reference": "ea1ce71cbf9741e445a5914e2f67cdbb484ff712",
"shasum": ""
},
"require": {
@@ -3664,7 +3536,7 @@
],
"support": {
"issues": "https://github.com/lcobucci/jwt/issues",
- "source": "https://github.com/lcobucci/jwt/tree/5.4.0"
+ "source": "https://github.com/lcobucci/jwt/tree/5.4.2"
},
"funding": [
{
@@ -3676,7 +3548,7 @@
"type": "patreon"
}
],
- "time": "2024-10-08T22:06:45+00:00"
+ "time": "2024-11-07T12:54:35+00:00"
},
{
"name": "league/commonmark",
@@ -4410,16 +4282,16 @@
},
{
"name": "livewire/livewire",
- "version": "v3.4.9",
+ "version": "v3.5.12",
"source": {
"type": "git",
"url": "https://github.com/livewire/livewire.git",
- "reference": "c65b3f0798ab2c9338213ede3588c3cdf4e6fcc0"
+ "reference": "3c8d1f9d7d9098aaea663093ae168f2d5d2ae73d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/livewire/livewire/zipball/c65b3f0798ab2c9338213ede3588c3cdf4e6fcc0",
- "reference": "c65b3f0798ab2c9338213ede3588c3cdf4e6fcc0",
+ "url": "https://api.github.com/repos/livewire/livewire/zipball/3c8d1f9d7d9098aaea663093ae168f2d5d2ae73d",
+ "reference": "3c8d1f9d7d9098aaea663093ae168f2d5d2ae73d",
"shasum": ""
},
"require": {
@@ -4427,17 +4299,18 @@
"illuminate/routing": "^10.0|^11.0",
"illuminate/support": "^10.0|^11.0",
"illuminate/validation": "^10.0|^11.0",
+ "laravel/prompts": "^0.1.24|^0.2|^0.3",
"league/mime-type-detection": "^1.9",
"php": "^8.1",
+ "symfony/console": "^6.0|^7.0",
"symfony/http-kernel": "^6.2|^7.0"
},
"require-dev": {
"calebporzio/sushi": "^2.1",
- "laravel/framework": "^10.0|^11.0",
- "laravel/prompts": "^0.1.6",
+ "laravel/framework": "^10.15.0|^11.0",
"mockery/mockery": "^1.3.1",
- "orchestra/testbench": "8.20.0|^9.0",
- "orchestra/testbench-dusk": "8.20.0|^9.0",
+ "orchestra/testbench": "^8.21.0|^9.0",
+ "orchestra/testbench-dusk": "^8.24|^9.1",
"phpunit/phpunit": "^10.4",
"psy/psysh": "^0.11.22|^0.12"
},
@@ -4473,7 +4346,7 @@
"description": "A front-end framework for Laravel.",
"support": {
"issues": "https://github.com/livewire/livewire/issues",
- "source": "https://github.com/livewire/livewire/tree/v3.4.9"
+ "source": "https://github.com/livewire/livewire/tree/v3.5.12"
},
"funding": [
{
@@ -4481,31 +4354,31 @@
"type": "github"
}
],
- "time": "2024-03-14T14:03:32+00:00"
+ "time": "2024-10-15T19:35:06+00:00"
},
{
"name": "log1x/laravel-webfonts",
- "version": "v1.0.1",
+ "version": "v1.0.2",
"source": {
"type": "git",
"url": "https://github.com/Log1x/laravel-webfonts.git",
- "reference": "0d38122aa7f5501394006a6715f7d97dac223507"
+ "reference": "128a20af26f02db84df21abc6524e5a069cf20a4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Log1x/laravel-webfonts/zipball/0d38122aa7f5501394006a6715f7d97dac223507",
- "reference": "0d38122aa7f5501394006a6715f7d97dac223507",
+ "url": "https://api.github.com/repos/Log1x/laravel-webfonts/zipball/128a20af26f02db84df21abc6524e5a069cf20a4",
+ "reference": "128a20af26f02db84df21abc6524e5a069cf20a4",
"shasum": ""
},
"require": {
"guzzlehttp/guzzle": "^7.8",
- "laravel/prompts": "^0.1.15",
+ "laravel/prompts": "^0.1|^0.2|^0.3",
"php": ">=8.1"
},
"require-dev": {
- "illuminate/console": "^10.41",
- "illuminate/http": "^10.41",
- "illuminate/support": "^10.41",
+ "illuminate/console": "^10.0|^11.0",
+ "illuminate/http": "^10.0|^11.0",
+ "illuminate/support": "^10.0|^11.0",
"laravel/pint": "^1.13"
},
"type": "package",
@@ -4535,7 +4408,7 @@
"description": "Download, install, and preload over 1500 Google fonts locally in your Laravel project",
"support": {
"issues": "https://github.com/Log1x/laravel-webfonts/issues",
- "source": "https://github.com/Log1x/laravel-webfonts/tree/v1.0.1"
+ "source": "https://github.com/Log1x/laravel-webfonts/tree/v1.0.2"
},
"funding": [
{
@@ -4543,7 +4416,7 @@
"type": "github"
}
],
- "time": "2024-03-28T11:53:11+00:00"
+ "time": "2024-11-12T19:00:31+00:00"
},
{
"name": "lorisleiva/laravel-actions",
@@ -4695,16 +4568,16 @@
},
{
"name": "monolog/monolog",
- "version": "3.7.0",
+ "version": "3.8.0",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
- "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8"
+ "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8",
- "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/32e515fdc02cdafbe4593e30a9350d486b125b67",
+ "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67",
"shasum": ""
},
"require": {
@@ -4724,12 +4597,14 @@
"guzzlehttp/psr7": "^2.2",
"mongodb/mongodb": "^1.8",
"php-amqplib/php-amqplib": "~2.4 || ^3",
- "phpstan/phpstan": "^1.9",
- "phpstan/phpstan-deprecation-rules": "^1.0",
- "phpstan/phpstan-strict-rules": "^1.4",
- "phpunit/phpunit": "^10.5.17",
+ "php-console/php-console": "^3.1.8",
+ "phpstan/phpstan": "^2",
+ "phpstan/phpstan-deprecation-rules": "^2",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpunit/phpunit": "^10.5.17 || ^11.0.7",
"predis/predis": "^1.1 || ^2",
- "ruflin/elastica": "^7",
+ "rollbar/rollbar": "^4.0",
+ "ruflin/elastica": "^7 || ^8",
"symfony/mailer": "^5.4 || ^6",
"symfony/mime": "^5.4 || ^6"
},
@@ -4780,7 +4655,7 @@
],
"support": {
"issues": "https://github.com/Seldaek/monolog/issues",
- "source": "https://github.com/Seldaek/monolog/tree/3.7.0"
+ "source": "https://github.com/Seldaek/monolog/tree/3.8.0"
},
"funding": [
{
@@ -4792,7 +4667,7 @@
"type": "tidelift"
}
],
- "time": "2024-06-28T09:40:51+00:00"
+ "time": "2024-11-12T13:57:08+00:00"
},
{
"name": "mtdowling/jmespath.php",
@@ -4862,20 +4737,20 @@
},
{
"name": "nesbot/carbon",
- "version": "3.8.0",
+ "version": "3.8.2",
"source": {
"type": "git",
"url": "https://github.com/briannesbitt/Carbon.git",
- "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f"
+ "reference": "e1268cdbc486d97ce23fef2c666dc3c6b6de9947"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bbd3eef89af8ba66a3aa7952b5439168fbcc529f",
- "reference": "bbd3eef89af8ba66a3aa7952b5439168fbcc529f",
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/e1268cdbc486d97ce23fef2c666dc3c6b6de9947",
+ "reference": "e1268cdbc486d97ce23fef2c666dc3c6b6de9947",
"shasum": ""
},
"require": {
- "carbonphp/carbon-doctrine-types": "*",
+ "carbonphp/carbon-doctrine-types": "<100.0",
"ext-json": "*",
"php": "^8.1",
"psr/clock": "^1.0",
@@ -4964,7 +4839,7 @@
"type": "tidelift"
}
],
- "time": "2024-08-19T06:22:39+00:00"
+ "time": "2024-11-07T17:46:48+00:00"
},
{
"name": "nette/schema",
@@ -5227,32 +5102,31 @@
},
{
"name": "nunomaduro/termwind",
- "version": "v2.1.0",
+ "version": "v2.2.0",
"source": {
"type": "git",
"url": "https://github.com/nunomaduro/termwind.git",
- "reference": "e5f21eade88689536c0cdad4c3cd75f3ed26e01a"
+ "reference": "42c84e4e8090766bbd6445d06cd6e57650626ea3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/e5f21eade88689536c0cdad4c3cd75f3ed26e01a",
- "reference": "e5f21eade88689536c0cdad4c3cd75f3ed26e01a",
+ "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/42c84e4e8090766bbd6445d06cd6e57650626ea3",
+ "reference": "42c84e4e8090766bbd6445d06cd6e57650626ea3",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"php": "^8.2",
- "symfony/console": "^7.0.4"
+ "symfony/console": "^7.1.5"
},
"require-dev": {
- "ergebnis/phpstan-rules": "^2.2.0",
- "illuminate/console": "^11.1.1",
- "laravel/pint": "^1.15.0",
- "mockery/mockery": "^1.6.11",
- "pestphp/pest": "^2.34.6",
- "phpstan/phpstan": "^1.10.66",
- "phpstan/phpstan-strict-rules": "^1.5.2",
- "symfony/var-dumper": "^7.0.4",
+ "illuminate/console": "^11.28.0",
+ "laravel/pint": "^1.18.1",
+ "mockery/mockery": "^1.6.12",
+ "pestphp/pest": "^2.36.0",
+ "phpstan/phpstan": "^1.12.6",
+ "phpstan/phpstan-strict-rules": "^1.6.1",
+ "symfony/var-dumper": "^7.1.5",
"thecodingmachine/phpstan-strict-rules": "^1.0.0"
},
"type": "library",
@@ -5295,7 +5169,7 @@
],
"support": {
"issues": "https://github.com/nunomaduro/termwind/issues",
- "source": "https://github.com/nunomaduro/termwind/tree/v2.1.0"
+ "source": "https://github.com/nunomaduro/termwind/tree/v2.2.0"
},
"funding": [
{
@@ -5311,7 +5185,7 @@
"type": "github"
}
],
- "time": "2024-09-05T15:25:50+00:00"
+ "time": "2024-10-15T16:15:16+00:00"
},
{
"name": "nyholm/psr7",
@@ -5510,30 +5384,35 @@
},
{
"name": "paragonie/sodium_compat",
- "version": "v1.21.1",
+ "version": "v2.1.0",
"source": {
"type": "git",
"url": "https://github.com/paragonie/sodium_compat.git",
- "reference": "bb312875dcdd20680419564fe42ba1d9564b9e37"
+ "reference": "a673d5f310477027cead2e2f2b6db5d8368157cb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/bb312875dcdd20680419564fe42ba1d9564b9e37",
- "reference": "bb312875dcdd20680419564fe42ba1d9564b9e37",
+ "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/a673d5f310477027cead2e2f2b6db5d8368157cb",
+ "reference": "a673d5f310477027cead2e2f2b6db5d8368157cb",
"shasum": ""
},
"require": {
- "paragonie/random_compat": ">=1",
- "php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8"
+ "php": "^8.1",
+ "php-64bit": "*"
},
"require-dev": {
- "phpunit/phpunit": "^3|^4|^5|^6|^7|^8|^9"
+ "phpunit/phpunit": "^7|^8|^9",
+ "vimeo/psalm": "^4|^5"
},
"suggest": {
- "ext-libsodium": "PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.",
- "ext-sodium": "PHP >= 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security."
+ "ext-sodium": "Better performance, password hashing (Argon2i), secure memory management (memzero), and better security."
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
"autoload": {
"files": [
"autoload.php"
@@ -5590,9 +5469,9 @@
],
"support": {
"issues": "https://github.com/paragonie/sodium_compat/issues",
- "source": "https://github.com/paragonie/sodium_compat/tree/v1.21.1"
+ "source": "https://github.com/paragonie/sodium_compat/tree/v2.1.0"
},
- "time": "2024-04-22T22:05:04+00:00"
+ "time": "2024-09-04T12:51:01+00:00"
},
{
"name": "php-di/invoker",
@@ -5722,6 +5601,73 @@
],
"time": "2024-07-21T15:55:45+00:00"
},
+ {
+ "name": "phpdocumentor/reflection",
+ "version": "6.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/Reflection.git",
+ "reference": "61e2f1fe7683e9647b9ed8d9e53d08699385267d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/61e2f1fe7683e9647b9ed8d9e53d08699385267d",
+ "reference": "61e2f1fe7683e9647b9ed8d9e53d08699385267d",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "~4.18 || ^5.0",
+ "php": "8.1.*|8.2.*|8.3.*",
+ "phpdocumentor/reflection-common": "^2.1",
+ "phpdocumentor/reflection-docblock": "^5",
+ "phpdocumentor/type-resolver": "^1.2",
+ "symfony/polyfill-php80": "^1.28",
+ "webmozart/assert": "^1.7"
+ },
+ "require-dev": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^1.0",
+ "doctrine/coding-standard": "^12.0",
+ "mikey179/vfsstream": "~1.2",
+ "mockery/mockery": "~1.6.0",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-webmozart-assert": "^1.2",
+ "phpunit/phpunit": "^10.0",
+ "psalm/phar": "^5.24",
+ "rector/rector": "^1.0.0",
+ "squizlabs/php_codesniffer": "^3.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-5.x": "5.3.x-dev",
+ "dev-6.x": "6.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\": "src/phpDocumentor"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Reflection library to do Static Analysis for PHP Projects",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/Reflection/issues",
+ "source": "https://github.com/phpDocumentor/Reflection/tree/6.0.0"
+ },
+ "time": "2024-05-23T19:28:12+00:00"
+ },
{
"name": "phpdocumentor/reflection-common",
"version": "2.2.0",
@@ -5776,24 +5722,88 @@
"time": "2020-06-27T09:03:43+00:00"
},
{
- "name": "phpdocumentor/type-resolver",
- "version": "1.8.2",
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.6.0",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "153ae662783729388a584b4361f2545e4d841e3c"
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c",
- "reference": "153ae662783729388a584b4361f2545e4d841e3c",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/f3558a4c23426d12bffeaab463f8a8d8b681193c",
+ "reference": "f3558a4c23426d12bffeaab463f8a8d8b681193c",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1.1",
+ "ext-filter": "*",
+ "php": "^7.4 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.2",
+ "phpdocumentor/type-resolver": "^1.7",
+ "phpstan/phpdoc-parser": "^1.7|^2.0",
+ "webmozart/assert": "^1.9.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.5 || ~1.6.0",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-mockery": "^1.1",
+ "phpstan/phpstan-webmozart-assert": "^1.2",
+ "phpunit/phpunit": "^9.5",
+ "psalm/phar": "^5.26"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.0"
+ },
+ "time": "2024-11-12T11:25:25+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a",
+ "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a",
"shasum": ""
},
"require": {
"doctrine/deprecations": "^1.0",
"php": "^7.3 || ^8.0",
"phpdocumentor/reflection-common": "^2.0",
- "phpstan/phpdoc-parser": "^1.13"
+ "phpstan/phpdoc-parser": "^1.18|^2.0"
},
"require-dev": {
"ext-tokenizer": "*",
@@ -5829,9 +5839,9 @@
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
"support": {
"issues": "https://github.com/phpDocumentor/TypeResolver/issues",
- "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2"
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0"
},
- "time": "2024-02-23T11:10:43+00:00"
+ "time": "2024-11-09T15:12:26+00:00"
},
{
"name": "phpoption/phpoption",
@@ -6020,30 +6030,30 @@
},
{
"name": "phpstan/phpdoc-parser",
- "version": "1.32.0",
+ "version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
- "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4"
+ "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6ca22b154efdd9e3c68c56f5d94670920a1c19a4",
- "reference": "6ca22b154efdd9e3c68c56f5d94670920a1c19a4",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/c00d78fb6b29658347f9d37ebe104bffadf36299",
+ "reference": "c00d78fb6b29658347f9d37ebe104bffadf36299",
"shasum": ""
},
"require": {
- "php": "^7.2 || ^8.0"
+ "php": "^7.4 || ^8.0"
},
"require-dev": {
"doctrine/annotations": "^2.0",
- "nikic/php-parser": "^4.15",
+ "nikic/php-parser": "^5.3.0",
"php-parallel-lint/php-parallel-lint": "^1.2",
"phpstan/extension-installer": "^1.0",
- "phpstan/phpstan": "^1.5",
- "phpstan/phpstan-phpunit": "^1.1",
- "phpstan/phpstan-strict-rules": "^1.0",
- "phpunit/phpunit": "^9.5",
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.6",
"symfony/process": "^5.2"
},
"type": "library",
@@ -6061,22 +6071,22 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
- "source": "https://github.com/phpstan/phpdoc-parser/tree/1.32.0"
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/2.0.0"
},
- "time": "2024-09-26T07:23:32+00:00"
+ "time": "2024-10-13T11:29:49+00:00"
},
{
"name": "phpstan/phpstan",
- "version": "1.12.6",
+ "version": "1.12.10",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
- "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae"
+ "reference": "fc463b5d0fe906dcf19689be692c65c50406a071"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc4d2f145a88ea7141ae698effd64d9df46527ae",
- "reference": "dc4d2f145a88ea7141ae698effd64d9df46527ae",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/fc463b5d0fe906dcf19689be692c65c50406a071",
+ "reference": "fc463b5d0fe906dcf19689be692c65c50406a071",
"shasum": ""
},
"require": {
@@ -6121,7 +6131,7 @@
"type": "github"
}
],
- "time": "2024-10-06T15:03:59+00:00"
+ "time": "2024-11-11T15:37:09+00:00"
},
{
"name": "pion/laravel-chunk-upload",
@@ -6875,23 +6885,23 @@
},
{
"name": "pusher/pusher-php-server",
- "version": "7.2.4",
+ "version": "7.2.6",
"source": {
"type": "git",
"url": "https://github.com/pusher/pusher-http-php.git",
- "reference": "de2f72296808f9cafa6a4462b15a768ff130cddb"
+ "reference": "d89e9997191d18fb0fe03a956fa3ccfe0af524ea"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/pusher/pusher-http-php/zipball/de2f72296808f9cafa6a4462b15a768ff130cddb",
- "reference": "de2f72296808f9cafa6a4462b15a768ff130cddb",
+ "url": "https://api.github.com/repos/pusher/pusher-http-php/zipball/d89e9997191d18fb0fe03a956fa3ccfe0af524ea",
+ "reference": "d89e9997191d18fb0fe03a956fa3ccfe0af524ea",
"shasum": ""
},
"require": {
"ext-curl": "*",
"ext-json": "*",
"guzzlehttp/guzzle": "^7.2",
- "paragonie/sodium_compat": "^1.6",
+ "paragonie/sodium_compat": "^1.6|^2.0",
"php": "^7.3|^8.0",
"psr/log": "^1.0|^2.0|^3.0"
},
@@ -6930,9 +6940,9 @@
],
"support": {
"issues": "https://github.com/pusher/pusher-http-php/issues",
- "source": "https://github.com/pusher/pusher-http-php/tree/7.2.4"
+ "source": "https://github.com/pusher/pusher-http-php/tree/7.2.6"
},
- "time": "2023-12-15T10:58:53+00:00"
+ "time": "2024-10-18T12:04:31+00:00"
},
{
"name": "ralouphie/getallheaders",
@@ -7161,16 +7171,16 @@
},
{
"name": "rector/rector",
- "version": "1.2.6",
+ "version": "1.2.10",
"source": {
"type": "git",
"url": "https://github.com/rectorphp/rector.git",
- "reference": "6ca85da28159dbd3bb36211c5104b7bc91278e99"
+ "reference": "40f9cf38c05296bd32f444121336a521a293fa61"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/rectorphp/rector/zipball/6ca85da28159dbd3bb36211c5104b7bc91278e99",
- "reference": "6ca85da28159dbd3bb36211c5104b7bc91278e99",
+ "url": "https://api.github.com/repos/rectorphp/rector/zipball/40f9cf38c05296bd32f444121336a521a293fa61",
+ "reference": "40f9cf38c05296bd32f444121336a521a293fa61",
"shasum": ""
},
"require": {
@@ -7208,7 +7218,7 @@
],
"support": {
"issues": "https://github.com/rectorphp/rector/issues",
- "source": "https://github.com/rectorphp/rector/tree/1.2.6"
+ "source": "https://github.com/rectorphp/rector/tree/1.2.10"
},
"funding": [
{
@@ -7216,27 +7226,27 @@
"type": "github"
}
],
- "time": "2024-10-03T08:56:44+00:00"
+ "time": "2024-11-08T13:59:10+00:00"
},
{
"name": "resend/resend-laravel",
- "version": "v0.13.0",
+ "version": "v0.15.0",
"source": {
"type": "git",
"url": "https://github.com/resend/resend-laravel.git",
- "reference": "23aed22df0d0b23c2952da2aaed6a8b88d301a8a"
+ "reference": "af914817abc6abaa4522b5cfb177f3519493fd6e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/resend/resend-laravel/zipball/23aed22df0d0b23c2952da2aaed6a8b88d301a8a",
- "reference": "23aed22df0d0b23c2952da2aaed6a8b88d301a8a",
+ "url": "https://api.github.com/repos/resend/resend-laravel/zipball/af914817abc6abaa4522b5cfb177f3519493fd6e",
+ "reference": "af914817abc6abaa4522b5cfb177f3519493fd6e",
"shasum": ""
},
"require": {
"illuminate/http": "^10.0|^11.0",
"illuminate/support": "^10.0|^11.0",
"php": "^8.1",
- "resend/resend-php": "^0.12.0",
+ "resend/resend-php": "^0.14.0",
"symfony/mailer": "^6.2|^7.0"
},
"require-dev": {
@@ -7283,22 +7293,22 @@
],
"support": {
"issues": "https://github.com/resend/resend-laravel/issues",
- "source": "https://github.com/resend/resend-laravel/tree/v0.13.0"
+ "source": "https://github.com/resend/resend-laravel/tree/v0.15.0"
},
- "time": "2024-07-08T18:51:42+00:00"
+ "time": "2024-11-04T18:34:08+00:00"
},
{
"name": "resend/resend-php",
- "version": "v0.12.0",
+ "version": "v0.14.0",
"source": {
"type": "git",
"url": "https://github.com/resend/resend-php.git",
- "reference": "37fb79bb8160ce2de521bf37484ba59e89236521"
+ "reference": "d7900752bb9839421d40d9e66362bffb3ec07aac"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/resend/resend-php/zipball/37fb79bb8160ce2de521bf37484ba59e89236521",
- "reference": "37fb79bb8160ce2de521bf37484ba59e89236521",
+ "url": "https://api.github.com/repos/resend/resend-php/zipball/d7900752bb9839421d40d9e66362bffb3ec07aac",
+ "reference": "d7900752bb9839421d40d9e66362bffb3ec07aac",
"shasum": ""
},
"require": {
@@ -7340,9 +7350,9 @@
],
"support": {
"issues": "https://github.com/resend/resend-php/issues",
- "source": "https://github.com/resend/resend-php/tree/v0.12.0"
+ "source": "https://github.com/resend/resend-php/tree/v0.14.0"
},
- "time": "2024-03-04T03:16:28+00:00"
+ "time": "2024-11-01T02:00:44+00:00"
},
{
"name": "revolt/event-loop",
@@ -7418,16 +7428,16 @@
},
{
"name": "sentry/sentry",
- "version": "4.9.0",
+ "version": "4.10.0",
"source": {
"type": "git",
"url": "https://github.com/getsentry/sentry-php.git",
- "reference": "788ec170f51ebb22f2809a1e3f78b19ccd39b70d"
+ "reference": "2af937d47d8aadb8dab0b1d7b9557e495dd12856"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/788ec170f51ebb22f2809a1e3f78b19ccd39b70d",
- "reference": "788ec170f51ebb22f2809a1e3f78b19ccd39b70d",
+ "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/2af937d47d8aadb8dab0b1d7b9557e495dd12856",
+ "reference": "2af937d47d8aadb8dab0b1d7b9557e495dd12856",
"shasum": ""
},
"require": {
@@ -7445,12 +7455,12 @@
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.4",
- "guzzlehttp/promises": "^1.0|^2.0",
+ "guzzlehttp/promises": "^2.0.3",
"guzzlehttp/psr7": "^1.8.4|^2.1.1",
"monolog/monolog": "^1.6|^2.0|^3.0",
"phpbench/phpbench": "^1.0",
"phpstan/phpstan": "^1.3",
- "phpunit/phpunit": "^8.5.14|^9.4",
+ "phpunit/phpunit": "^8.5|^9.6",
"symfony/phpunit-bridge": "^5.2|^6.0|^7.0",
"vimeo/psalm": "^4.17"
},
@@ -7491,7 +7501,7 @@
],
"support": {
"issues": "https://github.com/getsentry/sentry-php/issues",
- "source": "https://github.com/getsentry/sentry-php/tree/4.9.0"
+ "source": "https://github.com/getsentry/sentry-php/tree/4.10.0"
},
"funding": [
{
@@ -7503,27 +7513,27 @@
"type": "custom"
}
],
- "time": "2024-08-08T14:40:50+00:00"
+ "time": "2024-11-06T07:44:19+00:00"
},
{
"name": "sentry/sentry-laravel",
- "version": "4.9.0",
+ "version": "4.10.0",
"source": {
"type": "git",
"url": "https://github.com/getsentry/sentry-laravel.git",
- "reference": "73078e1f26d57f7a10e3bee2a2f543a02f6493c3"
+ "reference": "cbdd224cc5a224528bf6b19507ad76187b3bccfa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/73078e1f26d57f7a10e3bee2a2f543a02f6493c3",
- "reference": "73078e1f26d57f7a10e3bee2a2f543a02f6493c3",
+ "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/cbdd224cc5a224528bf6b19507ad76187b3bccfa",
+ "reference": "cbdd224cc5a224528bf6b19507ad76187b3bccfa",
"shasum": ""
},
"require": {
"illuminate/support": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0",
"nyholm/psr7": "^1.0",
"php": "^7.2 | ^8.0",
- "sentry/sentry": "^4.9",
+ "sentry/sentry": "^4.10",
"symfony/psr-http-message-bridge": "^1.0 | ^2.0 | ^6.0 | ^7.0"
},
"require-dev": {
@@ -7580,7 +7590,7 @@
],
"support": {
"issues": "https://github.com/getsentry/sentry-laravel/issues",
- "source": "https://github.com/getsentry/sentry-laravel/tree/4.9.0"
+ "source": "https://github.com/getsentry/sentry-laravel/tree/4.10.0"
},
"funding": [
{
@@ -7592,20 +7602,20 @@
"type": "custom"
}
],
- "time": "2024-09-19T12:58:53+00:00"
+ "time": "2024-11-07T08:05:24+00:00"
},
{
"name": "socialiteproviders/manager",
- "version": "v4.6.0",
+ "version": "v4.7.0",
"source": {
"type": "git",
"url": "https://github.com/SocialiteProviders/Manager.git",
- "reference": "dea5190981c31b89e52259da9ab1ca4e2b258b21"
+ "reference": "ab0691b82cec77efd90154c78f1854903455c82f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/dea5190981c31b89e52259da9ab1ca4e2b258b21",
- "reference": "dea5190981c31b89e52259da9ab1ca4e2b258b21",
+ "url": "https://api.github.com/repos/SocialiteProviders/Manager/zipball/ab0691b82cec77efd90154c78f1854903455c82f",
+ "reference": "ab0691b82cec77efd90154c78f1854903455c82f",
"shasum": ""
},
"require": {
@@ -7666,7 +7676,7 @@
"issues": "https://github.com/socialiteproviders/manager/issues",
"source": "https://github.com/socialiteproviders/manager"
},
- "time": "2024-05-04T07:57:39+00:00"
+ "time": "2024-11-10T01:56:18+00:00"
},
{
"name": "socialiteproviders/microsoft-azure",
@@ -7784,16 +7794,16 @@
},
{
"name": "spatie/laravel-activitylog",
- "version": "4.8.0",
+ "version": "4.9.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-activitylog.git",
- "reference": "eb6f37dd40af950ce10cf5280f0acfa3e08c3bff"
+ "reference": "e0fc28178515a5396f48e107ed697719189bbe02"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/eb6f37dd40af950ce10cf5280f0acfa3e08c3bff",
- "reference": "eb6f37dd40af950ce10cf5280f0acfa3e08c3bff",
+ "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/e0fc28178515a5396f48e107ed697719189bbe02",
+ "reference": "e0fc28178515a5396f48e107ed697719189bbe02",
"shasum": ""
},
"require": {
@@ -7859,7 +7869,7 @@
],
"support": {
"issues": "https://github.com/spatie/laravel-activitylog/issues",
- "source": "https://github.com/spatie/laravel-activitylog/tree/4.8.0"
+ "source": "https://github.com/spatie/laravel-activitylog/tree/4.9.0"
},
"funding": [
{
@@ -7871,47 +7881,47 @@
"type": "github"
}
],
- "time": "2024-03-08T22:28:17+00:00"
+ "time": "2024-10-18T13:38:47+00:00"
},
{
"name": "spatie/laravel-data",
- "version": "3.12.0",
+ "version": "4.11.1",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-data.git",
- "reference": "d44e04839407bc32b029be59ba80090a5f720e91"
+ "reference": "df5b58baebae34475ca35338b4e9a131c9e2a8e0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-data/zipball/d44e04839407bc32b029be59ba80090a5f720e91",
- "reference": "d44e04839407bc32b029be59ba80090a5f720e91",
+ "url": "https://api.github.com/repos/spatie/laravel-data/zipball/df5b58baebae34475ca35338b4e9a131c9e2a8e0",
+ "reference": "df5b58baebae34475ca35338b4e9a131c9e2a8e0",
"shasum": ""
},
"require": {
- "illuminate/contracts": "^9.30|^10.0|^11.0",
+ "illuminate/contracts": "^10.0|^11.0",
"php": "^8.1",
- "phpdocumentor/type-resolver": "^1.5",
+ "phpdocumentor/reflection": "^6.0",
"spatie/laravel-package-tools": "^1.9.0",
"spatie/php-structure-discoverer": "^2.0"
},
"require-dev": {
"fakerphp/faker": "^1.14",
"friendsofphp/php-cs-fixer": "^3.0",
- "inertiajs/inertia-laravel": "^0.6.3",
+ "inertiajs/inertia-laravel": "^1.2",
+ "livewire/livewire": "^3.0",
"mockery/mockery": "^1.6",
"nesbot/carbon": "^2.63",
- "nette/php-generator": "^3.5",
"nunomaduro/larastan": "^2.0",
- "orchestra/testbench": "^7.6|^8.0",
- "pestphp/pest": "^1.22",
- "pestphp/pest-plugin-laravel": "^1.3",
+ "orchestra/testbench": "^8.0|^9.0",
+ "pestphp/pest": "^2.31",
+ "pestphp/pest-plugin-laravel": "^2.0",
+ "pestphp/pest-plugin-livewire": "^2.1",
"phpbench/phpbench": "^1.2",
"phpstan/extension-installer": "^1.1",
- "phpunit/phpunit": "^9.3",
+ "phpunit/phpunit": "^10.0",
"spatie/invade": "^1.0",
- "spatie/laravel-typescript-transformer": "^2.1.6",
- "spatie/pest-plugin-snapshots": "^1.1",
- "spatie/phpunit-snapshot-assertions": "^4.2",
+ "spatie/laravel-typescript-transformer": "^2.5",
+ "spatie/pest-plugin-snapshots": "^2.1",
"spatie/test-time": "^1.2"
},
"type": "library",
@@ -7924,8 +7934,7 @@
},
"autoload": {
"psr-4": {
- "Spatie\\LaravelData\\": "src",
- "Spatie\\LaravelData\\Database\\Factories\\": "database/factories"
+ "Spatie\\LaravelData\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -7948,7 +7957,7 @@
],
"support": {
"issues": "https://github.com/spatie/laravel-data/issues",
- "source": "https://github.com/spatie/laravel-data/tree/3.12.0"
+ "source": "https://github.com/spatie/laravel-data/tree/4.11.1"
},
"funding": [
{
@@ -7956,7 +7965,7 @@
"type": "github"
}
],
- "time": "2024-04-24T09:27:45+00:00"
+ "time": "2024-10-23T07:14:53+00:00"
},
{
"name": "spatie/laravel-package-tools",
@@ -8460,16 +8469,16 @@
},
{
"name": "stripe/stripe-php",
- "version": "v12.8.0",
+ "version": "v16.2.0",
"source": {
"type": "git",
"url": "https://github.com/stripe/stripe-php.git",
- "reference": "6b6f4a775ad46fee4b1df2df4fdfa574365b1621"
+ "reference": "813ae4961755af28a13bda451689f7a6ed6498cb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/stripe/stripe-php/zipball/6b6f4a775ad46fee4b1df2df4fdfa574365b1621",
- "reference": "6b6f4a775ad46fee4b1df2df4fdfa574365b1621",
+ "url": "https://api.github.com/repos/stripe/stripe-php/zipball/813ae4961755af28a13bda451689f7a6ed6498cb",
+ "reference": "813ae4961755af28a13bda451689f7a6ed6498cb",
"shasum": ""
},
"require": {
@@ -8513,22 +8522,22 @@
],
"support": {
"issues": "https://github.com/stripe/stripe-php/issues",
- "source": "https://github.com/stripe/stripe-php/tree/v12.8.0"
+ "source": "https://github.com/stripe/stripe-php/tree/v16.2.0"
},
- "time": "2023-10-16T18:04:12+00:00"
+ "time": "2024-10-29T21:15:53+00:00"
},
{
"name": "symfony/clock",
- "version": "v7.1.1",
+ "version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/clock.git",
- "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7"
+ "reference": "97bebc53548684c17ed696bc8af016880f0f098d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/clock/zipball/3dfc8b084853586de51dd1441c6242c76a28cbe7",
- "reference": "3dfc8b084853586de51dd1441c6242c76a28cbe7",
+ "url": "https://api.github.com/repos/symfony/clock/zipball/97bebc53548684c17ed696bc8af016880f0f098d",
+ "reference": "97bebc53548684c17ed696bc8af016880f0f098d",
"shasum": ""
},
"require": {
@@ -8573,7 +8582,7 @@
"time"
],
"support": {
- "source": "https://github.com/symfony/clock/tree/v7.1.1"
+ "source": "https://github.com/symfony/clock/tree/v7.1.6"
},
"funding": [
{
@@ -8589,20 +8598,20 @@
"type": "tidelift"
}
],
- "time": "2024-05-31T14:57:53+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/console",
- "version": "v7.1.5",
+ "version": "v7.1.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee"
+ "reference": "ff04e5b5ba043d2badfb308197b9e6b42883fcd5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/0fa539d12b3ccf068a722bbbffa07ca7079af9ee",
- "reference": "0fa539d12b3ccf068a722bbbffa07ca7079af9ee",
+ "url": "https://api.github.com/repos/symfony/console/zipball/ff04e5b5ba043d2badfb308197b9e6b42883fcd5",
+ "reference": "ff04e5b5ba043d2badfb308197b9e6b42883fcd5",
"shasum": ""
},
"require": {
@@ -8666,7 +8675,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v7.1.5"
+ "source": "https://github.com/symfony/console/tree/v7.1.8"
},
"funding": [
{
@@ -8682,20 +8691,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-20T08:28:38+00:00"
+ "time": "2024-11-06T14:23:19+00:00"
},
{
"name": "symfony/css-selector",
- "version": "v7.1.1",
+ "version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4"
+ "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4",
- "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/4aa4f6b3d6749c14d3aa815eef8226632e7bbc66",
+ "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66",
"shasum": ""
},
"require": {
@@ -8731,7 +8740,7 @@
"description": "Converts CSS selectors to XPath expressions",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/css-selector/tree/v7.1.1"
+ "source": "https://github.com/symfony/css-selector/tree/v7.1.6"
},
"funding": [
{
@@ -8747,7 +8756,7 @@
"type": "tidelift"
}
],
- "time": "2024-05-31T14:57:53+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -8818,16 +8827,16 @@
},
{
"name": "symfony/error-handler",
- "version": "v7.1.3",
+ "version": "v7.1.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
- "reference": "432bb369952795c61ca1def65e078c4a80dad13c"
+ "reference": "010e44661f4c6babaf8c4862fe68c24a53903342"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/error-handler/zipball/432bb369952795c61ca1def65e078c4a80dad13c",
- "reference": "432bb369952795c61ca1def65e078c4a80dad13c",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/010e44661f4c6babaf8c4862fe68c24a53903342",
+ "reference": "010e44661f4c6babaf8c4862fe68c24a53903342",
"shasum": ""
},
"require": {
@@ -8873,7 +8882,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/error-handler/tree/v7.1.3"
+ "source": "https://github.com/symfony/error-handler/tree/v7.1.7"
},
"funding": [
{
@@ -8889,20 +8898,20 @@
"type": "tidelift"
}
],
- "time": "2024-07-26T13:02:51+00:00"
+ "time": "2024-11-05T15:34:55+00:00"
},
{
"name": "symfony/event-dispatcher",
- "version": "v7.1.1",
+ "version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7"
+ "reference": "87254c78dd50721cfd015b62277a8281c5589702"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7",
- "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702",
+ "reference": "87254c78dd50721cfd015b62277a8281c5589702",
"shasum": ""
},
"require": {
@@ -8953,7 +8962,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1"
+ "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.6"
},
"funding": [
{
@@ -8969,7 +8978,7 @@
"type": "tidelift"
}
],
- "time": "2024-05-31T14:57:53+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
@@ -9049,16 +9058,16 @@
},
{
"name": "symfony/finder",
- "version": "v7.1.4",
+ "version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "d95bbf319f7d052082fb7af147e0f835a695e823"
+ "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/d95bbf319f7d052082fb7af147e0f835a695e823",
- "reference": "d95bbf319f7d052082fb7af147e0f835a695e823",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/2cb89664897be33f78c65d3d2845954c8d7a43b8",
+ "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8",
"shasum": ""
},
"require": {
@@ -9093,7 +9102,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v7.1.4"
+ "source": "https://github.com/symfony/finder/tree/v7.1.6"
},
"funding": [
{
@@ -9109,20 +9118,20 @@
"type": "tidelift"
}
],
- "time": "2024-08-13T14:28:19+00:00"
+ "time": "2024-10-01T08:31:23+00:00"
},
{
"name": "symfony/http-foundation",
- "version": "v7.1.5",
+ "version": "v7.1.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b"
+ "reference": "f4419ec69ccfc3f725a4de7c20e4e57626d10112"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e30ef73b1e44eea7eb37ba69600a354e553f694b",
- "reference": "e30ef73b1e44eea7eb37ba69600a354e553f694b",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f4419ec69ccfc3f725a4de7c20e4e57626d10112",
+ "reference": "f4419ec69ccfc3f725a4de7c20e4e57626d10112",
"shasum": ""
},
"require": {
@@ -9132,12 +9141,12 @@
},
"conflict": {
"doctrine/dbal": "<3.6",
- "symfony/cache": "<6.4"
+ "symfony/cache": "<6.4.12|>=7.0,<7.1.5"
},
"require-dev": {
"doctrine/dbal": "^3.6|^4",
"predis/predis": "^1.1|^2.0",
- "symfony/cache": "^6.4|^7.0",
+ "symfony/cache": "^6.4.12|^7.1.5",
"symfony/dependency-injection": "^6.4|^7.0",
"symfony/expression-language": "^6.4|^7.0",
"symfony/http-kernel": "^6.4|^7.0",
@@ -9170,7 +9179,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v7.1.5"
+ "source": "https://github.com/symfony/http-foundation/tree/v7.1.8"
},
"funding": [
{
@@ -9186,20 +9195,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-20T08:28:38+00:00"
+ "time": "2024-11-09T09:16:45+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v7.1.5",
+ "version": "v7.1.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b"
+ "reference": "33fef24e3dc79d6d30bf4936531f2f4bd2ca189e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/44204d96150a9df1fc57601ec933d23fefc2d65b",
- "reference": "44204d96150a9df1fc57601ec933d23fefc2d65b",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/33fef24e3dc79d6d30bf4936531f2f4bd2ca189e",
+ "reference": "33fef24e3dc79d6d30bf4936531f2f4bd2ca189e",
"shasum": ""
},
"require": {
@@ -9284,7 +9293,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v7.1.5"
+ "source": "https://github.com/symfony/http-kernel/tree/v7.1.8"
},
"funding": [
{
@@ -9300,20 +9309,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-21T06:09:21+00:00"
+ "time": "2024-11-13T14:25:32+00:00"
},
{
"name": "symfony/mailer",
- "version": "v7.1.5",
+ "version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/mailer.git",
- "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b"
+ "reference": "69c9948451fb3a6a4d47dc8261d1794734e76cdd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mailer/zipball/bbf21460c56f29810da3df3e206e38dfbb01e80b",
- "reference": "bbf21460c56f29810da3df3e206e38dfbb01e80b",
+ "url": "https://api.github.com/repos/symfony/mailer/zipball/69c9948451fb3a6a4d47dc8261d1794734e76cdd",
+ "reference": "69c9948451fb3a6a4d47dc8261d1794734e76cdd",
"shasum": ""
},
"require": {
@@ -9364,7 +9373,7 @@
"description": "Helps sending emails",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/mailer/tree/v7.1.5"
+ "source": "https://github.com/symfony/mailer/tree/v7.1.6"
},
"funding": [
{
@@ -9380,20 +9389,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-08T12:32:26+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/mime",
- "version": "v7.1.5",
+ "version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
- "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff"
+ "reference": "caa1e521edb2650b8470918dfe51708c237f0598"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mime/zipball/711d2e167e8ce65b05aea6b258c449671cdd38ff",
- "reference": "711d2e167e8ce65b05aea6b258c449671cdd38ff",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/caa1e521edb2650b8470918dfe51708c237f0598",
+ "reference": "caa1e521edb2650b8470918dfe51708c237f0598",
"shasum": ""
},
"require": {
@@ -9448,7 +9457,7 @@
"mime-type"
],
"support": {
- "source": "https://github.com/symfony/mime/tree/v7.1.5"
+ "source": "https://github.com/symfony/mime/tree/v7.1.6"
},
"funding": [
{
@@ -9464,20 +9473,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-20T08:28:38+00:00"
+ "time": "2024-10-25T15:11:02+00:00"
},
{
"name": "symfony/options-resolver",
- "version": "v7.1.1",
+ "version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/options-resolver.git",
- "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55"
+ "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/options-resolver/zipball/47aa818121ed3950acd2b58d1d37d08a94f9bf55",
- "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/85e95eeede2d41cd146146e98c9c81d9214cae85",
+ "reference": "85e95eeede2d41cd146146e98c9c81d9214cae85",
"shasum": ""
},
"require": {
@@ -9515,7 +9524,7 @@
"options"
],
"support": {
- "source": "https://github.com/symfony/options-resolver/tree/v7.1.1"
+ "source": "https://github.com/symfony/options-resolver/tree/v7.1.6"
},
"funding": [
{
@@ -9531,7 +9540,7 @@
"type": "tidelift"
}
],
- "time": "2024-05-31T14:57:53+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/polyfill-ctype",
@@ -10251,16 +10260,16 @@
},
{
"name": "symfony/process",
- "version": "v7.1.5",
+ "version": "v7.1.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "5c03ee6369281177f07f7c68252a280beccba847"
+ "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/5c03ee6369281177f07f7c68252a280beccba847",
- "reference": "5c03ee6369281177f07f7c68252a280beccba847",
+ "url": "https://api.github.com/repos/symfony/process/zipball/42783370fda6e538771f7c7a36e9fa2ee3a84892",
+ "reference": "42783370fda6e538771f7c7a36e9fa2ee3a84892",
"shasum": ""
},
"require": {
@@ -10292,7 +10301,7 @@
"description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/process/tree/v7.1.5"
+ "source": "https://github.com/symfony/process/tree/v7.1.8"
},
"funding": [
{
@@ -10308,20 +10317,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-19T21:48:23+00:00"
+ "time": "2024-11-06T14:23:19+00:00"
},
{
"name": "symfony/psr-http-message-bridge",
- "version": "v7.1.4",
+ "version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/psr-http-message-bridge.git",
- "reference": "405a7bcd872f1563966f64be19f1362d94ce71ab"
+ "reference": "f16471bb19f6685b9ccf0a2c03c213840ae68cd6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/405a7bcd872f1563966f64be19f1362d94ce71ab",
- "reference": "405a7bcd872f1563966f64be19f1362d94ce71ab",
+ "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/f16471bb19f6685b9ccf0a2c03c213840ae68cd6",
+ "reference": "f16471bb19f6685b9ccf0a2c03c213840ae68cd6",
"shasum": ""
},
"require": {
@@ -10375,7 +10384,7 @@
"psr-7"
],
"support": {
- "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.1.4"
+ "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.1.6"
},
"funding": [
{
@@ -10391,20 +10400,20 @@
"type": "tidelift"
}
],
- "time": "2024-08-15T22:48:53+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/routing",
- "version": "v7.1.4",
+ "version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
- "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7"
+ "reference": "66a2c469f6c22d08603235c46a20007c0701ea0a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/1500aee0094a3ce1c92626ed8cf3c2037e86f5a7",
- "reference": "1500aee0094a3ce1c92626ed8cf3c2037e86f5a7",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/66a2c469f6c22d08603235c46a20007c0701ea0a",
+ "reference": "66a2c469f6c22d08603235c46a20007c0701ea0a",
"shasum": ""
},
"require": {
@@ -10456,7 +10465,7 @@
"url"
],
"support": {
- "source": "https://github.com/symfony/routing/tree/v7.1.4"
+ "source": "https://github.com/symfony/routing/tree/v7.1.6"
},
"funding": [
{
@@ -10472,7 +10481,7 @@
"type": "tidelift"
}
],
- "time": "2024-08-29T08:16:25+00:00"
+ "time": "2024-10-01T08:31:23+00:00"
},
{
"name": "symfony/service-contracts",
@@ -10559,16 +10568,16 @@
},
{
"name": "symfony/stopwatch",
- "version": "v7.1.1",
+ "version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/stopwatch.git",
- "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d"
+ "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/stopwatch/zipball/5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d",
- "reference": "5b75bb1ac2ba1b9d05c47fc4b3046a625377d23d",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/8b4a434e6e7faf6adedffb48783a5c75409a1a05",
+ "reference": "8b4a434e6e7faf6adedffb48783a5c75409a1a05",
"shasum": ""
},
"require": {
@@ -10601,7 +10610,7 @@
"description": "Provides a way to profile code",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/stopwatch/tree/v7.1.1"
+ "source": "https://github.com/symfony/stopwatch/tree/v7.1.6"
},
"funding": [
{
@@ -10617,20 +10626,20 @@
"type": "tidelift"
}
],
- "time": "2024-05-31T14:57:53+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/string",
- "version": "v7.1.5",
+ "version": "v7.1.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306"
+ "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306",
- "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306",
+ "url": "https://api.github.com/repos/symfony/string/zipball/591ebd41565f356fcd8b090fe64dbb5878f50281",
+ "reference": "591ebd41565f356fcd8b090fe64dbb5878f50281",
"shasum": ""
},
"require": {
@@ -10688,7 +10697,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v7.1.5"
+ "source": "https://github.com/symfony/string/tree/v7.1.8"
},
"funding": [
{
@@ -10704,20 +10713,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-20T08:28:38+00:00"
+ "time": "2024-11-13T13:31:21+00:00"
},
{
"name": "symfony/translation",
- "version": "v7.1.5",
+ "version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea"
+ "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/235535e3f84f3dfbdbde0208ede6ca75c3a489ea",
- "reference": "235535e3f84f3dfbdbde0208ede6ca75c3a489ea",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/b9f72ab14efdb6b772f85041fa12f820dee8d55f",
+ "reference": "b9f72ab14efdb6b772f85041fa12f820dee8d55f",
"shasum": ""
},
"require": {
@@ -10782,7 +10791,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/translation/tree/v7.1.5"
+ "source": "https://github.com/symfony/translation/tree/v7.1.6"
},
"funding": [
{
@@ -10798,7 +10807,7 @@
"type": "tidelift"
}
],
- "time": "2024-09-16T06:30:38+00:00"
+ "time": "2024-09-28T12:35:13+00:00"
},
{
"name": "symfony/translation-contracts",
@@ -10880,16 +10889,16 @@
},
{
"name": "symfony/uid",
- "version": "v7.1.5",
+ "version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/uid.git",
- "reference": "8c7bb8acb933964055215d89f9a9871df0239317"
+ "reference": "65befb3bb2d503bbffbd08c815aa38b472999917"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/uid/zipball/8c7bb8acb933964055215d89f9a9871df0239317",
- "reference": "8c7bb8acb933964055215d89f9a9871df0239317",
+ "url": "https://api.github.com/repos/symfony/uid/zipball/65befb3bb2d503bbffbd08c815aa38b472999917",
+ "reference": "65befb3bb2d503bbffbd08c815aa38b472999917",
"shasum": ""
},
"require": {
@@ -10934,7 +10943,7 @@
"uuid"
],
"support": {
- "source": "https://github.com/symfony/uid/tree/v7.1.5"
+ "source": "https://github.com/symfony/uid/tree/v7.1.6"
},
"funding": [
{
@@ -10950,20 +10959,20 @@
"type": "tidelift"
}
],
- "time": "2024-09-17T09:16:35+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v7.1.5",
+ "version": "v7.1.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "e20e03889539fd4e4211e14d2179226c513c010d"
+ "reference": "7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e20e03889539fd4e4211e14d2179226c513c010d",
- "reference": "e20e03889539fd4e4211e14d2179226c513c010d",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8",
+ "reference": "7bb01a47b1b00428d32b5e7b4d3b2d1aa58d3db8",
"shasum": ""
},
"require": {
@@ -11017,7 +11026,7 @@
"dump"
],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v7.1.5"
+ "source": "https://github.com/symfony/var-dumper/tree/v7.1.8"
},
"funding": [
{
@@ -11033,32 +11042,31 @@
"type": "tidelift"
}
],
- "time": "2024-09-16T10:07:02+00:00"
+ "time": "2024-11-08T15:46:42+00:00"
},
{
"name": "symfony/yaml",
- "version": "v6.4.12",
+ "version": "v7.1.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "762ee56b2649659380e0ef4d592d807bc17b7971"
+ "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/762ee56b2649659380e0ef4d592d807bc17b7971",
- "reference": "762ee56b2649659380e0ef4d592d807bc17b7971",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/3ced3f29e4f0d6bce2170ff26719f1fe9aacc671",
+ "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671",
"shasum": ""
},
"require": {
- "php": ">=8.1",
- "symfony/deprecation-contracts": "^2.5|^3",
+ "php": ">=8.2",
"symfony/polyfill-ctype": "^1.8"
},
"conflict": {
- "symfony/console": "<5.4"
+ "symfony/console": "<6.4"
},
"require-dev": {
- "symfony/console": "^5.4|^6.0|^7.0"
+ "symfony/console": "^6.4|^7.0"
},
"bin": [
"Resources/bin/yaml-lint"
@@ -11089,7 +11097,7 @@
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/yaml/tree/v6.4.12"
+ "source": "https://github.com/symfony/yaml/tree/v7.1.6"
},
"funding": [
{
@@ -11105,7 +11113,7 @@
"type": "tidelift"
}
],
- "time": "2024-09-17T12:47:12+00:00"
+ "time": "2024-09-25T14:20:29+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
@@ -11162,25 +11170,24 @@
},
{
"name": "visus/cuid2",
- "version": "2.0.0",
+ "version": "4.1.0",
"source": {
"type": "git",
"url": "https://github.com/visus-io/php-cuid2.git",
- "reference": "907919cadd8dfeb24ffecf7209ec4988fb9b3fc0"
+ "reference": "17c9b3098d556bb2556a084c948211333cc19c79"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/visus-io/php-cuid2/zipball/907919cadd8dfeb24ffecf7209ec4988fb9b3fc0",
- "reference": "907919cadd8dfeb24ffecf7209ec4988fb9b3fc0",
+ "url": "https://api.github.com/repos/visus-io/php-cuid2/zipball/17c9b3098d556bb2556a084c948211333cc19c79",
+ "reference": "17c9b3098d556bb2556a084c948211333cc19c79",
"shasum": ""
},
"require": {
- "php": "^8.0"
+ "php": "^8.1"
},
"require-dev": {
"ergebnis/composer-normalize": "^2.29",
"ext-ctype": "*",
- "php-parallel-lint/php-parallel-lint": "^1.3",
"phpstan/phpstan": "^1.9",
"phpunit/phpunit": "^10.0",
"squizlabs/php_codesniffer": "^3.7",
@@ -11200,7 +11207,7 @@
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "Apache-2.0"
+ "MIT"
],
"authors": [
{
@@ -11215,9 +11222,9 @@
],
"support": {
"issues": "https://github.com/visus-io/php-cuid2/issues",
- "source": "https://github.com/visus-io/php-cuid2/tree/2.0.0"
+ "source": "https://github.com/visus-io/php-cuid2/tree/4.1.0"
},
- "time": "2023-03-23T19:18:36+00:00"
+ "time": "2024-05-14T13:23:35+00:00"
},
{
"name": "vlucas/phpdotenv",
@@ -11755,16 +11762,16 @@
},
{
"name": "zircote/swagger-php",
- "version": "4.11.0",
+ "version": "4.11.1",
"source": {
"type": "git",
"url": "https://github.com/zircote/swagger-php.git",
- "reference": "3b6f3800f4fd6544ada4dce180c6b69eaead7c7c"
+ "reference": "7df10e8ec47db07c031db317a25bef962b4e5de1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/zircote/swagger-php/zipball/3b6f3800f4fd6544ada4dce180c6b69eaead7c7c",
- "reference": "3b6f3800f4fd6544ada4dce180c6b69eaead7c7c",
+ "url": "https://api.github.com/repos/zircote/swagger-php/zipball/7df10e8ec47db07c031db317a25bef962b4e5de1",
+ "reference": "7df10e8ec47db07c031db317a25bef962b4e5de1",
"shasum": ""
},
"require": {
@@ -11830,24 +11837,24 @@
],
"support": {
"issues": "https://github.com/zircote/swagger-php/issues",
- "source": "https://github.com/zircote/swagger-php/tree/4.11.0"
+ "source": "https://github.com/zircote/swagger-php/tree/4.11.1"
},
- "time": "2024-10-09T03:11:12+00:00"
+ "time": "2024-10-15T19:20:02+00:00"
}
],
"packages-dev": [
{
"name": "barryvdh/laravel-debugbar",
- "version": "v3.14.3",
+ "version": "v3.14.7",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-debugbar.git",
- "reference": "c0bee7c08ae2429e4a9ed2bc75679b012db6e3bd"
+ "reference": "f484b8c9124de0b163da39958331098ffcd4a65e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/c0bee7c08ae2429e4a9ed2bc75679b012db6e3bd",
- "reference": "c0bee7c08ae2429e4a9ed2bc75679b012db6e3bd",
+ "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/f484b8c9124de0b163da39958331098ffcd4a65e",
+ "reference": "f484b8c9124de0b163da39958331098ffcd4a65e",
"shasum": ""
},
"require": {
@@ -11906,7 +11913,7 @@
],
"support": {
"issues": "https://github.com/barryvdh/laravel-debugbar/issues",
- "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.14.3"
+ "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.14.7"
},
"funding": [
{
@@ -11918,20 +11925,20 @@
"type": "github"
}
],
- "time": "2024-10-02T09:17:49+00:00"
+ "time": "2024-11-14T09:12:35+00:00"
},
{
"name": "brianium/paratest",
- "version": "v7.4.3",
+ "version": "v7.6.0",
"source": {
"type": "git",
"url": "https://github.com/paratestphp/paratest.git",
- "reference": "64fcfd0e28a6b8078a19dbf9127be2ee645b92ec"
+ "reference": "68ff89a8de47d086588e391a516d2a5b5fde6254"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paratestphp/paratest/zipball/64fcfd0e28a6b8078a19dbf9127be2ee645b92ec",
- "reference": "64fcfd0e28a6b8078a19dbf9127be2ee645b92ec",
+ "url": "https://api.github.com/repos/paratestphp/paratest/zipball/68ff89a8de47d086588e391a516d2a5b5fde6254",
+ "reference": "68ff89a8de47d086588e391a516d2a5b5fde6254",
"shasum": ""
},
"require": {
@@ -11939,31 +11946,30 @@
"ext-pcre": "*",
"ext-reflection": "*",
"ext-simplexml": "*",
- "fidry/cpu-core-counter": "^1.1.0",
- "jean85/pretty-package-versions": "^2.0.5",
- "php": "~8.2.0 || ~8.3.0",
- "phpunit/php-code-coverage": "^10.1.11 || ^11.0.0",
- "phpunit/php-file-iterator": "^4.1.0 || ^5.0.0",
- "phpunit/php-timer": "^6.0.0 || ^7.0.0",
- "phpunit/phpunit": "^10.5.9 || ^11.0.3",
- "sebastian/environment": "^6.0.1 || ^7.0.0",
- "symfony/console": "^6.4.3 || ^7.0.3",
- "symfony/process": "^6.4.3 || ^7.0.3"
+ "fidry/cpu-core-counter": "^1.2.0",
+ "jean85/pretty-package-versions": "^2.0.6",
+ "php": "~8.2.0 || ~8.3.0 || ~8.4.0",
+ "phpunit/php-code-coverage": "^11.0.7",
+ "phpunit/php-file-iterator": "^5.1.0",
+ "phpunit/php-timer": "^7.0.1",
+ "phpunit/phpunit": "^11.4.1",
+ "sebastian/environment": "^7.2.0",
+ "symfony/console": "^6.4.11 || ^7.1.5",
+ "symfony/process": "^6.4.8 || ^7.1.5"
},
"require-dev": {
"doctrine/coding-standard": "^12.0.0",
"ext-pcov": "*",
"ext-posix": "*",
- "phpstan/phpstan": "^1.10.58",
- "phpstan/phpstan-deprecation-rules": "^1.1.4",
- "phpstan/phpstan-phpunit": "^1.3.15",
- "phpstan/phpstan-strict-rules": "^1.5.2",
- "squizlabs/php_codesniffer": "^3.9.0",
- "symfony/filesystem": "^6.4.3 || ^7.0.3"
+ "phpstan/phpstan": "^1.12.6",
+ "phpstan/phpstan-deprecation-rules": "^1.2.1",
+ "phpstan/phpstan-phpunit": "^1.4.0",
+ "phpstan/phpstan-strict-rules": "^1.6.1",
+ "squizlabs/php_codesniffer": "^3.10.3",
+ "symfony/filesystem": "^6.4.9 || ^7.1.5"
},
"bin": [
"bin/paratest",
- "bin/paratest.bat",
"bin/paratest_for_phpstorm"
],
"type": "library",
@@ -12000,7 +12006,7 @@
],
"support": {
"issues": "https://github.com/paratestphp/paratest/issues",
- "source": "https://github.com/paratestphp/paratest/tree/v7.4.3"
+ "source": "https://github.com/paratestphp/paratest/tree/v7.6.0"
},
"funding": [
{
@@ -12012,20 +12018,20 @@
"type": "paypal"
}
],
- "time": "2024-02-20T07:24:02+00:00"
+ "time": "2024-10-15T12:38:31+00:00"
},
{
"name": "fakerphp/faker",
- "version": "v1.23.1",
+ "version": "v1.24.0",
"source": {
"type": "git",
"url": "https://github.com/FakerPHP/Faker.git",
- "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b"
+ "reference": "a136842a532bac9ecd8a1c723852b09915d7db50"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b",
- "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b",
+ "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/a136842a532bac9ecd8a1c723852b09915d7db50",
+ "reference": "a136842a532bac9ecd8a1c723852b09915d7db50",
"shasum": ""
},
"require": {
@@ -12073,9 +12079,9 @@
],
"support": {
"issues": "https://github.com/FakerPHP/Faker/issues",
- "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1"
+ "source": "https://github.com/FakerPHP/Faker/tree/v1.24.0"
},
- "time": "2024-01-02T13:46:09+00:00"
+ "time": "2024-11-07T15:11:20+00:00"
},
{
"name": "fidry/cpu-core-counter",
@@ -12262,16 +12268,16 @@
},
{
"name": "laravel/dusk",
- "version": "v8.2.8",
+ "version": "v8.2.11",
"source": {
"type": "git",
"url": "https://github.com/laravel/dusk.git",
- "reference": "5bff1e8dd87ec653a2202475377152e5d14fde40"
+ "reference": "c667db6d8795f0ccc8f63d54a7780ce8a0cc3d3c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/dusk/zipball/5bff1e8dd87ec653a2202475377152e5d14fde40",
- "reference": "5bff1e8dd87ec653a2202475377152e5d14fde40",
+ "url": "https://api.github.com/repos/laravel/dusk/zipball/c667db6d8795f0ccc8f63d54a7780ce8a0cc3d3c",
+ "reference": "c667db6d8795f0ccc8f63d54a7780ce8a0cc3d3c",
"shasum": ""
},
"require": {
@@ -12328,9 +12334,9 @@
],
"support": {
"issues": "https://github.com/laravel/dusk/issues",
- "source": "https://github.com/laravel/dusk/tree/v8.2.8"
+ "source": "https://github.com/laravel/dusk/tree/v8.2.11"
},
- "time": "2024-10-04T14:02:20+00:00"
+ "time": "2024-11-07T21:51:32+00:00"
},
{
"name": "laravel/pint",
@@ -12400,16 +12406,16 @@
},
{
"name": "laravel/telescope",
- "version": "v5.2.4",
+ "version": "v5.2.5",
"source": {
"type": "git",
"url": "https://github.com/laravel/telescope.git",
- "reference": "749369e996611d803e7c1b57929b482dd676008d"
+ "reference": "f68386a8d816c9e3a011b8301bfd263213bf00d4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/telescope/zipball/749369e996611d803e7c1b57929b482dd676008d",
- "reference": "749369e996611d803e7c1b57929b482dd676008d",
+ "url": "https://api.github.com/repos/laravel/telescope/zipball/f68386a8d816c9e3a011b8301bfd263213bf00d4",
+ "reference": "f68386a8d816c9e3a011b8301bfd263213bf00d4",
"shasum": ""
},
"require": {
@@ -12463,22 +12469,22 @@
],
"support": {
"issues": "https://github.com/laravel/telescope/issues",
- "source": "https://github.com/laravel/telescope/tree/v5.2.4"
+ "source": "https://github.com/laravel/telescope/tree/v5.2.5"
},
- "time": "2024-10-29T15:35:13+00:00"
+ "time": "2024-10-31T17:06:07+00:00"
},
{
"name": "maximebf/debugbar",
- "version": "v1.23.2",
+ "version": "v1.23.3",
"source": {
"type": "git",
"url": "https://github.com/maximebf/php-debugbar.git",
- "reference": "689720d724c771ac4add859056744b7b3f2406da"
+ "reference": "687400043d77943ef95e8417cb44e1673ee57844"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/689720d724c771ac4add859056744b7b3f2406da",
- "reference": "689720d724c771ac4add859056744b7b3f2406da",
+ "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/687400043d77943ef95e8417cb44e1673ee57844",
+ "reference": "687400043d77943ef95e8417cb44e1673ee57844",
"shasum": ""
},
"require": {
@@ -12531,9 +12537,9 @@
],
"support": {
"issues": "https://github.com/maximebf/php-debugbar/issues",
- "source": "https://github.com/maximebf/php-debugbar/tree/v1.23.2"
+ "source": "https://github.com/maximebf/php-debugbar/tree/v1.23.3"
},
- "time": "2024-09-16T11:23:09+00:00"
+ "time": "2024-10-29T12:24:25+00:00"
},
{
"name": "mockery/mockery",
@@ -12620,16 +12626,16 @@
},
{
"name": "myclabs/deep-copy",
- "version": "1.12.0",
+ "version": "1.12.1",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c"
+ "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
- "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845",
+ "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845",
"shasum": ""
},
"require": {
@@ -12668,7 +12674,7 @@
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
- "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0"
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1"
},
"funding": [
{
@@ -12676,27 +12682,27 @@
"type": "tidelift"
}
],
- "time": "2024-06-12T14:39:25+00:00"
+ "time": "2024-11-08T17:47:46+00:00"
},
{
"name": "nunomaduro/collision",
- "version": "v8.4.0",
+ "version": "v8.5.0",
"source": {
"type": "git",
"url": "https://github.com/nunomaduro/collision.git",
- "reference": "e7d1aa8ed753f63fa816932bbc89678238843b4a"
+ "reference": "f5c101b929c958e849a633283adff296ed5f38f5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nunomaduro/collision/zipball/e7d1aa8ed753f63fa816932bbc89678238843b4a",
- "reference": "e7d1aa8ed753f63fa816932bbc89678238843b4a",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/f5c101b929c958e849a633283adff296ed5f38f5",
+ "reference": "f5c101b929c958e849a633283adff296ed5f38f5",
"shasum": ""
},
"require": {
- "filp/whoops": "^2.15.4",
- "nunomaduro/termwind": "^2.0.1",
+ "filp/whoops": "^2.16.0",
+ "nunomaduro/termwind": "^2.1.0",
"php": "^8.2.0",
- "symfony/console": "^7.1.3"
+ "symfony/console": "^7.1.5"
},
"conflict": {
"laravel/framework": "<11.0.0 || >=12.0.0",
@@ -12704,14 +12710,14 @@
},
"require-dev": {
"larastan/larastan": "^2.9.8",
- "laravel/framework": "^11.19.0",
- "laravel/pint": "^1.17.1",
- "laravel/sail": "^1.31.0",
- "laravel/sanctum": "^4.0.2",
- "laravel/tinker": "^2.9.0",
- "orchestra/testbench-core": "^9.2.3",
- "pestphp/pest": "^2.35.0 || ^3.0.0",
- "sebastian/environment": "^6.1.0 || ^7.0.0"
+ "laravel/framework": "^11.28.0",
+ "laravel/pint": "^1.18.1",
+ "laravel/sail": "^1.36.0",
+ "laravel/sanctum": "^4.0.3",
+ "laravel/tinker": "^2.10.0",
+ "orchestra/testbench-core": "^9.5.3",
+ "pestphp/pest": "^2.36.0 || ^3.4.0",
+ "sebastian/environment": "^6.1.0 || ^7.2.0"
},
"type": "library",
"extra": {
@@ -12773,40 +12779,42 @@
"type": "patreon"
}
],
- "time": "2024-08-03T15:32:23+00:00"
+ "time": "2024-10-15T16:06:32+00:00"
},
{
"name": "pestphp/pest",
- "version": "v2.35.1",
+ "version": "v3.5.1",
"source": {
"type": "git",
"url": "https://github.com/pestphp/pest.git",
- "reference": "b13acb630df52c06123588d321823c31fc685545"
+ "reference": "179d46ce97d52bcb3f791449ae94025c3f32e3e3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/pestphp/pest/zipball/b13acb630df52c06123588d321823c31fc685545",
- "reference": "b13acb630df52c06123588d321823c31fc685545",
+ "url": "https://api.github.com/repos/pestphp/pest/zipball/179d46ce97d52bcb3f791449ae94025c3f32e3e3",
+ "reference": "179d46ce97d52bcb3f791449ae94025c3f32e3e3",
"shasum": ""
},
"require": {
- "brianium/paratest": "^7.3.1",
- "nunomaduro/collision": "^7.10.0|^8.4.0",
- "nunomaduro/termwind": "^1.15.1|^2.0.1",
- "pestphp/pest-plugin": "^2.1.1",
- "pestphp/pest-plugin-arch": "^2.7.0",
- "php": "^8.1.0",
- "phpunit/phpunit": "^10.5.17"
+ "brianium/paratest": "^7.6.0",
+ "nunomaduro/collision": "^8.5.0",
+ "nunomaduro/termwind": "^2.2.0",
+ "pestphp/pest-plugin": "^3.0.0",
+ "pestphp/pest-plugin-arch": "^3.0.0",
+ "pestphp/pest-plugin-mutate": "^3.0.5",
+ "php": "^8.2.0",
+ "phpunit/phpunit": "^11.4.3"
},
"conflict": {
- "phpunit/phpunit": ">10.5.17",
- "sebastian/exporter": "<5.1.0",
+ "filp/whoops": "<2.16.0",
+ "phpunit/phpunit": ">11.4.3",
+ "sebastian/exporter": "<6.0.0",
"webmozart/assert": "<1.11.0"
},
"require-dev": {
- "pestphp/pest-dev-tools": "^2.16.0",
- "pestphp/pest-plugin-type-coverage": "^2.8.5",
- "symfony/process": "^6.4.0|^7.1.3"
+ "pestphp/pest-dev-tools": "^3.3.0",
+ "pestphp/pest-plugin-type-coverage": "^3.1.0",
+ "symfony/process": "^7.1.6"
},
"bin": [
"bin/pest"
@@ -12815,6 +12823,8 @@
"extra": {
"pest": {
"plugins": [
+ "Pest\\Mutate\\Plugins\\Mutate",
+ "Pest\\Plugins\\Configuration",
"Pest\\Plugins\\Bail",
"Pest\\Plugins\\Cache",
"Pest\\Plugins\\Coverage",
@@ -12869,7 +12879,7 @@
],
"support": {
"issues": "https://github.com/pestphp/pest/issues",
- "source": "https://github.com/pestphp/pest/tree/v2.35.1"
+ "source": "https://github.com/pestphp/pest/tree/v3.5.1"
},
"funding": [
{
@@ -12881,34 +12891,34 @@
"type": "github"
}
],
- "time": "2024-08-20T21:41:50+00:00"
+ "time": "2024-10-31T16:12:45+00:00"
},
{
"name": "pestphp/pest-plugin",
- "version": "v2.1.1",
+ "version": "v3.0.0",
"source": {
"type": "git",
"url": "https://github.com/pestphp/pest-plugin.git",
- "reference": "e05d2859e08c2567ee38ce8b005d044e72648c0b"
+ "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/e05d2859e08c2567ee38ce8b005d044e72648c0b",
- "reference": "e05d2859e08c2567ee38ce8b005d044e72648c0b",
+ "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/e79b26c65bc11c41093b10150c1341cc5cdbea83",
+ "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83",
"shasum": ""
},
"require": {
"composer-plugin-api": "^2.0.0",
"composer-runtime-api": "^2.2.2",
- "php": "^8.1"
+ "php": "^8.2"
},
"conflict": {
- "pestphp/pest": "<2.2.3"
+ "pestphp/pest": "<3.0.0"
},
"require-dev": {
- "composer/composer": "^2.5.8",
- "pestphp/pest": "^2.16.0",
- "pestphp/pest-dev-tools": "^2.16.0"
+ "composer/composer": "^2.7.9",
+ "pestphp/pest": "^3.0.0",
+ "pestphp/pest-dev-tools": "^3.0.0"
},
"type": "composer-plugin",
"extra": {
@@ -12935,7 +12945,7 @@
"unit"
],
"support": {
- "source": "https://github.com/pestphp/pest-plugin/tree/v2.1.1"
+ "source": "https://github.com/pestphp/pest-plugin/tree/v3.0.0"
},
"funding": [
{
@@ -12951,31 +12961,30 @@
"type": "patreon"
}
],
- "time": "2023-08-22T08:40:06+00:00"
+ "time": "2024-09-08T23:21:41+00:00"
},
{
"name": "pestphp/pest-plugin-arch",
- "version": "v2.7.0",
+ "version": "v3.0.0",
"source": {
"type": "git",
"url": "https://github.com/pestphp/pest-plugin-arch.git",
- "reference": "d23b2d7498475354522c3818c42ef355dca3fcda"
+ "reference": "0a27e55a270cfe73d8cb70551b91002ee2cb64b0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/d23b2d7498475354522c3818c42ef355dca3fcda",
- "reference": "d23b2d7498475354522c3818c42ef355dca3fcda",
+ "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/0a27e55a270cfe73d8cb70551b91002ee2cb64b0",
+ "reference": "0a27e55a270cfe73d8cb70551b91002ee2cb64b0",
"shasum": ""
},
"require": {
- "nunomaduro/collision": "^7.10.0|^8.1.0",
- "pestphp/pest-plugin": "^2.1.1",
- "php": "^8.1",
+ "pestphp/pest-plugin": "^3.0.0",
+ "php": "^8.2",
"ta-tikoma/phpunit-architecture-test": "^0.8.4"
},
"require-dev": {
- "pestphp/pest": "^2.33.0",
- "pestphp/pest-dev-tools": "^2.16.0"
+ "pestphp/pest": "^3.0.0",
+ "pestphp/pest-dev-tools": "^3.0.0"
},
"type": "library",
"extra": {
@@ -13010,7 +13019,7 @@
"unit"
],
"support": {
- "source": "https://github.com/pestphp/pest-plugin-arch/tree/v2.7.0"
+ "source": "https://github.com/pestphp/pest-plugin-arch/tree/v3.0.0"
},
"funding": [
{
@@ -13022,7 +13031,79 @@
"type": "github"
}
],
- "time": "2024-01-26T09:46:42+00:00"
+ "time": "2024-09-08T23:23:55+00:00"
+ },
+ {
+ "name": "pestphp/pest-plugin-mutate",
+ "version": "v3.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pestphp/pest-plugin-mutate.git",
+ "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/e10dbdc98c9e2f3890095b4fe2144f63a5717e08",
+ "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^5.2.0",
+ "pestphp/pest-plugin": "^3.0.0",
+ "php": "^8.2",
+ "psr/simple-cache": "^3.0.0"
+ },
+ "require-dev": {
+ "pestphp/pest": "^3.0.8",
+ "pestphp/pest-dev-tools": "^3.0.0",
+ "pestphp/pest-plugin-type-coverage": "^3.0.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Pest\\Mutate\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Sandro Gehri",
+ "email": "sandrogehri@gmail.com"
+ }
+ ],
+ "description": "Mutates your code to find untested cases",
+ "keywords": [
+ "framework",
+ "mutate",
+ "mutation",
+ "pest",
+ "php",
+ "plugin",
+ "test",
+ "testing",
+ "unit"
+ ],
+ "support": {
+ "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v3.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://www.paypal.com/paypalme/enunomaduro",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/gehrisandro",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nunomaduro",
+ "type": "github"
+ }
+ ],
+ "time": "2024-09-22T07:54:40+00:00"
},
{
"name": "phar-io/manifest",
@@ -13208,101 +13289,37 @@
},
"time": "2023-10-20T12:21:20+00:00"
},
- {
- "name": "phpdocumentor/reflection-docblock",
- "version": "5.4.1",
- "source": {
- "type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c",
- "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c",
- "shasum": ""
- },
- "require": {
- "doctrine/deprecations": "^1.1",
- "ext-filter": "*",
- "php": "^7.4 || ^8.0",
- "phpdocumentor/reflection-common": "^2.2",
- "phpdocumentor/type-resolver": "^1.7",
- "phpstan/phpdoc-parser": "^1.7",
- "webmozart/assert": "^1.9.1"
- },
- "require-dev": {
- "mockery/mockery": "~1.3.5",
- "phpstan/extension-installer": "^1.1",
- "phpstan/phpstan": "^1.8",
- "phpstan/phpstan-mockery": "^1.1",
- "phpstan/phpstan-webmozart-assert": "^1.2",
- "phpunit/phpunit": "^9.5",
- "vimeo/psalm": "^5.13"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
- },
- {
- "name": "Jaap van Otterdijk",
- "email": "opensource@ijaap.nl"
- }
- ],
- "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
- "support": {
- "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
- "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.4.1"
- },
- "time": "2024-05-21T05:55:05+00:00"
- },
{
"name": "phpunit/php-code-coverage",
- "version": "10.1.16",
+ "version": "11.0.7",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "7e308268858ed6baedc8704a304727d20bc07c77"
+ "reference": "f7f08030e8811582cc459871d28d6f5a1a4d35ca"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77",
- "reference": "7e308268858ed6baedc8704a304727d20bc07c77",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f7f08030e8811582cc459871d28d6f5a1a4d35ca",
+ "reference": "f7f08030e8811582cc459871d28d6f5a1a4d35ca",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
- "nikic/php-parser": "^4.19.1 || ^5.1.0",
- "php": ">=8.1",
- "phpunit/php-file-iterator": "^4.1.0",
- "phpunit/php-text-template": "^3.0.1",
- "sebastian/code-unit-reverse-lookup": "^3.0.0",
- "sebastian/complexity": "^3.2.0",
- "sebastian/environment": "^6.1.0",
- "sebastian/lines-of-code": "^2.0.2",
- "sebastian/version": "^4.0.1",
+ "nikic/php-parser": "^5.3.1",
+ "php": ">=8.2",
+ "phpunit/php-file-iterator": "^5.1.0",
+ "phpunit/php-text-template": "^4.0.1",
+ "sebastian/code-unit-reverse-lookup": "^4.0.1",
+ "sebastian/complexity": "^4.0.1",
+ "sebastian/environment": "^7.2.0",
+ "sebastian/lines-of-code": "^3.0.1",
+ "sebastian/version": "^5.0.2",
"theseer/tokenizer": "^1.2.3"
},
"require-dev": {
- "phpunit/phpunit": "^10.1"
+ "phpunit/phpunit": "^11.4.1"
},
"suggest": {
"ext-pcov": "PHP extension that provides line coverage",
@@ -13311,7 +13328,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "10.1.x-dev"
+ "dev-main": "11.0.x-dev"
}
},
"autoload": {
@@ -13340,7 +13357,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
- "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16"
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.7"
},
"funding": [
{
@@ -13348,32 +13365,32 @@
"type": "github"
}
],
- "time": "2024-08-22T04:31:57+00:00"
+ "time": "2024-10-09T06:21:38+00:00"
},
{
"name": "phpunit/php-file-iterator",
- "version": "4.1.0",
+ "version": "5.1.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c"
+ "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c",
- "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6",
+ "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "4.0-dev"
+ "dev-main": "5.0-dev"
}
},
"autoload": {
@@ -13401,7 +13418,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
"security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy",
- "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0"
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0"
},
"funding": [
{
@@ -13409,28 +13426,28 @@
"type": "github"
}
],
- "time": "2023-08-31T06:24:48+00:00"
+ "time": "2024-08-27T05:02:59+00:00"
},
{
"name": "phpunit/php-invoker",
- "version": "4.0.0",
+ "version": "5.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-invoker.git",
- "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7"
+ "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
- "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2",
+ "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
"ext-pcntl": "*",
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"suggest": {
"ext-pcntl": "*"
@@ -13438,7 +13455,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "4.0-dev"
+ "dev-main": "5.0-dev"
}
},
"autoload": {
@@ -13464,7 +13481,8 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-invoker/issues",
- "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0"
+ "security": "https://github.com/sebastianbergmann/php-invoker/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1"
},
"funding": [
{
@@ -13472,32 +13490,32 @@
"type": "github"
}
],
- "time": "2023-02-03T06:56:09+00:00"
+ "time": "2024-07-03T05:07:44+00:00"
},
{
"name": "phpunit/php-text-template",
- "version": "3.0.1",
+ "version": "4.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-text-template.git",
- "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748"
+ "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748",
- "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964",
+ "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.0-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -13524,7 +13542,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-text-template/issues",
"security": "https://github.com/sebastianbergmann/php-text-template/security/policy",
- "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1"
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1"
},
"funding": [
{
@@ -13532,32 +13550,32 @@
"type": "github"
}
],
- "time": "2023-08-31T14:07:24+00:00"
+ "time": "2024-07-03T05:08:43+00:00"
},
{
"name": "phpunit/php-timer",
- "version": "6.0.0",
+ "version": "7.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git",
- "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d"
+ "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d",
- "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3",
+ "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "6.0-dev"
+ "dev-main": "7.0-dev"
}
},
"autoload": {
@@ -13583,7 +13601,8 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-timer/issues",
- "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0"
+ "security": "https://github.com/sebastianbergmann/php-timer/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1"
},
"funding": [
{
@@ -13591,20 +13610,20 @@
"type": "github"
}
],
- "time": "2023-02-03T06:57:52+00:00"
+ "time": "2024-07-03T05:09:35+00:00"
},
{
"name": "phpunit/phpunit",
- "version": "10.5.17",
+ "version": "11.4.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "c1f736a473d21957ead7e94fcc029f571895abf5"
+ "reference": "e8e8ed1854de5d36c088ec1833beae40d2dedd76"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c1f736a473d21957ead7e94fcc029f571895abf5",
- "reference": "c1f736a473d21957ead7e94fcc029f571895abf5",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e8e8ed1854de5d36c088ec1833beae40d2dedd76",
+ "reference": "e8e8ed1854de5d36c088ec1833beae40d2dedd76",
"shasum": ""
},
"require": {
@@ -13614,26 +13633,25 @@
"ext-mbstring": "*",
"ext-xml": "*",
"ext-xmlwriter": "*",
- "myclabs/deep-copy": "^1.10.1",
- "phar-io/manifest": "^2.0.3",
- "phar-io/version": "^3.0.2",
- "php": ">=8.1",
- "phpunit/php-code-coverage": "^10.1.5",
- "phpunit/php-file-iterator": "^4.0",
- "phpunit/php-invoker": "^4.0",
- "phpunit/php-text-template": "^3.0",
- "phpunit/php-timer": "^6.0",
- "sebastian/cli-parser": "^2.0",
- "sebastian/code-unit": "^2.0",
- "sebastian/comparator": "^5.0",
- "sebastian/diff": "^5.0",
- "sebastian/environment": "^6.0",
- "sebastian/exporter": "^5.1",
- "sebastian/global-state": "^6.0.1",
- "sebastian/object-enumerator": "^5.0",
- "sebastian/recursion-context": "^5.0",
- "sebastian/type": "^4.0",
- "sebastian/version": "^4.0"
+ "myclabs/deep-copy": "^1.12.0",
+ "phar-io/manifest": "^2.0.4",
+ "phar-io/version": "^3.2.1",
+ "php": ">=8.2",
+ "phpunit/php-code-coverage": "^11.0.7",
+ "phpunit/php-file-iterator": "^5.1.0",
+ "phpunit/php-invoker": "^5.0.1",
+ "phpunit/php-text-template": "^4.0.1",
+ "phpunit/php-timer": "^7.0.1",
+ "sebastian/cli-parser": "^3.0.2",
+ "sebastian/code-unit": "^3.0.1",
+ "sebastian/comparator": "^6.1.1",
+ "sebastian/diff": "^6.0.2",
+ "sebastian/environment": "^7.2.0",
+ "sebastian/exporter": "^6.1.3",
+ "sebastian/global-state": "^7.0.2",
+ "sebastian/object-enumerator": "^6.0.1",
+ "sebastian/type": "^5.1.0",
+ "sebastian/version": "^5.0.2"
},
"suggest": {
"ext-soap": "To be able to generate mocks based on WSDL files"
@@ -13644,7 +13662,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "10.5-dev"
+ "dev-main": "11.4-dev"
}
},
"autoload": {
@@ -13676,7 +13694,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.17"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/11.4.3"
},
"funding": [
{
@@ -13692,32 +13710,32 @@
"type": "tidelift"
}
],
- "time": "2024-04-05T04:39:01+00:00"
+ "time": "2024-10-28T13:07:50+00:00"
},
{
"name": "sebastian/cli-parser",
- "version": "2.0.1",
+ "version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git",
- "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084"
+ "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084",
- "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180",
+ "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "2.0-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -13741,7 +13759,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/cli-parser/issues",
"security": "https://github.com/sebastianbergmann/cli-parser/security/policy",
- "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1"
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2"
},
"funding": [
{
@@ -13749,32 +13767,32 @@
"type": "github"
}
],
- "time": "2024-03-02T07:12:49+00:00"
+ "time": "2024-07-03T04:41:36+00:00"
},
{
"name": "sebastian/code-unit",
- "version": "2.0.0",
+ "version": "3.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit.git",
- "reference": "a81fee9eef0b7a76af11d121767abc44c104e503"
+ "reference": "6bb7d09d6623567178cf54126afa9c2310114268"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503",
- "reference": "a81fee9eef0b7a76af11d121767abc44c104e503",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/6bb7d09d6623567178cf54126afa9c2310114268",
+ "reference": "6bb7d09d6623567178cf54126afa9c2310114268",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "2.0-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -13797,7 +13815,8 @@
"homepage": "https://github.com/sebastianbergmann/code-unit",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit/issues",
- "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0"
+ "security": "https://github.com/sebastianbergmann/code-unit/security/policy",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.1"
},
"funding": [
{
@@ -13805,32 +13824,32 @@
"type": "github"
}
],
- "time": "2023-02-03T06:58:43+00:00"
+ "time": "2024-07-03T04:44:28+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
- "version": "3.0.0",
+ "version": "4.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
- "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d"
+ "reference": "183a9b2632194febd219bb9246eee421dad8d45e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
- "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e",
+ "reference": "183a9b2632194febd219bb9246eee421dad8d45e",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.0-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -13852,7 +13871,8 @@
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
- "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0"
+ "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1"
},
"funding": [
{
@@ -13860,36 +13880,36 @@
"type": "github"
}
],
- "time": "2023-02-03T06:59:15+00:00"
+ "time": "2024-07-03T04:45:54+00:00"
},
{
"name": "sebastian/comparator",
- "version": "5.0.2",
+ "version": "6.2.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53"
+ "reference": "43d129d6a0f81c78bee378b46688293eb7ea3739"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53",
- "reference": "2d3e04c3b4c1e84a5e7382221ad8883c8fbc4f53",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/43d129d6a0f81c78bee378b46688293eb7ea3739",
+ "reference": "43d129d6a0f81c78bee378b46688293eb7ea3739",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-mbstring": "*",
- "php": ">=8.1",
- "sebastian/diff": "^5.0",
- "sebastian/exporter": "^5.0"
+ "php": ">=8.2",
+ "sebastian/diff": "^6.0",
+ "sebastian/exporter": "^6.0"
},
"require-dev": {
- "phpunit/phpunit": "^10.4"
+ "phpunit/phpunit": "^11.4"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "5.0-dev"
+ "dev-main": "6.2-dev"
}
},
"autoload": {
@@ -13929,7 +13949,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
"security": "https://github.com/sebastianbergmann/comparator/security/policy",
- "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.2"
+ "source": "https://github.com/sebastianbergmann/comparator/tree/6.2.1"
},
"funding": [
{
@@ -13937,33 +13957,33 @@
"type": "github"
}
],
- "time": "2024-08-12T06:03:08+00:00"
+ "time": "2024-10-31T05:30:08+00:00"
},
{
"name": "sebastian/complexity",
- "version": "3.2.0",
+ "version": "4.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git",
- "reference": "68ff824baeae169ec9f2137158ee529584553799"
+ "reference": "ee41d384ab1906c68852636b6de493846e13e5a0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799",
- "reference": "68ff824baeae169ec9f2137158ee529584553799",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0",
+ "reference": "ee41d384ab1906c68852636b6de493846e13e5a0",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.18 || ^5.0",
- "php": ">=8.1"
+ "nikic/php-parser": "^5.0",
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.2-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -13987,7 +14007,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/complexity/issues",
"security": "https://github.com/sebastianbergmann/complexity/security/policy",
- "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0"
+ "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1"
},
"funding": [
{
@@ -13995,33 +14015,33 @@
"type": "github"
}
],
- "time": "2023-12-21T08:37:17+00:00"
+ "time": "2024-07-03T04:49:50+00:00"
},
{
"name": "sebastian/diff",
- "version": "5.1.1",
+ "version": "6.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e"
+ "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e",
- "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544",
+ "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0",
- "symfony/process": "^6.4"
+ "phpunit/phpunit": "^11.0",
+ "symfony/process": "^4.2 || ^5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "5.1-dev"
+ "dev-main": "6.0-dev"
}
},
"autoload": {
@@ -14054,7 +14074,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy",
- "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1"
+ "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2"
},
"funding": [
{
@@ -14062,27 +14082,27 @@
"type": "github"
}
],
- "time": "2024-03-02T07:15:17+00:00"
+ "time": "2024-07-03T04:53:05+00:00"
},
{
"name": "sebastian/environment",
- "version": "6.1.0",
+ "version": "7.2.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "8074dbcd93529b357029f5cc5058fd3e43666984"
+ "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984",
- "reference": "8074dbcd93529b357029f5cc5058fd3e43666984",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5",
+ "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"suggest": {
"ext-posix": "*"
@@ -14090,7 +14110,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "6.1-dev"
+ "dev-main": "7.2-dev"
}
},
"autoload": {
@@ -14118,7 +14138,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
"security": "https://github.com/sebastianbergmann/environment/security/policy",
- "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0"
+ "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0"
},
"funding": [
{
@@ -14126,34 +14146,34 @@
"type": "github"
}
],
- "time": "2024-03-23T08:47:14+00:00"
+ "time": "2024-07-03T04:54:44+00:00"
},
{
"name": "sebastian/exporter",
- "version": "5.1.2",
+ "version": "6.1.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "955288482d97c19a372d3f31006ab3f37da47adf"
+ "reference": "c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf",
- "reference": "955288482d97c19a372d3f31006ab3f37da47adf",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e",
+ "reference": "c414673eee9a8f9d51bbf8d61fc9e3ef1e85b20e",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
- "php": ">=8.1",
- "sebastian/recursion-context": "^5.0"
+ "php": ">=8.2",
+ "sebastian/recursion-context": "^6.0"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.2"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "5.1-dev"
+ "dev-main": "6.1-dev"
}
},
"autoload": {
@@ -14196,7 +14216,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
"security": "https://github.com/sebastianbergmann/exporter/security/policy",
- "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2"
+ "source": "https://github.com/sebastianbergmann/exporter/tree/6.1.3"
},
"funding": [
{
@@ -14204,35 +14224,35 @@
"type": "github"
}
],
- "time": "2024-03-02T07:17:12+00:00"
+ "time": "2024-07-03T04:56:19+00:00"
},
{
"name": "sebastian/global-state",
- "version": "6.0.2",
+ "version": "7.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9"
+ "reference": "3be331570a721f9a4b5917f4209773de17f747d7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9",
- "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7",
+ "reference": "3be331570a721f9a4b5917f4209773de17f747d7",
"shasum": ""
},
"require": {
- "php": ">=8.1",
- "sebastian/object-reflector": "^3.0",
- "sebastian/recursion-context": "^5.0"
+ "php": ">=8.2",
+ "sebastian/object-reflector": "^4.0",
+ "sebastian/recursion-context": "^6.0"
},
"require-dev": {
"ext-dom": "*",
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "6.0-dev"
+ "dev-main": "7.0-dev"
}
},
"autoload": {
@@ -14258,7 +14278,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues",
"security": "https://github.com/sebastianbergmann/global-state/security/policy",
- "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2"
+ "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2"
},
"funding": [
{
@@ -14266,33 +14286,33 @@
"type": "github"
}
],
- "time": "2024-03-02T07:19:19+00:00"
+ "time": "2024-07-03T04:57:36+00:00"
},
{
"name": "sebastian/lines-of-code",
- "version": "2.0.2",
+ "version": "3.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
- "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0"
+ "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0",
- "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a",
+ "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a",
"shasum": ""
},
"require": {
- "nikic/php-parser": "^4.18 || ^5.0",
- "php": ">=8.1"
+ "nikic/php-parser": "^5.0",
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "2.0-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -14316,7 +14336,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
"security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
- "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2"
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1"
},
"funding": [
{
@@ -14324,34 +14344,34 @@
"type": "github"
}
],
- "time": "2023-12-21T08:38:20+00:00"
+ "time": "2024-07-03T04:58:38+00:00"
},
{
"name": "sebastian/object-enumerator",
- "version": "5.0.0",
+ "version": "6.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-enumerator.git",
- "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906"
+ "reference": "f5b498e631a74204185071eb41f33f38d64608aa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906",
- "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa",
+ "reference": "f5b498e631a74204185071eb41f33f38d64608aa",
"shasum": ""
},
"require": {
- "php": ">=8.1",
- "sebastian/object-reflector": "^3.0",
- "sebastian/recursion-context": "^5.0"
+ "php": ">=8.2",
+ "sebastian/object-reflector": "^4.0",
+ "sebastian/recursion-context": "^6.0"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "5.0-dev"
+ "dev-main": "6.0-dev"
}
},
"autoload": {
@@ -14373,7 +14393,8 @@
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
- "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0"
+ "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1"
},
"funding": [
{
@@ -14381,32 +14402,32 @@
"type": "github"
}
],
- "time": "2023-02-03T07:08:32+00:00"
+ "time": "2024-07-03T05:00:13+00:00"
},
{
"name": "sebastian/object-reflector",
- "version": "3.0.0",
+ "version": "4.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-reflector.git",
- "reference": "24ed13d98130f0e7122df55d06c5c4942a577957"
+ "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957",
- "reference": "24ed13d98130f0e7122df55d06c5c4942a577957",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9",
+ "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "3.0-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -14428,7 +14449,8 @@
"homepage": "https://github.com/sebastianbergmann/object-reflector/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-reflector/issues",
- "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0"
+ "security": "https://github.com/sebastianbergmann/object-reflector/security/policy",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1"
},
"funding": [
{
@@ -14436,32 +14458,32 @@
"type": "github"
}
],
- "time": "2023-02-03T07:06:18+00:00"
+ "time": "2024-07-03T05:01:32+00:00"
},
{
"name": "sebastian/recursion-context",
- "version": "5.0.0",
+ "version": "6.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "05909fb5bc7df4c52992396d0116aed689f93712"
+ "reference": "694d156164372abbd149a4b85ccda2e4670c0e16"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712",
- "reference": "05909fb5bc7df4c52992396d0116aed689f93712",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16",
+ "reference": "694d156164372abbd149a4b85ccda2e4670c0e16",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "5.0-dev"
+ "dev-main": "6.0-dev"
}
},
"autoload": {
@@ -14491,7 +14513,8 @@
"homepage": "https://github.com/sebastianbergmann/recursion-context",
"support": {
"issues": "https://github.com/sebastianbergmann/recursion-context/issues",
- "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0"
+ "security": "https://github.com/sebastianbergmann/recursion-context/security/policy",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2"
},
"funding": [
{
@@ -14499,32 +14522,32 @@
"type": "github"
}
],
- "time": "2023-02-03T07:05:40+00:00"
+ "time": "2024-07-03T05:10:34+00:00"
},
{
"name": "sebastian/type",
- "version": "4.0.0",
+ "version": "5.1.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
- "reference": "462699a16464c3944eefc02ebdd77882bd3925bf"
+ "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf",
- "reference": "462699a16464c3944eefc02ebdd77882bd3925bf",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/461b9c5da241511a2a0e8f240814fb23ce5c0aac",
+ "reference": "461b9c5da241511a2a0e8f240814fb23ce5c0aac",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"require-dev": {
- "phpunit/phpunit": "^10.0"
+ "phpunit/phpunit": "^11.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "4.0-dev"
+ "dev-main": "5.1-dev"
}
},
"autoload": {
@@ -14547,7 +14570,8 @@
"homepage": "https://github.com/sebastianbergmann/type",
"support": {
"issues": "https://github.com/sebastianbergmann/type/issues",
- "source": "https://github.com/sebastianbergmann/type/tree/4.0.0"
+ "security": "https://github.com/sebastianbergmann/type/security/policy",
+ "source": "https://github.com/sebastianbergmann/type/tree/5.1.0"
},
"funding": [
{
@@ -14555,29 +14579,29 @@
"type": "github"
}
],
- "time": "2023-02-03T07:10:45+00:00"
+ "time": "2024-09-17T13:12:04+00:00"
},
{
"name": "sebastian/version",
- "version": "4.0.1",
+ "version": "5.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/version.git",
- "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17"
+ "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17",
- "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874",
+ "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874",
"shasum": ""
},
"require": {
- "php": ">=8.1"
+ "php": ">=8.2"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-main": "4.0-dev"
+ "dev-main": "5.0-dev"
}
},
"autoload": {
@@ -14600,7 +14624,8 @@
"homepage": "https://github.com/sebastianbergmann/version",
"support": {
"issues": "https://github.com/sebastianbergmann/version/issues",
- "source": "https://github.com/sebastianbergmann/version/tree/4.0.1"
+ "security": "https://github.com/sebastianbergmann/version/security/policy",
+ "source": "https://github.com/sebastianbergmann/version/tree/5.0.2"
},
"funding": [
{
@@ -14608,20 +14633,20 @@
"type": "github"
}
],
- "time": "2023-02-07T11:34:05+00:00"
+ "time": "2024-10-09T05:16:32+00:00"
},
{
"name": "serversideup/spin",
- "version": "v1.1.0",
+ "version": "v2.3.0",
"source": {
"type": "git",
"url": "https://github.com/serversideup/spin.git",
- "reference": "03bb69dbdc6d6a68b82b4bb4cfeb7accc4f8758f"
+ "reference": "e7f742dfe54146196da26876670f368c11852df3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/serversideup/spin/zipball/03bb69dbdc6d6a68b82b4bb4cfeb7accc4f8758f",
- "reference": "03bb69dbdc6d6a68b82b4bb4cfeb7accc4f8758f",
+ "url": "https://api.github.com/repos/serversideup/spin/zipball/e7f742dfe54146196da26876670f368c11852df3",
+ "reference": "e7f742dfe54146196da26876670f368c11852df3",
"shasum": ""
},
"bin": [
@@ -14645,7 +14670,7 @@
"description": "Replicate your production environment locally using Docker. Just run \"spin up\". It's really that easy.",
"support": {
"issues": "https://github.com/serversideup/spin/issues",
- "source": "https://github.com/serversideup/spin/tree/v1.1.0"
+ "source": "https://github.com/serversideup/spin/tree/v2.3.0"
},
"funding": [
{
@@ -14653,7 +14678,7 @@
"type": "github"
}
],
- "time": "2022-05-20T15:13:10+00:00"
+ "time": "2024-10-15T15:12:28+00:00"
},
{
"name": "spatie/error-solutions",
@@ -14974,20 +14999,20 @@
},
{
"name": "symfony/http-client",
- "version": "v6.4.12",
+ "version": "v7.1.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-client.git",
- "reference": "fbebfcce21084d3e91ea987ae5bdd8c71ff0fd56"
+ "reference": "c30d91a1deac0dc3ed5e604683cf2e1dfc635b8a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-client/zipball/fbebfcce21084d3e91ea987ae5bdd8c71ff0fd56",
- "reference": "fbebfcce21084d3e91ea987ae5bdd8c71ff0fd56",
+ "url": "https://api.github.com/repos/symfony/http-client/zipball/c30d91a1deac0dc3ed5e604683cf2e1dfc635b8a",
+ "reference": "c30d91a1deac0dc3ed5e604683cf2e1dfc635b8a",
"shasum": ""
},
"require": {
- "php": ">=8.1",
+ "php": ">=8.2",
"psr/log": "^1|^2|^3",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/http-client-contracts": "^3.4.1",
@@ -14995,7 +15020,7 @@
},
"conflict": {
"php-http/discovery": "<1.15",
- "symfony/http-foundation": "<6.3"
+ "symfony/http-foundation": "<6.4"
},
"provide": {
"php-http/async-client-implementation": "*",
@@ -15012,11 +15037,12 @@
"nyholm/psr7": "^1.0",
"php-http/httplug": "^1.0|^2.0",
"psr/http-client": "^1.0",
- "symfony/dependency-injection": "^5.4|^6.0|^7.0",
- "symfony/http-kernel": "^5.4|^6.0|^7.0",
- "symfony/messenger": "^5.4|^6.0|^7.0",
- "symfony/process": "^5.4|^6.0|^7.0",
- "symfony/stopwatch": "^5.4|^6.0|^7.0"
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/messenger": "^6.4|^7.0",
+ "symfony/process": "^6.4|^7.0",
+ "symfony/rate-limiter": "^6.4|^7.0",
+ "symfony/stopwatch": "^6.4|^7.0"
},
"type": "library",
"autoload": {
@@ -15047,7 +15073,7 @@
"http"
],
"support": {
- "source": "https://github.com/symfony/http-client/tree/v6.4.12"
+ "source": "https://github.com/symfony/http-client/tree/v7.1.8"
},
"funding": [
{
@@ -15063,7 +15089,7 @@
"type": "tidelift"
}
],
- "time": "2024-09-20T08:21:33+00:00"
+ "time": "2024-11-13T13:40:27+00:00"
},
{
"name": "symfony/http-client-contracts",
diff --git a/config/constants.php b/config/constants.php
index 5792b358c..363cdd14f 100644
--- a/config/constants.php
+++ b/config/constants.php
@@ -1,10 +1,47 @@
[
- 'base_url' => 'https://coolify.io/docs',
+ 'coolify' => [
+ 'version' => '4.0.0-beta.370',
+ 'self_hosted' => env('SELF_HOSTED', true),
+ 'autoupdate' => env('AUTOUPDATE'),
+ 'base_config_path' => env('BASE_CONFIG_PATH', '/data/coolify'),
+ 'helper_image' => env('HELPER_IMAGE', 'ghcr.io/coollabsio/coolify-helper'),
+ 'is_windows_docker_desktop' => env('IS_WINDOWS_DOCKER_DESKTOP', false),
+ ],
+
+ 'urls' => [
+ 'docs' => 'https://coolify.io/docs',
'contact' => 'https://coolify.io/docs/contact',
],
+
+ 'services' => [
+ // Temporary disabled until cache is implemented
+ // 'official' => 'https://cdn.coollabs.io/coolify/service-templates.json',
+ 'official' => 'https://raw.githubusercontent.com/coollabsio/coolify/main/templates/service-templates.json',
+ ],
+
+ 'terminal' => [
+ 'protocol' => env('TERMINAL_PROTOCOL'),
+ 'host' => env('TERMINAL_HOST'),
+ 'port' => env('TERMINAL_PORT'),
+ ],
+
+ 'pusher' => [
+ 'host' => env('PUSHER_HOST'),
+ 'port' => env('PUSHER_PORT'),
+ 'app_key' => env('PUSHER_APP_KEY'),
+ ],
+
+ 'horizon' => [
+ 'is_horizon_enabled' => env('HORIZON_ENABLED', true),
+ 'is_scheduler_enabled' => env('SCHEDULER_ENABLED', true),
+ ],
+
+ 'docker' => [
+ 'minimum_required_version' => '26.0',
+ ],
+
'ssh' => [
'mux_enabled' => env('MUX_ENABLED', env('SSH_MUX_ENABLED', true)),
'mux_persist_time' => env('SSH_MUX_PERSIST_TIME', 3600),
@@ -12,20 +49,14 @@ return [
'server_interval' => 20,
'command_timeout' => 7200,
],
- 'waitlist' => [
- 'expiration' => 10,
- ],
+
'invitation' => [
'link' => [
'base_url' => '/invitations/',
- 'expiration' => 10,
+ 'expiration_days' => 3,
],
],
- 'services' => [
- // Temporary disabled until cache is implemented
- // 'official' => 'https://cdn.coollabs.io/coolify/service-templates.json',
- 'official' => 'https://raw.githubusercontent.com/coollabsio/coolify/main/templates/service-templates.json',
- ],
+
'limits' => [
'trial_period' => 0,
'server' => [
@@ -45,4 +76,23 @@ return [
'dynamic' => true,
],
],
+
+ 'waitlist' => [
+ 'enabled' => env('WAITLIST', false),
+ 'expiration' => 10,
+ ],
+
+ 'sentry' => [
+ 'sentry_dsn' => env('SENTRY_DSN'),
+ ],
+
+ 'webhooks' => [
+ 'feedback_discord_webhook' => env('FEEDBACK_DISCORD_WEBHOOK'),
+ 'dev_webhook' => env('SERVEO_URL'),
+ ],
+
+ 'bunny' => [
+ 'storage_api_key' => env('BUNNY_STORAGE_API_KEY'),
+ 'api_key' => env('BUNNY_API_KEY'),
+ ],
];
diff --git a/config/coolify.php b/config/coolify.php
deleted file mode 100644
index f9878fff7..000000000
--- a/config/coolify.php
+++ /dev/null
@@ -1,16 +0,0 @@
- 'https://coolify.io/docs/',
- 'contact' => 'https://coolify.io/docs/contact',
- 'feedback_discord_webhook' => env('FEEDBACK_DISCORD_WEBHOOK'),
- 'self_hosted' => env('SELF_HOSTED', true),
- 'waitlist' => env('WAITLIST', false),
- 'license_url' => 'https://licenses.coollabs.io',
- 'dev_webhook' => env('SERVEO_URL'),
- 'is_windows_docker_desktop' => env('IS_WINDOWS_DOCKER_DESKTOP', false),
- 'base_config_path' => env('BASE_CONFIG_PATH', '/data/coolify'),
- 'helper_image' => env('HELPER_IMAGE', 'ghcr.io/coollabsio/coolify-helper'),
- 'is_horizon_enabled' => env('HORIZON_ENABLED', true),
- 'is_scheduler_enabled' => env('SCHEDULER_ENABLED', true),
-];
diff --git a/config/redoc.php b/config/redoc.php
new file mode 100644
index 000000000..439e93e7b
--- /dev/null
+++ b/config/redoc.php
@@ -0,0 +1,28 @@
+ '',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Variables
+ |--------------------------------------------------------------------------
+ |
+ | You can automatically replace variables in your OpenAPI definitions by
+ | adding a key value pair to the array below. This will replace any
+ | instances of :key with the given value.
+ |
+ */
+
+ 'variables' => [],
+
+];
diff --git a/config/sentry.php b/config/sentry.php
index e8b6ab098..0efb4a0e2 100644
--- a/config/sentry.php
+++ b/config/sentry.php
@@ -3,11 +3,11 @@
return [
// @see https://docs.sentry.io/product/sentry-basics/dsn-explainer/
- 'dsn' => 'https://89552af6db48f4ca6a871ec0fc42964d@o1082494.ingest.us.sentry.io/4505347448045568',
+ 'dsn' => config('constants.sentry.sentry_dsn'),
// 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.361',
+ 'release' => config('constants.coolify.version'),
// When left empty or `null` the Laravel environment will be used
'environment' => config('app.env'),
diff --git a/config/subscription.php b/config/subscription.php
index 3e0182de9..a033862d2 100644
--- a/config/subscription.php
+++ b/config/subscription.php
@@ -6,21 +6,7 @@ return [
// Stripe
'stripe_api_key' => env('STRIPE_API_KEY', null),
'stripe_webhook_secret' => env('STRIPE_WEBHOOK_SECRET', null),
- 'stripe_price_id_basic_monthly' => env('STRIPE_PRICE_ID_BASIC_MONTHLY', null),
- 'stripe_price_id_basic_yearly' => env('STRIPE_PRICE_ID_BASIC_YEARLY', null),
- 'stripe_price_id_pro_monthly' => env('STRIPE_PRICE_ID_PRO_MONTHLY', null),
- 'stripe_price_id_pro_yearly' => env('STRIPE_PRICE_ID_PRO_YEARLY', null),
- 'stripe_price_id_ultimate_monthly' => env('STRIPE_PRICE_ID_ULTIMATE_MONTHLY', null),
- 'stripe_price_id_ultimate_yearly' => env('STRIPE_PRICE_ID_ULTIMATE_YEARLY', null),
'stripe_excluded_plans' => env('STRIPE_EXCLUDED_PLANS', null),
-
- 'stripe_price_id_basic_monthly_old' => env('STRIPE_PRICE_ID_BASIC_MONTHLY_OLD', null),
- 'stripe_price_id_basic_yearly_old' => env('STRIPE_PRICE_ID_BASIC_YEARLY_OLD', null),
- 'stripe_price_id_pro_monthly_old' => env('STRIPE_PRICE_ID_PRO_MONTHLY_OLD', null),
- 'stripe_price_id_pro_yearly_old' => env('STRIPE_PRICE_ID_PRO_YEARLY_OLD', null),
- 'stripe_price_id_ultimate_monthly_old' => env('STRIPE_PRICE_ID_ULTIMATE_MONTHLY_OLD', null),
- 'stripe_price_id_ultimate_yearly_old' => env('STRIPE_PRICE_ID_ULTIMATE_YEARLY_OLD', null),
-
'stripe_price_id_dynamic_monthly' => env('STRIPE_PRICE_ID_DYNAMIC_MONTHLY', null),
'stripe_price_id_dynamic_yearly' => env('STRIPE_PRICE_ID_DYNAMIC_YEARLY', null),
];
diff --git a/config/version.php b/config/version.php
index 0e83ff40e..64226ac05 100644
--- a/config/version.php
+++ b/config/version.php
@@ -1,3 +1,3 @@
update(['metrics_history_days' => 7]);
} catch (\Exception $e) {
- loggy($e);
+ Log::error('Error updating db: '.$e->getMessage());
}
}
diff --git a/database/migrations/2024_11_11_125335_add_custom_nginx_configuration_to_static.php b/database/migrations/2024_11_11_125335_add_custom_nginx_configuration_to_static.php
new file mode 100644
index 000000000..1c6e2daa0
--- /dev/null
+++ b/database/migrations/2024_11_11_125335_add_custom_nginx_configuration_to_static.php
@@ -0,0 +1,28 @@
+longText('custom_nginx_configuration')->nullable()->after('static_image');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('applications', function (Blueprint $table) {
+ $table->dropColumn('custom_nginx_configuration');
+ });
+ }
+};
diff --git a/database/seeders/PopulateSshKeysDirectorySeeder.php b/database/seeders/PopulateSshKeysDirectorySeeder.php
index d528179c0..87984769c 100644
--- a/database/seeders/PopulateSshKeysDirectorySeeder.php
+++ b/database/seeders/PopulateSshKeysDirectorySeeder.php
@@ -24,9 +24,8 @@ class PopulateSshKeysDirectorySeeder extends Seeder
});
if (isDev()) {
- $user = env('PUID').':'.env('PGID');
- Process::run("chown -R $user ".storage_path('app/ssh/keys'));
- Process::run("chown -R $user ".storage_path('app/ssh/mux'));
+ Process::run('chown -R 9999:9999 '.storage_path('app/ssh/keys'));
+ Process::run('chown -R 9999:9999 '.storage_path('app/ssh/mux'));
} else {
Process::run('chown -R 9999:root '.storage_path('app/ssh/keys'));
Process::run('chown -R 9999:root '.storage_path('app/ssh/mux'));
diff --git a/database/seeders/ProductionSeeder.php b/database/seeders/ProductionSeeder.php
index 3e820a162..7acdef548 100644
--- a/database/seeders/ProductionSeeder.php
+++ b/database/seeders/ProductionSeeder.php
@@ -22,9 +22,9 @@ class ProductionSeeder extends Seeder
public function run(): void
{
if (isCloud()) {
- echo "Running in cloud mode.\n";
+ echo "[x]: Running in cloud mode.\n";
} else {
- echo "Running in self-hosted mode.\n";
+ echo "[x]: Running in self-hosted mode.\n";
}
// Fix for 4.0.0-beta.37
@@ -100,7 +100,7 @@ class ProductionSeeder extends Seeder
}
}
- if (! isCloud() && config('coolify.is_windows_docker_desktop') == false) {
+ if (! isCloud() && config('constants.coolify.is_windows_docker_desktop') == false) {
$coolify_key_name = '@host.docker.internal';
$ssh_keys_directory = Storage::disk('ssh-keys')->files();
$coolify_key = collect($ssh_keys_directory)->firstWhere(fn ($item) => str($item)->contains($coolify_key_name));
@@ -127,7 +127,7 @@ class ProductionSeeder extends Seeder
}
}
}
- if (config('coolify.is_windows_docker_desktop')) {
+ if (config('constants.coolify.is_windows_docker_desktop')) {
PrivateKey::updateOrCreate(
[
'id' => 0,
diff --git a/database/seeders/SentinelSeeder.php b/database/seeders/SentinelSeeder.php
index 117ba6782..3cf913933 100644
--- a/database/seeders/SentinelSeeder.php
+++ b/database/seeders/SentinelSeeder.php
@@ -4,6 +4,7 @@ namespace Database\Seeders;
use App\Models\Server;
use Illuminate\Database\Seeder;
+use Illuminate\Support\Facades\Log;
class SentinelSeeder extends Seeder
{
@@ -13,17 +14,17 @@ class SentinelSeeder extends Seeder
foreach ($servers as $server) {
try {
if (str($server->settings->sentinel_token)->isEmpty()) {
- $server->settings->generateSentinelToken();
+ $server->settings->generateSentinelToken(ignoreEvent: true);
}
if (str($server->settings->sentinel_custom_url)->isEmpty()) {
- $url = $server->settings->generateSentinelUrl();
+ $url = $server->settings->generateSentinelUrl(ignoreEvent: true);
if (str($url)->isEmpty()) {
$server->settings->is_sentinel_enabled = false;
$server->settings->save();
}
}
} catch (\Throwable $e) {
- loggy("Error: {$e->getMessage()}\n");
+ Log::error('Error seeding sentinel: '.$e->getMessage());
}
}
});
diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml
index f1da567fc..05b9f9cfb 100644
--- a/docker-compose.dev.yml
+++ b/docker-compose.dev.yml
@@ -60,7 +60,7 @@ services:
SOKETI_DEFAULT_APP_SECRET: "${PUSHER_APP_SECRET:-coolify}"
entrypoint: ["/bin/sh", "/soketi-entrypoint.sh"]
vite:
- image: node:20
+ image: node:20-alpine
pull_policy: always
working_dir: /var/www/html
environment:
@@ -74,8 +74,9 @@ services:
networks:
- coolify
testing-host:
- image: "ghcr.io/coollabsio/coolify-testing-host:latest"
- pull_policy: always
+ build:
+ context: .
+ dockerfile: ./docker/testing-host/Dockerfile
init: true
container_name: coolify-testing-host
volumes:
@@ -88,7 +89,7 @@ services:
networks:
- coolify
mailpit:
- image: "axllent/mailpit:latest"
+ image: axllent/mailpit:latest
pull_policy: always
container_name: coolify-mail
ports:
diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml
index b15a109c3..d86b2336b 100644
--- a/docker-compose.prod.yml
+++ b/docker-compose.prod.yml
@@ -29,6 +29,7 @@ services:
- REDIS_HOST
- REDIS_PASSWORD
- HORIZON_BALANCE
+ - HORIZON_MIN_PROCESSES
- HORIZON_MAX_PROCESSES
- HORIZON_BALANCE_MAX_SHIFT
- HORIZON_BALANCE_COOLDOWN
@@ -50,29 +51,8 @@ services:
- TERMINAL_HOST
- TERMINAL_PORT
- AUTOUPDATE
- - SELF_HOSTED
- SSH_MUX_ENABLED
- SSH_MUX_PERSIST_TIME
- - FEEDBACK_DISCORD_WEBHOOK
- - WAITLIST
- - SUBSCRIPTION_PROVIDER
- - STRIPE_API_KEY
- - STRIPE_WEBHOOK_SECRET
- - STRIPE_PRICE_ID_BASIC_MONTHLY
- - STRIPE_PRICE_ID_BASIC_YEARLY
- - STRIPE_PRICE_ID_PRO_MONTHLY
- - STRIPE_PRICE_ID_PRO_YEARLY
- - STRIPE_PRICE_ID_ULTIMATE_MONTHLY
- - STRIPE_PRICE_ID_ULTIMATE_YEARLY
- - STRIPE_PRICE_ID_DYNAMIC_MONTHLY
- - STRIPE_PRICE_ID_DYNAMIC_YEARLY
- - STRIPE_PRICE_ID_BASIC_MONTHLY_OLD
- - STRIPE_PRICE_ID_BASIC_YEARLY_OLD
- - STRIPE_PRICE_ID_PRO_MONTHLY_OLD
- - STRIPE_PRICE_ID_PRO_YEARLY_OLD
- - STRIPE_PRICE_ID_ULTIMATE_MONTHLY_OLD
- - STRIPE_PRICE_ID_ULTIMATE_YEARLY_OLD
- - STRIPE_EXCLUDED_PLANS
ports:
- "${APP_PORT:-8000}:80"
expose:
@@ -113,7 +93,7 @@ services:
retries: 10
timeout: 2s
soketi:
- image: 'ghcr.io/coollabsio/coolify-realtime:1.0.3'
+ image: 'ghcr.io/coollabsio/coolify-realtime:1.0.4'
ports:
- "${SOKETI_PORT:-6001}:6001"
- "6002:6002"
diff --git a/docker-compose.windows.yml b/docker-compose.windows.yml
index ef2de82e9..f2b03d209 100644
--- a/docker-compose.windows.yml
+++ b/docker-compose.windows.yml
@@ -86,7 +86,7 @@ services:
retries: 10
timeout: 2s
redis:
- image: redis:alpine
+ image: redis:7-alpine
pull_policy: always
container_name: coolify-redis
restart: always
@@ -103,7 +103,7 @@ services:
retries: 10
timeout: 2s
soketi:
- image: 'ghcr.io/coollabsio/coolify-realtime:1.0.0'
+ image: 'ghcr.io/coollabsio/coolify-realtime:1.0.4'
pull_policy: always
container_name: coolify-realtime
restart: always
diff --git a/docker-compose.yml b/docker-compose.yml
index 68d0f0744..0fd3dda07 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -4,7 +4,7 @@ services:
restart: always
working_dir: /var/www/html
extra_hosts:
- - 'host.docker.internal:host-gateway'
+ - host.docker.internal:host-gateway
networks:
- coolify
depends_on:
@@ -18,7 +18,7 @@ services:
networks:
- coolify
redis:
- image: redis:alpine
+ image: redis:7-alpine
container_name: coolify-redis
restart: always
networks:
@@ -26,7 +26,7 @@ services:
soketi:
container_name: coolify-realtime
extra_hosts:
- - 'host.docker.internal:host-gateway'
+ - host.docker.internal:host-gateway
restart: always
networks:
- coolify
diff --git a/docker/coolify-helper/Dockerfile b/docker/coolify-helper/Dockerfile
index 7aa9d8722..741fff764 100644
--- a/docker/coolify-helper/Dockerfile
+++ b/docker/coolify-helper/Dockerfile
@@ -1,16 +1,30 @@
-FROM alpine:3.17
+# Versions
-ARG TARGETPLATFORM
+# https://hub.docker.com/_/alpine
+ARG BASE_IMAGE=alpine:3.20
# https://download.docker.com/linux/static/stable/
-ARG DOCKER_VERSION=26.1.3
+ARG DOCKER_VERSION=27.3.1
# https://github.com/docker/compose/releases
-ARG DOCKER_COMPOSE_VERSION=2.27.1
+ARG DOCKER_COMPOSE_VERSION=2.30.3
# https://github.com/docker/buildx/releases
-ARG DOCKER_BUILDX_VERSION=0.14.1
+ARG DOCKER_BUILDX_VERSION=0.18.0
# https://github.com/buildpacks/pack/releases
ARG PACK_VERSION=0.35.1
# https://github.com/railwayapp/nixpacks/releases
-ARG NIXPACKS_VERSION=1.28.0
+ARG NIXPACKS_VERSION=1.29.0
+# https://hub.docker.com/r/minio/mc/tags
+ARG MINIO_VERSION=RELEASE.2024-03-07T00-31-49Z
+
+FROM minio/mc:${MINIO_VERSION} AS minio-client
+
+FROM ${BASE_IMAGE} AS base
+
+ARG TARGETPLATFORM
+ARG DOCKER_VERSION
+ARG DOCKER_COMPOSE_VERSION
+ARG DOCKER_BUILDX_VERSION
+ARG PACK_VERSION
+ARG NIXPACKS_VERSION
USER root
WORKDIR /artifacts
@@ -34,9 +48,8 @@ RUN if [[ ${TARGETPLATFORM} == 'linux/arm64' ]]; then \
chmod +x ~/.docker/cli-plugins/docker-compose /usr/bin/docker /usr/local/bin/pack /root/.docker/cli-plugins/docker-buildx \
;fi
-COPY --from=minio/mc:RELEASE.2024-09-09T07-53-10Z /usr/bin/mc /usr/bin/mc
+COPY --from=minio-client /usr/bin/mc /usr/bin/mc
RUN chmod +x /usr/bin/mc
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["tail", "-f", "/dev/null"]
-
diff --git a/docker/coolify-realtime/Dockerfile b/docker/coolify-realtime/Dockerfile
index f0d6db906..b9f3c1e62 100644
--- a/docker/coolify-realtime/Dockerfile
+++ b/docker/coolify-realtime/Dockerfile
@@ -1,5 +1,6 @@
FROM quay.io/soketi/soketi:1.6-16-alpine
+
ARG TARGETPLATFORM
# https://github.com/cloudflare/cloudflared/releases
ARG CLOUDFLARED_VERSION=2024.4.1
@@ -22,6 +23,4 @@ RUN /bin/sh -c "if [[ ${TARGETPLATFORM} == 'linux/arm64' ]]; then \
curl -L https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64 -o /usr/local/bin/cloudflared && chmod +x /usr/local/bin/cloudflared \
;fi"
-
-
ENTRYPOINT ["/bin/sh", "/soketi-entrypoint.sh"]
diff --git a/docker/coolify-realtime/package-lock.json b/docker/coolify-realtime/package-lock.json
new file mode 100644
index 000000000..9316442ae
--- /dev/null
+++ b/docker/coolify-realtime/package-lock.json
@@ -0,0 +1,190 @@
+{
+ "name": "coolify-realtime",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "@xterm/addon-fit": "0.10.0",
+ "@xterm/xterm": "5.5.0",
+ "axios": "1.7.7",
+ "cookie": "1.0.1",
+ "dotenv": "16.4.5",
+ "node-pty": "1.0.0",
+ "ws": "8.18.0"
+ }
+ },
+ "node_modules/@xterm/addon-fit": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.10.0.tgz",
+ "integrity": "sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@xterm/xterm": "^5.0.0"
+ }
+ },
+ "node_modules/@xterm/xterm": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz",
+ "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==",
+ "license": "MIT"
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/axios": {
+ "version": "1.7.7",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
+ "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.1.tgz",
+ "integrity": "sha512-Xd8lFX4LM9QEEwxQpF9J9NTUh8pmdJO0cyRJhFiDoLTk2eH8FXlRv2IFGYVadZpqI3j8fhNrSdKCeYPxiAhLXw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.4.5",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
+ "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/nan": {
+ "version": "2.22.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz",
+ "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==",
+ "license": "MIT"
+ },
+ "node_modules/node-pty": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-1.0.0.tgz",
+ "integrity": "sha512-wtBMWWS7dFZm/VgqElrTvtfMq4GzJ6+edFI0Y0zyzygUSZMgZdraDUMUhCIvkjhJjme15qWmbyJbtAx4ot4uZA==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "nan": "^2.17.0"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
+ },
+ "node_modules/ws": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
+ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/docker/coolify-realtime/package.json b/docker/coolify-realtime/package.json
index 146e6b90a..8b2076f8d 100644
--- a/docker/coolify-realtime/package.json
+++ b/docker/coolify-realtime/package.json
@@ -2,12 +2,12 @@
"private": true,
"type": "module",
"dependencies": {
- "@xterm/addon-fit": "^0.10.0",
- "@xterm/xterm": "^5.5.0",
- "cookie": "^0.7.0",
- "axios": "1.7.5",
- "dotenv": "^16.4.5",
- "node-pty": "^1.0.0",
- "ws": "^8.17.0"
+ "@xterm/addon-fit": "0.10.0",
+ "@xterm/xterm": "5.5.0",
+ "cookie": "1.0.1",
+ "axios": "1.7.7",
+ "dotenv": "16.4.5",
+ "node-pty": "1.0.0",
+ "ws": "8.18.0"
}
}
diff --git a/docker/dev/Dockerfile b/docker/dev/Dockerfile
index d2381f764..e90521759 100644
--- a/docker/dev/Dockerfile
+++ b/docker/dev/Dockerfile
@@ -1,10 +1,21 @@
-FROM serversideup/php:8.2-fpm-nginx-v2.2.1
+# Versions
+# https://hub.docker.com/r/serversideup/php/tags?name=8.3-fpm-nginx-alpine
+ARG SERVERSIDEUP_PHP_VERSION=8.2-fpm-nginx-v2.2.1
+# https://github.com/minio/mc/releases
+ARG MINIO_VERSION=RELEASE.2024-11-05T11-29-45Z
+# https://github.com/cloudflare/cloudflared/releases
+ARG CLOUDFLARED_VERSION=2024.11.0
+# https://www.postgresql.org/support/versioning/ - Can not updated automatically so keep it at 15
+ARG POSTGRES_VERSION=15
+
+FROM minio/mc:${MINIO_VERSION} AS minio-client
+
+FROM serversideup/php:${SERVERSIDEUP_PHP_VERSION}
ARG TARGETPLATFORM
-# https://github.com/cloudflare/cloudflared/releases
-ARG CLOUDFLARED_VERSION=2024.4.1
-
-ARG POSTGRES_VERSION=15
+ARG CLOUDFLARED_VERSION
+ARG MINIO_VERSION
+ARG POSTGRES_VERSION
# Use build arguments for caching
ARG BUILDTIME_DEPS="dirmngr ca-certificates software-properties-common gnupg gnupg2 apt-transport-https curl"
@@ -41,7 +52,7 @@ RUN --mount=type=cache,target=/root/.cache \
curl -L https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/cloudflared-linux-arm64 -o /usr/local/bin/cloudflared && chmod +x /usr/local/bin/cloudflared \
;fi"
-COPY --from=minio/mc:RELEASE.2024-09-09T07-53-10Z /usr/bin/mc /usr/bin/mc
+COPY --from=minio-client /usr/bin/mc /usr/bin/mc
RUN chmod +x /usr/bin/mc
RUN { \
diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile
index 22a5b143a..36be6cf06 100644
--- a/docker/prod/Dockerfile
+++ b/docker/prod/Dockerfile
@@ -1,22 +1,34 @@
-FROM serversideup/php:8.2-fpm-nginx-v2.2.1 AS base
+# Versions
+# https://hub.docker.com/r/serversideup/php/tags?name=8.3-fpm-nginx-alpine
+ARG SERVERSIDEUP_PHP_VERSION=8.2-fpm-nginx-v2.2.1
+# https://github.com/minio/mc/releases
+ARG MINIO_VERSION=RELEASE.2024-11-05T11-29-45Z
+# https://github.com/cloudflare/cloudflared/releases
+ARG CLOUDFLARED_VERSION=2024.11.0
+# https://www.postgresql.org/support/versioning/ - Can not updated automatically so keep it at 15
+ARG POSTGRES_VERSION=15
+
+
+FROM serversideup/php:${SERVERSIDEUP_PHP_VERSION} AS base
WORKDIR /var/www/html
COPY composer.json composer.lock ./
RUN composer install --no-dev --no-interaction --no-plugins --no-scripts --prefer-dist
-FROM node:20 as static-assets
+FROM node:20 AS static-assets
WORKDIR /app
COPY . .
COPY --from=base --chown=9999:9999 /var/www/html .
RUN npm install
RUN npm run build
-FROM serversideup/php:8.2-fpm-nginx-v2.2.1
+FROM minio/mc:${MINIO_VERSION} AS minio-client
+
+FROM serversideup/php:${SERVERSIDEUP_PHP_VERSION}
ARG TARGETPLATFORM
-# https://github.com/cloudflare/cloudflared/releases
-ARG CLOUDFLARED_VERSION=2024.4.1
-ARG POSTGRES_VERSION=15
+ARG CLOUDFLARED_VERSION
+ARG POSTGRES_VERSION
ARG CI=true
WORKDIR /var/www/html
@@ -29,7 +41,7 @@ RUN curl -fSsL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmo
RUN echo deb [arch=amd64,arm64,ppc64el signed-by=/usr/share/keyrings/postgresql.gpg] http://apt.postgresql.org/pub/repos/apt/ jammy-pgdg main | tee -a /etc/apt/sources.list.d/postgresql.list
RUN apt-get update
-RUN apt-get install postgresql-client-$POSTGRES_VERSION -y
+RUN apt-get install postgresql-client-${POSTGRES_VERSION} -y
# Coolify requirements
RUN apt-get install -y php8.2-pgsql openssh-client git git-lfs jq lsof vim
@@ -45,9 +57,6 @@ RUN composer dump-autoload
COPY --from=static-assets --chown=9999:9999 /app/public/build ./public/build
COPY --chmod=755 docker/prod/etc/s6-overlay/ /etc/s6-overlay/
-RUN php artisan route:cache
-RUN php artisan view:cache
-
RUN echo "alias ll='ls -al'" >>/etc/bash.bashrc
RUN echo "alias a='php artisan'" >>/etc/bash.bashrc
RUN echo "alias logs='tail -f storage/logs/laravel.log'" >>/etc/bash.bashrc
@@ -69,5 +78,5 @@ RUN { \
echo 'post_max_size=256M'; \
} > /etc/php/current_version/cli/conf.d/upload-limits.ini
-COPY --from=minio/mc:RELEASE.2024-09-09T07-53-10Z /usr/bin/mc /usr/bin/mc
+COPY --from=minio-client /usr/bin/mc /usr/bin/mc
RUN chmod +x /usr/bin/mc
diff --git a/docker/testing-host/Dockerfile b/docker/testing-host/Dockerfile
index deb09eeba..d98fcc821 100644
--- a/docker/testing-host/Dockerfile
+++ b/docker/testing-host/Dockerfile
@@ -1,16 +1,22 @@
+# Versions
+# https://download.docker.com/linux/static/stable/
+ARG DOCKER_VERSION=27.3.1
+# https://github.com/docker/compose/releases
+ARG DOCKER_COMPOSE_VERSION=2.30.3
+# https://github.com/docker/buildx/releases
+ARG DOCKER_BUILDX_VERSION=0.18.0
+
+
FROM debian:12-slim
ARG TARGETPLATFORM
-# https://download.docker.com/linux/static/stable/
-ARG DOCKER_VERSION=26.1.2
-# https://github.com/docker/compose/releases
-ARG DOCKER_COMPOSE_VERSION=2.27.0
-# https://github.com/docker/buildx/releases
-ARG DOCKER_BUILDX_VERSION=0.14.0
+ARG DOCKER_VERSION
+ARG DOCKER_COMPOSE_VERSION
+ARG DOCKER_BUILDX_VERSION
USER root
WORKDIR /root
-ENV PATH "$PATH:/host/usr/local/sbin:/host/usr/local/bin:/host/usr/sbin:/host/usr/bin:/host/sbin:/host/bin"
+ENV PATH="/host/usr/local/sbin:/host/usr/local/bin:/host/usr/sbin:/host/usr/bin:/host/sbin:/host/bin:$PATH"
RUN apt update && apt -y install openssh-client openssh-server curl wget git jq jc
RUN mkdir -p ~/.docker/cli-plugins
diff --git a/examples/traefik-dynamic-catch-all.yaml b/examples/traefik-dynamic-catch-all.yaml
deleted file mode 100644
index 54f7b1fb9..000000000
--- a/examples/traefik-dynamic-catch-all.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-# This is an example dynamic configuration.
-http:
- routers:
- catchall:
- entryPoints:
- - http
- - https
- service: noop
- rule: HostRegexp(`{catchall:.*}`)
- priority: 1
- middlewares:
- - redirect-regexp
- services:
- noop:
- loadBalancer:
- servers:
- - url: ''
- middlewares:
- redirect-regexp:
- redirectRegex:
- regex: '(.*)'
- replacement: 'https://coolify.io'
- permanent: false
\ No newline at end of file
diff --git a/examples/traefik-dynamic-coolify.yaml b/examples/traefik-dynamic-coolify.yaml
deleted file mode 100644
index 0c5f7e311..000000000
--- a/examples/traefik-dynamic-coolify.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-# This is an example dynamic configuration.
-http:
- routers:
- coolify-http:
- entryPoints:
- - http
- service: coolify
- rule: Host(`coolify.io`)
- services:
- coolify:
- loadBalancer:
- servers:
- -
- url: 'http://coolify:80'
\ No newline at end of file
diff --git a/openapi.json b/openapi.json
new file mode 100644
index 000000000..cdcd47f40
--- /dev/null
+++ b/openapi.json
@@ -0,0 +1,7985 @@
+{
+ "openapi": "3.0.0",
+ "info": {
+ "title": "Coolify",
+ "version": "0.1"
+ },
+ "servers": [
+ {
+ "url": "https:\/\/app.coolify.io\/api\/v1",
+ "description": "Coolify Cloud API. Change the host to your own instance if you are self-hosting."
+ }
+ ],
+ "paths": {
+ "\/applications": {
+ "get": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "List",
+ "description": "List all applications.",
+ "operationId": "list-applications",
+ "responses": {
+ "200": {
+ "description": "Get all applications.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#\/components\/schemas\/Application"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/applications\/public": {
+ "post": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Create (Public)",
+ "description": "Create new application based on a public git repository.",
+ "operationId": "create-public-application",
+ "requestBody": {
+ "description": "Application object that needs to be created.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "project_uuid",
+ "server_uuid",
+ "environment_name",
+ "git_repository",
+ "git_branch",
+ "build_pack",
+ "ports_exposes"
+ ],
+ "properties": {
+ "project_uuid": {
+ "type": "string",
+ "description": "The project UUID."
+ },
+ "server_uuid": {
+ "type": "string",
+ "description": "The server UUID."
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "The environment name."
+ },
+ "git_repository": {
+ "type": "string",
+ "description": "The git repository URL."
+ },
+ "git_branch": {
+ "type": "string",
+ "description": "The git branch."
+ },
+ "build_pack": {
+ "type": "string",
+ "enum": [
+ "nixpacks",
+ "static",
+ "dockerfile",
+ "dockercompose"
+ ],
+ "description": "The build pack type."
+ },
+ "ports_exposes": {
+ "type": "string",
+ "description": "The ports to expose."
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "The destination UUID."
+ },
+ "name": {
+ "type": "string",
+ "description": "The application name."
+ },
+ "description": {
+ "type": "string",
+ "description": "The application description."
+ },
+ "domains": {
+ "type": "string",
+ "description": "The application domains."
+ },
+ "git_commit_sha": {
+ "type": "string",
+ "description": "The git commit SHA."
+ },
+ "docker_registry_image_name": {
+ "type": "string",
+ "description": "The docker registry image name."
+ },
+ "docker_registry_image_tag": {
+ "type": "string",
+ "description": "The docker registry image tag."
+ },
+ "is_static": {
+ "type": "boolean",
+ "description": "The flag to indicate if the application is static."
+ },
+ "static_image": {
+ "type": "string",
+ "enum": [
+ "nginx:alpine"
+ ],
+ "description": "The static image."
+ },
+ "install_command": {
+ "type": "string",
+ "description": "The install command."
+ },
+ "build_command": {
+ "type": "string",
+ "description": "The build command."
+ },
+ "start_command": {
+ "type": "string",
+ "description": "The start command."
+ },
+ "ports_mappings": {
+ "type": "string",
+ "description": "The ports mappings."
+ },
+ "base_directory": {
+ "type": "string",
+ "description": "The base directory for all commands."
+ },
+ "publish_directory": {
+ "type": "string",
+ "description": "The publish directory."
+ },
+ "health_check_enabled": {
+ "type": "boolean",
+ "description": "Health check enabled."
+ },
+ "health_check_path": {
+ "type": "string",
+ "description": "Health check path."
+ },
+ "health_check_port": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check port."
+ },
+ "health_check_host": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check host."
+ },
+ "health_check_method": {
+ "type": "string",
+ "description": "Health check method."
+ },
+ "health_check_return_code": {
+ "type": "integer",
+ "description": "Health check return code."
+ },
+ "health_check_scheme": {
+ "type": "string",
+ "description": "Health check scheme."
+ },
+ "health_check_response_text": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check response text."
+ },
+ "health_check_interval": {
+ "type": "integer",
+ "description": "Health check interval in seconds."
+ },
+ "health_check_timeout": {
+ "type": "integer",
+ "description": "Health check timeout in seconds."
+ },
+ "health_check_retries": {
+ "type": "integer",
+ "description": "Health check retries count."
+ },
+ "health_check_start_period": {
+ "type": "integer",
+ "description": "Health check start period in seconds."
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit."
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit."
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness."
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation."
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit."
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "nullable": true,
+ "description": "CPU set."
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares."
+ },
+ "custom_labels": {
+ "type": "string",
+ "description": "Custom labels."
+ },
+ "custom_docker_run_options": {
+ "type": "string",
+ "description": "Custom docker run options."
+ },
+ "post_deployment_command": {
+ "type": "string",
+ "description": "Post deployment command."
+ },
+ "post_deployment_command_container": {
+ "type": "string",
+ "description": "Post deployment command container."
+ },
+ "pre_deployment_command": {
+ "type": "string",
+ "description": "Pre deployment command."
+ },
+ "pre_deployment_command_container": {
+ "type": "string",
+ "description": "Pre deployment command container."
+ },
+ "manual_webhook_secret_github": {
+ "type": "string",
+ "description": "Manual webhook secret for Github."
+ },
+ "manual_webhook_secret_gitlab": {
+ "type": "string",
+ "description": "Manual webhook secret for Gitlab."
+ },
+ "manual_webhook_secret_bitbucket": {
+ "type": "string",
+ "description": "Manual webhook secret for Bitbucket."
+ },
+ "manual_webhook_secret_gitea": {
+ "type": "string",
+ "description": "Manual webhook secret for Gitea."
+ },
+ "redirect": {
+ "type": "string",
+ "nullable": true,
+ "description": "How to set redirect with Traefik \/ Caddy. www<->non-www.",
+ "enum": [
+ "www",
+ "non-www",
+ "both"
+ ]
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "description": "The flag to indicate if the application should be deployed instantly."
+ },
+ "dockerfile": {
+ "type": "string",
+ "description": "The Dockerfile content."
+ },
+ "docker_compose_location": {
+ "type": "string",
+ "description": "The Docker Compose location."
+ },
+ "docker_compose_raw": {
+ "type": "string",
+ "description": "The Docker Compose raw content."
+ },
+ "docker_compose_custom_start_command": {
+ "type": "string",
+ "description": "The Docker Compose custom start command."
+ },
+ "docker_compose_custom_build_command": {
+ "type": "string",
+ "description": "The Docker Compose custom build command."
+ },
+ "docker_compose_domains": {
+ "type": "array",
+ "description": "The Docker Compose domains."
+ },
+ "watch_paths": {
+ "type": "string",
+ "description": "The watch paths."
+ },
+ "use_build_server": {
+ "type": "boolean",
+ "nullable": true,
+ "description": "Use build server."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Application created successfully."
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/applications\/private-github-app": {
+ "post": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Create (Private - GH App)",
+ "description": "Create new application based on a private repository through a Github App.",
+ "operationId": "create-private-github-app-application",
+ "requestBody": {
+ "description": "Application object that needs to be created.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "project_uuid",
+ "server_uuid",
+ "environment_name",
+ "github_app_uuid",
+ "git_repository",
+ "git_branch",
+ "build_pack",
+ "ports_exposes"
+ ],
+ "properties": {
+ "project_uuid": {
+ "type": "string",
+ "description": "The project UUID."
+ },
+ "server_uuid": {
+ "type": "string",
+ "description": "The server UUID."
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "The environment name."
+ },
+ "github_app_uuid": {
+ "type": "string",
+ "description": "The Github App UUID."
+ },
+ "git_repository": {
+ "type": "string",
+ "description": "The git repository URL."
+ },
+ "git_branch": {
+ "type": "string",
+ "description": "The git branch."
+ },
+ "ports_exposes": {
+ "type": "string",
+ "description": "The ports to expose."
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "The destination UUID."
+ },
+ "build_pack": {
+ "type": "string",
+ "enum": [
+ "nixpacks",
+ "static",
+ "dockerfile",
+ "dockercompose"
+ ],
+ "description": "The build pack type."
+ },
+ "name": {
+ "type": "string",
+ "description": "The application name."
+ },
+ "description": {
+ "type": "string",
+ "description": "The application description."
+ },
+ "domains": {
+ "type": "string",
+ "description": "The application domains."
+ },
+ "git_commit_sha": {
+ "type": "string",
+ "description": "The git commit SHA."
+ },
+ "docker_registry_image_name": {
+ "type": "string",
+ "description": "The docker registry image name."
+ },
+ "docker_registry_image_tag": {
+ "type": "string",
+ "description": "The docker registry image tag."
+ },
+ "is_static": {
+ "type": "boolean",
+ "description": "The flag to indicate if the application is static."
+ },
+ "static_image": {
+ "type": "string",
+ "enum": [
+ "nginx:alpine"
+ ],
+ "description": "The static image."
+ },
+ "install_command": {
+ "type": "string",
+ "description": "The install command."
+ },
+ "build_command": {
+ "type": "string",
+ "description": "The build command."
+ },
+ "start_command": {
+ "type": "string",
+ "description": "The start command."
+ },
+ "ports_mappings": {
+ "type": "string",
+ "description": "The ports mappings."
+ },
+ "base_directory": {
+ "type": "string",
+ "description": "The base directory for all commands."
+ },
+ "publish_directory": {
+ "type": "string",
+ "description": "The publish directory."
+ },
+ "health_check_enabled": {
+ "type": "boolean",
+ "description": "Health check enabled."
+ },
+ "health_check_path": {
+ "type": "string",
+ "description": "Health check path."
+ },
+ "health_check_port": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check port."
+ },
+ "health_check_host": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check host."
+ },
+ "health_check_method": {
+ "type": "string",
+ "description": "Health check method."
+ },
+ "health_check_return_code": {
+ "type": "integer",
+ "description": "Health check return code."
+ },
+ "health_check_scheme": {
+ "type": "string",
+ "description": "Health check scheme."
+ },
+ "health_check_response_text": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check response text."
+ },
+ "health_check_interval": {
+ "type": "integer",
+ "description": "Health check interval in seconds."
+ },
+ "health_check_timeout": {
+ "type": "integer",
+ "description": "Health check timeout in seconds."
+ },
+ "health_check_retries": {
+ "type": "integer",
+ "description": "Health check retries count."
+ },
+ "health_check_start_period": {
+ "type": "integer",
+ "description": "Health check start period in seconds."
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit."
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit."
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness."
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation."
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit."
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "nullable": true,
+ "description": "CPU set."
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares."
+ },
+ "custom_labels": {
+ "type": "string",
+ "description": "Custom labels."
+ },
+ "custom_docker_run_options": {
+ "type": "string",
+ "description": "Custom docker run options."
+ },
+ "post_deployment_command": {
+ "type": "string",
+ "description": "Post deployment command."
+ },
+ "post_deployment_command_container": {
+ "type": "string",
+ "description": "Post deployment command container."
+ },
+ "pre_deployment_command": {
+ "type": "string",
+ "description": "Pre deployment command."
+ },
+ "pre_deployment_command_container": {
+ "type": "string",
+ "description": "Pre deployment command container."
+ },
+ "manual_webhook_secret_github": {
+ "type": "string",
+ "description": "Manual webhook secret for Github."
+ },
+ "manual_webhook_secret_gitlab": {
+ "type": "string",
+ "description": "Manual webhook secret for Gitlab."
+ },
+ "manual_webhook_secret_bitbucket": {
+ "type": "string",
+ "description": "Manual webhook secret for Bitbucket."
+ },
+ "manual_webhook_secret_gitea": {
+ "type": "string",
+ "description": "Manual webhook secret for Gitea."
+ },
+ "redirect": {
+ "type": "string",
+ "nullable": true,
+ "description": "How to set redirect with Traefik \/ Caddy. www<->non-www.",
+ "enum": [
+ "www",
+ "non-www",
+ "both"
+ ]
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "description": "The flag to indicate if the application should be deployed instantly."
+ },
+ "dockerfile": {
+ "type": "string",
+ "description": "The Dockerfile content."
+ },
+ "docker_compose_location": {
+ "type": "string",
+ "description": "The Docker Compose location."
+ },
+ "docker_compose_raw": {
+ "type": "string",
+ "description": "The Docker Compose raw content."
+ },
+ "docker_compose_custom_start_command": {
+ "type": "string",
+ "description": "The Docker Compose custom start command."
+ },
+ "docker_compose_custom_build_command": {
+ "type": "string",
+ "description": "The Docker Compose custom build command."
+ },
+ "docker_compose_domains": {
+ "type": "array",
+ "description": "The Docker Compose domains."
+ },
+ "watch_paths": {
+ "type": "string",
+ "description": "The watch paths."
+ },
+ "use_build_server": {
+ "type": "boolean",
+ "nullable": true,
+ "description": "Use build server."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Application created successfully."
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/applications\/private-deploy-key": {
+ "post": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Create (Private - Deploy Key)",
+ "description": "Create new application based on a private repository through a Deploy Key.",
+ "operationId": "create-private-deploy-key-application",
+ "requestBody": {
+ "description": "Application object that needs to be created.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "project_uuid",
+ "server_uuid",
+ "environment_name",
+ "private_key_uuid",
+ "git_repository",
+ "git_branch",
+ "build_pack",
+ "ports_exposes"
+ ],
+ "properties": {
+ "project_uuid": {
+ "type": "string",
+ "description": "The project UUID."
+ },
+ "server_uuid": {
+ "type": "string",
+ "description": "The server UUID."
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "The environment name."
+ },
+ "private_key_uuid": {
+ "type": "string",
+ "description": "The private key UUID."
+ },
+ "git_repository": {
+ "type": "string",
+ "description": "The git repository URL."
+ },
+ "git_branch": {
+ "type": "string",
+ "description": "The git branch."
+ },
+ "ports_exposes": {
+ "type": "string",
+ "description": "The ports to expose."
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "The destination UUID."
+ },
+ "build_pack": {
+ "type": "string",
+ "enum": [
+ "nixpacks",
+ "static",
+ "dockerfile",
+ "dockercompose"
+ ],
+ "description": "The build pack type."
+ },
+ "name": {
+ "type": "string",
+ "description": "The application name."
+ },
+ "description": {
+ "type": "string",
+ "description": "The application description."
+ },
+ "domains": {
+ "type": "string",
+ "description": "The application domains."
+ },
+ "git_commit_sha": {
+ "type": "string",
+ "description": "The git commit SHA."
+ },
+ "docker_registry_image_name": {
+ "type": "string",
+ "description": "The docker registry image name."
+ },
+ "docker_registry_image_tag": {
+ "type": "string",
+ "description": "The docker registry image tag."
+ },
+ "is_static": {
+ "type": "boolean",
+ "description": "The flag to indicate if the application is static."
+ },
+ "static_image": {
+ "type": "string",
+ "enum": [
+ "nginx:alpine"
+ ],
+ "description": "The static image."
+ },
+ "install_command": {
+ "type": "string",
+ "description": "The install command."
+ },
+ "build_command": {
+ "type": "string",
+ "description": "The build command."
+ },
+ "start_command": {
+ "type": "string",
+ "description": "The start command."
+ },
+ "ports_mappings": {
+ "type": "string",
+ "description": "The ports mappings."
+ },
+ "base_directory": {
+ "type": "string",
+ "description": "The base directory for all commands."
+ },
+ "publish_directory": {
+ "type": "string",
+ "description": "The publish directory."
+ },
+ "health_check_enabled": {
+ "type": "boolean",
+ "description": "Health check enabled."
+ },
+ "health_check_path": {
+ "type": "string",
+ "description": "Health check path."
+ },
+ "health_check_port": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check port."
+ },
+ "health_check_host": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check host."
+ },
+ "health_check_method": {
+ "type": "string",
+ "description": "Health check method."
+ },
+ "health_check_return_code": {
+ "type": "integer",
+ "description": "Health check return code."
+ },
+ "health_check_scheme": {
+ "type": "string",
+ "description": "Health check scheme."
+ },
+ "health_check_response_text": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check response text."
+ },
+ "health_check_interval": {
+ "type": "integer",
+ "description": "Health check interval in seconds."
+ },
+ "health_check_timeout": {
+ "type": "integer",
+ "description": "Health check timeout in seconds."
+ },
+ "health_check_retries": {
+ "type": "integer",
+ "description": "Health check retries count."
+ },
+ "health_check_start_period": {
+ "type": "integer",
+ "description": "Health check start period in seconds."
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit."
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit."
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness."
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation."
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit."
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "nullable": true,
+ "description": "CPU set."
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares."
+ },
+ "custom_labels": {
+ "type": "string",
+ "description": "Custom labels."
+ },
+ "custom_docker_run_options": {
+ "type": "string",
+ "description": "Custom docker run options."
+ },
+ "post_deployment_command": {
+ "type": "string",
+ "description": "Post deployment command."
+ },
+ "post_deployment_command_container": {
+ "type": "string",
+ "description": "Post deployment command container."
+ },
+ "pre_deployment_command": {
+ "type": "string",
+ "description": "Pre deployment command."
+ },
+ "pre_deployment_command_container": {
+ "type": "string",
+ "description": "Pre deployment command container."
+ },
+ "manual_webhook_secret_github": {
+ "type": "string",
+ "description": "Manual webhook secret for Github."
+ },
+ "manual_webhook_secret_gitlab": {
+ "type": "string",
+ "description": "Manual webhook secret for Gitlab."
+ },
+ "manual_webhook_secret_bitbucket": {
+ "type": "string",
+ "description": "Manual webhook secret for Bitbucket."
+ },
+ "manual_webhook_secret_gitea": {
+ "type": "string",
+ "description": "Manual webhook secret for Gitea."
+ },
+ "redirect": {
+ "type": "string",
+ "nullable": true,
+ "description": "How to set redirect with Traefik \/ Caddy. www<->non-www.",
+ "enum": [
+ "www",
+ "non-www",
+ "both"
+ ]
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "description": "The flag to indicate if the application should be deployed instantly."
+ },
+ "dockerfile": {
+ "type": "string",
+ "description": "The Dockerfile content."
+ },
+ "docker_compose_location": {
+ "type": "string",
+ "description": "The Docker Compose location."
+ },
+ "docker_compose_raw": {
+ "type": "string",
+ "description": "The Docker Compose raw content."
+ },
+ "docker_compose_custom_start_command": {
+ "type": "string",
+ "description": "The Docker Compose custom start command."
+ },
+ "docker_compose_custom_build_command": {
+ "type": "string",
+ "description": "The Docker Compose custom build command."
+ },
+ "docker_compose_domains": {
+ "type": "array",
+ "description": "The Docker Compose domains."
+ },
+ "watch_paths": {
+ "type": "string",
+ "description": "The watch paths."
+ },
+ "use_build_server": {
+ "type": "boolean",
+ "nullable": true,
+ "description": "Use build server."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Application created successfully."
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/applications\/dockerfile": {
+ "post": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Create (Dockerfile)",
+ "description": "Create new application based on a simple Dockerfile.",
+ "operationId": "create-dockerfile-application",
+ "requestBody": {
+ "description": "Application object that needs to be created.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "project_uuid",
+ "server_uuid",
+ "environment_name",
+ "dockerfile"
+ ],
+ "properties": {
+ "project_uuid": {
+ "type": "string",
+ "description": "The project UUID."
+ },
+ "server_uuid": {
+ "type": "string",
+ "description": "The server UUID."
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "The environment name."
+ },
+ "dockerfile": {
+ "type": "string",
+ "description": "The Dockerfile content."
+ },
+ "build_pack": {
+ "type": "string",
+ "enum": [
+ "nixpacks",
+ "static",
+ "dockerfile",
+ "dockercompose"
+ ],
+ "description": "The build pack type."
+ },
+ "ports_exposes": {
+ "type": "string",
+ "description": "The ports to expose."
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "The destination UUID."
+ },
+ "name": {
+ "type": "string",
+ "description": "The application name."
+ },
+ "description": {
+ "type": "string",
+ "description": "The application description."
+ },
+ "domains": {
+ "type": "string",
+ "description": "The application domains."
+ },
+ "docker_registry_image_name": {
+ "type": "string",
+ "description": "The docker registry image name."
+ },
+ "docker_registry_image_tag": {
+ "type": "string",
+ "description": "The docker registry image tag."
+ },
+ "ports_mappings": {
+ "type": "string",
+ "description": "The ports mappings."
+ },
+ "base_directory": {
+ "type": "string",
+ "description": "The base directory for all commands."
+ },
+ "health_check_enabled": {
+ "type": "boolean",
+ "description": "Health check enabled."
+ },
+ "health_check_path": {
+ "type": "string",
+ "description": "Health check path."
+ },
+ "health_check_port": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check port."
+ },
+ "health_check_host": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check host."
+ },
+ "health_check_method": {
+ "type": "string",
+ "description": "Health check method."
+ },
+ "health_check_return_code": {
+ "type": "integer",
+ "description": "Health check return code."
+ },
+ "health_check_scheme": {
+ "type": "string",
+ "description": "Health check scheme."
+ },
+ "health_check_response_text": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check response text."
+ },
+ "health_check_interval": {
+ "type": "integer",
+ "description": "Health check interval in seconds."
+ },
+ "health_check_timeout": {
+ "type": "integer",
+ "description": "Health check timeout in seconds."
+ },
+ "health_check_retries": {
+ "type": "integer",
+ "description": "Health check retries count."
+ },
+ "health_check_start_period": {
+ "type": "integer",
+ "description": "Health check start period in seconds."
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit."
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit."
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness."
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation."
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit."
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "nullable": true,
+ "description": "CPU set."
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares."
+ },
+ "custom_labels": {
+ "type": "string",
+ "description": "Custom labels."
+ },
+ "custom_docker_run_options": {
+ "type": "string",
+ "description": "Custom docker run options."
+ },
+ "post_deployment_command": {
+ "type": "string",
+ "description": "Post deployment command."
+ },
+ "post_deployment_command_container": {
+ "type": "string",
+ "description": "Post deployment command container."
+ },
+ "pre_deployment_command": {
+ "type": "string",
+ "description": "Pre deployment command."
+ },
+ "pre_deployment_command_container": {
+ "type": "string",
+ "description": "Pre deployment command container."
+ },
+ "manual_webhook_secret_github": {
+ "type": "string",
+ "description": "Manual webhook secret for Github."
+ },
+ "manual_webhook_secret_gitlab": {
+ "type": "string",
+ "description": "Manual webhook secret for Gitlab."
+ },
+ "manual_webhook_secret_bitbucket": {
+ "type": "string",
+ "description": "Manual webhook secret for Bitbucket."
+ },
+ "manual_webhook_secret_gitea": {
+ "type": "string",
+ "description": "Manual webhook secret for Gitea."
+ },
+ "redirect": {
+ "type": "string",
+ "nullable": true,
+ "description": "How to set redirect with Traefik \/ Caddy. www<->non-www.",
+ "enum": [
+ "www",
+ "non-www",
+ "both"
+ ]
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "description": "The flag to indicate if the application should be deployed instantly."
+ },
+ "use_build_server": {
+ "type": "boolean",
+ "nullable": true,
+ "description": "Use build server."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Application created successfully."
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/applications\/dockerimage": {
+ "post": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Create (Docker Image)",
+ "description": "Create new application based on a prebuilt docker image",
+ "operationId": "create-dockerimage-application",
+ "requestBody": {
+ "description": "Application object that needs to be created.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "project_uuid",
+ "server_uuid",
+ "environment_name",
+ "docker_registry_image_name",
+ "ports_exposes"
+ ],
+ "properties": {
+ "project_uuid": {
+ "type": "string",
+ "description": "The project UUID."
+ },
+ "server_uuid": {
+ "type": "string",
+ "description": "The server UUID."
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "The environment name."
+ },
+ "docker_registry_image_name": {
+ "type": "string",
+ "description": "The docker registry image name."
+ },
+ "docker_registry_image_tag": {
+ "type": "string",
+ "description": "The docker registry image tag."
+ },
+ "ports_exposes": {
+ "type": "string",
+ "description": "The ports to expose."
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "The destination UUID."
+ },
+ "name": {
+ "type": "string",
+ "description": "The application name."
+ },
+ "description": {
+ "type": "string",
+ "description": "The application description."
+ },
+ "domains": {
+ "type": "string",
+ "description": "The application domains."
+ },
+ "ports_mappings": {
+ "type": "string",
+ "description": "The ports mappings."
+ },
+ "health_check_enabled": {
+ "type": "boolean",
+ "description": "Health check enabled."
+ },
+ "health_check_path": {
+ "type": "string",
+ "description": "Health check path."
+ },
+ "health_check_port": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check port."
+ },
+ "health_check_host": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check host."
+ },
+ "health_check_method": {
+ "type": "string",
+ "description": "Health check method."
+ },
+ "health_check_return_code": {
+ "type": "integer",
+ "description": "Health check return code."
+ },
+ "health_check_scheme": {
+ "type": "string",
+ "description": "Health check scheme."
+ },
+ "health_check_response_text": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check response text."
+ },
+ "health_check_interval": {
+ "type": "integer",
+ "description": "Health check interval in seconds."
+ },
+ "health_check_timeout": {
+ "type": "integer",
+ "description": "Health check timeout in seconds."
+ },
+ "health_check_retries": {
+ "type": "integer",
+ "description": "Health check retries count."
+ },
+ "health_check_start_period": {
+ "type": "integer",
+ "description": "Health check start period in seconds."
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit."
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit."
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness."
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation."
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit."
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "nullable": true,
+ "description": "CPU set."
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares."
+ },
+ "custom_labels": {
+ "type": "string",
+ "description": "Custom labels."
+ },
+ "custom_docker_run_options": {
+ "type": "string",
+ "description": "Custom docker run options."
+ },
+ "post_deployment_command": {
+ "type": "string",
+ "description": "Post deployment command."
+ },
+ "post_deployment_command_container": {
+ "type": "string",
+ "description": "Post deployment command container."
+ },
+ "pre_deployment_command": {
+ "type": "string",
+ "description": "Pre deployment command."
+ },
+ "pre_deployment_command_container": {
+ "type": "string",
+ "description": "Pre deployment command container."
+ },
+ "manual_webhook_secret_github": {
+ "type": "string",
+ "description": "Manual webhook secret for Github."
+ },
+ "manual_webhook_secret_gitlab": {
+ "type": "string",
+ "description": "Manual webhook secret for Gitlab."
+ },
+ "manual_webhook_secret_bitbucket": {
+ "type": "string",
+ "description": "Manual webhook secret for Bitbucket."
+ },
+ "manual_webhook_secret_gitea": {
+ "type": "string",
+ "description": "Manual webhook secret for Gitea."
+ },
+ "redirect": {
+ "type": "string",
+ "nullable": true,
+ "description": "How to set redirect with Traefik \/ Caddy. www<->non-www.",
+ "enum": [
+ "www",
+ "non-www",
+ "both"
+ ]
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "description": "The flag to indicate if the application should be deployed instantly."
+ },
+ "use_build_server": {
+ "type": "boolean",
+ "nullable": true,
+ "description": "Use build server."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Application created successfully."
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/applications\/dockercompose": {
+ "post": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Create (Docker Compose)",
+ "description": "Create new application based on a docker-compose file.",
+ "operationId": "create-dockercompose-application",
+ "requestBody": {
+ "description": "Application object that needs to be created.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "project_uuid",
+ "server_uuid",
+ "environment_name",
+ "docker_compose_raw"
+ ],
+ "properties": {
+ "project_uuid": {
+ "type": "string",
+ "description": "The project UUID."
+ },
+ "server_uuid": {
+ "type": "string",
+ "description": "The server UUID."
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "The environment name."
+ },
+ "docker_compose_raw": {
+ "type": "string",
+ "description": "The Docker Compose raw content."
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "The destination UUID if the server has more than one destinations."
+ },
+ "name": {
+ "type": "string",
+ "description": "The application name."
+ },
+ "description": {
+ "type": "string",
+ "description": "The application description."
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "description": "The flag to indicate if the application should be deployed instantly."
+ },
+ "use_build_server": {
+ "type": "boolean",
+ "nullable": true,
+ "description": "Use build server."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Application created successfully."
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/applications\/{uuid}": {
+ "get": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Get",
+ "description": "Get application by UUID.",
+ "operationId": "get-application-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the application.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Get application by UUID.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "$ref": "#\/components\/schemas\/Application"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "delete": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Delete",
+ "description": "Delete application by UUID.",
+ "operationId": "delete-application-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the application.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ },
+ {
+ "name": "delete_configurations",
+ "in": "query",
+ "description": "Delete configurations.",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ },
+ {
+ "name": "delete_volumes",
+ "in": "query",
+ "description": "Delete volumes.",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ },
+ {
+ "name": "docker_cleanup",
+ "in": "query",
+ "description": "Run docker cleanup.",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ },
+ {
+ "name": "delete_connected_networks",
+ "in": "query",
+ "description": "Delete connected networks.",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Application deleted.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Application deleted."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "patch": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Update",
+ "description": "Update application by UUID.",
+ "operationId": "update-application-by-uuid",
+ "requestBody": {
+ "description": "Application updated.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "project_uuid": {
+ "type": "string",
+ "description": "The project UUID."
+ },
+ "server_uuid": {
+ "type": "string",
+ "description": "The server UUID."
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "The environment name."
+ },
+ "github_app_uuid": {
+ "type": "string",
+ "description": "The Github App UUID."
+ },
+ "git_repository": {
+ "type": "string",
+ "description": "The git repository URL."
+ },
+ "git_branch": {
+ "type": "string",
+ "description": "The git branch."
+ },
+ "ports_exposes": {
+ "type": "string",
+ "description": "The ports to expose."
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "The destination UUID."
+ },
+ "build_pack": {
+ "type": "string",
+ "enum": [
+ "nixpacks",
+ "static",
+ "dockerfile",
+ "dockercompose"
+ ],
+ "description": "The build pack type."
+ },
+ "name": {
+ "type": "string",
+ "description": "The application name."
+ },
+ "description": {
+ "type": "string",
+ "description": "The application description."
+ },
+ "domains": {
+ "type": "string",
+ "description": "The application domains."
+ },
+ "git_commit_sha": {
+ "type": "string",
+ "description": "The git commit SHA."
+ },
+ "docker_registry_image_name": {
+ "type": "string",
+ "description": "The docker registry image name."
+ },
+ "docker_registry_image_tag": {
+ "type": "string",
+ "description": "The docker registry image tag."
+ },
+ "is_static": {
+ "type": "boolean",
+ "description": "The flag to indicate if the application is static."
+ },
+ "install_command": {
+ "type": "string",
+ "description": "The install command."
+ },
+ "build_command": {
+ "type": "string",
+ "description": "The build command."
+ },
+ "start_command": {
+ "type": "string",
+ "description": "The start command."
+ },
+ "ports_mappings": {
+ "type": "string",
+ "description": "The ports mappings."
+ },
+ "base_directory": {
+ "type": "string",
+ "description": "The base directory for all commands."
+ },
+ "publish_directory": {
+ "type": "string",
+ "description": "The publish directory."
+ },
+ "health_check_enabled": {
+ "type": "boolean",
+ "description": "Health check enabled."
+ },
+ "health_check_path": {
+ "type": "string",
+ "description": "Health check path."
+ },
+ "health_check_port": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check port."
+ },
+ "health_check_host": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check host."
+ },
+ "health_check_method": {
+ "type": "string",
+ "description": "Health check method."
+ },
+ "health_check_return_code": {
+ "type": "integer",
+ "description": "Health check return code."
+ },
+ "health_check_scheme": {
+ "type": "string",
+ "description": "Health check scheme."
+ },
+ "health_check_response_text": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check response text."
+ },
+ "health_check_interval": {
+ "type": "integer",
+ "description": "Health check interval in seconds."
+ },
+ "health_check_timeout": {
+ "type": "integer",
+ "description": "Health check timeout in seconds."
+ },
+ "health_check_retries": {
+ "type": "integer",
+ "description": "Health check retries count."
+ },
+ "health_check_start_period": {
+ "type": "integer",
+ "description": "Health check start period in seconds."
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit."
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit."
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness."
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation."
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit."
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "nullable": true,
+ "description": "CPU set."
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares."
+ },
+ "custom_labels": {
+ "type": "string",
+ "description": "Custom labels."
+ },
+ "custom_docker_run_options": {
+ "type": "string",
+ "description": "Custom docker run options."
+ },
+ "post_deployment_command": {
+ "type": "string",
+ "description": "Post deployment command."
+ },
+ "post_deployment_command_container": {
+ "type": "string",
+ "description": "Post deployment command container."
+ },
+ "pre_deployment_command": {
+ "type": "string",
+ "description": "Pre deployment command."
+ },
+ "pre_deployment_command_container": {
+ "type": "string",
+ "description": "Pre deployment command container."
+ },
+ "manual_webhook_secret_github": {
+ "type": "string",
+ "description": "Manual webhook secret for Github."
+ },
+ "manual_webhook_secret_gitlab": {
+ "type": "string",
+ "description": "Manual webhook secret for Gitlab."
+ },
+ "manual_webhook_secret_bitbucket": {
+ "type": "string",
+ "description": "Manual webhook secret for Bitbucket."
+ },
+ "manual_webhook_secret_gitea": {
+ "type": "string",
+ "description": "Manual webhook secret for Gitea."
+ },
+ "redirect": {
+ "type": "string",
+ "nullable": true,
+ "description": "How to set redirect with Traefik \/ Caddy. www<->non-www.",
+ "enum": [
+ "www",
+ "non-www",
+ "both"
+ ]
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "description": "The flag to indicate if the application should be deployed instantly."
+ },
+ "dockerfile": {
+ "type": "string",
+ "description": "The Dockerfile content."
+ },
+ "docker_compose_location": {
+ "type": "string",
+ "description": "The Docker Compose location."
+ },
+ "docker_compose_raw": {
+ "type": "string",
+ "description": "The Docker Compose raw content."
+ },
+ "docker_compose_custom_start_command": {
+ "type": "string",
+ "description": "The Docker Compose custom start command."
+ },
+ "docker_compose_custom_build_command": {
+ "type": "string",
+ "description": "The Docker Compose custom build command."
+ },
+ "docker_compose_domains": {
+ "type": "array",
+ "description": "The Docker Compose domains."
+ },
+ "watch_paths": {
+ "type": "string",
+ "description": "The watch paths."
+ },
+ "use_build_server": {
+ "type": "boolean",
+ "nullable": true,
+ "description": "Use build server."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Application updated.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "uuid": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/applications\/{uuid}\/envs": {
+ "get": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "List Envs",
+ "description": "List all envs by application UUID.",
+ "operationId": "list-envs-by-application-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the application.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "All environment variables by application UUID.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#\/components\/schemas\/EnvironmentVariable"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Create Env",
+ "description": "Create env by application UUID.",
+ "operationId": "create-env-by-application-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the application.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "Env created.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "key": {
+ "type": "string",
+ "description": "The key of the environment variable."
+ },
+ "value": {
+ "type": "string",
+ "description": "The value of the environment variable."
+ },
+ "is_preview": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is used in preview deployments."
+ },
+ "is_build_time": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is used in build time."
+ },
+ "is_literal": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is a literal, nothing espaced."
+ },
+ "is_multiline": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is multiline."
+ },
+ "is_shown_once": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable's value is shown on the UI."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "Environment variable created.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "example": "nc0k04gk8g0cgsk440g0koko"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "patch": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Update Env",
+ "description": "Update env by application UUID.",
+ "operationId": "update-env-by-application-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the application.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "Env updated.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "key",
+ "value"
+ ],
+ "properties": {
+ "key": {
+ "type": "string",
+ "description": "The key of the environment variable."
+ },
+ "value": {
+ "type": "string",
+ "description": "The value of the environment variable."
+ },
+ "is_preview": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is used in preview deployments."
+ },
+ "is_build_time": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is used in build time."
+ },
+ "is_literal": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is a literal, nothing espaced."
+ },
+ "is_multiline": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is multiline."
+ },
+ "is_shown_once": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable's value is shown on the UI."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "Environment variable updated.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Environment variable updated."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/applications\/{uuid}\/envs\/bulk": {
+ "patch": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Update Envs (Bulk)",
+ "description": "Update multiple envs by application UUID.",
+ "operationId": "update-envs-by-application-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the application.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "Bulk envs updated.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "data"
+ ],
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "properties": {
+ "key": {
+ "type": "string",
+ "description": "The key of the environment variable."
+ },
+ "value": {
+ "type": "string",
+ "description": "The value of the environment variable."
+ },
+ "is_preview": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is used in preview deployments."
+ },
+ "is_build_time": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is used in build time."
+ },
+ "is_literal": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is a literal, nothing espaced."
+ },
+ "is_multiline": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is multiline."
+ },
+ "is_shown_once": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable's value is shown on the UI."
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "Environment variables updated.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Environment variables updated."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/applications\/{uuid}\/envs\/{env_uuid}": {
+ "delete": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Delete Env",
+ "description": "Delete env by UUID.",
+ "operationId": "delete-env-by-application-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the application.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ },
+ {
+ "name": "env_uuid",
+ "in": "path",
+ "description": "UUID of the environment variable.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Environment variable deleted.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Environment variable deleted."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/applications\/{uuid}\/start": {
+ "get": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Start",
+ "description": "Start application. `Post` request is also accepted.",
+ "operationId": "start-application-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the application.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ },
+ {
+ "name": "force",
+ "in": "query",
+ "description": "Force rebuild.",
+ "schema": {
+ "type": "boolean",
+ "default": false
+ }
+ },
+ {
+ "name": "instant_deploy",
+ "in": "query",
+ "description": "Instant deploy (skip queuing).",
+ "schema": {
+ "type": "boolean",
+ "default": false
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Start application.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Deployment request queued.",
+ "description": "Message."
+ },
+ "deployment_uuid": {
+ "type": "string",
+ "example": "doogksw",
+ "description": "UUID of the deployment."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/applications\/{uuid}\/stop": {
+ "get": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Stop",
+ "description": "Stop application. `Post` request is also accepted.",
+ "operationId": "stop-application-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the application.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Stop application.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Application stopping request queued."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/applications\/{uuid}\/restart": {
+ "get": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Restart",
+ "description": "Restart application. `Post` request is also accepted.",
+ "operationId": "restart-application-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the application.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Restart application.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Restart request queued."
+ },
+ "deployment_uuid": {
+ "type": "string",
+ "example": "doogksw",
+ "description": "UUID of the deployment."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/applications\/{uuid}\/execute": {
+ "post": {
+ "tags": [
+ "Applications"
+ ],
+ "summary": "Execute Command",
+ "description": "Execute a command on the application's current container.",
+ "operationId": "execute-command-application",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the application.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "Command to execute.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "command": {
+ "type": "string",
+ "description": "Command to execute."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Execute a command on the application's current container.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Command executed."
+ },
+ "response": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/databases": {
+ "get": {
+ "tags": [
+ "Databases"
+ ],
+ "summary": "List",
+ "description": "List all databases.",
+ "operationId": "list-databases",
+ "responses": {
+ "200": {
+ "description": "Get all databases",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "string"
+ },
+ "example": "Content is very complex. Will be implemented later."
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/databases\/{uuid}": {
+ "get": {
+ "tags": [
+ "Databases"
+ ],
+ "summary": "Get",
+ "description": "Get database by UUID.",
+ "operationId": "get-database-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the database.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Get all databases",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "string"
+ },
+ "example": "Content is very complex. Will be implemented later."
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "delete": {
+ "tags": [
+ "Databases"
+ ],
+ "summary": "Delete",
+ "description": "Delete database by UUID.",
+ "operationId": "delete-database-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the database.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ },
+ {
+ "name": "delete_configurations",
+ "in": "query",
+ "description": "Delete configurations.",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ },
+ {
+ "name": "delete_volumes",
+ "in": "query",
+ "description": "Delete volumes.",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ },
+ {
+ "name": "docker_cleanup",
+ "in": "query",
+ "description": "Run docker cleanup.",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ },
+ {
+ "name": "delete_connected_networks",
+ "in": "query",
+ "description": "Delete connected networks.",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Database deleted.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Database deleted."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "patch": {
+ "tags": [
+ "Databases"
+ ],
+ "summary": "Update",
+ "description": "Update database by UUID.",
+ "operationId": "update-database-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the database.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "Database data",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the database"
+ },
+ "description": {
+ "type": "string",
+ "description": "Description of the database"
+ },
+ "image": {
+ "type": "string",
+ "description": "Docker Image of the database"
+ },
+ "is_public": {
+ "type": "boolean",
+ "description": "Is the database public?"
+ },
+ "public_port": {
+ "type": "integer",
+ "description": "Public port of the database"
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit of the database"
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit of the database"
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness of the database"
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation of the database"
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit of the database"
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "description": "CPU set of the database"
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares of the database"
+ },
+ "postgres_user": {
+ "type": "string",
+ "description": "PostgreSQL user"
+ },
+ "postgres_password": {
+ "type": "string",
+ "description": "PostgreSQL password"
+ },
+ "postgres_db": {
+ "type": "string",
+ "description": "PostgreSQL database"
+ },
+ "postgres_initdb_args": {
+ "type": "string",
+ "description": "PostgreSQL initdb args"
+ },
+ "postgres_host_auth_method": {
+ "type": "string",
+ "description": "PostgreSQL host auth method"
+ },
+ "postgres_conf": {
+ "type": "string",
+ "description": "PostgreSQL conf"
+ },
+ "clickhouse_admin_user": {
+ "type": "string",
+ "description": "Clickhouse admin user"
+ },
+ "clickhouse_admin_password": {
+ "type": "string",
+ "description": "Clickhouse admin password"
+ },
+ "dragonfly_password": {
+ "type": "string",
+ "description": "DragonFly password"
+ },
+ "redis_password": {
+ "type": "string",
+ "description": "Redis password"
+ },
+ "redis_conf": {
+ "type": "string",
+ "description": "Redis conf"
+ },
+ "keydb_password": {
+ "type": "string",
+ "description": "KeyDB password"
+ },
+ "keydb_conf": {
+ "type": "string",
+ "description": "KeyDB conf"
+ },
+ "mariadb_conf": {
+ "type": "string",
+ "description": "MariaDB conf"
+ },
+ "mariadb_root_password": {
+ "type": "string",
+ "description": "MariaDB root password"
+ },
+ "mariadb_user": {
+ "type": "string",
+ "description": "MariaDB user"
+ },
+ "mariadb_password": {
+ "type": "string",
+ "description": "MariaDB password"
+ },
+ "mariadb_database": {
+ "type": "string",
+ "description": "MariaDB database"
+ },
+ "mongo_conf": {
+ "type": "string",
+ "description": "Mongo conf"
+ },
+ "mongo_initdb_root_username": {
+ "type": "string",
+ "description": "Mongo initdb root username"
+ },
+ "mongo_initdb_root_password": {
+ "type": "string",
+ "description": "Mongo initdb root password"
+ },
+ "mongo_initdb_init_database": {
+ "type": "string",
+ "description": "Mongo initdb init database"
+ },
+ "mysql_root_password": {
+ "type": "string",
+ "description": "MySQL root password"
+ },
+ "mysql_user": {
+ "type": "string",
+ "description": "MySQL user"
+ },
+ "mysql_database": {
+ "type": "string",
+ "description": "MySQL database"
+ },
+ "mysql_conf": {
+ "type": "string",
+ "description": "MySQL conf"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Database updated"
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/databases\/postgresql": {
+ "post": {
+ "tags": [
+ "Databases"
+ ],
+ "summary": "Create (PostgreSQL)",
+ "description": "Create a new PostgreSQL database.",
+ "operationId": "create-database-postgresql",
+ "requestBody": {
+ "description": "Database data",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "server_uuid",
+ "project_uuid",
+ "environment_name"
+ ],
+ "properties": {
+ "server_uuid": {
+ "type": "string",
+ "description": "UUID of the server"
+ },
+ "project_uuid": {
+ "type": "string",
+ "description": "UUID of the project"
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "Name of the environment"
+ },
+ "postgres_user": {
+ "type": "string",
+ "description": "PostgreSQL user"
+ },
+ "postgres_password": {
+ "type": "string",
+ "description": "PostgreSQL password"
+ },
+ "postgres_db": {
+ "type": "string",
+ "description": "PostgreSQL database"
+ },
+ "postgres_initdb_args": {
+ "type": "string",
+ "description": "PostgreSQL initdb args"
+ },
+ "postgres_host_auth_method": {
+ "type": "string",
+ "description": "PostgreSQL host auth method"
+ },
+ "postgres_conf": {
+ "type": "string",
+ "description": "PostgreSQL conf"
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "UUID of the destination if the server has multiple destinations"
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the database"
+ },
+ "description": {
+ "type": "string",
+ "description": "Description of the database"
+ },
+ "image": {
+ "type": "string",
+ "description": "Docker Image of the database"
+ },
+ "is_public": {
+ "type": "boolean",
+ "description": "Is the database public?"
+ },
+ "public_port": {
+ "type": "integer",
+ "description": "Public port of the database"
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit of the database"
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit of the database"
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness of the database"
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation of the database"
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit of the database"
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "description": "CPU set of the database"
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares of the database"
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "description": "Instant deploy the database"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Database updated"
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/databases\/clickhouse": {
+ "post": {
+ "tags": [
+ "Databases"
+ ],
+ "summary": "Create (Clickhouse)",
+ "description": "Create a new Clickhouse database.",
+ "operationId": "create-database-clickhouse",
+ "requestBody": {
+ "description": "Database data",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "server_uuid",
+ "project_uuid",
+ "environment_name"
+ ],
+ "properties": {
+ "server_uuid": {
+ "type": "string",
+ "description": "UUID of the server"
+ },
+ "project_uuid": {
+ "type": "string",
+ "description": "UUID of the project"
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "Name of the environment"
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "UUID of the destination if the server has multiple destinations"
+ },
+ "clickhouse_admin_user": {
+ "type": "string",
+ "description": "Clickhouse admin user"
+ },
+ "clickhouse_admin_password": {
+ "type": "string",
+ "description": "Clickhouse admin password"
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the database"
+ },
+ "description": {
+ "type": "string",
+ "description": "Description of the database"
+ },
+ "image": {
+ "type": "string",
+ "description": "Docker Image of the database"
+ },
+ "is_public": {
+ "type": "boolean",
+ "description": "Is the database public?"
+ },
+ "public_port": {
+ "type": "integer",
+ "description": "Public port of the database"
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit of the database"
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit of the database"
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness of the database"
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation of the database"
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit of the database"
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "description": "CPU set of the database"
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares of the database"
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "description": "Instant deploy the database"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Database updated"
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/databases\/dragonfly": {
+ "post": {
+ "tags": [
+ "Databases"
+ ],
+ "summary": "Create (DragonFly)",
+ "description": "Create a new DragonFly database.",
+ "operationId": "create-database-dragonfly",
+ "requestBody": {
+ "description": "Database data",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "server_uuid",
+ "project_uuid",
+ "environment_name"
+ ],
+ "properties": {
+ "server_uuid": {
+ "type": "string",
+ "description": "UUID of the server"
+ },
+ "project_uuid": {
+ "type": "string",
+ "description": "UUID of the project"
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "Name of the environment"
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "UUID of the destination if the server has multiple destinations"
+ },
+ "dragonfly_password": {
+ "type": "string",
+ "description": "DragonFly password"
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the database"
+ },
+ "description": {
+ "type": "string",
+ "description": "Description of the database"
+ },
+ "image": {
+ "type": "string",
+ "description": "Docker Image of the database"
+ },
+ "is_public": {
+ "type": "boolean",
+ "description": "Is the database public?"
+ },
+ "public_port": {
+ "type": "integer",
+ "description": "Public port of the database"
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit of the database"
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit of the database"
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness of the database"
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation of the database"
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit of the database"
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "description": "CPU set of the database"
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares of the database"
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "description": "Instant deploy the database"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Database updated"
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/databases\/redis": {
+ "post": {
+ "tags": [
+ "Databases"
+ ],
+ "summary": "Create (Redis)",
+ "description": "Create a new Redis database.",
+ "operationId": "create-database-redis",
+ "requestBody": {
+ "description": "Database data",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "server_uuid",
+ "project_uuid",
+ "environment_name"
+ ],
+ "properties": {
+ "server_uuid": {
+ "type": "string",
+ "description": "UUID of the server"
+ },
+ "project_uuid": {
+ "type": "string",
+ "description": "UUID of the project"
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "Name of the environment"
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "UUID of the destination if the server has multiple destinations"
+ },
+ "redis_password": {
+ "type": "string",
+ "description": "Redis password"
+ },
+ "redis_conf": {
+ "type": "string",
+ "description": "Redis conf"
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the database"
+ },
+ "description": {
+ "type": "string",
+ "description": "Description of the database"
+ },
+ "image": {
+ "type": "string",
+ "description": "Docker Image of the database"
+ },
+ "is_public": {
+ "type": "boolean",
+ "description": "Is the database public?"
+ },
+ "public_port": {
+ "type": "integer",
+ "description": "Public port of the database"
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit of the database"
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit of the database"
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness of the database"
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation of the database"
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit of the database"
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "description": "CPU set of the database"
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares of the database"
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "description": "Instant deploy the database"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Database updated"
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/databases\/keydb": {
+ "post": {
+ "tags": [
+ "Databases"
+ ],
+ "summary": "Create (KeyDB)",
+ "description": "Create a new KeyDB database.",
+ "operationId": "create-database-keydb",
+ "requestBody": {
+ "description": "Database data",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "server_uuid",
+ "project_uuid",
+ "environment_name"
+ ],
+ "properties": {
+ "server_uuid": {
+ "type": "string",
+ "description": "UUID of the server"
+ },
+ "project_uuid": {
+ "type": "string",
+ "description": "UUID of the project"
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "Name of the environment"
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "UUID of the destination if the server has multiple destinations"
+ },
+ "keydb_password": {
+ "type": "string",
+ "description": "KeyDB password"
+ },
+ "keydb_conf": {
+ "type": "string",
+ "description": "KeyDB conf"
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the database"
+ },
+ "description": {
+ "type": "string",
+ "description": "Description of the database"
+ },
+ "image": {
+ "type": "string",
+ "description": "Docker Image of the database"
+ },
+ "is_public": {
+ "type": "boolean",
+ "description": "Is the database public?"
+ },
+ "public_port": {
+ "type": "integer",
+ "description": "Public port of the database"
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit of the database"
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit of the database"
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness of the database"
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation of the database"
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit of the database"
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "description": "CPU set of the database"
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares of the database"
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "description": "Instant deploy the database"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Database updated"
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/databases\/mariadb": {
+ "post": {
+ "tags": [
+ "Databases"
+ ],
+ "summary": "Create (MariaDB)",
+ "description": "Create a new MariaDB database.",
+ "operationId": "create-database-mariadb",
+ "requestBody": {
+ "description": "Database data",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "server_uuid",
+ "project_uuid",
+ "environment_name"
+ ],
+ "properties": {
+ "server_uuid": {
+ "type": "string",
+ "description": "UUID of the server"
+ },
+ "project_uuid": {
+ "type": "string",
+ "description": "UUID of the project"
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "Name of the environment"
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "UUID of the destination if the server has multiple destinations"
+ },
+ "mariadb_conf": {
+ "type": "string",
+ "description": "MariaDB conf"
+ },
+ "mariadb_root_password": {
+ "type": "string",
+ "description": "MariaDB root password"
+ },
+ "mariadb_user": {
+ "type": "string",
+ "description": "MariaDB user"
+ },
+ "mariadb_password": {
+ "type": "string",
+ "description": "MariaDB password"
+ },
+ "mariadb_database": {
+ "type": "string",
+ "description": "MariaDB database"
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the database"
+ },
+ "description": {
+ "type": "string",
+ "description": "Description of the database"
+ },
+ "image": {
+ "type": "string",
+ "description": "Docker Image of the database"
+ },
+ "is_public": {
+ "type": "boolean",
+ "description": "Is the database public?"
+ },
+ "public_port": {
+ "type": "integer",
+ "description": "Public port of the database"
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit of the database"
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit of the database"
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness of the database"
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation of the database"
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit of the database"
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "description": "CPU set of the database"
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares of the database"
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "description": "Instant deploy the database"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Database updated"
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/databases\/mysql": {
+ "post": {
+ "tags": [
+ "Databases"
+ ],
+ "summary": "Create (MySQL)",
+ "description": "Create a new MySQL database.",
+ "operationId": "create-database-mysql",
+ "requestBody": {
+ "description": "Database data",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "server_uuid",
+ "project_uuid",
+ "environment_name"
+ ],
+ "properties": {
+ "server_uuid": {
+ "type": "string",
+ "description": "UUID of the server"
+ },
+ "project_uuid": {
+ "type": "string",
+ "description": "UUID of the project"
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "Name of the environment"
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "UUID of the destination if the server has multiple destinations"
+ },
+ "mysql_root_password": {
+ "type": "string",
+ "description": "MySQL root password"
+ },
+ "mysql_user": {
+ "type": "string",
+ "description": "MySQL user"
+ },
+ "mysql_database": {
+ "type": "string",
+ "description": "MySQL database"
+ },
+ "mysql_conf": {
+ "type": "string",
+ "description": "MySQL conf"
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the database"
+ },
+ "description": {
+ "type": "string",
+ "description": "Description of the database"
+ },
+ "image": {
+ "type": "string",
+ "description": "Docker Image of the database"
+ },
+ "is_public": {
+ "type": "boolean",
+ "description": "Is the database public?"
+ },
+ "public_port": {
+ "type": "integer",
+ "description": "Public port of the database"
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit of the database"
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit of the database"
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness of the database"
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation of the database"
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit of the database"
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "description": "CPU set of the database"
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares of the database"
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "description": "Instant deploy the database"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Database updated"
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/databases\/mongodb": {
+ "post": {
+ "tags": [
+ "Databases"
+ ],
+ "summary": "Create (MongoDB)",
+ "description": "Create a new MongoDB database.",
+ "operationId": "create-database-mongodb",
+ "requestBody": {
+ "description": "Database data",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "server_uuid",
+ "project_uuid",
+ "environment_name"
+ ],
+ "properties": {
+ "server_uuid": {
+ "type": "string",
+ "description": "UUID of the server"
+ },
+ "project_uuid": {
+ "type": "string",
+ "description": "UUID of the project"
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "Name of the environment"
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "UUID of the destination if the server has multiple destinations"
+ },
+ "mongo_conf": {
+ "type": "string",
+ "description": "MongoDB conf"
+ },
+ "mongo_initdb_root_username": {
+ "type": "string",
+ "description": "MongoDB initdb root username"
+ },
+ "name": {
+ "type": "string",
+ "description": "Name of the database"
+ },
+ "description": {
+ "type": "string",
+ "description": "Description of the database"
+ },
+ "image": {
+ "type": "string",
+ "description": "Docker Image of the database"
+ },
+ "is_public": {
+ "type": "boolean",
+ "description": "Is the database public?"
+ },
+ "public_port": {
+ "type": "integer",
+ "description": "Public port of the database"
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit of the database"
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit of the database"
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness of the database"
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation of the database"
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit of the database"
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "description": "CPU set of the database"
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares of the database"
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "description": "Instant deploy the database"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "200": {
+ "description": "Database updated"
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/databases\/{uuid}\/start": {
+ "get": {
+ "tags": [
+ "Databases"
+ ],
+ "summary": "Start",
+ "description": "Start database. `Post` request is also accepted.",
+ "operationId": "start-database-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the database.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Start database.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Database starting request queued."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/databases\/{uuid}\/stop": {
+ "get": {
+ "tags": [
+ "Databases"
+ ],
+ "summary": "Stop",
+ "description": "Stop database. `Post` request is also accepted.",
+ "operationId": "stop-database-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the database.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Stop database.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Database stopping request queued."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/databases\/{uuid}\/restart": {
+ "get": {
+ "tags": [
+ "Databases"
+ ],
+ "summary": "Restart",
+ "description": "Restart database. `Post` request is also accepted.",
+ "operationId": "restart-database-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the database.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Restart database.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Database restaring request queued."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/deployments": {
+ "get": {
+ "tags": [
+ "Deployments"
+ ],
+ "summary": "List",
+ "description": "List currently running deployments",
+ "operationId": "list-deployments",
+ "responses": {
+ "200": {
+ "description": "Get all currently running deployments.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#\/components\/schemas\/ApplicationDeploymentQueue"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/deployments\/{uuid}": {
+ "get": {
+ "tags": [
+ "Deployments"
+ ],
+ "summary": "Get",
+ "description": "Get deployment by UUID.",
+ "operationId": "get-deployment-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "Deployment UUID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Get deployment by UUID.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "$ref": "#\/components\/schemas\/ApplicationDeploymentQueue"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/deploy": {
+ "get": {
+ "tags": [
+ "Deployments"
+ ],
+ "summary": "Deploy",
+ "description": "Deploy by tag or uuid. `Post` request also accepted.",
+ "operationId": "deploy-by-tag-or-uuid",
+ "parameters": [
+ {
+ "name": "tag",
+ "in": "query",
+ "description": "Tag name(s). Comma separated list is also accepted.",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "uuid",
+ "in": "query",
+ "description": "Resource UUID(s). Comma separated list is also accepted.",
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "force",
+ "in": "query",
+ "description": "Force rebuild (without cache)",
+ "schema": {
+ "type": "boolean"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Get deployment(s) UUID's",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "deployments": {
+ "type": "array",
+ "items": {
+ "properties": {
+ "message": {
+ "type": "string"
+ },
+ "resource_uuid": {
+ "type": "string"
+ },
+ "deployment_uuid": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/version": {
+ "get": {
+ "summary": "Version",
+ "description": "Get Coolify version.",
+ "operationId": "version",
+ "responses": {
+ "200": {
+ "description": "Returns the version of the application",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "string"
+ },
+ "example": "v4.0.0"
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/enable": {
+ "get": {
+ "summary": "Enable API",
+ "description": "Enable API (only with root permissions).",
+ "operationId": "enable-api",
+ "responses": {
+ "200": {
+ "description": "Enable API.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "API enabled."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "You are not allowed to enable the API.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "You are not allowed to enable the API."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/disable": {
+ "get": {
+ "summary": "Disable API",
+ "description": "Disable API (only with root permissions).",
+ "operationId": "disable-api",
+ "responses": {
+ "200": {
+ "description": "Disable API.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "API disabled."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "You are not allowed to disable the API.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "You are not allowed to disable the API."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/health": {
+ "get": {
+ "summary": "Healthcheck",
+ "description": "Healthcheck endpoint.",
+ "operationId": "healthcheck",
+ "responses": {
+ "200": {
+ "description": "Healthcheck endpoint.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "string"
+ },
+ "example": "OK"
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ }
+ }
+ },
+ "\/projects": {
+ "get": {
+ "tags": [
+ "Projects"
+ ],
+ "summary": "List",
+ "description": "List projects.",
+ "operationId": "list-projects",
+ "responses": {
+ "200": {
+ "description": "Get all projects.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#\/components\/schemas\/Project"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "Projects"
+ ],
+ "summary": "Create",
+ "description": "Create Project.",
+ "operationId": "create-project",
+ "requestBody": {
+ "description": "Project created.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the project."
+ },
+ "description": {
+ "type": "string",
+ "description": "The description of the project."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "Project created.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "example": "og888os",
+ "description": "The UUID of the project."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/projects\/{uuid}": {
+ "get": {
+ "tags": [
+ "Projects"
+ ],
+ "summary": "Get",
+ "description": "Get project by UUID.",
+ "operationId": "get-project-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "Project UUID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Project details",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "$ref": "#\/components\/schemas\/Project"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "description": "Project not found."
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "delete": {
+ "tags": [
+ "Projects"
+ ],
+ "summary": "Delete",
+ "description": "Delete project by UUID.",
+ "operationId": "delete-project-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the application.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Project deleted.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Project deleted."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "patch": {
+ "tags": [
+ "Projects"
+ ],
+ "summary": "Update",
+ "description": "Update Project.",
+ "operationId": "update-project-by-uuid",
+ "requestBody": {
+ "description": "Project updated.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the project."
+ },
+ "description": {
+ "type": "string",
+ "description": "The description of the project."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "Project updated.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "example": "og888os"
+ },
+ "name": {
+ "type": "string",
+ "example": "Project Name"
+ },
+ "description": {
+ "type": "string",
+ "example": "Project Description"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/projects\/{uuid}\/{environment_name}": {
+ "get": {
+ "tags": [
+ "Projects"
+ ],
+ "summary": "Environment",
+ "description": "Get environment by name.",
+ "operationId": "get-environment-by-name",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "Project UUID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "environment_name",
+ "in": "path",
+ "description": "Environment name",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Environment details",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "$ref": "#\/components\/schemas\/Environment"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/resources": {
+ "get": {
+ "tags": [
+ "Resources"
+ ],
+ "summary": "List",
+ "description": "Get all resources.",
+ "operationId": "list-resources",
+ "responses": {
+ "200": {
+ "description": "Get all resources",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "string"
+ },
+ "example": "Content is very complex. Will be implemented later."
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/security\/keys": {
+ "get": {
+ "tags": [
+ "Private Keys"
+ ],
+ "summary": "List",
+ "description": "List all private keys.",
+ "operationId": "list-private-keys",
+ "responses": {
+ "200": {
+ "description": "Get all private keys.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#\/components\/schemas\/PrivateKey"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "Private Keys"
+ ],
+ "summary": "Create",
+ "description": "Create a new private key.",
+ "operationId": "create-private-key",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "private_key"
+ ],
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "private_key": {
+ "type": "string"
+ }
+ },
+ "type": "object",
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "The created private key's UUID.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "uuid": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "patch": {
+ "tags": [
+ "Private Keys"
+ ],
+ "summary": "Update",
+ "description": "Update a private key.",
+ "operationId": "update-private-key",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "private_key"
+ ],
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "private_key": {
+ "type": "string"
+ }
+ },
+ "type": "object",
+ "additionalProperties": false
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "The updated private key's UUID.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "uuid": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/security\/keys\/{uuid}": {
+ "get": {
+ "tags": [
+ "Private Keys"
+ ],
+ "summary": "Get",
+ "description": "Get key by UUID.",
+ "operationId": "get-private-key-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "Private Key UUID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Get all private keys.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "$ref": "#\/components\/schemas\/PrivateKey"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "description": "Private Key not found."
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "delete": {
+ "tags": [
+ "Private Keys"
+ ],
+ "summary": "Delete",
+ "description": "Delete a private key.",
+ "operationId": "delete-private-key-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "Private Key UUID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Private Key deleted.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Private Key deleted."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "description": "Private Key not found."
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/servers": {
+ "get": {
+ "tags": [
+ "Servers"
+ ],
+ "summary": "List",
+ "description": "List all servers.",
+ "operationId": "list-servers",
+ "responses": {
+ "200": {
+ "description": "Get all servers.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#\/components\/schemas\/Server"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "Servers"
+ ],
+ "summary": "Create",
+ "description": "Create Server.",
+ "operationId": "create-server",
+ "requestBody": {
+ "description": "Server created.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "example": "My Server",
+ "description": "The name of the server."
+ },
+ "description": {
+ "type": "string",
+ "example": "My Server Description",
+ "description": "The description of the server."
+ },
+ "ip": {
+ "type": "string",
+ "example": "127.0.0.1",
+ "description": "The IP of the server."
+ },
+ "port": {
+ "type": "integer",
+ "example": 22,
+ "description": "The port of the server."
+ },
+ "user": {
+ "type": "string",
+ "example": "root",
+ "description": "The user of the server."
+ },
+ "private_key_uuid": {
+ "type": "string",
+ "example": "og888os",
+ "description": "The UUID of the private key."
+ },
+ "is_build_server": {
+ "type": "boolean",
+ "example": false,
+ "description": "Is build server."
+ },
+ "instant_validate": {
+ "type": "boolean",
+ "example": false,
+ "description": "Instant validate."
+ },
+ "proxy_type": {
+ "type": "string",
+ "enum": [
+ "traefik",
+ "caddy",
+ "none"
+ ],
+ "example": "traefik",
+ "description": "The proxy type."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "Server created.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "example": "og888os",
+ "description": "The UUID of the server."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/servers\/{uuid}": {
+ "get": {
+ "tags": [
+ "Servers"
+ ],
+ "summary": "Get",
+ "description": "Get server by UUID.",
+ "operationId": "get-server-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "Server's UUID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Get server by UUID",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "$ref": "#\/components\/schemas\/Server"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "delete": {
+ "tags": [
+ "Servers"
+ ],
+ "summary": "Delete",
+ "description": "Delete server by UUID.",
+ "operationId": "delete-server-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the server.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Server deleted.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Server deleted."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "patch": {
+ "tags": [
+ "Servers"
+ ],
+ "summary": "Update",
+ "description": "Update Server.",
+ "operationId": "update-server-by-uuid",
+ "requestBody": {
+ "description": "Server updated.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the server."
+ },
+ "description": {
+ "type": "string",
+ "description": "The description of the server."
+ },
+ "ip": {
+ "type": "string",
+ "description": "The IP of the server."
+ },
+ "port": {
+ "type": "integer",
+ "description": "The port of the server."
+ },
+ "user": {
+ "type": "string",
+ "description": "The user of the server."
+ },
+ "private_key_uuid": {
+ "type": "string",
+ "description": "The UUID of the private key."
+ },
+ "is_build_server": {
+ "type": "boolean",
+ "description": "Is build server."
+ },
+ "instant_validate": {
+ "type": "boolean",
+ "description": "Instant validate."
+ },
+ "proxy_type": {
+ "type": "string",
+ "enum": [
+ "traefik",
+ "caddy",
+ "none"
+ ],
+ "description": "The proxy type."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "Server updated.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#\/components\/schemas\/Server"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/servers\/{uuid}\/resources": {
+ "get": {
+ "tags": [
+ "Servers"
+ ],
+ "summary": "Resources",
+ "description": "Get resources by server.",
+ "operationId": "get-resources-by-server-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "Server's UUID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Get resources by server",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "uuid": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "updated_at": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/servers\/{uuid}\/domains": {
+ "get": {
+ "tags": [
+ "Servers"
+ ],
+ "summary": "Domains",
+ "description": "Get domains by server.",
+ "operationId": "get-domains-by-server-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "Server's UUID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Get domains by server",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "properties": {
+ "ip": {
+ "type": "string"
+ },
+ "domains": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/servers\/{uuid}\/validate": {
+ "get": {
+ "tags": [
+ "Servers"
+ ],
+ "summary": "Validate",
+ "description": "Validate server by UUID.",
+ "operationId": "validate-server-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "Server UUID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "201": {
+ "description": "Server validation started.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Validation started."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/services": {
+ "get": {
+ "tags": [
+ "Services"
+ ],
+ "summary": "List",
+ "description": "List all services.",
+ "operationId": "list-services",
+ "responses": {
+ "200": {
+ "description": "Get all services",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#\/components\/schemas\/Service"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "Services"
+ ],
+ "summary": "Create",
+ "description": "Create a one-click service",
+ "operationId": "create-service",
+ "requestBody": {
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "server_uuid",
+ "project_uuid",
+ "environment_name",
+ "type"
+ ],
+ "properties": {
+ "type": {
+ "description": "The one-click service type",
+ "type": "string",
+ "enum": [
+ "activepieces",
+ "appsmith",
+ "appwrite",
+ "authentik",
+ "babybuddy",
+ "budge",
+ "changedetection",
+ "chatwoot",
+ "classicpress-with-mariadb",
+ "classicpress-with-mysql",
+ "classicpress-without-database",
+ "cloudflared",
+ "code-server",
+ "dashboard",
+ "directus",
+ "directus-with-postgresql",
+ "docker-registry",
+ "docuseal",
+ "docuseal-with-postgres",
+ "dokuwiki",
+ "duplicati",
+ "emby",
+ "embystat",
+ "fider",
+ "filebrowser",
+ "firefly",
+ "formbricks",
+ "ghost",
+ "gitea",
+ "gitea-with-mariadb",
+ "gitea-with-mysql",
+ "gitea-with-postgresql",
+ "glance",
+ "glances",
+ "glitchtip",
+ "grafana",
+ "grafana-with-postgresql",
+ "grocy",
+ "heimdall",
+ "homepage",
+ "jellyfin",
+ "kuzzle",
+ "listmonk",
+ "logto",
+ "mediawiki",
+ "meilisearch",
+ "metabase",
+ "metube",
+ "minio",
+ "moodle",
+ "n8n",
+ "n8n-with-postgresql",
+ "next-image-transformation",
+ "nextcloud",
+ "nocodb",
+ "odoo",
+ "openblocks",
+ "pairdrop",
+ "penpot",
+ "phpmyadmin",
+ "pocketbase",
+ "posthog",
+ "reactive-resume",
+ "rocketchat",
+ "shlink",
+ "slash",
+ "snapdrop",
+ "statusnook",
+ "stirling-pdf",
+ "supabase",
+ "syncthing",
+ "tolgee",
+ "trigger",
+ "trigger-with-external-database",
+ "twenty",
+ "umami",
+ "unleash-with-postgresql",
+ "unleash-without-database",
+ "uptime-kuma",
+ "vaultwarden",
+ "vikunja",
+ "weblate",
+ "whoogle",
+ "wordpress-with-mariadb",
+ "wordpress-with-mysql",
+ "wordpress-without-database"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "maxLength": 255,
+ "description": "Name of the service."
+ },
+ "description": {
+ "type": "string",
+ "nullable": true,
+ "description": "Description of the service."
+ },
+ "project_uuid": {
+ "type": "string",
+ "description": "Project UUID."
+ },
+ "environment_name": {
+ "type": "string",
+ "description": "Environment name."
+ },
+ "server_uuid": {
+ "type": "string",
+ "description": "Server UUID."
+ },
+ "destination_uuid": {
+ "type": "string",
+ "description": "Destination UUID. Required if server has multiple destinations."
+ },
+ "instant_deploy": {
+ "type": "boolean",
+ "default": false,
+ "description": "Start the service immediately after creation."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "Create a service.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "description": "Service UUID."
+ },
+ "domains": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Service domains."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/services\/{uuid}": {
+ "get": {
+ "tags": [
+ "Services"
+ ],
+ "summary": "Get",
+ "description": "Get service by UUID.",
+ "operationId": "get-service-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "Service UUID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Get a service by UUID.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "$ref": "#\/components\/schemas\/Service"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "delete": {
+ "tags": [
+ "Services"
+ ],
+ "summary": "Delete",
+ "description": "Delete service by UUID.",
+ "operationId": "delete-service-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "Service UUID",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "delete_configurations",
+ "in": "query",
+ "description": "Delete configurations.",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ },
+ {
+ "name": "delete_volumes",
+ "in": "query",
+ "description": "Delete volumes.",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ },
+ {
+ "name": "docker_cleanup",
+ "in": "query",
+ "description": "Run docker cleanup.",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ },
+ {
+ "name": "delete_connected_networks",
+ "in": "query",
+ "description": "Delete connected networks.",
+ "required": false,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Delete a service by UUID",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Service deletion request queued."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/services\/{uuid}\/envs": {
+ "get": {
+ "tags": [
+ "Services"
+ ],
+ "summary": "List Envs",
+ "description": "List all envs by service UUID.",
+ "operationId": "list-envs-by-service-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the service.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "All environment variables by service UUID.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#\/components\/schemas\/EnvironmentVariable"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "Services"
+ ],
+ "summary": "Create Env",
+ "description": "Create env by service UUID.",
+ "operationId": "create-env-by-service-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the service.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "Env created.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "key": {
+ "type": "string",
+ "description": "The key of the environment variable."
+ },
+ "value": {
+ "type": "string",
+ "description": "The value of the environment variable."
+ },
+ "is_preview": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is used in preview deployments."
+ },
+ "is_build_time": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is used in build time."
+ },
+ "is_literal": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is a literal, nothing espaced."
+ },
+ "is_multiline": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is multiline."
+ },
+ "is_shown_once": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable's value is shown on the UI."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "Environment variable created.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "uuid": {
+ "type": "string",
+ "example": "nc0k04gk8g0cgsk440g0koko"
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ },
+ "patch": {
+ "tags": [
+ "Services"
+ ],
+ "summary": "Update Env",
+ "description": "Update env by service UUID.",
+ "operationId": "update-env-by-service-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the service.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "Env updated.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "key",
+ "value"
+ ],
+ "properties": {
+ "key": {
+ "type": "string",
+ "description": "The key of the environment variable."
+ },
+ "value": {
+ "type": "string",
+ "description": "The value of the environment variable."
+ },
+ "is_preview": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is used in preview deployments."
+ },
+ "is_build_time": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is used in build time."
+ },
+ "is_literal": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is a literal, nothing espaced."
+ },
+ "is_multiline": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is multiline."
+ },
+ "is_shown_once": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable's value is shown on the UI."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "Environment variable updated.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Environment variable updated."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/services\/{uuid}\/envs\/bulk": {
+ "patch": {
+ "tags": [
+ "Services"
+ ],
+ "summary": "Update Envs (Bulk)",
+ "description": "Update multiple envs by service UUID.",
+ "operationId": "update-envs-by-service-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the service.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "Bulk envs updated.",
+ "required": true,
+ "content": {
+ "application\/json": {
+ "schema": {
+ "required": [
+ "data"
+ ],
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "properties": {
+ "key": {
+ "type": "string",
+ "description": "The key of the environment variable."
+ },
+ "value": {
+ "type": "string",
+ "description": "The value of the environment variable."
+ },
+ "is_preview": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is used in preview deployments."
+ },
+ "is_build_time": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is used in build time."
+ },
+ "is_literal": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is a literal, nothing espaced."
+ },
+ "is_multiline": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable is multiline."
+ },
+ "is_shown_once": {
+ "type": "boolean",
+ "description": "The flag to indicate if the environment variable's value is shown on the UI."
+ }
+ },
+ "type": "object"
+ }
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "responses": {
+ "201": {
+ "description": "Environment variables updated.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Environment variables updated."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/services\/{uuid}\/envs\/{env_uuid}": {
+ "delete": {
+ "tags": [
+ "Services"
+ ],
+ "summary": "Delete Env",
+ "description": "Delete env by UUID.",
+ "operationId": "delete-env-by-service-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the service.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ },
+ {
+ "name": "env_uuid",
+ "in": "path",
+ "description": "UUID of the environment variable.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Environment variable deleted.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Environment variable deleted."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/services\/{uuid}\/start": {
+ "get": {
+ "tags": [
+ "Services"
+ ],
+ "summary": "Start",
+ "description": "Start service. `Post` request is also accepted.",
+ "operationId": "start-service-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the service.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Start service.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Service starting request queued."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/services\/{uuid}\/stop": {
+ "get": {
+ "tags": [
+ "Services"
+ ],
+ "summary": "Stop",
+ "description": "Stop service. `Post` request is also accepted.",
+ "operationId": "stop-service-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the service.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Stop service.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Service stopping request queued."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/services\/{uuid}\/restart": {
+ "get": {
+ "tags": [
+ "Services"
+ ],
+ "summary": "Restart",
+ "description": "Restart service. `Post` request is also accepted.",
+ "operationId": "restart-service-by-uuid",
+ "parameters": [
+ {
+ "name": "uuid",
+ "in": "path",
+ "description": "UUID of the service.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uuid"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Restart service.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Service restaring request queued."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/teams": {
+ "get": {
+ "tags": [
+ "Teams"
+ ],
+ "summary": "List",
+ "description": "Get all teams.",
+ "operationId": "list-teams",
+ "responses": {
+ "200": {
+ "description": "List of teams.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#\/components\/schemas\/Team"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/teams\/{id}": {
+ "get": {
+ "tags": [
+ "Teams"
+ ],
+ "summary": "Get",
+ "description": "Get team by TeamId.",
+ "operationId": "get-team-by-id",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "Team ID",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "List of teams.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "$ref": "#\/components\/schemas\/Team"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/teams\/{id}\/members": {
+ "get": {
+ "tags": [
+ "Teams"
+ ],
+ "summary": "Members",
+ "description": "Get members by TeamId.",
+ "operationId": "get-members-by-team-id",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "Team ID",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "List of members.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#\/components\/schemas\/User"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ },
+ "404": {
+ "$ref": "#\/components\/responses\/404"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/teams\/current": {
+ "get": {
+ "tags": [
+ "Teams"
+ ],
+ "summary": "Authenticated Team",
+ "description": "Get currently authenticated team.",
+ "operationId": "get-current-team",
+ "responses": {
+ "200": {
+ "description": "Current Team.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "$ref": "#\/components\/schemas\/Team"
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ },
+ "\/teams\/current\/members": {
+ "get": {
+ "tags": [
+ "Teams"
+ ],
+ "summary": "Authenticated Team Members",
+ "description": "Get currently authenticated team members.",
+ "operationId": "get-current-team-members",
+ "responses": {
+ "200": {
+ "description": "Currently authenticated team members.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#\/components\/schemas\/User"
+ }
+ }
+ }
+ }
+ },
+ "401": {
+ "$ref": "#\/components\/responses\/401"
+ },
+ "400": {
+ "$ref": "#\/components\/responses\/400"
+ }
+ },
+ "security": [
+ {
+ "bearerAuth": []
+ }
+ ]
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "Application": {
+ "description": "Application model",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "The application identifier in the database."
+ },
+ "description": {
+ "type": "string",
+ "nullable": true,
+ "description": "The application description."
+ },
+ "repository_project_id": {
+ "type": "integer",
+ "nullable": true,
+ "description": "The repository project identifier."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "The application UUID."
+ },
+ "name": {
+ "type": "string",
+ "description": "The application name."
+ },
+ "fqdn": {
+ "type": "string",
+ "nullable": true,
+ "description": "The application domains."
+ },
+ "config_hash": {
+ "type": "string",
+ "description": "Configuration hash."
+ },
+ "git_repository": {
+ "type": "string",
+ "description": "Git repository URL."
+ },
+ "git_branch": {
+ "type": "string",
+ "description": "Git branch."
+ },
+ "git_commit_sha": {
+ "type": "string",
+ "description": "Git commit SHA."
+ },
+ "git_full_url": {
+ "type": "string",
+ "nullable": true,
+ "description": "Git full URL."
+ },
+ "docker_registry_image_name": {
+ "type": "string",
+ "nullable": true,
+ "description": "Docker registry image name."
+ },
+ "docker_registry_image_tag": {
+ "type": "string",
+ "nullable": true,
+ "description": "Docker registry image tag."
+ },
+ "build_pack": {
+ "type": "string",
+ "description": "Build pack.",
+ "enum": [
+ "nixpacks",
+ "static",
+ "dockerfile",
+ "dockercompose"
+ ]
+ },
+ "static_image": {
+ "type": "string",
+ "description": "Static image used when static site is deployed."
+ },
+ "install_command": {
+ "type": "string",
+ "description": "Install command."
+ },
+ "build_command": {
+ "type": "string",
+ "description": "Build command."
+ },
+ "start_command": {
+ "type": "string",
+ "description": "Start command."
+ },
+ "ports_exposes": {
+ "type": "string",
+ "description": "Ports exposes."
+ },
+ "ports_mappings": {
+ "type": "string",
+ "nullable": true,
+ "description": "Ports mappings."
+ },
+ "base_directory": {
+ "type": "string",
+ "description": "Base directory for all commands."
+ },
+ "publish_directory": {
+ "type": "string",
+ "description": "Publish directory."
+ },
+ "health_check_enabled": {
+ "type": "boolean",
+ "description": "Health check enabled."
+ },
+ "health_check_path": {
+ "type": "string",
+ "description": "Health check path."
+ },
+ "health_check_port": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check port."
+ },
+ "health_check_host": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check host."
+ },
+ "health_check_method": {
+ "type": "string",
+ "description": "Health check method."
+ },
+ "health_check_return_code": {
+ "type": "integer",
+ "description": "Health check return code."
+ },
+ "health_check_scheme": {
+ "type": "string",
+ "description": "Health check scheme."
+ },
+ "health_check_response_text": {
+ "type": "string",
+ "nullable": true,
+ "description": "Health check response text."
+ },
+ "health_check_interval": {
+ "type": "integer",
+ "description": "Health check interval in seconds."
+ },
+ "health_check_timeout": {
+ "type": "integer",
+ "description": "Health check timeout in seconds."
+ },
+ "health_check_retries": {
+ "type": "integer",
+ "description": "Health check retries count."
+ },
+ "health_check_start_period": {
+ "type": "integer",
+ "description": "Health check start period in seconds."
+ },
+ "limits_memory": {
+ "type": "string",
+ "description": "Memory limit."
+ },
+ "limits_memory_swap": {
+ "type": "string",
+ "description": "Memory swap limit."
+ },
+ "limits_memory_swappiness": {
+ "type": "integer",
+ "description": "Memory swappiness."
+ },
+ "limits_memory_reservation": {
+ "type": "string",
+ "description": "Memory reservation."
+ },
+ "limits_cpus": {
+ "type": "string",
+ "description": "CPU limit."
+ },
+ "limits_cpuset": {
+ "type": "string",
+ "nullable": true,
+ "description": "CPU set."
+ },
+ "limits_cpu_shares": {
+ "type": "integer",
+ "description": "CPU shares."
+ },
+ "status": {
+ "type": "string",
+ "description": "Application status."
+ },
+ "preview_url_template": {
+ "type": "string",
+ "description": "Preview URL template."
+ },
+ "destination_type": {
+ "type": "string",
+ "description": "Destination type."
+ },
+ "destination_id": {
+ "type": "integer",
+ "description": "Destination identifier."
+ },
+ "source_id": {
+ "type": "integer",
+ "nullable": true,
+ "description": "Source identifier."
+ },
+ "private_key_id": {
+ "type": "integer",
+ "nullable": true,
+ "description": "Private key identifier."
+ },
+ "environment_id": {
+ "type": "integer",
+ "description": "Environment identifier."
+ },
+ "dockerfile": {
+ "type": "string",
+ "nullable": true,
+ "description": "Dockerfile content. Used for dockerfile build pack."
+ },
+ "dockerfile_location": {
+ "type": "string",
+ "description": "Dockerfile location."
+ },
+ "custom_labels": {
+ "type": "string",
+ "nullable": true,
+ "description": "Custom labels."
+ },
+ "dockerfile_target_build": {
+ "type": "string",
+ "nullable": true,
+ "description": "Dockerfile target build."
+ },
+ "manual_webhook_secret_github": {
+ "type": "string",
+ "nullable": true,
+ "description": "Manual webhook secret for GitHub."
+ },
+ "manual_webhook_secret_gitlab": {
+ "type": "string",
+ "nullable": true,
+ "description": "Manual webhook secret for GitLab."
+ },
+ "manual_webhook_secret_bitbucket": {
+ "type": "string",
+ "nullable": true,
+ "description": "Manual webhook secret for Bitbucket."
+ },
+ "manual_webhook_secret_gitea": {
+ "type": "string",
+ "nullable": true,
+ "description": "Manual webhook secret for Gitea."
+ },
+ "docker_compose_location": {
+ "type": "string",
+ "description": "Docker compose location."
+ },
+ "docker_compose": {
+ "type": "string",
+ "nullable": true,
+ "description": "Docker compose content. Used for docker compose build pack."
+ },
+ "docker_compose_raw": {
+ "type": "string",
+ "nullable": true,
+ "description": "Docker compose raw content."
+ },
+ "docker_compose_domains": {
+ "type": "string",
+ "nullable": true,
+ "description": "Docker compose domains."
+ },
+ "docker_compose_custom_start_command": {
+ "type": "string",
+ "nullable": true,
+ "description": "Docker compose custom start command."
+ },
+ "docker_compose_custom_build_command": {
+ "type": "string",
+ "nullable": true,
+ "description": "Docker compose custom build command."
+ },
+ "swarm_replicas": {
+ "type": "integer",
+ "nullable": true,
+ "description": "Swarm replicas. Only used for swarm deployments."
+ },
+ "swarm_placement_constraints": {
+ "type": "string",
+ "nullable": true,
+ "description": "Swarm placement constraints. Only used for swarm deployments."
+ },
+ "custom_docker_run_options": {
+ "type": "string",
+ "nullable": true,
+ "description": "Custom docker run options."
+ },
+ "post_deployment_command": {
+ "type": "string",
+ "nullable": true,
+ "description": "Post deployment command."
+ },
+ "post_deployment_command_container": {
+ "type": "string",
+ "nullable": true,
+ "description": "Post deployment command container."
+ },
+ "pre_deployment_command": {
+ "type": "string",
+ "nullable": true,
+ "description": "Pre deployment command."
+ },
+ "pre_deployment_command_container": {
+ "type": "string",
+ "nullable": true,
+ "description": "Pre deployment command container."
+ },
+ "watch_paths": {
+ "type": "string",
+ "nullable": true,
+ "description": "Watch paths."
+ },
+ "custom_healthcheck_found": {
+ "type": "boolean",
+ "description": "Custom healthcheck found."
+ },
+ "redirect": {
+ "type": "string",
+ "nullable": true,
+ "description": "How to set redirect with Traefik \/ Caddy. www<->non-www.",
+ "enum": [
+ "www",
+ "non-www",
+ "both"
+ ]
+ },
+ "created_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "The date and time when the application was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "format": "date-time",
+ "description": "The date and time when the application was last updated."
+ },
+ "deleted_at": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true,
+ "description": "The date and time when the application was deleted."
+ },
+ "compose_parsing_version": {
+ "type": "string",
+ "description": "How Coolify parse the compose file."
+ },
+ "custom_nginx_configuration": {
+ "type": "string",
+ "nullable": true,
+ "description": "Custom Nginx configuration base64 encoded."
+ }
+ },
+ "type": "object"
+ },
+ "ApplicationDeploymentQueue": {
+ "description": "Project model",
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "application_id": {
+ "type": "string"
+ },
+ "deployment_uuid": {
+ "type": "string"
+ },
+ "pull_request_id": {
+ "type": "integer"
+ },
+ "force_rebuild": {
+ "type": "boolean"
+ },
+ "commit": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "is_webhook": {
+ "type": "boolean"
+ },
+ "is_api": {
+ "type": "boolean"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "updated_at": {
+ "type": "string"
+ },
+ "logs": {
+ "type": "string"
+ },
+ "current_process_id": {
+ "type": "string"
+ },
+ "restart_only": {
+ "type": "boolean"
+ },
+ "git_type": {
+ "type": "string"
+ },
+ "server_id": {
+ "type": "integer"
+ },
+ "application_name": {
+ "type": "string"
+ },
+ "server_name": {
+ "type": "string"
+ },
+ "deployment_url": {
+ "type": "string"
+ },
+ "destination_id": {
+ "type": "string"
+ },
+ "only_this_server": {
+ "type": "boolean"
+ },
+ "rollback": {
+ "type": "boolean"
+ },
+ "commit_message": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "Environment": {
+ "description": "Environment model",
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "name": {
+ "type": "string"
+ },
+ "project_id": {
+ "type": "integer"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "updated_at": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "EnvironmentVariable": {
+ "description": "Environment Variable model",
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "uuid": {
+ "type": "string"
+ },
+ "application_id": {
+ "type": "integer"
+ },
+ "service_id": {
+ "type": "integer"
+ },
+ "database_id": {
+ "type": "integer"
+ },
+ "is_build_time": {
+ "type": "boolean"
+ },
+ "is_literal": {
+ "type": "boolean"
+ },
+ "is_multiline": {
+ "type": "boolean"
+ },
+ "is_preview": {
+ "type": "boolean"
+ },
+ "is_shared": {
+ "type": "boolean"
+ },
+ "is_shown_once": {
+ "type": "boolean"
+ },
+ "key": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ },
+ "real_value": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "updated_at": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "PrivateKey": {
+ "description": "Private Key model",
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "uuid": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "private_key": {
+ "type": "string",
+ "format": "private-key"
+ },
+ "is_git_related": {
+ "type": "boolean"
+ },
+ "team_id": {
+ "type": "integer"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "updated_at": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "Project": {
+ "description": "Project model",
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "uuid": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "description": {
+ "type": "string"
+ },
+ "environments": {
+ "description": "The environments of the project.",
+ "type": "array",
+ "items": {
+ "$ref": "#\/components\/schemas\/Environment"
+ }
+ }
+ },
+ "type": "object"
+ },
+ "Server": {
+ "description": "Server model",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "The server ID."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "The server UUID."
+ },
+ "name": {
+ "type": "string",
+ "description": "The server name."
+ },
+ "description": {
+ "type": "string",
+ "description": "The server description."
+ },
+ "ip": {
+ "type": "string",
+ "description": "The IP address."
+ },
+ "user": {
+ "type": "string",
+ "description": "The user."
+ },
+ "port": {
+ "type": "integer",
+ "description": "The port number."
+ },
+ "proxy": {
+ "type": "object",
+ "description": "The proxy configuration."
+ },
+ "proxy_type": {
+ "type": "string",
+ "enum": [
+ "traefik",
+ "caddy",
+ "none"
+ ],
+ "description": "The proxy type."
+ },
+ "high_disk_usage_notification_sent": {
+ "type": "boolean",
+ "description": "The flag to indicate if the high disk usage notification has been sent."
+ },
+ "unreachable_notification_sent": {
+ "type": "boolean",
+ "description": "The flag to indicate if the unreachable notification has been sent."
+ },
+ "unreachable_count": {
+ "type": "integer",
+ "description": "The unreachable count for your server."
+ },
+ "validation_logs": {
+ "type": "string",
+ "description": "The validation logs."
+ },
+ "log_drain_notification_sent": {
+ "type": "boolean",
+ "description": "The flag to indicate if the log drain notification has been sent."
+ },
+ "swarm_cluster": {
+ "type": "string",
+ "description": "The swarm cluster configuration."
+ },
+ "delete_unused_volumes": {
+ "type": "boolean",
+ "description": "The flag to indicate if the unused volumes should be deleted."
+ },
+ "delete_unused_networks": {
+ "type": "boolean",
+ "description": "The flag to indicate if the unused networks should be deleted."
+ }
+ },
+ "type": "object"
+ },
+ "ServerSetting": {
+ "description": "Server Settings model",
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "concurrent_builds": {
+ "type": "integer"
+ },
+ "dynamic_timeout": {
+ "type": "integer"
+ },
+ "force_disabled": {
+ "type": "boolean"
+ },
+ "force_server_cleanup": {
+ "type": "boolean"
+ },
+ "is_build_server": {
+ "type": "boolean"
+ },
+ "is_cloudflare_tunnel": {
+ "type": "boolean"
+ },
+ "is_jump_server": {
+ "type": "boolean"
+ },
+ "is_logdrain_axiom_enabled": {
+ "type": "boolean"
+ },
+ "is_logdrain_custom_enabled": {
+ "type": "boolean"
+ },
+ "is_logdrain_highlight_enabled": {
+ "type": "boolean"
+ },
+ "is_logdrain_newrelic_enabled": {
+ "type": "boolean"
+ },
+ "is_metrics_enabled": {
+ "type": "boolean"
+ },
+ "is_reachable": {
+ "type": "boolean"
+ },
+ "is_sentinel_enabled": {
+ "type": "boolean"
+ },
+ "is_swarm_manager": {
+ "type": "boolean"
+ },
+ "is_swarm_worker": {
+ "type": "boolean"
+ },
+ "is_usable": {
+ "type": "boolean"
+ },
+ "logdrain_axiom_api_key": {
+ "type": "string"
+ },
+ "logdrain_axiom_dataset_name": {
+ "type": "string"
+ },
+ "logdrain_custom_config": {
+ "type": "string"
+ },
+ "logdrain_custom_config_parser": {
+ "type": "string"
+ },
+ "logdrain_highlight_project_id": {
+ "type": "string"
+ },
+ "logdrain_newrelic_base_uri": {
+ "type": "string"
+ },
+ "logdrain_newrelic_license_key": {
+ "type": "string"
+ },
+ "sentinel_metrics_history_days": {
+ "type": "integer"
+ },
+ "sentinel_metrics_refresh_rate_seconds": {
+ "type": "integer"
+ },
+ "sentinel_token": {
+ "type": "string"
+ },
+ "docker_cleanup_frequency": {
+ "type": "string"
+ },
+ "docker_cleanup_threshold": {
+ "type": "integer"
+ },
+ "server_id": {
+ "type": "integer"
+ },
+ "wildcard_domain": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "updated_at": {
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
+ "Service": {
+ "description": "Service model",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "The unique identifier of the service. Only used for database identification."
+ },
+ "uuid": {
+ "type": "string",
+ "description": "The unique identifier of the service."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the service."
+ },
+ "environment_id": {
+ "type": "integer",
+ "description": "The unique identifier of the environment where the service is attached to."
+ },
+ "server_id": {
+ "type": "integer",
+ "description": "The unique identifier of the server where the service is running."
+ },
+ "description": {
+ "type": "string",
+ "description": "The description of the service."
+ },
+ "docker_compose_raw": {
+ "type": "string",
+ "description": "The raw docker-compose.yml file of the service."
+ },
+ "docker_compose": {
+ "type": "string",
+ "description": "The docker-compose.yml file that is parsed and modified by Coolify."
+ },
+ "destination_type": {
+ "type": "string",
+ "description": "Destination type."
+ },
+ "destination_id": {
+ "type": "integer",
+ "description": "The unique identifier of the destination where the service is running."
+ },
+ "connect_to_docker_network": {
+ "type": "boolean",
+ "description": "The flag to connect the service to the predefined Docker network."
+ },
+ "is_container_label_escape_enabled": {
+ "type": "boolean",
+ "description": "The flag to enable the container label escape."
+ },
+ "is_container_label_readonly_enabled": {
+ "type": "boolean",
+ "description": "The flag to enable the container label readonly."
+ },
+ "config_hash": {
+ "type": "string",
+ "description": "The hash of the service configuration."
+ },
+ "service_type": {
+ "type": "string",
+ "description": "The type of the service."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time when the service was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time when the service was last updated."
+ },
+ "deleted_at": {
+ "type": "string",
+ "description": "The date and time when the service was deleted."
+ }
+ },
+ "type": "object"
+ },
+ "Team": {
+ "description": "Team model",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "The unique identifier of the team."
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the team."
+ },
+ "description": {
+ "type": "string",
+ "description": "The description of the team."
+ },
+ "personal_team": {
+ "type": "boolean",
+ "description": "Whether the team is personal or not."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date and time the team was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date and time the team was last updated."
+ },
+ "smtp_enabled": {
+ "type": "boolean",
+ "description": "Whether SMTP is enabled or not."
+ },
+ "smtp_from_address": {
+ "type": "string",
+ "description": "The email address to send emails from."
+ },
+ "smtp_from_name": {
+ "type": "string",
+ "description": "The name to send emails from."
+ },
+ "smtp_recipients": {
+ "type": "string",
+ "description": "The email addresses to send emails to."
+ },
+ "smtp_host": {
+ "type": "string",
+ "description": "The SMTP host."
+ },
+ "smtp_port": {
+ "type": "string",
+ "description": "The SMTP port."
+ },
+ "smtp_encryption": {
+ "type": "string",
+ "description": "The SMTP encryption."
+ },
+ "smtp_username": {
+ "type": "string",
+ "description": "The SMTP username."
+ },
+ "smtp_password": {
+ "type": "string",
+ "description": "The SMTP password."
+ },
+ "smtp_timeout": {
+ "type": "string",
+ "description": "The SMTP timeout."
+ },
+ "smtp_notifications_test": {
+ "type": "boolean",
+ "description": "Whether to send test notifications via SMTP."
+ },
+ "smtp_notifications_deployments": {
+ "type": "boolean",
+ "description": "Whether to send deployment notifications via SMTP."
+ },
+ "smtp_notifications_status_changes": {
+ "type": "boolean",
+ "description": "Whether to send status change notifications via SMTP."
+ },
+ "smtp_notifications_scheduled_tasks": {
+ "type": "boolean",
+ "description": "Whether to send scheduled task notifications via SMTP."
+ },
+ "smtp_notifications_database_backups": {
+ "type": "boolean",
+ "description": "Whether to send database backup notifications via SMTP."
+ },
+ "smtp_notifications_server_disk_usage": {
+ "type": "boolean",
+ "description": "Whether to send server disk usage notifications via SMTP."
+ },
+ "discord_enabled": {
+ "type": "boolean",
+ "description": "Whether Discord is enabled or not."
+ },
+ "discord_webhook_url": {
+ "type": "string",
+ "description": "The Discord webhook URL."
+ },
+ "discord_notifications_test": {
+ "type": "boolean",
+ "description": "Whether to send test notifications via Discord."
+ },
+ "discord_notifications_deployments": {
+ "type": "boolean",
+ "description": "Whether to send deployment notifications via Discord."
+ },
+ "discord_notifications_status_changes": {
+ "type": "boolean",
+ "description": "Whether to send status change notifications via Discord."
+ },
+ "discord_notifications_database_backups": {
+ "type": "boolean",
+ "description": "Whether to send database backup notifications via Discord."
+ },
+ "discord_notifications_scheduled_tasks": {
+ "type": "boolean",
+ "description": "Whether to send scheduled task notifications via Discord."
+ },
+ "discord_notifications_server_disk_usage": {
+ "type": "boolean",
+ "description": "Whether to send server disk usage notifications via Discord."
+ },
+ "show_boarding": {
+ "type": "boolean",
+ "description": "Whether to show the boarding screen or not."
+ },
+ "resend_enabled": {
+ "type": "boolean",
+ "description": "Whether to enable resending or not."
+ },
+ "resend_api_key": {
+ "type": "string",
+ "description": "The resending API key."
+ },
+ "use_instance_email_settings": {
+ "type": "boolean",
+ "description": "Whether to use instance email settings or not."
+ },
+ "telegram_enabled": {
+ "type": "boolean",
+ "description": "Whether Telegram is enabled or not."
+ },
+ "telegram_token": {
+ "type": "string",
+ "description": "The Telegram token."
+ },
+ "telegram_chat_id": {
+ "type": "string",
+ "description": "The Telegram chat ID."
+ },
+ "telegram_notifications_test": {
+ "type": "boolean",
+ "description": "Whether to send test notifications via Telegram."
+ },
+ "telegram_notifications_deployments": {
+ "type": "boolean",
+ "description": "Whether to send deployment notifications via Telegram."
+ },
+ "telegram_notifications_status_changes": {
+ "type": "boolean",
+ "description": "Whether to send status change notifications via Telegram."
+ },
+ "telegram_notifications_database_backups": {
+ "type": "boolean",
+ "description": "Whether to send database backup notifications via Telegram."
+ },
+ "telegram_notifications_test_message_thread_id": {
+ "type": "string",
+ "description": "The Telegram test message thread ID."
+ },
+ "telegram_notifications_deployments_message_thread_id": {
+ "type": "string",
+ "description": "The Telegram deployment message thread ID."
+ },
+ "telegram_notifications_status_changes_message_thread_id": {
+ "type": "string",
+ "description": "The Telegram status change message thread ID."
+ },
+ "telegram_notifications_database_backups_message_thread_id": {
+ "type": "string",
+ "description": "The Telegram database backup message thread ID."
+ },
+ "custom_server_limit": {
+ "type": "string",
+ "description": "The custom server limit."
+ },
+ "telegram_notifications_scheduled_tasks": {
+ "type": "boolean",
+ "description": "Whether to send scheduled task notifications via Telegram."
+ },
+ "telegram_notifications_scheduled_tasks_thread_id": {
+ "type": "string",
+ "description": "The Telegram scheduled task message thread ID."
+ },
+ "members": {
+ "description": "The members of the team.",
+ "type": "array",
+ "items": {
+ "$ref": "#\/components\/schemas\/User"
+ }
+ }
+ },
+ "type": "object"
+ },
+ "User": {
+ "description": "User model",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "description": "The user identifier in the database."
+ },
+ "name": {
+ "type": "string",
+ "description": "The user name."
+ },
+ "email": {
+ "type": "string",
+ "description": "The user email."
+ },
+ "email_verified_at": {
+ "type": "string",
+ "description": "The date when the user email was verified."
+ },
+ "created_at": {
+ "type": "string",
+ "description": "The date when the user was created."
+ },
+ "updated_at": {
+ "type": "string",
+ "description": "The date when the user was updated."
+ },
+ "two_factor_confirmed_at": {
+ "type": "string",
+ "description": "The date when the user two factor was confirmed."
+ },
+ "force_password_reset": {
+ "type": "boolean",
+ "description": "The flag to force the user to reset the password."
+ },
+ "marketing_emails": {
+ "type": "boolean",
+ "description": "The flag to receive marketing emails."
+ }
+ },
+ "type": "object"
+ }
+ },
+ "responses": {
+ "400": {
+ "description": "Invalid token.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Invalid token."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "401": {
+ "description": "Unauthenticated.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Unauthenticated."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Resource not found.",
+ "content": {
+ "application\/json": {
+ "schema": {
+ "properties": {
+ "message": {
+ "type": "string",
+ "example": "Resource not found."
+ }
+ },
+ "type": "object"
+ }
+ }
+ }
+ }
+ },
+ "securitySchemes": {
+ "bearerAuth": {
+ "type": "http",
+ "description": "Go to `Keys & Tokens` \/ `API tokens` and create a new token. Use the token as the bearer token.",
+ "scheme": "bearer"
+ }
+ }
+ },
+ "tags": [
+ {
+ "name": "Applications",
+ "description": "Applications"
+ },
+ {
+ "name": "Databases",
+ "description": "Databases"
+ },
+ {
+ "name": "Deployments",
+ "description": "Deployments"
+ },
+ {
+ "name": "Projects",
+ "description": "Projects"
+ },
+ {
+ "name": "Resources",
+ "description": "Resources"
+ },
+ {
+ "name": "Private Keys",
+ "description": "Private Keys"
+ },
+ {
+ "name": "Servers",
+ "description": "Servers"
+ },
+ {
+ "name": "Services",
+ "description": "Services"
+ },
+ {
+ "name": "Teams",
+ "description": "Teams"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/openapi.yaml b/openapi.yaml
index d2616e9c6..2b1ece41c 100644
--- a/openapi.yaml
+++ b/openapi.yaml
@@ -1,4 +1,4 @@
-openapi: 3.0.0
+openapi: 3.1.0
info:
title: Coolify
version: '0.1'
@@ -3311,7 +3311,7 @@ paths:
type: string
responses:
'200':
- description: 'Project details'
+ description: 'Environment details'
content:
application/json:
schema:
@@ -3467,9 +3467,7 @@ paths:
content:
application/json:
schema:
- type: array
- items:
- $ref: '#/components/schemas/PrivateKey'
+ $ref: '#/components/schemas/PrivateKey'
'401':
$ref: '#/components/responses/401'
'400':
@@ -3579,6 +3577,11 @@ paths:
type: boolean
example: false
description: 'Instant validate.'
+ proxy_type:
+ type: string
+ enum: [traefik, caddy, none]
+ example: traefik
+ description: 'The proxy type.'
type: object
responses:
'201':
@@ -3699,6 +3702,10 @@ paths:
instant_validate:
type: boolean
description: 'Instant validate.'
+ proxy_type:
+ type: string
+ enum: [traefik, caddy, none]
+ description: 'The proxy type.'
type: object
responses:
'201':
@@ -4759,6 +4766,10 @@ components:
compose_parsing_version:
type: string
description: 'How Coolify parse the compose file.'
+ custom_nginx_configuration:
+ type: string
+ nullable: true
+ description: 'Custom Nginx configuration base64 encoded.'
type: object
ApplicationDeploymentQueue:
description: 'Project model'
@@ -4909,36 +4920,59 @@ components:
properties:
id:
type: integer
+ description: 'The server ID.'
uuid:
type: string
+ description: 'The server UUID.'
name:
type: string
+ description: 'The server name.'
description:
type: string
+ description: 'The server description.'
ip:
type: string
+ description: 'The IP address.'
user:
type: string
+ description: 'The user.'
port:
type: integer
+ description: 'The port number.'
proxy:
type: object
+ description: 'The proxy configuration.'
+ proxy_type:
+ type: string
+ enum:
+ - traefik
+ - caddy
+ - none
+ description: 'The proxy type.'
high_disk_usage_notification_sent:
type: boolean
+ description: 'The flag to indicate if the high disk usage notification has been sent.'
unreachable_notification_sent:
type: boolean
+ description: 'The flag to indicate if the unreachable notification has been sent.'
unreachable_count:
type: integer
+ description: 'The unreachable count for your server.'
validation_logs:
type: string
+ description: 'The validation logs.'
log_drain_notification_sent:
type: boolean
+ description: 'The flag to indicate if the log drain notification has been sent.'
swarm_cluster:
type: string
+ description: 'The swarm cluster configuration.'
delete_unused_volumes:
type: boolean
+ description: 'The flag to indicate if the unused volumes should be deleted.'
delete_unused_networks:
type: boolean
+ description: 'The flag to indicate if the unused networks should be deleted.'
type: object
ServerSetting:
description: 'Server Settings model'
@@ -5136,6 +5170,9 @@ components:
smtp_notifications_database_backups:
type: boolean
description: 'Whether to send database backup notifications via SMTP.'
+ smtp_notifications_server_disk_usage:
+ type: boolean
+ description: 'Whether to send server disk usage notifications via SMTP.'
discord_enabled:
type: boolean
description: 'Whether Discord is enabled or not.'
@@ -5157,6 +5194,9 @@ components:
discord_notifications_scheduled_tasks:
type: boolean
description: 'Whether to send scheduled task notifications via Discord.'
+ discord_notifications_server_disk_usage:
+ type: boolean
+ description: 'Whether to send server disk usage notifications via Discord.'
show_boarding:
type: boolean
description: 'Whether to show the boarding screen or not.'
diff --git a/other/nightly/docker-compose.prod.yml b/other/nightly/docker-compose.prod.yml
index b15a109c3..d86b2336b 100644
--- a/other/nightly/docker-compose.prod.yml
+++ b/other/nightly/docker-compose.prod.yml
@@ -29,6 +29,7 @@ services:
- REDIS_HOST
- REDIS_PASSWORD
- HORIZON_BALANCE
+ - HORIZON_MIN_PROCESSES
- HORIZON_MAX_PROCESSES
- HORIZON_BALANCE_MAX_SHIFT
- HORIZON_BALANCE_COOLDOWN
@@ -50,29 +51,8 @@ services:
- TERMINAL_HOST
- TERMINAL_PORT
- AUTOUPDATE
- - SELF_HOSTED
- SSH_MUX_ENABLED
- SSH_MUX_PERSIST_TIME
- - FEEDBACK_DISCORD_WEBHOOK
- - WAITLIST
- - SUBSCRIPTION_PROVIDER
- - STRIPE_API_KEY
- - STRIPE_WEBHOOK_SECRET
- - STRIPE_PRICE_ID_BASIC_MONTHLY
- - STRIPE_PRICE_ID_BASIC_YEARLY
- - STRIPE_PRICE_ID_PRO_MONTHLY
- - STRIPE_PRICE_ID_PRO_YEARLY
- - STRIPE_PRICE_ID_ULTIMATE_MONTHLY
- - STRIPE_PRICE_ID_ULTIMATE_YEARLY
- - STRIPE_PRICE_ID_DYNAMIC_MONTHLY
- - STRIPE_PRICE_ID_DYNAMIC_YEARLY
- - STRIPE_PRICE_ID_BASIC_MONTHLY_OLD
- - STRIPE_PRICE_ID_BASIC_YEARLY_OLD
- - STRIPE_PRICE_ID_PRO_MONTHLY_OLD
- - STRIPE_PRICE_ID_PRO_YEARLY_OLD
- - STRIPE_PRICE_ID_ULTIMATE_MONTHLY_OLD
- - STRIPE_PRICE_ID_ULTIMATE_YEARLY_OLD
- - STRIPE_EXCLUDED_PLANS
ports:
- "${APP_PORT:-8000}:80"
expose:
@@ -113,7 +93,7 @@ services:
retries: 10
timeout: 2s
soketi:
- image: 'ghcr.io/coollabsio/coolify-realtime:1.0.3'
+ image: 'ghcr.io/coollabsio/coolify-realtime:1.0.4'
ports:
- "${SOKETI_PORT:-6001}:6001"
- "6002:6002"
diff --git a/other/nightly/install.sh b/other/nightly/install.sh
index 04faf50ea..4a03a5c98 100755
--- a/other/nightly/install.sh
+++ b/other/nightly/install.sh
@@ -9,11 +9,11 @@ CDN="https://cdn.coollabs.io/coolify-nightly"
DATE=$(date +"%Y%m%d-%H%M%S")
VERSION="1.6"
-DOCKER_VERSION="26.0"
+DOCKER_VERSION="27.0"
# TODO: Ask for a user
CURRENT_USER=$USER
-mkdir -p /data/coolify/{source,ssh,applications,databases,backups,services,proxy,webhooks-during-maintenance,metrics,logs}
+mkdir -p /data/coolify/{source,ssh,applications,databases,backups,services,proxy,webhooks-during-maintenance,sentinel}
mkdir -p /data/coolify/ssh/{keys,mux}
mkdir -p /data/coolify/proxy/dynamic
@@ -164,7 +164,6 @@ sles | opensuse-leap | opensuse-tumbleweed)
esac
-
echo -e "2. Check OpenSSH server configuration. "
# Detect OpenSSH server
@@ -186,11 +185,51 @@ elif [ -x "$(command -v service)" ]; then
SSH_DETECTED=true
fi
fi
+
+
if [ "$SSH_DETECTED" = "false" ]; then
- echo "###############################################################################"
- echo "WARNING: Could not detect if OpenSSH server is installed and running - this does not mean that it is not installed, just that we could not detect it."
- echo -e "Please make sure it is set, otherwise Coolify cannot connect to the host system. \n"
- echo "###############################################################################"
+ echo " - OpenSSH server not detected. Installing OpenSSH server."
+ case "$OS_TYPE" in
+ arch)
+ pacman -Sy --noconfirm openssh >/dev/null
+ systemctl enable sshd >/dev/null 2>&1
+ systemctl start sshd >/dev/null 2>&1
+ ;;
+ alpine)
+ apk add openssh >/dev/null
+ rc-update add sshd default >/dev/null 2>&1
+ service sshd start >/dev/null 2>&1
+ ;;
+ ubuntu | debian | raspbian)
+ apt-get update -y >/dev/null
+ apt-get install -y openssh-server >/dev/null
+ systemctl enable ssh >/dev/null 2>&1
+ systemctl start ssh >/dev/null 2>&1
+ ;;
+ centos | fedora | rhel | ol | rocky | almalinux | amzn)
+ if [ "$OS_TYPE" = "amzn" ]; then
+ dnf install -y openssh-server >/dev/null
+ else
+ dnf install -y openssh-server >/dev/null
+ fi
+ systemctl enable sshd >/dev/null 2>&1
+ systemctl start sshd >/dev/null 2>&1
+ ;;
+ sles | opensuse-leap | opensuse-tumbleweed)
+ zypper install -y openssh >/dev/null
+ systemctl enable sshd >/dev/null 2>&1
+ systemctl start sshd >/dev/null 2>&1
+ ;;
+ *)
+ echo "###############################################################################"
+ echo "WARNING: Could not detect and install OpenSSH server - this does not mean that it is not installed or not running, just that we could not detect it."
+ echo -e "Please make sure it is installed and running, otherwise Coolify cannot connect to the host system. \n"
+ echo "###############################################################################"
+ exit 1
+ ;;
+ esac
+ echo " - OpenSSH server installed successfully."
+ SSH_DETECTED=true
fi
# Detect SSH PermitRootLogin
@@ -262,9 +301,14 @@ if ! [ -x "$(command -v docker)" ]; then
fi
;;
*)
- curl -s https://releases.rancher.com/install-docker/${DOCKER_VERSION}.sh | sh >/dev/null 2>&1
+ if [ "$OS_TYPE" = "ubuntu" ] && [ "$OS_VERSION" = "24.10" ]; then
+ echo "Docker automated installation is not supported on Ubuntu 24.10 (non-LTS release)."
+ echo "Please install Docker manually."
+ exit 1
+ fi
+ curl -s https://releases.rancher.com/install-docker/${DOCKER_VERSION}.sh | sh 2>&1
if ! [ -x "$(command -v docker)" ]; then
- curl -s https://get.docker.com | sh -s -- --version ${DOCKER_VERSION} >/dev/null 2>&1
+ curl -s https://get.docker.com | sh -s -- --version ${DOCKER_VERSION} 2>&1
if ! [ -x "$(command -v docker)" ]; then
echo " - Docker installation failed."
echo " Maybe your OS is not supported?"
@@ -287,7 +331,10 @@ test -s /etc/docker/daemon.json && cp /etc/docker/daemon.json /etc/docker/daemon
"log-opts": {
"max-size": "10m",
"max-file": "3"
- }
+ },
+ "default-address-pools": [
+ {"base":"10.0.0.0/8","size":24}
+ ]
}
EOL
cat >/etc/docker/daemon.json.coolify <Bad Request
+ @if ($exception->getMessage())
+ Something is not okay, are you okay?
+ Wait, this is not cool...
Minimum Docker Engine version is: 22
To manually install
+ to run optimal.
Minimum Docker Engine version is: {{ $minDockerVersion }}
To manually install
Docker
Engine, check this
diff --git a/resources/views/livewire/destination/index.blade.php b/resources/views/livewire/destination/index.blade.php
index df64e953e..0e20b764e 100644
--- a/resources/views/livewire/destination/index.blade.php
+++ b/resources/views/livewire/destination/index.blade.php
@@ -16,8 +16,7 @@
@forelse ($server->destinations() as $destination)
@if ($destination->getMorphClass() === 'App\Models\StandaloneDocker')
+ href="{{ route('destination.show', ['destination_uuid' => data_get($destination, 'uuid')]) }}">
Compose
- Services
- @foreach ($services as $serviceName => $value)
- Base64 En/Decode
- S3 Test
-
- Functions
- SMTP Server
- Subscribe to events
Subscribe to events
Test Notification
- Container Status Changes
- Application Deployments
- Database Backup Status
- Scheduled Tasks Status
- Server Disk Usage
- General
@if ($application->git_based())
Docker Compose
- Container Names
+ Container Names
Network
- Logs
+ @if ($isLogDrainEnabled === false)
+ Logs
Git
- GPU
- @endif
- GPU Settings
+ GPU
+ @if ($isGpuEnabled)
Preview Deployments
Network
Proxy
- Proxy
+ Advanced
- S3
+ @if ($definedS3s->count() === 0)
Network
Proxy
- Proxy
+ Advanced
- Advanced
+ Network
Proxy
- Proxy
+ Advanced
- Advanced
+ Proxy
- Proxy
+ Advanced
diff --git a/resources/views/livewire/project/database/mongodb/general.blade.php b/resources/views/livewire/project/database/mongodb/general.blade.php
index 8fc86ae1c..72fd2f75d 100644
--- a/resources/views/livewire/project/database/mongodb/general.blade.php
+++ b/resources/views/livewire/project/database/mongodb/general.blade.php
@@ -56,21 +56,28 @@
@endif
Proxy
- Proxy
+ Advanced
diff --git a/resources/views/livewire/project/database/mysql/general.blade.php b/resources/views/livewire/project/database/mysql/general.blade.php
index 40fcca1e8..c4ac7221a 100644
--- a/resources/views/livewire/project/database/mysql/general.blade.php
+++ b/resources/views/livewire/project/database/mysql/general.blade.php
@@ -66,21 +66,28 @@
@endif
Proxy
- Proxy
+ Advanced
diff --git a/resources/views/livewire/project/database/postgresql/general.blade.php b/resources/views/livewire/project/database/postgresql/general.blade.php
index 73f8e4313..5abde2b01 100644
--- a/resources/views/livewire/project/database/postgresql/general.blade.php
+++ b/resources/views/livewire/project/database/postgresql/general.blade.php
@@ -74,21 +74,28 @@
@endif
Proxy
- Proxy
+ Initialization scripts
Network
Proxy
- Proxy
+ Advanced
Project: {{ data_get($project, 'name') }}
Create a new Application
-
+ :src='service.logo'
+ x-on:error.window="$event.target.src = service.logo_github_url"
+ onerror="this.onerror=null; this.src=this.getAttribute('data-fallback');"
+ x-on:error="$event.target.src = '/svgs/coolify.png'"
+ :data-fallback='service.logo_github_url' />
Select a server
diff --git a/resources/views/livewire/project/resource/index.blade.php b/resources/views/livewire/project/resource/index.blade.php
index 0e16b7266..a618e6db2 100644
--- a/resources/views/livewire/project/resource/index.blade.php
+++ b/resources/views/livewire/project/resource/index.blade.php
@@ -44,17 +44,108 @@
Applications
+
+ Databases
+
+ Services
+
+
@foreach ($applications as $application)
Scheduled Backups
Scheduled Tasks
- Recent executions (click to check output)
- General
- @if ($server->id === 0)
- Previous Validation Logs
- Swarm (experimental)
- Sentinel
- @if ($server->isSentinelEnabled())
- Log Drains
DNS Validation
API
+ Advanced
- Update
Confirmation Settings
- @if ($disable_two_step_confirmation)
- Confirmation Settings
+ Resale License
- Tags
- Deployments
- @if (count($deploymentsPerTagPerServer) > 0)
- Tags
+ Details
- Details
+ Deployments
- @if (count($deployments_per_tag_per_server) > 0)
- {{ $server_name }}
- Deployments
+ @if (count($deploymentsPerTagPerServer) > 0)
+ {{ $serverName }}
+ $member->id == auth()->user()->id,
+ 'dark:bg-coolgray-100 bg-neutral-200' => $member->id == Auth::id(),
])>
{{ $member->name }}
@@ -12,9 +12,9 @@
{{ data_get($member, 'pivot.role') }}
- @if (auth()->user()->isAdminFromSession())
- @if ($member->id !== auth()->user()->id)
- @if (auth()->user()->isOwner())
+ @if (Auth::user()->isAdminFromSession())
+ @if ($member->id !== Auth::id())
+ @if (Auth::user()->isOwner())
@if (data_get($member, 'pivot.role') === 'owner')