diff --git a/apps/docs/content/alpine/how-to/controls.mdx b/apps/docs/content/alpine/how-to/controls.mdx
index 974b276e..cb1a3ea0 100644
--- a/apps/docs/content/alpine/how-to/controls.mdx
+++ b/apps/docs/content/alpine/how-to/controls.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start Alpine service
-description: Learn how you can stop and start your Alpine service on Zerops.
+title: Stop, start and delete Alpine service
+description: Learn how you can stop, start and delete your Alpine service on Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/alpine/how-to/delete.mdx b/apps/docs/content/alpine/how-to/delete.mdx
deleted file mode 100644
index 4c0eb80f..00000000
--- a/apps/docs/content/alpine/how-to/delete.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Delete Alpine service
-description: Learn how you can delete your Alpine service on Zerops.
----
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/bun/how-to/controls.mdx b/apps/docs/content/bun/how-to/controls.mdx
index 855775ee..ff030cda 100644
--- a/apps/docs/content/bun/how-to/controls.mdx
+++ b/apps/docs/content/bun/how-to/controls.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start Bun service
-description: Learn how you can stop and start your bun service in Zerops.
+title: Stop, start and delete Bun service
+description: Learn how you can stop, start and delete your bun service in Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/bun/how-to/delete.mdx b/apps/docs/content/bun/how-to/delete.mdx
deleted file mode 100644
index 6cb032a7..00000000
--- a/apps/docs/content/bun/how-to/delete.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Delete Bun service
-description: Learn how you can delete your node.js service in Zerops.
----
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/deno/how-to/controls.mdx b/apps/docs/content/deno/how-to/controls.mdx
index 7accc1f7..76feaedf 100644
--- a/apps/docs/content/deno/how-to/controls.mdx
+++ b/apps/docs/content/deno/how-to/controls.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start Deno service
-description: Learn how you can stop and start your deno service in Zerops.
+title: Stop, start and delete Deno service
+description: Learn how you can stop, start and delete your deno service in Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/deno/how-to/delete.mdx b/apps/docs/content/deno/how-to/delete.mdx
deleted file mode 100644
index 58c52cf2..00000000
--- a/apps/docs/content/deno/how-to/delete.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Delete Deno service
-description: Learn how you can delete your deno service in Zerops.
----
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/dotnet/how-to/controls.mdx b/apps/docs/content/dotnet/how-to/controls.mdx
index e0f4b323..12ca5f5a 100644
--- a/apps/docs/content/dotnet/how-to/controls.mdx
+++ b/apps/docs/content/dotnet/how-to/controls.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start .NET service
-description: Learn how you can stop and start your dotnet service in Zerops.
+title: Stop, start and delete .NET service
+description: Learn how you can stop, start and delete your dotnet service in Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/dotnet/how-to/delete.mdx b/apps/docs/content/dotnet/how-to/delete.mdx
deleted file mode 100644
index 49242c5b..00000000
--- a/apps/docs/content/dotnet/how-to/delete.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Delete .NET service
-description: Learn how you can delete your dotnet service in Zerops.
----
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/elixir/how-to/controls.mdx b/apps/docs/content/elixir/how-to/controls.mdx
index 3120c46f..c9dbd90e 100644
--- a/apps/docs/content/elixir/how-to/controls.mdx
+++ b/apps/docs/content/elixir/how-to/controls.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start Elixir service
-description: Learn how you can stop and start your Elixir service in Zerops.
+title: Stop, start and delete Elixir service
+description: Learn how you can stop, start and delete your Elixir service in Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/elixir/how-to/delete.mdx b/apps/docs/content/elixir/how-to/delete.mdx
deleted file mode 100644
index 32cafe13..00000000
--- a/apps/docs/content/elixir/how-to/delete.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Delete Elixir service
-description: Learn how you can delete your Elixir service in Zerops.
----
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/features/scaling-ha.mdx b/apps/docs/content/features/scaling-ha.mdx
index 1a69c64b..ad0a9620 100644
--- a/apps/docs/content/features/scaling-ha.mdx
+++ b/apps/docs/content/features/scaling-ha.mdx
@@ -96,15 +96,27 @@ This flexibility lets you plan scaling strategies upfront or adapt them as requi
Resource management in Zerops focuses on efficiently allocating and adjusting CPU, RAM, and disk resources within individual containers based on actual usage patterns.
-### CPU Options
+These resource management capabilities apply to **runtime** services, **databases**, **shared storage**, and **Linux containers** (Alpine and Ubuntu).
+
+:::note
+Docker services do not support automatic vertical scaling. Resources for Docker services are fixed at the values set manually and do not automatically adjust based on usage.
+:::
+
+:::tip Disable Scaling for Specific Resources
+To prevent automatic scaling of specific resources, simply set identical minimum and maximum values for CPU, RAM, or Disk.
+:::
+
+### CPU Settings
+
+#### CPU Mode
Two CPU allocation modes are available for any service:
-#### Shared CPU
+**Shared CPU**
Shared CPU provides a physical CPU core shared with up to 10 other applications. Performance varies depending on neighbors, ranging from 1/10 to 10/10 power. This option is cost-effective for non-critical workloads, development, and testing environments.
-#### Dedicated CPU
+**Dedicated CPU**
Dedicated CPU gives exclusive access to a full physical CPU core(s), ensuring consistent and predictable performance. This option is ideal for production environments and CPU-intensive applications.
@@ -114,39 +126,42 @@ CPU mode can be changed (once per hour) as needed.
See the [pricing](/company/pricing#resource-pricing) for the difference between CPU modes.
-### Vertical Scaling
+#### Minimum and Maximum CPU Cores
-Vertical scaling adjusts individual resources (CPU, RAM, Disk) within existing containers. When a container needs more/less power, allocated resources are increased/decreased instead of creating a new/removing container.
+Set boundaries for CPU core allocation. Zerops will scale CPU resources within these limits based on actual usage.
-This is the preferred scaling method and is attempted first before horizontal scaling.
+#### Start CPU Core Count
-These resource management capabilities apply to **runtime** services, **databases**, **shared storage**, and **Linux containers** (Alpine and Ubuntu).
-
-:::note
-Docker services do not support vertical scaling. Resources for Docker services are fixed at the values set manually and do not automatically adjust based on usage.
-:::
+Determines how many CPU cores are allocated when containers start:
+- Default: 2 cores
+- Applies to both dedicated and shared CPU modes
+- Higher values provide more processing power during application initialization
+- After startup, resources are automatically adjusted based on actual usage and limits
-### Fine-Tuning Resource Allocation
+#### CPU Scaling Thresholds
-Resource allocation can be configured through basic and advanced settings:
+For services using [dedicated CPU](#cpu-mode) only, CPU scaling is controlled by:
-#### Minimum and Maximum Resources (Basic)
+**Min. Free CPU Cores (%)**
+- Scale-up is triggered when free capacity drops below a fixed fraction of a single CPU core
+- Default: 10%
+- Set as a percentage of a single core's capacity
+- Example: Setting to 20% means that with one core, at least 20% of that core should remain free
-Boundaries for CPU cores, RAM, and disk space can be established.
+**Dynamic Min. Free Total Core Percent**
+- Scale-up is triggered when total free capacity across all cores falls below a percentage of total capacity
+- Default: 0% (disabled)
+- Dynamically adjusts as the number of cores changes
+- Ideal for accommodating varying load distributions
+- Example: 20% setting ensures at least 20% of the combined capacity of all cores remains free
-:::tip Resource Scaling Control
-To prevent scaling of specific resources, simply set identical minimum and maximum values for CPU, RAM, or Disk.
-:::
+### RAM Settings
-#### Start CPU Core Count (Advanced)
+#### Minimum and Maximum RAM
-How many CPU cores should be allocated when containers start to ensure reliable and fast startup:
-- Default: 2 cores
-- Applies to both dedicated and shared CPU modes
-- Higher values provide more processing power during application initialization
-- After startup, resources are automatically adjusted based on actual usage and limits
+Set boundaries for RAM allocation. Zerops will scale RAM within these limits based on actual usage.
-#### RAM Scaling Thresholds (Advanced)
+#### RAM Scaling Thresholds
RAM usage is monitored every 10 seconds to ensure optimal performance. The minimum free RAM settings serve multiple important purposes: they prevent Out of Memory (OOM) errors, provide space for kernel disk caching (which improves application performance), and maintain a buffer for sudden memory demands.
@@ -154,17 +169,17 @@ Swap is enabled for all containers to help prevent OOM errors, but proper minimu
Two threshold types determine RAM scaling:
-1. **Minimum Free RAM (absolute value in GB)**
- - Specifies an absolute threshold for free RAM
- - Additional memory is triggered when available RAM falls below this fixed amount
- - Default: 0.0625 GB (64 MB) for most services
- - Ideal for maintaining system stability and responsiveness
+**Minimum Free RAM (absolute value in GB)**
+- Specifies an absolute threshold for free RAM
+- Additional memory is triggered when available RAM falls below this fixed amount
+- Default: 0.0625 GB (64 MB) for most services
+- Ideal for maintaining system stability and responsiveness
-2. **Minimum Free RAM (% of Granted)**
- - Establishes a dynamic threshold based on a percentage of total granted memory
- - Default: 0% (disabled)
- - The buffer scales proportionally as total memory increases
- - Particularly useful for handling varying loads
+**Minimum Free RAM (% of Granted)**
+- Establishes a dynamic threshold based on a percentage of total granted memory
+- Default: 0% (disabled)
+- The buffer scales proportionally as total memory increases
+- Particularly useful for handling varying loads
:::note
Whichever setting provides more free memory is used.
@@ -180,22 +195,11 @@ Whichever setting provides more free memory is used.
plays-inline="true"
/>
-#### CPU Scaling Thresholds (Advanced)
-
-For services using [dedicated CPU](#dedicated-cpu) cores only, CPU scaling is controlled by:
+### Disk Settings
-1. **Min. Free CPU Cores (%)**
- - Scale-up is triggered when free capacity drops below a fixed fraction of a single CPU core
- - Default: 10%
- - Set as a percentage of a single core's capacity
- - Example: Setting to 20% means that with one core, at least 20% of that core should remain free
+#### Minimum and Maximum Disk
-2. **Dynamic Min. Free Total Core Percent**
- - Scale-up is triggered when total free capacity across all cores falls below a percentage of total capacity
- - Default: 0% (disabled)
- - Dynamically adjusts as the number of cores changes
- - Ideal for accommodating varying load distributions
- - Example: 20% setting ensures at least 20% of the combined capacity of all cores remains free
+Set boundaries for disk space allocation. Zerops will scale disk space within these limits based on actual usage.
### Resource Scaling Behavior
diff --git a/apps/docs/content/gleam/how-to/controls.mdx b/apps/docs/content/gleam/how-to/controls.mdx
index 045200a4..7f282702 100644
--- a/apps/docs/content/gleam/how-to/controls.mdx
+++ b/apps/docs/content/gleam/how-to/controls.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start Gleam service
-description: Learn how you can stop and start your Gleam service in Zerops.
+title: Stop, start and delete Gleam service
+description: Learn how you can stop, start and delete your Gleam service in Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/gleam/how-to/delete.mdx b/apps/docs/content/gleam/how-to/delete.mdx
deleted file mode 100644
index feb2cf4b..00000000
--- a/apps/docs/content/gleam/how-to/delete.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Delete Gleam service
-description: Learn how you can delete your Gleam service in Zerops.
----
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/go/how-to/controls.mdx b/apps/docs/content/go/how-to/controls.mdx
index 7a6390d3..0b5f24d3 100644
--- a/apps/docs/content/go/how-to/controls.mdx
+++ b/apps/docs/content/go/how-to/controls.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start Go service
-description: Learn how you can stop and start your go service in Zerops.
+title: Stop, start and delete Go service
+description: Learn how you can stop, start and delete your go service in Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/go/how-to/delete.mdx b/apps/docs/content/go/how-to/delete.mdx
deleted file mode 100644
index ed468bf0..00000000
--- a/apps/docs/content/go/how-to/delete.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Delete Go service
-description: Learn how you can delete your go service in Zerops.
----
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/java/how-to/controls.mdx b/apps/docs/content/java/how-to/controls.mdx
index fe26b06e..a96582b8 100644
--- a/apps/docs/content/java/how-to/controls.mdx
+++ b/apps/docs/content/java/how-to/controls.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start Java service
-description: Learn how you can stop and start your java service in Zerops.
+title: Stop, start and delete Java service
+description: Learn how you can stop, start and delete your java service in Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/java/how-to/delete.mdx b/apps/docs/content/java/how-to/delete.mdx
deleted file mode 100644
index 56b642de..00000000
--- a/apps/docs/content/java/how-to/delete.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Delete Java service
-description: Learn how you can delete your java service in Zerops.
----
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/keydb/how-to/control.mdx b/apps/docs/content/keydb/how-to/control.mdx
index b48bafc9..6593970d 100644
--- a/apps/docs/content/keydb/how-to/control.mdx
+++ b/apps/docs/content/keydb/how-to/control.mdx
@@ -1,57 +1,12 @@
---
-title: Stop and start KeyDB service
-description: Learn how you can stop and start your keydb service in Zerops.
+title: Stop, start and delete KeyDB service
+description: Learn how you can stop, start and delete your KeyDB service in Zerops.
---
-Zerops allows you to stop any service. Stopped services only consume disk.
+import { SetVar } from '/src/components/content/var';
+import ServiceContent from '/src/components/content/manage.mdx';
-## Stop, start and restart KeyDB service in Zerops GUI
+
+
-To stop the KeyDB service in Zerops GUI go to the project dashboard and select the **Stop** menu item in the top right corner.
-
-{/*TODO screenshot (show menu with the start and stop items on a service)*/}
-
-To start the stopped KeyDB service choose the **Start** item from the same menu.
-
-To restart the KeyDB service choose the **Restart** item from the same menu.
-
-## Stop and start KeyDB using zCLI
-
-zCLI is the Zerops command-line tool. To stop and start the KeyDB service via the command-line, follow these steps:
-
-1. [Install & setup zCLI](/references/cli)
-2. Run the `zcli service stop` command
-
-```sh
-Usage:
- zcli service stop [service-id-or-name] [flags]
-
-Flags:
- -h, --help the enable Zerops subdomain command.
- --project-id string If you have access to more than one project, you must specify the project ID for which the
- command is to be executed.
- --service-id string If you have access to more than one service, you must specify the service ID for which the
- command is to be executed.
-```
-
-:::info
-zCLI commands are interactive, when you press enter after `zcli service stop`, you will be given a list of your projects and services to choose from.
-:::
-
-3. Run the `zcli service start` command
-
-```sh
-Usage:
- zcli service start [{serviceName | serviceId}] [flags]
-
-Flags:
- -h, --help the service start command.
- --project-id string If you have access to more than one project, you must specify the project ID for which the
- command is to be executed.
- --service-id string If you have access to more than one service, you must specify the service ID for which the
- command is to be executed.
-```
-
-:::info
-zCLI commands are interactive, when you press enter after `zcli service start`, you will be given a list of your projects and its services to choose from.
-:::
+
\ No newline at end of file
diff --git a/apps/docs/content/keydb/how-to/delete.mdx b/apps/docs/content/keydb/how-to/delete.mdx
deleted file mode 100644
index fb7e6452..00000000
--- a/apps/docs/content/keydb/how-to/delete.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Delete KeyDB service
-description: Learn how you can delete your keydb service in Zerops.
----
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/mariadb/how-to/control.mdx b/apps/docs/content/mariadb/how-to/control.mdx
index 0213aefe..257ab4b1 100644
--- a/apps/docs/content/mariadb/how-to/control.mdx
+++ b/apps/docs/content/mariadb/how-to/control.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start MariaDB service
-description: Learn how you can stop and start your mariadb service in Zerops.
+title: Stop, start and delete MariaDB service
+description: Learn how you can stop, start and delete your mariadb service in Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/mariadb/how-to/delete.mdx b/apps/docs/content/mariadb/how-to/delete.mdx
deleted file mode 100644
index 6897aa37..00000000
--- a/apps/docs/content/mariadb/how-to/delete.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Delete MariaDB service
-description: Learn how you can delete your mariadb service in Zerops.
----
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/nginx/how-to/controls.mdx b/apps/docs/content/nginx/how-to/controls.mdx
index 9263fa68..d2a5764f 100644
--- a/apps/docs/content/nginx/how-to/controls.mdx
+++ b/apps/docs/content/nginx/how-to/controls.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start Nginx static service
-description: Learn how you can stop and start your nginx static service in Zerops.
+title: Stop, start and delete Nginx static service
+description: Learn how you can stop, start and delete your nginx static service in Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/nginx/how-to/delete.mdx b/apps/docs/content/nginx/how-to/delete.mdx
deleted file mode 100644
index 75fba1ed..00000000
--- a/apps/docs/content/nginx/how-to/delete.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Delete Nginx static service
-description: Learn how you can delete your nginx static service in Zerops.
----
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/nodejs/how-to/controls.mdx b/apps/docs/content/nodejs/how-to/controls.mdx
index 2d16e81b..967c7ffd 100644
--- a/apps/docs/content/nodejs/how-to/controls.mdx
+++ b/apps/docs/content/nodejs/how-to/controls.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start Node.js service
-description: Learn how you can stop and start your node.js service in Zerops.
+title: Stop, start and delete Node.js service
+description: Learn how you can stop, start and delete your node.js service in Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/nodejs/how-to/delete.mdx b/apps/docs/content/nodejs/how-to/delete.mdx
deleted file mode 100644
index 9429b6c1..00000000
--- a/apps/docs/content/nodejs/how-to/delete.mdx
+++ /dev/null
@@ -1,12 +0,0 @@
----
-title: Delete Node.js service
-description: Learn how you can delete your node.js service in Zerops.
----
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/object-storage/how-to/controls.mdx b/apps/docs/content/object-storage/how-to/controls.mdx
new file mode 100644
index 00000000..e6984d66
--- /dev/null
+++ b/apps/docs/content/object-storage/how-to/controls.mdx
@@ -0,0 +1,12 @@
+---
+title: Stop, start and delete Object storage service
+description: Learn how you can stop, start and delete your object storage service in Zerops.
+---
+
+import { SetVar } from '/src/components/content/var';
+import ServiceContent from '/src/components/content/manage.mdx';
+
+
+
+
+
\ No newline at end of file
diff --git a/apps/docs/content/object-storage/how-to/delete.mdx b/apps/docs/content/object-storage/how-to/delete.mdx
deleted file mode 100644
index 6ba7befb..00000000
--- a/apps/docs/content/object-storage/how-to/delete.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Delete Object storage service
-description: Learn how you can delete your object storage service in Zerops.
----
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/php/how-to/controls.mdx b/apps/docs/content/php/how-to/controls.mdx
index 6f643ec1..7a873fae 100644
--- a/apps/docs/content/php/how-to/controls.mdx
+++ b/apps/docs/content/php/how-to/controls.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start PHP service
-description: Learn how you can stop and start your php service in Zerops.
+title: Stop, start and delete PHP service
+description: Learn how you can stop, start and delete your php service in Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/php/how-to/delete.mdx b/apps/docs/content/php/how-to/delete.mdx
deleted file mode 100644
index a9ac9000..00000000
--- a/apps/docs/content/php/how-to/delete.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Delete PHP service
-description: Learn how you can delete your php service in Zerops.
----
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/postgresql/how-to/control.mdx b/apps/docs/content/postgresql/how-to/control.mdx
index a941a554..b3096e4e 100644
--- a/apps/docs/content/postgresql/how-to/control.mdx
+++ b/apps/docs/content/postgresql/how-to/control.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start PostgreSQL service
-description: Learn how you can stop and start your postgresql service in Zerops.
+title: Stop, start and delete PostgreSQL service
+description: Learn how you can stop, start and delete your postgresql service in Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/postgresql/how-to/delete.mdx b/apps/docs/content/postgresql/how-to/delete.mdx
deleted file mode 100644
index 4ed633b8..00000000
--- a/apps/docs/content/postgresql/how-to/delete.mdx
+++ /dev/null
@@ -1,12 +0,0 @@
----
-title: Delete PostgreSQL service
-description: Learn how you can delete your postgresql service in Zerops.
----
-
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/python/how-to/controls.mdx b/apps/docs/content/python/how-to/controls.mdx
index 19541643..0480ab92 100644
--- a/apps/docs/content/python/how-to/controls.mdx
+++ b/apps/docs/content/python/how-to/controls.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start Python service
-description: Learn how you can stop and start your python service in Zerops.
+title: Stop, start and delete Python service
+description: Learn how you can stop, start and delete your python service in Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/python/how-to/delete.mdx b/apps/docs/content/python/how-to/delete.mdx
deleted file mode 100644
index e0c0e6ed..00000000
--- a/apps/docs/content/python/how-to/delete.mdx
+++ /dev/null
@@ -1,12 +0,0 @@
----
-title: Delete Python service
-description: Learn how you can delete your python service in Zerops.
----
-
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/rust/how-to/controls.mdx b/apps/docs/content/rust/how-to/controls.mdx
index 9aba5ad3..6ddfed6e 100644
--- a/apps/docs/content/rust/how-to/controls.mdx
+++ b/apps/docs/content/rust/how-to/controls.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start your Rust service
-description: Learn how you can stop and start your rust service in Zerops.
+title: Stop, start and delete your Rust service
+description: Learn how you can stop, start and delete your rust service in Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/rust/how-to/delete.mdx b/apps/docs/content/rust/how-to/delete.mdx
deleted file mode 100644
index 75572ba4..00000000
--- a/apps/docs/content/rust/how-to/delete.mdx
+++ /dev/null
@@ -1,12 +0,0 @@
----
-title: Delete Rust service
-description: Learn how you can delete your rust service in Zerops.
----
-
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/content/ubuntu/how-to/controls.mdx b/apps/docs/content/ubuntu/how-to/controls.mdx
index 4a237e1b..216b4e69 100644
--- a/apps/docs/content/ubuntu/how-to/controls.mdx
+++ b/apps/docs/content/ubuntu/how-to/controls.mdx
@@ -1,10 +1,10 @@
---
-title: Stop and start Ubuntu service
-description: Learn how you can stop and start your Ubuntu service on Zerops.
+title: Stop, start and delete Ubuntu service
+description: Learn how you can stop, start and delete your Ubuntu service on Zerops.
---
import { SetVar } from '/src/components/content/var';
-import ServiceContent from '/src/components/content/start-stop.mdx';
+import ServiceContent from '/src/components/content/manage.mdx';
diff --git a/apps/docs/content/ubuntu/how-to/delete.mdx b/apps/docs/content/ubuntu/how-to/delete.mdx
deleted file mode 100644
index d00df961..00000000
--- a/apps/docs/content/ubuntu/how-to/delete.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: Delete Ubuntu service
-description: Learn how you can delete your Ubuntu service on Zerops.
----
-
-import { SetVar } from '/src/components/content/var';
-import DeleteContent from '/src/components/content/delete.mdx';
-
-
-
-
\ No newline at end of file
diff --git a/apps/docs/sidebars.js b/apps/docs/sidebars.js
index aac998a0..7faa8ffa 100644
--- a/apps/docs/sidebars.js
+++ b/apps/docs/sidebars.js
@@ -857,15 +857,10 @@ module.exports = {
id: 'nodejs/how-to/upgrade',
label: 'Upgrade Node.js service',
},
- {
- type: 'doc',
- id: 'nodejs/how-to/delete',
- label: 'Delete Node.js service',
- },
{
type: 'doc',
id: 'nodejs/how-to/controls',
- label: 'Stop & start Node.js runtime service',
+ label: 'Stop, start & delete Node.js runtime service',
},
],
},
@@ -996,15 +991,10 @@ module.exports = {
id: 'php/how-to/upgrade',
label: 'Upgrade PHP service',
},
- {
- type: 'doc',
- id: 'php/how-to/delete',
- label: 'Delete PHP service',
- },
{
type: 'doc',
id: 'php/how-to/controls',
- label: 'Stop & start PHP runtime service',
+ label: 'Stop, start & delete PHP runtime service',
},
],
},
@@ -1131,15 +1121,10 @@ module.exports = {
id: 'python/how-to/upgrade',
label: 'Upgrade Python service',
},
- {
- type: 'doc',
- id: 'python/how-to/delete',
- label: 'Delete Python service',
- },
{
type: 'doc',
id: 'python/how-to/controls',
- label: 'Stop & start Python runtime service',
+ label: 'Stop, start & delete Python runtime service',
},
],
},
@@ -1261,15 +1246,10 @@ module.exports = {
id: 'go/how-to/upgrade',
label: 'Upgrade Go service',
},
- {
- type: 'doc',
- id: 'go/how-to/delete',
- label: 'Delete Go service',
- },
{
type: 'doc',
id: 'go/how-to/controls',
- label: 'Stop & start Go runtime service',
+ label: 'Stop, start & delete Go runtime service',
},
],
},
@@ -1391,15 +1371,10 @@ module.exports = {
id: 'rust/how-to/upgrade',
label: 'Upgrade Rust service',
},
- {
- type: 'doc',
- id: 'rust/how-to/delete',
- label: 'Delete Rust service',
- },
{
type: 'doc',
id: 'rust/how-to/controls',
- label: 'Stop & start Rust runtime service',
+ label: 'Stop, start & delete Rust runtime service',
},
],
},
@@ -1521,15 +1496,10 @@ module.exports = {
id: 'dotnet/how-to/upgrade',
label: 'Upgrade .NET service',
},
- {
- type: 'doc',
- id: 'dotnet/how-to/delete',
- label: 'Delete .NET service',
- },
{
type: 'doc',
id: 'dotnet/how-to/controls',
- label: 'Stop & start .NET runtime service',
+ label: 'Stop, start & delete .NET runtime service',
},
],
},
@@ -1651,15 +1621,10 @@ module.exports = {
id: 'java/how-to/upgrade',
label: 'Upgrade Java service',
},
- {
- type: 'doc',
- id: 'java/how-to/delete',
- label: 'Delete Java service',
- },
{
type: 'doc',
id: 'java/how-to/controls',
- label: 'Stop & start Java runtime service',
+ label: 'Stop, start & delete Java runtime service',
},
],
},
@@ -1781,15 +1746,10 @@ module.exports = {
id: 'nginx/how-to/upgrade',
label: 'Upgrade Nginx service',
},
- {
- type: 'doc',
- id: 'nginx/how-to/delete',
- label: 'Delete Nginx static service',
- },
{
type: 'doc',
id: 'nginx/how-to/controls',
- label: 'Stop & start Nginx static service',
+ label: 'Stop, start & delete Nginx static service',
},
],
},
@@ -1940,15 +1900,10 @@ module.exports = {
id: 'ubuntu/how-to/upgrade',
label: 'Upgrade Ubuntu service',
},
- {
- type: 'doc',
- id: 'ubuntu/how-to/delete',
- label: 'Delete Ubuntu service',
- },
{
type: 'doc',
id: 'ubuntu/how-to/controls',
- label: 'Stop & start Ubuntu runtime service',
+ label: 'Stop, start & delete Ubuntu runtime service',
},
],
},
@@ -2070,15 +2025,10 @@ module.exports = {
id: 'alpine/how-to/upgrade',
label: 'Upgrade Alpine service',
},
- {
- type: 'doc',
- id: 'alpine/how-to/delete',
- label: 'Delete Alpine service',
- },
{
type: 'doc',
id: 'alpine/how-to/controls',
- label: 'Stop & start Alpine runtime service',
+ label: 'Stop, start & delete Alpine runtime service',
},
],
},
@@ -2243,12 +2193,7 @@ module.exports = {
{
type: 'doc',
id: 'mariadb/how-to/control',
- label: 'Stop and start MariaDB service',
- },
- {
- type: 'doc',
- id: 'mariadb/how-to/delete',
- label: 'Delete MariaDB service',
+ label: 'Stop, start and delete MariaDB service',
},
],
},
@@ -2342,12 +2287,7 @@ module.exports = {
{
type: 'doc',
id: 'postgresql/how-to/control',
- label: 'Stop and start PostgreSQL service',
- },
- {
- type: 'doc',
- id: 'postgresql/how-to/delete',
- label: 'Delete PostgreSQL service',
+ label: 'Stop, start and delete PostgreSQL service',
},
],
},
@@ -2451,12 +2391,7 @@ module.exports = {
{
type: 'doc',
id: 'keydb/how-to/control',
- label: 'Stop and start KeyDB service',
- },
- {
- type: 'doc',
- id: 'keydb/how-to/delete',
- label: 'Delete KeyDB service',
+ label: 'Stop, start and delete KeyDB service',
},
],
},
@@ -2720,8 +2655,8 @@ module.exports = {
},
{
type: 'doc',
- id: 'object-storage/how-to/delete',
- label: 'Delete object storage service',
+ id: 'object-storage/how-to/controls',
+ label: 'Stop, start & delete object storage service',
},
{
type: 'doc',
@@ -2768,15 +2703,10 @@ module.exports = {
id: 'deno/how-to/upgrade',
label: 'Upgrade Deno service',
},
- {
- type: 'doc',
- id: 'deno/how-to/delete',
- label: 'Delete Deno service',
- },
{
type: 'doc',
id: 'deno/how-to/controls',
- label: 'Stop & start Deno runtime service',
+ label: 'Stop, start & delete Deno runtime service',
},
],
},
@@ -2898,15 +2828,10 @@ module.exports = {
id: 'bun/how-to/upgrade',
label: 'Upgrade Bun service',
},
- {
- type: 'doc',
- id: 'bun/how-to/delete',
- label: 'Delete Bun service',
- },
{
type: 'doc',
id: 'bun/how-to/controls',
- label: 'Stop & start Bun runtime service',
+ label: 'Stop, start & delete Bun runtime service',
},
],
},
@@ -3028,15 +2953,10 @@ module.exports = {
id: 'gleam/how-to/upgrade',
label: 'Upgrade Gleam service',
},
- {
- type: 'doc',
- id: 'gleam/how-to/delete',
- label: 'Delete Gleam service',
- },
{
type: 'doc',
id: 'gleam/how-to/controls',
- label: 'Stop & start Gleam runtime service',
+ label: 'Stop, start & delete Gleam runtime service',
},
],
},
@@ -3158,15 +3078,10 @@ module.exports = {
id: 'elixir/how-to/upgrade',
label: 'Upgrade Elixir service',
},
- {
- type: 'doc',
- id: 'elixir/how-to/delete',
- label: 'Delete Elixir service',
- },
{
type: 'doc',
id: 'elixir/how-to/controls',
- label: 'Stop & start Elixir runtime service',
+ label: 'Stop, start & delete Elixir runtime service',
},
],
},
diff --git a/apps/docs/content/frameworks/laravel.mdx b/apps/docs/src/components/backup/frameworks/laravel.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel.mdx
rename to apps/docs/src/components/backup/frameworks/laravel.mdx
diff --git a/apps/docs/content/frameworks/laravel/cron.mdx b/apps/docs/src/components/backup/frameworks/laravel/cron.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/cron.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/cron.mdx
diff --git a/apps/docs/content/frameworks/laravel/env-variables.mdx b/apps/docs/src/components/backup/frameworks/laravel/env-variables.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/env-variables.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/env-variables.mdx
diff --git a/apps/docs/content/frameworks/laravel/faq.mdx b/apps/docs/src/components/backup/frameworks/laravel/faq.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/faq.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/faq.mdx
diff --git a/apps/docs/content/frameworks/laravel/introduction.mdx b/apps/docs/src/components/backup/frameworks/laravel/introduction.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/introduction.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/introduction.mdx
diff --git a/apps/docs/content/frameworks/laravel/logs.mdx b/apps/docs/src/components/backup/frameworks/laravel/logs.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/logs.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/logs.mdx
diff --git a/apps/docs/content/frameworks/laravel/migrations.mdx b/apps/docs/src/components/backup/frameworks/laravel/migrations.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/migrations.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/migrations.mdx
diff --git a/apps/docs/content/frameworks/laravel/recipes/filament-devel.mdx b/apps/docs/src/components/backup/frameworks/laravel/recipes/filament-devel.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/recipes/filament-devel.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/recipes/filament-devel.mdx
diff --git a/apps/docs/content/frameworks/laravel/recipes/filament-local.mdx b/apps/docs/src/components/backup/frameworks/laravel/recipes/filament-local.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/recipes/filament-local.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/recipes/filament-local.mdx
diff --git a/apps/docs/content/frameworks/laravel/recipes/filament-prod.mdx b/apps/docs/src/components/backup/frameworks/laravel/recipes/filament-prod.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/recipes/filament-prod.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/recipes/filament-prod.mdx
diff --git a/apps/docs/content/frameworks/laravel/recipes/jetstream-devel.mdx b/apps/docs/src/components/backup/frameworks/laravel/recipes/jetstream-devel.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/recipes/jetstream-devel.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/recipes/jetstream-devel.mdx
diff --git a/apps/docs/content/frameworks/laravel/recipes/jetstream-local.mdx b/apps/docs/src/components/backup/frameworks/laravel/recipes/jetstream-local.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/recipes/jetstream-local.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/recipes/jetstream-local.mdx
diff --git a/apps/docs/content/frameworks/laravel/recipes/jetstream-prod.mdx b/apps/docs/src/components/backup/frameworks/laravel/recipes/jetstream-prod.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/recipes/jetstream-prod.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/recipes/jetstream-prod.mdx
diff --git a/apps/docs/content/frameworks/laravel/recipes/minimal-devel.mdx b/apps/docs/src/components/backup/frameworks/laravel/recipes/minimal-devel.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/recipes/minimal-devel.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/recipes/minimal-devel.mdx
diff --git a/apps/docs/content/frameworks/laravel/recipes/minimal-local.mdx b/apps/docs/src/components/backup/frameworks/laravel/recipes/minimal-local.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/recipes/minimal-local.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/recipes/minimal-local.mdx
diff --git a/apps/docs/content/frameworks/laravel/recipes/minimal-prod.mdx b/apps/docs/src/components/backup/frameworks/laravel/recipes/minimal-prod.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/recipes/minimal-prod.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/recipes/minimal-prod.mdx
diff --git a/apps/docs/content/frameworks/laravel/recipes/twill-devel.mdx b/apps/docs/src/components/backup/frameworks/laravel/recipes/twill-devel.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/recipes/twill-devel.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/recipes/twill-devel.mdx
diff --git a/apps/docs/content/frameworks/laravel/recipes/twill-local.mdx b/apps/docs/src/components/backup/frameworks/laravel/recipes/twill-local.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/recipes/twill-local.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/recipes/twill-local.mdx
diff --git a/apps/docs/content/frameworks/laravel/recipes/twill-prod.mdx b/apps/docs/src/components/backup/frameworks/laravel/recipes/twill-prod.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/recipes/twill-prod.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/recipes/twill-prod.mdx
diff --git a/apps/docs/content/frameworks/laravel/redis.mdx b/apps/docs/src/components/backup/frameworks/laravel/redis.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/redis.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/redis.mdx
diff --git a/apps/docs/content/frameworks/laravel/smtp.mdx b/apps/docs/src/components/backup/frameworks/laravel/smtp.mdx
similarity index 100%
rename from apps/docs/content/frameworks/laravel/smtp.mdx
rename to apps/docs/src/components/backup/frameworks/laravel/smtp.mdx
diff --git a/apps/docs/src/components/content/delete.mdx b/apps/docs/src/components/content/delete.mdx
deleted file mode 100644
index 4220e09e..00000000
--- a/apps/docs/src/components/content/delete.mdx
+++ /dev/null
@@ -1,27 +0,0 @@
-import { Var } from '/src/components/content/var';
-
-## Delete service in Zerops GUI
-
-Go to the project dashboard and select the **delete service** menu item in the top right corner.
-
-## Delete using zCLI
-
-zCLI is the Zerops command-line tool. To delete the service via the command-line, follow these steps:
-
-1. [Install & setup zCLI](/references/cli)
-2. Run the `zcli service delete` command
-
-```sh
-Usage:
- zcli service delete [service-id-or-name] [flags]
-
-Flags:
- --confirm Skip confirmation prompts for destructive operations.
- -h, --help Help for the service delete command.
- -P, --project-id string If you have access to more than one project, you must specify the project ID for which the
- command is to be executed.
- -S, --service-id string If you have access to more than one service, you must specify the service ID for which the
- command is to be executed.
-```
-
-zCLI commands are interactive, when you press enter after `zcli service delete`, you will be given a list of your projects and its services to choose from.
\ No newline at end of file
diff --git a/apps/docs/src/components/content/manage.mdx b/apps/docs/src/components/content/manage.mdx
new file mode 100644
index 00000000..9232e452
--- /dev/null
+++ b/apps/docs/src/components/content/manage.mdx
@@ -0,0 +1,57 @@
+import { Var } from '/src/components/content/var';
+
+Learn how to stop, start, restart, and delete your service in Zerops.
+
+## Using Zerops GUI
+
+Go to the project dashboard and select the appropriate action from the menu in the top right corner:
+
+- **Stop** - Stops the service (only disk resources are consumed while stopped)
+- **Start** - Starts a stopped service
+- **Restart** - Restarts a running service
+- **Delete service** - Permanently deletes the service and all associated data
+
+{/*TODO screenshot (show menu with the start and stop items on a service)*/}
+
+:::warning
+Deleting a service is permanent and cannot be undone. All data associated with the service will be lost.
+:::
+
+## Using zCLI
+
+zCLI is the Zerops command-line tool. To manage your service via the command-line:
+
+1. [Install & setup zCLI](/references/cli)
+2. Run the appropriate command:
+
+```sh
+# Stop a service
+zcli service stop [service-id-or-name]
+
+# Start a service
+zcli service start [service-id-or-name]
+
+# Delete a service
+zcli service delete [service-id-or-name]
+```
+
+:::info
+All zCLI commands are interactive. When you press enter, you will be given a list of your projects and services to choose from.
+:::
+
+### Available flags
+
+All service management commands support these flags:
+
+```
+ -h, --help Help for the command.
+ -P, --project-id string If you have access to more than one project, you must specify the project ID for which the
+ command is to be executed.
+ -S, --service-id string If you have access to more than one service, you must specify the service ID for which the
+ command is to be executed.
+```
+
+The `delete` command also supports:
+```
+ --confirm Skip confirmation prompts for destructive operations.
+```
\ No newline at end of file
diff --git a/apps/docs/src/components/content/scaling.mdx b/apps/docs/src/components/content/scaling.mdx
index 880c4b66..9fa85e41 100644
--- a/apps/docs/src/components/content/scaling.mdx
+++ b/apps/docs/src/components/content/scaling.mdx
@@ -29,8 +29,6 @@ You can configure scaling settings at different stages:
- **After service creation** - Navigate to your service and select **Automatic scaling configuration** from the menu to modify settings.
-### Basic settings
-
-**CPU mode**: Choose between shared (cost-effective, variable performance) or dedicated (consistent performance, higher cost). You can change CPU mode once per hour. See [pricing](https://zerops.io/#pricing) for costs or read more about [CPU options](/features/scaling-ha#cpu-options).
-
-**Resource limits**: Configure minimum and maximum resources for your service:
-
-
+### CPU Settings
-- **Lower the maximum** to control costs and prevent over-scaling
-- **Raise the minimum** when you need guaranteed baseline performance
-- **Set minimum = maximum** to disable automatic scaling for that specific resource
+**CPU mode**: Choose between shared (cost-effective, variable performance) or dedicated (consistent performance, higher cost). You can change CPU mode once per hour. See [pricing](https://zerops.io/#pricing) for costs or read more about [CPU mode](/features/scaling-ha#cpu-mode).
-:::info Read More
-More details on [fine-tuning resource allocation](/features/scaling-ha#fine-tuning-resource-allocation).
-:::
-
-**Container limits**: Set how many containers your service can scale to:
+**Minimum and Maximum CPU**: Configure the boundaries for CPU core allocation. Zerops will scale CPU resources within these limits based on actual usage.
- | Minimum containers |
+ Minimum CPU cores |
1 |
- | Maximum containers |
- 10 |
+ Maximum CPU cores |
+ 8 |
-**Single container** (maximum = 1): More cost-effective, but your application will experience downtime if the container fails. This mode is suitable for development and testing environments.
-
-**Multiple containers** (maximum > 1): Can provide high availability for production environments, but only if your application is properly designed for it. Each container runs on a different physical server for redundancy. Your application must be stateless and avoid storing data in local files to work properly across multiple containers.
-
-:::info Read More
-More details on [horizontal scaling](/features/scaling-ha#horizontal-scaling-runtime-services-linux-containers-and-docker).
+:::tip
+Set minimum = maximum to disable automatic CPU scaling.
:::
-### Advanced settings
-
**Start CPU cores**: Determines how many CPU cores are allocated during application startup. Increase this value if your application starts slowly or requires more processing power during initialization.
+- Default: 2 cores
-For dedicated CPU mode, you can also configure:
+**CPU Scaling Thresholds** (for dedicated CPU mode only):
- **Min free CPU %**: Triggers scaling when free CPU drops below this percentage of a single core
- **Dynamic free total %**: Triggers scaling when total free CPU across all cores drops below this percentage
:::info Read More
-More details on [CPU Scaling Thresholds](/features/scaling-ha#cpu-scaling-thresholds-advanced).
+More details on [CPU Settings](/features/scaling-ha#cpu-settings).
:::
-**RAM thresholds**: Help prevent out-of-memory crashes by maintaining buffer space:
+### RAM Settings
+
+**Minimum and Maximum RAM**: Configure the boundaries for RAM allocation. Zerops will scale RAM within these limits based on actual usage.
+
+
+
+ | Minimum RAM |
+ 0.125 GB |
+
+
+ | Maximum RAM |
+ 48 GB |
+
+
+
+
+:::tip
+Set minimum = maximum to disable automatic RAM scaling.
+:::
+
+**RAM Scaling Thresholds**: Help prevent out-of-memory crashes by maintaining buffer space:
- **Absolute (GB)**: Maintains this amount of free RAM at all times
- **Percentage**: Keeps this percentage of total RAM free
Consider increasing these values if your application experiences memory-related crashes.
:::info Read More
-More details on [RAM Scaling Thresholds](/features/scaling-ha#ram-scaling-thresholds-advanced).
+More details on [RAM Settings](/features/scaling-ha#ram-settings).
:::
+### Disk Settings
+
+**Minimum and Maximum Disk**: Configure the boundaries for disk space allocation. Zerops will scale disk space within these limits based on actual usage.
+
+
+
+
+ | Minimum disk |
+ 1 GB |
+
+
+ | Maximum disk |
+ 250 GB |
+
+
+
+
+:::tip
+Set minimum = maximum to disable automatic disk scaling.
+:::
+
+:::info Read More
+More details on [Disk Settings](/features/scaling-ha#disk-settings).
+:::
+
+### Container Settings
+
+**Container limits**: Set how many containers your service can scale to:
+
+
+
+
+ | Minimum containers |
+ 1 |
+
+
+ | Maximum containers |
+ 10 |
+
+
+
+
+**Single container** (maximum = 1): More cost-effective, but your application will experience downtime if the container fails. This mode is suitable for development and testing environments.
+
+**Multiple containers** (maximum > 1): Can provide high availability for production environments, but only if your application is properly designed for it. Each container runs on a different physical server for redundancy. Your application must be stateless and avoid storing data in local files to work properly across multiple containers.
+
+:::info Read More
+More details on [Horizontal Scaling](/features/scaling-ha#horizontal-scaling-runtime-services-linux-containers-and-docker).
+:::
+
## Monitor usage
Navigate to your service and select **Service dashboard & runtime containers** to view:
diff --git a/apps/docs/src/components/content/start-stop.mdx b/apps/docs/src/components/content/start-stop.mdx
deleted file mode 100644
index b826e980..00000000
--- a/apps/docs/src/components/content/start-stop.mdx
+++ /dev/null
@@ -1,54 +0,0 @@
-import { Var } from '/src/components/content/var';
-
-Zerops allows you to stop any service. Stopped services only consume disk.
-
-## Stop, start and restart service in Zerops GUI
-
-To stop the service in Zerops GUI go to the project dashboard and select the **Stop** menu item in the top right corner.
-
-{/*TODO screenshot (show menu with the start and stop items on a service)*/}
-
-To start the stopped service choose the **Start** item from the same menu.
-
-To restart the service choose the **Restart** item from the same menu.
-
-## Stop and start using zCLI
-
-zCLI is the Zerops command-line tool. To stop and start the service via the command-line, follow these steps:
-
-1. [Install & setup zCLI](/references/cli)
-2. Run the `zcli service stop` command
-
-```sh
-Usage:
- zcli service stop [service-id-or-name] [flags]
-
-Flags:
- -h, --help Help for the enable Zerops subdomain command.
- -P, --project-id string If you have access to more than one project, you must specify the project ID for which the
- command is to be executed.
- -S, --service-id string If you have access to more than one service, you must specify the service ID for which the
- command is to be executed.
-```
-
-:::info
-zCLI commands are interactive, when you press enter after `zcli service stop`, you will be given a list of your projects and services to choose from.
-:::
-
-3. Run the `zcli service start` command
-
-```sh
-Usage:
- zcli service start [{service-name | service-id}] [flags]
-
-Flags:
- -h, --help Help for the service start command.
- -P, --project-id string If you have access to more than one project, you must specify the project ID for which the
- command is to be executed.
- -S, --service-id string If you have access to more than one service, you must specify the service ID for which the
- command is to be executed.
-```
-
-:::info
-zCLI commands are interactive, when you press enter after `zcli service start`, you will be given a list of your projects and services to choose from.
-:::
\ No newline at end of file
diff --git a/apps/docs/static/llms-full.txt b/apps/docs/static/llms-full.txt
index acf40ce4..334b1ac4 100644
--- a/apps/docs/static/llms-full.txt
+++ b/apps/docs/static/llms-full.txt
@@ -982,12 +982,6 @@ Shared storage mounts are not available during the runtime prepare phase.
## Troubleshooting
If your `prepareCommands` fail, check the prepare runtime log for specific error messages.
-----------------------------------------
-
-# Alpine > How To > Delete
-
-
-
----------------------------------------
# Alpine > How To > Deploy Process
@@ -1984,12 +1978,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Bun > How To > Delete
-
-
-
----------------------------------------
# Bun > How To > Deploy Process
@@ -3484,12 +3472,6 @@ Shared storage mounts are not available during the runtime prepare phase.
## Troubleshooting
If your `prepareCommands` fail, check the [prepare runtime log](/deno/how-to/logs#prepare-runtime-log) for specific error messages.
-----------------------------------------
-
-# Deno > How To > Delete
-
-
-
----------------------------------------
# Deno > How To > Deploy Process
@@ -4735,12 +4717,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Dotnet > How To > Delete
-
-
-
----------------------------------------
# Dotnet > How To > Deploy Process
@@ -5832,12 +5808,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Elixir > How To > Delete
-
-
-
----------------------------------------
# Elixir > How To > Deploy Process
@@ -7482,66 +7452,68 @@ You can configure scaling settings at three different stages:
This flexibility lets you plan scaling strategies upfront or adapt them as requirements evolve.
## Part 1: Resource Management
Resource management in Zerops focuses on efficiently allocating and adjusting CPU, RAM, and disk resources within individual containers based on actual usage patterns.
-### CPU Options
+These resource management capabilities apply to **runtime** services, **databases**, **shared storage**, and **Linux containers** (Alpine and Ubuntu).
+:::note
+Docker services do not support automatic vertical scaling. Resources for Docker services are fixed at the values set manually and do not automatically adjust based on usage.
+:::
+:::tip Disable Scaling for Specific Resources
+To prevent automatic scaling of specific resources, simply set identical minimum and maximum values for CPU, RAM, or Disk.
+:::
+### CPU Settings
+#### CPU Mode
Two CPU allocation modes are available for any service:
-#### Shared CPU
+**Shared CPU**
Shared CPU provides a physical CPU core shared with up to 10 other applications. Performance varies depending on neighbors, ranging from 1/10 to 10/10 power. This option is cost-effective for non-critical workloads, development, and testing environments.
-#### Dedicated CPU
+**Dedicated CPU**
Dedicated CPU gives exclusive access to a full physical CPU core(s), ensuring consistent and predictable performance. This option is ideal for production environments and CPU-intensive applications.
:::tip
CPU mode can be changed (once per hour) as needed.
:::
See the [pricing](/company/pricing#resource-pricing) for the difference between CPU modes.
-### Vertical Scaling
-Vertical scaling adjusts individual resources (CPU, RAM, Disk) within existing containers. When a container needs more/less power, allocated resources are increased/decreased instead of creating a new/removing container.
-This is the preferred scaling method and is attempted first before horizontal scaling.
-These resource management capabilities apply to **runtime** services, **databases**, **shared storage**, and **Linux containers** (Alpine and Ubuntu).
-:::note
-Docker services do not support vertical scaling. Resources for Docker services are fixed at the values set manually and do not automatically adjust based on usage.
-:::
-### Fine-Tuning Resource Allocation
-Resource allocation can be configured through basic and advanced settings:
-#### Minimum and Maximum Resources (Basic)
-Boundaries for CPU cores, RAM, and disk space can be established.
-:::tip Resource Scaling Control
-To prevent scaling of specific resources, simply set identical minimum and maximum values for CPU, RAM, or Disk.
-:::
-#### Start CPU Core Count (Advanced)
-How many CPU cores should be allocated when containers start to ensure reliable and fast startup:
+#### Minimum and Maximum CPU Cores
+Set boundaries for CPU core allocation. Zerops will scale CPU resources within these limits based on actual usage.
+#### Start CPU Core Count
+Determines how many CPU cores are allocated when containers start:
- Default: 2 cores
- Applies to both dedicated and shared CPU modes
- Higher values provide more processing power during application initialization
- After startup, resources are automatically adjusted based on actual usage and limits
-#### RAM Scaling Thresholds (Advanced)
+#### CPU Scaling Thresholds
+For services using [dedicated CPU](#cpu-mode) only, CPU scaling is controlled by:
+**Min. Free CPU Cores (%)**
+- Scale-up is triggered when free capacity drops below a fixed fraction of a single CPU core
+- Default: 10%
+- Set as a percentage of a single core's capacity
+- Example: Setting to 20% means that with one core, at least 20% of that core should remain free
+**Dynamic Min. Free Total Core Percent**
+- Scale-up is triggered when total free capacity across all cores falls below a percentage of total capacity
+- Default: 0% (disabled)
+- Dynamically adjusts as the number of cores changes
+- Ideal for accommodating varying load distributions
+- Example: 20% setting ensures at least 20% of the combined capacity of all cores remains free
+### RAM Settings
+#### Minimum and Maximum RAM
+Set boundaries for RAM allocation. Zerops will scale RAM within these limits based on actual usage.
+#### RAM Scaling Thresholds
RAM usage is monitored every 10 seconds to ensure optimal performance. The minimum free RAM settings serve multiple important purposes: they prevent Out of Memory (OOM) errors, provide space for kernel disk caching (which improves application performance), and maintain a buffer for sudden memory demands.
Swap is enabled for all containers to help prevent OOM errors, but proper minimum free RAM configuration is still essential—especially for services that use large amounts of RAM or benefit from kernel disk caching. Without sufficient free memory, performance may degrade due to increased disk access.
Two threshold types determine RAM scaling:
-1. **Minimum Free RAM (absolute value in GB)**
- - Specifies an absolute threshold for free RAM
- - Additional memory is triggered when available RAM falls below this fixed amount
- - Default: 0.0625 GB (64 MB) for most services
- - Ideal for maintaining system stability and responsiveness
-2. **Minimum Free RAM (% of Granted)**
- - Establishes a dynamic threshold based on a percentage of total granted memory
- - Default: 0% (disabled)
- - The buffer scales proportionally as total memory increases
- - Particularly useful for handling varying loads
+**Minimum Free RAM (absolute value in GB)**
+- Specifies an absolute threshold for free RAM
+- Additional memory is triggered when available RAM falls below this fixed amount
+- Default: 0.0625 GB (64 MB) for most services
+- Ideal for maintaining system stability and responsiveness
+**Minimum Free RAM (% of Granted)**
+- Establishes a dynamic threshold based on a percentage of total granted memory
+- Default: 0% (disabled)
+- The buffer scales proportionally as total memory increases
+- Particularly useful for handling varying loads
:::note
Whichever setting provides more free memory is used.
:::
-#### CPU Scaling Thresholds (Advanced)
-For services using [dedicated CPU](#dedicated-cpu) cores only, CPU scaling is controlled by:
-1. **Min. Free CPU Cores (%)**
- - Scale-up is triggered when free capacity drops below a fixed fraction of a single CPU core
- - Default: 10%
- - Set as a percentage of a single core's capacity
- - Example: Setting to 20% means that with one core, at least 20% of that core should remain free
-2. **Dynamic Min. Free Total Core Percent**
- - Scale-up is triggered when total free capacity across all cores falls below a percentage of total capacity
- - Default: 0% (disabled)
- - Dynamically adjusts as the number of cores changes
- - Ideal for accommodating varying load distributions
- - Example: 20% setting ensures at least 20% of the combined capacity of all cores remains free
+### Disk Settings
+#### Minimum and Maximum Disk
+Set boundaries for disk space allocation. Zerops will scale disk space within these limits based on actual usage.
### Resource Scaling Behavior
Zerops implements an exponential growth pattern ensuring that **resources grow gradually** for minor load increases but can scale rapidly when significant additional capacity is needed. When resource usage triggers scaling, Zerops initially adds smaller increments, but as demand continues to increase, it can add larger increments to quickly meet the needs of your application.
Below are the parameters that control this behavior across all services that support vertical scaling:
@@ -7576,2159 +7548,128 @@ Below are the parameters that control this behavior across all services that sup
Scale-Up Threshold Percentile
60
50
- 50
-
- Scale-Down Threshold Percentile
- 40
- 50
- 50
-
- Minimum Step
- 1 (0.1 cores)
- 0.125 GB
- 0.5 GB
-
- Maximum Step
- 40
- 32 GB
- 128 GB
-
-## Part 2: Container Architecture — Service-Specific Approaches
-Container architecture in Zerops defines how services are distributed across containers. Different service types use fundamentally different approaches:
-1. **Horizontal Scaling** (Runtime Services, Linux Containers, and Docker)
-2. **Deployment Modes** (Databases and Shared Storage)
-### Horizontal Scaling (Runtime Services, Linux Containers, and Docker)
-Horizontal scaling adds or removes entire containers (or VMs for Docker) as demand fluctuates.
-* When vertical scaling reaches its defined maximum, new containers/VMs are automatically added to handle additional load.
-* As demand decreases, containers/VMs are gradually removed to optimize resource usage.
-:::important HA-ready Applications
-For applications to work properly across multiple containers, they must be designed to be HA-ready.
-:::
-#### Setting Horizontal Scaling Parameters
-To configure horizontal scaling, users need to set the minimum and maximum number of containers:
-- **Minimum Containers**: The baseline number of containers that should always be running (system limit: 1)
-- **Maximum Containers**: The upper limit of containers that can be created during high demand (system limit: 10)
-:::tip Disable Horizontal Scaling
-Setting identical minimum and maximum values creates a fixed number of containers (disables automatic horizontal scaling).
-:::
-### Deployment Modes (Databases and Shared Storage)
-For databases and shared storage services, Zerops offers two deployment modes focused on reliability and data integrity.
-:::warning
-Deployment mode cannot be changed after creation.
-:::
-#### Single Container Mode
-Single Container Mode provides one container with vertical scaling only. This is suitable for development environments or non-critical data storage.
-**Characteristics:**
-- Limited redundancy
-- No automatic recovery if the container fails
-- Data since last backup (if available) may be lost if failure occurs
-- Cost-effective for non-production environments
-#### Highly Available (HA) Mode
-Highly Available (HA) Mode creates multiple containers with built-in redundancy. This mode is strongly recommended for production environments and mission-critical data.
-**Characteristics:**
-- Multiple containers distributed across different physical machines
-- Automatic failover and recovery mechanisms
-- Data redundancy and integrity protection
-- Higher reliability and availability
-- Recommended for production use
-:::important
-Database and shared storage services in HA mode have a **fixed number of containers** that cannot be increased or decreased.
-:::
-**Recovery process:**
-In HA mode, when a container or physical machine fails, recovery is handled automatically:
-1. The failed container is disconnected from the cluster
-2. A new container is created on a different physical machine
-3. Data is synchronized from remaining healthy copies
-4. The failed container is removed
-5. Service continues with minimal disruption
-### Fixed Resource Allocation (Docker Services)
-Docker services in Zerops operate differently from other service types:
-#### Docker Service Characteristics
-- **VM-Based Deployment**: Docker services run in virtual machines rather than containers
-- **Fixed Resources**: Unlike other services, Docker services do not support automatic vertical scaling
-- **User-Defined Resources**: Resources are set at creation and remain fixed until manually changed
-- **VM Count Changes**: The number of VMs can be changed, but this requires a VM restart
-- **No Automatic Scaling**: Resource levels do not automatically adjust based on usage
-**Important Considerations for Docker Services:**
-- Initial resource values should be chosen carefully, as they cannot automatically scale
-- Planning for expected peak loads is important when setting resource values
-- Runtime services or Linux containers should be considered instead if dynamic scaling is essential
-- VM restarts cause temporary service disruption when changing VM count or resources
-:::warning
-Docker services use fixed resources that do not automatically scale. Sufficient resources should be allocated at creation to handle expected workload. Additionally, disk space for Docker services can only be increased, not decreased without recreation of the service.
-:::
-## Monitoring Your Infrastructure
-Zerops provides comprehensive monitoring tools in the user interface to track both resource usage and container scaling activities:
-### Resource History Graphs
-Resource and container scaling can be visualized over time:
-- CPU utilization per container
-- RAM usage patterns
-- Disk space consumption
-- Container count changes
-These graphs help understand application resource needs, identify usage patterns, and fine-tune scaling settings for optimal performance and cost efficiency.
-## Troubleshooting
-#### Resource-Related Issues (All Service Types Except Docker)
-**Out of Memory Errors**
-* **Issue:** Application crashes with OOM errors despite resource scaling.
-* **Possible Cause:** Insufficient minimum free RAM setting.
-* **Solution:**
- - Increase the "Minimum free RAM" setting
- - Check for memory leaks in the application
- - Consider setting a higher minimum RAM value
-**Excessive Resource Costs**
-* **Issue:** Resources scaling up but not scaling down efficiently.
-* **Possible Cause:** Scale-down thresholds not optimized.
-* **Solution:**
- - Review usage patterns in monitoring graphs
- - Adjust scale-down thresholds to be more aggressive
- - Set appropriate resource minimums based on base requirements
-#### Runtime Service and Linux Container Issues (Horizontal Scaling)
-**Application Not Working Properly Across Multiple Containers**
-* **Issue:** Application errors or inconsistent behavior when horizontally scaled.
-* **Possible Cause:** Application not designed for distributed operation.
-* **Solution:**
- - Ensure the application properly handles stateless operation
- - Implement proper session management across containers
- - Review and modify application code to support multiple instances
-#### Docker Service Issues
-**Insufficient Resources for Workload**
-* **Issue:** Docker service experiencing performance issues or crashes.
-* **Possible Cause:** Fixed resources inadequate for actual workload.
-* **Solution:**
- - Since Docker services don't support automatic vertical scaling, a new service with higher resource allocations may be needed
- - Consider migrating to a runtime service or Linux container if dynamic resource scaling is needed
-*Need help implementing scaling in your project? Join our [Discord community](https://discord.gg/zerops) where our team and other Zerops users can assist you!*
-
-----------------------------------------
-
-# Frameworks > Laravel
-
-# Laravel in Zerops
-> Modern Laravel development demands infrastructure that doesn't get in your way. Zerops provides the foundation that lets you focus on building great apps, not wrestling with environment configuration or resource management.
-## Why Zerops for Laravel?
-Zerops implements what we call "transparent infrastructure" - you get enterprise-grade capabilities with development-friendly ergonomics. This means:
-- **Full system access** across all environments
-- **Granular resource control** starting at 0.125GB RAM
-- **True environment parity** from local to production
-- **Zero-downtime deployments** by default
-*No artificial limitations, no framework-specific compromises - just solid infrastructure that lets Laravel do what it does best.*
-:::tip
-New Zerops accounts receive $15 in free credits for testing. After verifying your account with a $10 initial payment, you'll get an additional $50 in credits.
-:::
-## Quick Start
-Choose a recipe that matches your needs and deploy with a single click. Each recipe sets up a complete environment with all necessary services preconfigured.
-All recipes include:
-- **PHP 8.3 + Nginx**
-- **PostgreSQL 16**
-- **L3/L7 balancers**
-- **Logging & metrics**
-
- The most bare-bones examples of Laravel app including core services + PostgreSQL.
-
- A full-stack setup including Redis, Object Storage, and Mailpit.
-
- Admin panel optimized setup including Redis, Object Storage, and Mailpit.
-
- Content management focused setup including Redis, Object Storage, and Mailpit.
-
-## Core Features
-### Infrastructure and Security
-Each project runs in its own isolated network with enterprise-level security features automatically configured.
-What makes this special is how it combines security with simplicity - this infrastructure requires zero configuration from you – it's all handled automatically when you create your project.
-### Native Service Discovery
-Services within your project communicate seamlessly using internal hostnames:
-```php title=".env"
-DB_HOST=${db_hostname}
-REDIS_HOST=${cache_hostname}
-```
-*Environment variables are automatically injected and synchronized across all containers.*
-### Intelligent Scaling
-One of Zerops' most powerful features is its intelligent autoscaling system, which:
-* Scales resources (CPU, RAM, Disk) up and down based on actual usage
-* Maintains minimum required resources to optimize costs
-* Handles both vertical and horizontal scaling automatically
-* Manages disk space dynamically (a unique feature in the industry)
-Through a simple configuration, you define resource boundaries while Zerops automatically handles the complex scaling decisions:
-```yaml
-# Example scaling configuration
-services:
- - hostname: app
- minContainers: 2
- maxContainers: 6
- cpu:
- min: 1
- max: 4
- ram:
- min: 0.25
- max: 4
-```
-### Zero-Downtime Deployments
-Deploy with confidence using our battle-tested pipeline:
-```yaml title="zerops.yaml"
-zerops:
- - setup: app
- build:
- base: php@8.3
- buildCommands:
- - composer install --no-dev --optimize-autoloader
- deployFiles: ./
- cache: vendor
- run:
- base: php-nginx@8.3
- initCommands:
- - php artisan config:cache
- - php artisan route:cache
- - php artisan migrate --force --isolated
-```
-### High Availability
-Every service can run in HA mode with automatic failover.
-```yaml
-services:
- - hostname: db
- type: postgresql@16
- mode: HA # Automatic primary-replica setup
- - hostname: cache
- type: valkey@7.2
- mode: HA # Redis cluster configuration
-```
-Setting up a production-grade HA database cluster typically requires deep DevOps expertise. Zerops automates this complexity, giving you an enterprise-grade setup with a single configuration flag:
-* **Database Cluster** distributed across multiple physical servers
-* **Automatic failover** and data replication
-* **Enhanced performance** through load distribution
-* **Production-grade reliability** out of the box
-## Development Workflow
-### Team Collaboration
-Zerops enables seamless team development through:
-* **Declarative Infrastructure** - version control your entire setup
-* **Identical Environments** - every team member gets production-parity
-* **Automated Setup** - new team members are productive in minutes
-* **Transparent Configuration** - easily review and audit changes
-### Local Development
-Connect to your production-grade databases without any local setup through Zerops' VPN.
-Start with
-```
-zcli vpn up
-```
-and select your project. Get your database credentials from the service's **Access details** in your project dashboard and update your local `.env`. See PostgreSQL example below:
-```yaml
-DB_CONNECTION=pgsql
-DB_HOST=db.zerops # References the service's hostname
-DB_PORT=5432
-DB_DATABASE=db
-DB_USERNAME=db
-DB_PASSWORD=[password from Access details]
-```
-With this configuration, you can use any database tool - no local installation needed.
-### Deployment Options
-Choose the workflow that fits your team:
-1. **GitHub/GitLab Integration**
- - Automatic deployments on push/merge
- - Branch-specific environments
- - Build caching and artifacts
-2. **CLI-Driven Pipeline**
- ```bash
- # Deploy from your terminal
- zcli push
- ```
-3. **Manual Triggers**
- - Deploy specific versions
- - Roll back to previous states
- - Test deployment configurations
-## Next Steps
-- [Environment Variables](/frameworks/laravel/env-variables)
-- [Database Migrations](/frameworks/laravel/migrations)
-- [Cache & Queue with Redis](/frameworks/laravel/redis)
-- [Schedule Jobs & CRON](//frameworks/laravel/cron)
-- [SMTP Configuration](/frameworks/laravel/smtp)
-- [Logs](/frameworks/laravel/logs)
-## Resources
-- [Laravel Documentation](https://laravel.com/docs)
-- [Laravel Recipe Repository](https://github.com/zeropsio/recipe-laravel-minimal)
-- [zCLI Documentation](/references/cli)
-*Need help? Join our [Discord community](https://discord.gg/zeropsio) or check out our [quickstart guide](/frameworks/laravel/introduction).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Cron
-
-Zerops provides a convenient way for managing scheduled tasks through CRON jobs, configured directly in your `zerops.yaml` file. These tasks can be scheduled to run on single or multiple containers with granular timing control.
-## Basic Configuration
-Cron jobs are defined in the `run.crontab` section of your `zerops.yaml`. Each job requires two essential parameters:
-- **command**: The command to execute
-- **timing**: The CRON schedule expression
-```yaml
-run:
- crontab:
- - command: "date >> /var/log/cron.log"
- timing: "0 * * * *"
-```
-This example logs the current timestamp every hour.
-:::tip Detailed Configuration
-For comprehensive configuration options and examples, refer to our [CRON configuration guide](/zerops-yaml/cron).
-:::
-## Common Implementation Patterns
-### Laravel Scheduler
-To run Laravel's scheduler, configure it to execute every minute:
-```yaml
-run:
- crontab:
- - command: "php artisan schedule:run"
- timing: "* * * * *"
- workingDir: /var/www/html
-```
-### Cleanup Tasks
-Execute maintenance tasks on all containers:
-```yaml
-run:
- crontab:
- - command: "rm -rf /tmp/*"
- timing: "0 0 * * *"
- allContainers: true
-```
-### Multiple Jobs
-Configure multiple scheduled tasks within a single service:
-```yaml
-run:
- crontab:
- - command: "php artisan schedule:run"
- timing: "* * * * *"
- workingDir: /var/www/html
-
- - command: "php artisan cache:clear"
- timing: "0 0 * * *"
- workingDir: /var/www/html
-
- - command: "php artisan queue:restart"
- timing: "0 */6 * * *"
- workingDir: /var/www/html
-```
-## Best Practices
-1. **Log Output**: Implement comprehensive logging for debugging and monitoring:
- ```yaml
- command: "php artisan schedule:run >> /var/log/scheduler.log 2>&1"
- ```
-2. **Working Directory**: Always specify `workingDir` for Laravel commands to ensure they are executed from the correct location.
-3. **Container Selection**: Use `allContainers: true` carefully to avoid duplicate operations in a multi-container setup.
-4. **Timing Considerations**: Schedule intensive tasks during off-peak hours.
-## Monitoring
-Enable detailed scheduler [logging](/frameworks/laravel/logs) in your `.env`:
-```
-LOG_CHANNEL=daily
-```
-
-----------------------------------------
-
-# Frameworks > Laravel > Env Variables
-
-Zerops manages environment variables without requiring manual `.env` files, enabling application deployment across different environments (development, staging, production) while keeping environment-specific configurations isolated from your code.
-Read more about how [environment variables](/features/env-variables) work in Zerops.
-## Laravel Environment Variables in Zerops
-### Secret Variables
-Some Laravel variables contain sensitive information that should never be exposed as plain text. Manage these using Zerops Secret Variables by:
-* Creating and managing them through the Zerops GUI
-* Defining them in a configuration file when importing a project or service (allows [automatic generation](#automatic-generation-during-import))
-When importing a project or service, you can define secret variables directly in your import configuration:
-```yaml
-services:
- - hostname: app
- type: php-nginx@8.4
- envSecrets:
- APP_KEY: your-secret-key
-```
-:::tip
-Secret variables can be updated at any time without requiring application redeployment.
-:::
-#### Automatic Generation During Import
-If you prefer to have certain secrets **generated automatically**, you can use the [yaml preprocessor](/references/import-yaml/pre-processor). This is optional and only available during import:
-```yaml
-#yamlPreprocessor=on
-services:
- - hostname: app
- type: php-nginx@8.4
- envSecrets:
- APP_KEY: )>
-```
-### Runtime Variables
-These variables, defined in `zerops.yaml`, are typically environment-specific but not sensitive.
-:::note
-Changes to runtime variables require application redeployment to take effect.
-:::
-Below is a complete working example of `envVariables` in `zerops.yaml` (sourced from [Laravel Jetstream recipe](https://github.com/zeropsio/recipe-laravel-jetstream/blob/main/zerops.yaml)):
-```yaml title="zerops.yaml"
-run:
- envVariables:
- APP_LOCALE: en
- APP_FAKER_LOCALE: en_US
- APP_FALLBACK_LOCALE: en
- APP_MAINTENANCE_DRIVER: file
- APP_MAINTENANCE_STORE: database
- APP_TIMEZONE: UTC
- APP_URL: ${zeropsSubdomain} # References generated variable
- ASSET_URL: ${APP_URL}
- VITE_APP_NAME: ${APP_NAME}
- # PostgreSQL connection settings
- DB_CONNECTION: pgsql
- DB_DATABASE: db
- DB_HOST: db # References database service hostname
- DB_PASSWORD: ${db_password} # References database password
- DB_PORT: 5432
- DB_USERNAME: ${db_user} # References database user
- # S3-compatible object storage settings
- AWS_ACCESS_KEY_ID: ${storage_accessKeyId}
- AWS_REGION: us-east-1
- AWS_BUCKET: ${storage_bucketName} # References bucket name of service 'storage'
- AWS_ENDPOINT: ${storage_apiUrl}
- AWS_SECRET_ACCESS_KEY: ${storage_secretAccessKey} # Safely references secret
- AWS_URL: ${storage_apiUrl}/${storage_bucketName}
- AWS_USE_PATH_STYLE_ENDPOINT: true
- FILESYSTEM_DISK: s3
- # Logging Configuration
- LOG_CHANNEL: syslog
- LOG_LEVEL: debug
- LOG_STACK: single
- # SMTP settings for email delivery
- MAIL_FROM_ADDRESS: hello@example.com
- MAIL_FROM_NAME: ZeropsLaravel
- MAIL_HOST: mailpit # References mail service hostname
- MAIL_MAILER: smtp
- MAIL_PORT: 1025
- # Redis-based caching and session management
- BROADCAST_CONNECTION: redis
- CACHE_PREFIX: cache
- CACHE_STORE: redis
- QUEUE_CONNECTION: redis
- REDIS_CLIENT: phpredis
- REDIS_HOST: valkey # References Redis service hostname
- REDIS_PORT: 6379
- SESSION_DRIVER: redis
- SESSION_ENCRYPT: false
- SESSION_LIFETIME: 120
- SESSION_PATH: /
- # Security Configuration
- BCRYPT_ROUNDS: 12
- TRUSTED_PROXIES: "*"
-```
-Let's look at variable configurations that may need additional context and where to find detailed implementation guides:
-#### Application Configuration
-Core application settings that define your Laravel app's identity, URL structure, and environment parameters. Reference environment variables from the same service.
-```yaml
-APP_URL: ${zeropsSubdomain} # zeropsSubdomain variable is system generated
-ASSET_URL: ${APP_URL}
-VITE_APP_NAME: ${APP_NAME} # APP_NAME variable was created during import (envSecrets)
-```
-#### Database Configuration
-Essential database connection parameters that securely reference your PostgreSQL service `db` by hostname and its variables - `password` and `user`.
-It is safe to store `DB_PASSWORD` in `envVariables` by reference as it does not contain the sensitive value itself.
-```yaml
-DB_HOST: db
-DB_PASSWORD: ${db_password}
-DB_USERNAME: ${db_user}
-```
-Read more about [database management](/frameworks/laravel/migrations) for Laravel in Zerops.
-#### Storage Configuration
-S3-compatible object storage settings that enable efficient file handling and asset management in your Laravel application. Reference variables of Object storage service called `storage`.
-```yaml
-AWS_ACCESS_KEY_ID: ${storage_accessKeyId}
-AWS_REGION: us-east-1
-AWS_BUCKET: ${storage_bucketName}
-AWS_ENDPOINT: ${storage_apiUrl}
-AWS_SECRET_ACCESS_KEY: ${storage_secretAccessKey}
-AWS_URL: ${storage_apiUrl}/${storage_bucketName}
-AWS_USE_PATH_STYLE_ENDPOINT: true
-FILESYSTEM_DISK: s3
-```
-Read more about [object storage](/object-storage/overview) in Zerops.
-#### Logging Configuration
-System monitoring and debugging configuration that determines how your application tracks events and errors. Use `syslog` channel to access logs from Zerops Dashboard.
-```
-LOG_CHANNEL: syslog
-```
-Learn how to properly [configure logging](/frameworks/laravel/logs) for Laravel in Zerops.
-#### Mail Configuration
-SMTP server settings that enable your application to send emails through a dedicated mail service. Reference service `mailpit` by hostname.
-```
-MAIL_HOST: mailpit
-```
-Learn how to properly [configure SMTP](/frameworks/laravel/smtp) for Laravel in Zerops.
-#### Cache and Session
-Redis-based configuration for handling application caching, queues, and session management to optimize performance. Reference service `valkey` by hostname.
-```
-REDIS_HOST: valkey
-```
-Learn how to properly [configure cache, queue & session management](/frameworks/laravel/redis) for Laravel in Zerops.
-:::tip
-For automatic execution with each deploy, add these commands to the `initCommands` section of your `zerops.yaml` file.
-```yaml title="zerops.yaml"
-initCommands:
- - php artisan view:cache
- - php artisan config:cache
- - php artisan route:cache
-```
-:::
-
-----------------------------------------
-
-# Frameworks > Laravel > Faq
-
- Question: How do I configure environment variables?
-Answer:
- You can set environment variables through the Zerops dashboard or in your `zerops.yaml` file under the `run.envVariables` section:
- ```yaml
- zerops:
- - setup: app
- run:
- envVariables:
- APP_KEY: "base64:your-key-here"
- DB_CONNECTION: "pgsql"
- DB_HOST: ${db_host}
- ```
-
- Question: How do I run database migrations?
-Answer:
- You can run migrations during initialization by adding the command to your `zerops.yaml`:
- ```yaml
- zerops:
- - setup: app
- run:
- initCommands:
- - php artisan migrate --isolated --force
- ```
-
- Question: Can I use Laravel queue with Zerops?
-Answer:
- Yes, Laravel Queue is fully supported. Configure Redis as your queue driver:
- ```yaml
- zerops:
- - setup: app
- run:
- envVariables:
- QUEUE_CONNECTION: redis
- REDIS_HOST: redis
- REDIS_PORT: 6379
- ```
-
- Question: How do I handle file storage?
-Answer:
- Zerops supports S3-compatible storage. Configure it using these environment variables:
- ```yaml
- zerops:
- - setup: app
- run:
- envVariables:
- FILESYSTEM_DISK: s3
- AWS_ACCESS_KEY_ID: ${storage_accessKeyId}
- AWS_SECRET_ACCESS_KEY: ${storage_secretAccessKey}
- AWS_BUCKET: ${storage_bucketName}
- AWS_ENDPOINT: ${storage_apiUrl}
- AWS_URL: ${storage_apiUrl}/${storage_bucketName}
- AWS_USE_PATH_STYLE_ENDPOINT: true
- ```
-
- Question: How do I enable HTTPS?
-Answer:
- HTTPS is automatically enabled when you use either a Zerops subdomain or configure your custom domain. No additional configuration is required.
-
- Question: Can I run scheduled tasks?
-Answer:
- Yes, you can configure cron jobs in your `zerops.yaml`:
- ```yaml
- zerops:
- - setup: app
- run:
- crontab:
- - command: "php artisan schedule:run"
- timing: "* * * * *"
- workingDir: /var/www/html
- ```
-
- Question: How do I configure Redis for caching?
-Answer:
- Configure Redis for caching, sessions, and queues:
- ```yaml
- zerops:
- - setup: app
- run:
- envVariables:
- CACHE_STORE: redis
- SESSION_DRIVER: redis
- REDIS_HOST: redis
- REDIS_PORT: 6379
- REDIS_CLIENT: phpredis
- ```
-
- Question: How do I optimize my Laravel application?
-Answer:
- Add these optimization commands to your initialization:
- ```yaml
- zerops:
- - setup: app
- run:
- initCommands:
- - php artisan view:cache
- - php artisan config:cache
- - php artisan route:cache
- - php artisan optimize
- ```
-
- Question: How do I handle asset compilation?
-Answer:
- Configure asset compilation in your build phase:
- ```yaml
- zerops:
- - setup: app
- build:
- base:
- - php@8.4
- - nodejs@18
- buildCommands:
- - composer install --optimize-autoloader --no-dev
- - npm install
- - npm run build
- cache:
- - vendor
- - node_modules
- ```
-
- Question: How do I implement health checks?
-Answer:
- Add health checks to ensure your application is running properly:
- ```yaml
- zerops:
- - setup: app
- deploy:
- readinessCheck:
- httpGet:
- port: 80
- path: /up
- run:
- healthCheck:
- httpGet:
- port: 80
- path: /up
- ```
-
-
-----------------------------------------
-
-# Frameworks > Laravel > Introduction
-
- Deploy the same Laravel setup as in this tutorial with a single click. All you need is a Zerops account.
-
-## Introduction
-In this tutorial, you'll learn how to deploy a Laravel application in Zerops. We'll configure a complete environment using Apache as the web server and PostgreSQL as the database.
-By the end of this tutorial, you will:
-- Have a fresh Laravel installation running locally
-- Set up a Zerops project with Apache and PostgreSQL
-- Configure zero-downtime deployment with environment variables
-- Deploy a production-ready Laravel application with Zerops subdomain access
-- Set up secure VPN access to your PostgreSQL database
-## Prerequisites
-This tutorial assumes you have:
-* PHP, Composer, git installed locally
-* [Zerops account](https://app.zerops.io/signup)
-* [zcli](/references/cli) tool installed
-:::note
-You don't need to install PostgreSQL locally - Zerops VPN lets you connect directly to the remote database for development.
-:::
-## Step 1 — Creating a New Laravel Project
-Let's start by creating a fresh Laravel project:
-```bash
-composer create-project laravel/laravel zerops-laravel
-cd zerops-laravel
-```
-Let's verify everything works locally. Start Laravel's development server:
-```bash
-php artisan serve
-```
-Visit http://localhost:8000 in your browser. You should see Laravel's welcome page.
-:::tip
-While we're using Laravel's built-in server for simplicity, you can use any local development setup you prefer (Valet, Sail, XAMPP, etc.).
-:::
-If you see the welcome page, great! Your local setup is working correctly.
-## Step 2 — Setting Up Your Zerops Project
-### Log in to zcli
-[Log in](/references/cli#personal-access-tokens) to zcli with your **Personal access token**.
-### Create Project Configuration
-When you create a project in Zerops, you get a production-grade infrastructure with automated security, load balancing, and SSL management. Each project runs in its own isolated network where services communicate securely using simple hostnames, all accessible through VPN for seamless local development.
-Learn more about infrastructure features in documentation section [Project & Services Structure](/features/infrastructure).
-#### Project Configuration File
-The project configuration defines your infrastructure using YAML. This approach provides clear, reproducible configuration that can be version controlled. Later in this tutorial, we'll also show how to achieve the same using the GUI.
-Create a new file in your project root called `zerops-project-import.yaml` with the following content:
-```yaml title="zerops-project-import.yaml"
-#yamlPreprocessor=on
-project:
- name: laravel-zerops
- tags:
- - zerops-tutorial # tag for easy filtering (optional)
-services:
- - hostname: app
- type: php-apache@8.4
- envSecrets:
- # yamlPreprocessor feat: generates a random 32 char and stores it
- APP_KEY: )>
- - hostname: db
- type: postgresql@16
- mode: HA # High Availability mode for robust production setup
-```
-:::tip Generate secrets
-The `#yamlPreprocessor=on` directive enables Zerops' [YAML preprocessing](/references/import-yaml/pre-processor) for this import file, allowing us to use dynamic values and built-in functions like `generateRandomString`.
-:::
-#### Automatic Resource Management
-Zerops features intelligent autoscaling that manages all resources (CPU, RAM, Disk) based on actual usage, automatically scaling up and down to optimize costs while maintaining performance.
-In this guide, we'll use default scaling ranges and that's why you won't find resource configurations in the import file. See [current ranges](/php/how-to/scaling#basic-settings) for horizontal and vertical scaling of PHP services.
-#### High-Availability Database
-In this guide, [enabling HA mode](/postgresql/how-to/scale) creates a database cluster across three physical servers, with all the complexity managed automatically by Zerops.
-Through Zerops VPN, you can securely access this database setup directly from your local machine, ensuring your development environment matches production exactly.
-#### Import the Project
-Now create the project by running:
-```bash
-zcli project project-import zerops-project-import.yaml
-```
-### Alternative: Creating Project via GUI
-You can also create and configure your project through the Zerops dashboard:
-1. Log into your [Zerops Dashboard](https://app.zerops.io)
-2. Click **Add new project**
-3. Set a project name (e.g., "laravel-zerops") and click **Create project**
-Then add the required services:
-1. **PHP + Apache Service:**
- - Click **Add Service** and select **PHP+Apache**
- - Set hostname to "app"
- - Keep all other settings as default
-2. **PostgreSQL Service:**
- - Click **Add Service** and select **PostgreSQL**
- - Set hostname to "db"
- - Keep all other settings as default
-## Step 3 — Configuring Your Application
-The [deployment configuration](/zerops-yaml/specification) controls how your application builds and runs. Create a `zerops.yaml` file in your project root:
-```yaml title="zerops.yaml"
-zerops:
- - setup: app
- build:
- base:
- - php@8.4
- buildCommands:
- - composer install --ignore-platform-reqs
- deployFiles: ./
- cache:
- - vendor
- - composer.lock
- deploy:
- readinessCheck:
- httpGet:
- port: 80
- path: /up
- run:
- base: php-apache@8.4
- envVariables:
- APP_NAME: "Laravel Zerops Demo"
- APP_DEBUG: false
- APP_ENV: production
- APP_URL: ${zeropsSubdomain}
- DB_CONNECTION: pgsql
- DB_HOST: db
- DB_PORT: 5432
- DB_DATABASE: db
- DB_USERNAME: ${db_user}
- DB_PASSWORD: ${db_password}
- LOG_CHANNEL: stack
- LOG_LEVEL: debug
- SESSION_DRIVER: database
- initCommands:
- - php artisan config:cache
- - php artisan route:cache
- - php artisan migrate --force --isolated
- - php artisan optimize
- healthCheck:
- httpGet:
- port: 80
- path: /up
-```
-Let's break down some important parts of this configuration:
-### Environment Variables
-Zerops automatically generates and securely manages various environment variables. For example, `zeropsSubdomain` provides your application's URL, while database credentials `user` and `password` are variables of the `db` service. It is possible to reference any variable or a service by hostname within your project's private network.
-```yaml
-APP_URL: ${zeropsSubdomain} # Automatically set to your app's Zerops URL
-DB_USERNAME: ${db_user} # Database credentials auto-injected
-DB_PASSWORD: ${db_password} # Securely managed by Zerops
-```
-Learn more about [environment variables](/frameworks/laravel/env-variables) for Laravel.
-### Safe Database Migrations
-```yaml
-php artisan migrate --force --isolated
-```
-The `--isolated` flag prevents multiple servers from running migrations simultaneously by using a cache lock, ensuring safe database updates during deployment.
-### Health Checks
-The health check configuration ensures your application is running correctly:
-```yaml
- readinessCheck:
- httpGet:
- port: 80
- path: /up
- ...
- healthCheck:
- httpGet:
- port: 80
- path: /up
-```
-By default, latest version of Laravel responds with a 200 OK status on the `/up` endpoint, so no additional configuration is needed.
-## Step 4 — Deploying Your Application
-Now comes the exciting part - deploying your application to Zerops!
-### Deploying Your Code
-Initialize git in your project directory:
-```bash
-git init
-```
-:::note
-Git is required to track changes for deployment. You don't need to commit, but initializing git helps Zerops manage the deployment files.
-:::
-Push your code to Zerops, select your project and service when prompted:
-```bash
-zcli push
-```
-### Monitoring the Deployment
-1. Go to the [Zerops Dashboard](https://app.zerops.io)
-2. In the top-left corner, you'll see a circle with **running process** text
-3. Click it to see the build progress overview
-4. Click **Open pipeline detail** button to view the detailed build process
-You'll see the deployment progress with timing for each step:
-- Initializing build container
-- Running build commands from zerops.yaml
-- Creating app version and upgrading PHP+Apache service
-The entire process usually takes less than a minute to complete.
-## Step 5 — Verifying Your Deployment
-Once the deployment completes, let's verify everything works:
-1. Go to your project's app service
-2. Click on **Public access & internal ports**
-3. Find the **Public Access through zerops.app Subdomain** section
-4. Toggle **Enable Zerops Subdomain Access**
-5. Click the generated URL (e.g., `https://app-xxx.prg1.zerops.app`) to view your application
-:::note
-The Zerops subdomain is perfect for testing and development, but for production, you should [set up your own domain](/references/networking/public-access#custom-domain-access) under **Public Access through Your Domains**.
-:::
-### Testing Database Connectivity
-Let's create a quick route to test database connectivity. Add this to your `routes/web.php`:
-```php
-Route::get('/db-test', function () {
- session()->save();
- return 'Current number of active sessions in database: ' . Illuminate\Support\Facades\DB::table('sessions')->count();
-});
-```
-Deploy this change:
-```bash
-zcli push
-```
-Visit `{your-app-url}/db-test` to verify database connectivity.
-## Accessing Your Database Locally
-Once your application is deployed, you might want to access the database directly from your local machine. Zerops makes this easy with VPN access.
-### Setting up VPN Access
-1. Start the VPN connection:
-```bash
-zcli vpn up
-```
-2. Select your project when prompted
-3. Try http://app.zerops/ to verify connectivity.
-That's it! You now have direct access to all services in your project.
-### Connecting to Database
-To get your database credentials:
-1. Go to the PostgreSQL service in your project
-2. Click **Access details** button
-3. Here you'll find all connection details including hostname, port, user, and password
-Update your local `.env` file with these credentials:
-```ini
-DB_CONNECTION=pgsql
-DB_HOST=db.zerops
-DB_PORT=5432
-DB_DATABASE=db
-DB_USERNAME=db
-DB_PASSWORD=[password from Access details]
-```
-Now you can use your favorite database management tool or run artisan commands while working with the database in Zerops - no local PostgreSQL installation needed!
-## Next Steps
-Now that your Laravel application is running in Zerops, consider:
-1. Setting up a [custom domain](/references/networking/public-access#custom-domain-access)
-2. Implementing basic CI/CD pipelines with [GitHub](/references/github-integration) or [GitLab](/references/gitlab-integration) integration
-3. Setting up [object storage](/object-storage/overview)
-## Conclusion
-Congratulations! 🎉 You've successfully deployed a Laravel application in Zerops with Apache and PostgreSQL. Your application is now running in a production-ready environment with automated builds and deployments.
-### Additional Resources
-- [Laravel Documentation](https://laravel.com/docs)
-- [Laravel Recipe Repository](https://github.com/zeropsio/recipe-laravel-minimal)
-- [zCLI Documentation](/references/cli)
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Logs
-
-Zerops provides comprehensive logging capabilities for Laravel applications using its distributed logging architecture. This guide shows you how to set up and optimize Laravel logging in Zerops, ensuring your application logs are properly captured and accessible.
-## Accessing Logs
-Learn how to [access and view your logs](/php/how-to/logs) in Zerops.
-## Configuration
-### Zerops Environment Variables
-Laravel logging in Zerops is configured through environment variables, such as:
-- `LOG_CHANNEL`: Specifies which logging channel to use (e.g., 'syslog', 'stack')
-- `LOG_STACK`: When using the stack channel, defines which channels to include
-- `LOG_LEVEL`: Sets the minimum log level to capture (e.g., 'debug', 'info', 'error')
-```yaml title="zerops.yaml"
-zerops:
- - setup: app
- run:
- envVariables:
- LOG_CHANNEL: syslog
- LOG_LEVEL: debug
- LOG_STACK: single
-```
-:::tip Available Log Channels
-Laravel supports several logging channels out of the box:
-- **stack**: Aggregates multiple logging channels into a single channel
-- **single**: Writes logs to a single file (storage/logs/laravel.log)
-- **daily**: Creates daily rotating log files
-- **syslog**: Writes to system log (recommended for Zerops)
-- **stderr**: Writes to PHP's standard error output stream
-- **errorlog**: Uses PHP's error_log function
-- **slack**: Sends log messages to Slack
-- **papertrail**: Sends logs to Papertrail
-- **mongodb**: Stores logs in MongoDB (requires additional package)
-:::
-To use multiple logging channels, [configure](#laravel-configuration) the stack channel:
-```yaml
-LOG_CHANNEL: stack
-LOG_STACK: syslog,daily
-```
-This configuration logs to both syslog (for Zerops) and daily files (for local access).
-:::tip
-Using appropriate log levels makes it easier to filter and find relevant messages in the Zerops GUI.
-:::
-### Laravel Configuration
-While Zerops is configured through environment variables, these variables are interpreted by Laravel's logging system. By default, Laravel includes a logging configuration that works out of the box - you don't need to modify anything.
-If you're curious about the underlying configuration or need to customize it beyond environment variables, here's what Laravel's logging configuration typically looks like:
-
-```php title="config/logging.php"
- env('LOG_CHANNEL', 'stack'),
- 'deprecations' => [
- 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
- 'trace' => env('LOG_DEPRECATIONS_TRACE', false),
- ],
- 'channels' => [
- 'stack' => [
- 'driver' => 'stack',
- 'channels' => explode(',', env('LOG_STACK', 'single')),
- 'ignore_exceptions' => false,
- ],
- 'single' => [
- 'driver' => 'single',
- 'path' => storage_path('logs/laravel.log'),
- 'level' => env('LOG_LEVEL', 'debug'),
- 'replace_placeholders' => true,
- ],
- 'daily' => [
- 'driver' => 'daily',
- 'path' => storage_path('logs/laravel.log'),
- 'level' => env('LOG_LEVEL', 'debug'),
- 'days' => env('LOG_DAILY_DAYS', 14),
- 'replace_placeholders' => true,
- ],
- 'stderr' => [
- 'driver' => 'monolog',
- 'handler' => StreamHandler::class,
- 'with' => [
- 'stream' => 'php://stderr',
- ],
- 'level' => env('LOG_LEVEL', 'debug'),
- ],
- 'syslog' => [
- 'driver' => 'syslog',
- 'level' => env('LOG_LEVEL', 'debug'),
- ],
- 'errorlog' => [
- 'driver' => 'errorlog',
- 'level' => env('LOG_LEVEL', 'debug'),
- ],
- ],
-];
-```
-### Using Logs
-Laravel provides several ways to write log messages:
-```php
-// Using facade
-use Illuminate\Support\Facades\Log;
-Log::emergency($message);
-Log::alert($message);
-Log::critical($message);
-Log::error($message);
-Log::warning($message);
-Log::notice($message);
-Log::info($message);
-Log::debug($message);
-// Using helper function
-logger()->info($message);
-logger($message); // defaults to info level
-// With context data
-Log::info('User failed to login.', ['id' => $user->id]);
-```
-
-----------------------------------------
-
-# Frameworks > Laravel > Migrations
-
-Database migrations are **version control** for your database schema, allowing you to evolve your database structure alongside your application versions. Each migration represents a specific version change in your application's database schema, ensuring your database structure stays synchronized with your codebase as your application evolves.
-This guide covers how to implement and manage these version-based database changes in Zerops, focusing on PostgreSQL as the recommended database system.
-## Environment Configuration
-Configure your database connection in your environment variables:
-```yaml
-zerops:
- - setup: app
- run:
- envVariables:
- DB_CONNECTION: pgsql
- DB_HOST: ${db_hostname}
- DB_PORT: 5432
- DB_DATABASE: myapp
- DB_USERNAME: ${db_user}
- DB_PASSWORD: ${db_password}
-```
-:::warning Backup your data
-Before running migrations in production, it's strongly recommended to back up your database. Zerops provides automated daily backups - see our [backup documentation](/features/backup) for details.
-:::
-## Running Migrations
-### Automatic Migrations
-The most reliable way to manage migrations in your deployment pipeline is through automatic execution. Configure this in your `zerops.yaml`:
-```yaml title="zerops.yaml"
-zerops:
- - setup: app
- run:
- initCommands:
- - php artisan migrate --force --isolated
-```
-:::caution
-When running automatic migrations in production, the `--force` flag is necessary to bypass Laravel's safety prompt. Without this flag, Laravel asks for confirmation to help prevent accidental data loss.
-:::
-:::note Migrations in HA mode
-The `--isolated` flag prevents multiple servers from running migrations simultaneously by using a cache lock.
-:::
-### Manual Migrations
-For development and troubleshooting purposes, you can execute migrations manually through SSH:
-```bash
-# Connect to your zerops project
-zcli vpn up
-# SSH into your service using it's hostname (app)
-ssh app
-# For MacOS users
-ssh app.zerops
-```
-## Migration Commands
-Essential migration commands for your workflow:
-```bash
-# Create a new migration file with timestamp
-php artisan make:migration create_users_table
-# Execute all pending migrations
-php artisan migrate
-# Revert the most recent migration operation
-php artisan migrate:rollback
-# Reset and rerun all migrations (warning: destroys existing data)
-php artisan migrate:fresh
-# Display current migration status
-php artisan migrate:status
-```
-## Best Practices
-### Migration Structure
-```php {title="database/migrations/create_users_table.php"}
-id(); // Auto-incrementing primary key
- $table->string('name'); // User's full name
- $table->string('email')->unique(); // Unique email address
- $table->timestamp('email_verified_at')->nullable(); // Email verification timestamp
- $table->string('password'); // Hashed password
- $table->rememberToken(); // Remember me token
- $table->timestamps(); // Created_at and updated_at timestamps
- });
- }
- /**
- * Reverse the migrations.
- * Removes the users table completely.
- */
- public function down()
- {
- Schema::dropIfExists('users');
- }
-};
-```
-### Safe Migration Practices
-1. **Implement Reversible Changes**
-```php
-public function down()
-{
- // Always provide a way to undo migration changes
- Schema::table('users', function (Blueprint $table) {
- $table->dropColumn('new_column');
- });
-}
-```
-2. **Use Foreign Key Contraints**
-```php
-public function up()
-{
- Schema::table('posts', function (Blueprint $table) {
- // Create relationship with cascading delete
- $table->foreignId('user_id')
- ->constrained()
- ->onDelete('cascade');
- });
-}
-```
-3. **Handle Large Tables Efficiently**
-```php
-public function up()
-{
- // Step 1: Add nullable column to prevent blocking operations
- Schema::table('large_table', function (Blueprint $table) {
- $table->string('new_column')->nullable();
- });
- // Step 2: Update data in manageable chunks
- DB::table('large_table')
- ->orderBy('id')
- ->chunk(1000, function ($records) {
- foreach ($records as $record) {
- DB::table('large_table')
- ->where('id', $record->id)
- ->update(['new_column' => 'default_value']);
- }
- });
-}
-```
-## Testing Migrations
-### Create a Test Database
-Add a testing connection to your `config/database.php`:
-```php
-'testing' => [
- 'driver' => 'pgsql',
- 'host' => env('DB_TEST_HOST', '127.0.0.1'),
- 'database' => env('DB_TEST_DATABASE', 'testing'),
- 'username' => env('DB_TEST_USERNAME', 'postgres'),
- 'password' => env('DB_TEST_PASSWORD', ''),
-],
-```
-### Migration Test Example
-Create a test file at `tests/Unit/MigrationTest.php`:
-```php
-/**
- * Test migration execution and schema verification
- */
-public function test_migrations_can_be_run()
-{
- // Execute all migrations
- Artisan::call('migrate');
- // Verify table creation
- $this->assertTrue(Schema::hasTable('users'));
- // Verify column structure
- $this->assertTrue(Schema::hasColumns('users', [
- 'id', 'name', 'email', 'password'
- ]));
-}
-```
-:::tip Migration Tips
-* Always create a backup before running migrations in production
-* Use database transactions for complex migrations
-* Thoroughly test migrations in development environment
-* Implement seeders for initial data population
-* Monitor execution time for migrations on large tables
-:::
-## Troubleshooting
-Common migration issues and their solutions:
-1. **Migration Timeout** Configure longer timeout in [zerops.yaml](/zerops-yaml/specification):
-```yaml
-zerops:
- - setup: app
- run:
- initCommands:
- - php artisan migrate --force --isolated --timeout=1000
-```
-2. **Database Lock Timeout** Adjust PDO settings in `config/database.php`:
-```php
-'pgsql' => [
- // ...
- 'options' => [
- PDO::ATTR_LOCK_TIMEOUT => 1000 // Milliseconds
- ]
-],
-```
-3. **Reset Migration State** Commands:
-```bash
-# Reset all migrations
-php artisan migrate:reset
-# Re-run all migrations
-php artisan migrate
-```
-## Additional Resources
-* [Laravel Migration Documentation](https://laravel.com/docs/11.x/migrations)
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Filament Devel
-
-[Filament](https://filamentphp.com/) is a collection of tools for rapidly building beautiful TALL stack (Tailwind, Alpine, Laravel, Livewire) applications. It provides a powerful admin panel, form builder, table builder, and other components that help you build feature-rich web applications with minimal effort.
-This recipe demonstrates how to effectively integrate Laravel Filament applications with Zerops, providing a fully production-capable setup. While this setup is built for professional deployment, we call it a **development environment** due to its streamlined resource allocation and use of the [Lightweight](/features/infrastructure#project-core-options) core package, optimizing costs without compromising functionality.
- Set up a Laravel environment with Filament's admin panel and TALL stack in a development-optimized configuration.
-
-## Environment Overview
-Your newly deployed Laravel Filament environment includes:
-- A fully configured Laravel application service with Filament installed
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-- Configured Filament admin panel and components
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/minimal-prod).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service and includes Filament's admin panel and components. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-- Filament assets compilation
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel Filament application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel Filament tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel Filament project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Filament Local
-
-[Filament](https://filamentphp.com/) is a collection of tools for rapidly building beautiful TALL stack (Tailwind, Alpine, Laravel, Livewire) applications. It provides a powerful admin panel, form builder, table builder, and other components that help you build feature-rich web applications with minimal effort.
-This recipe provides a comprehensive Filament setup with PostgreSQL database, Redis-compatible store, object storage, and automated deployment pipeline, designed for **local development** This recipe provides a streamlined Laravel setup with PostgreSQL database and automated deployment pipeline, designed for **local development** with cost-efficient resource allocation and the [Lightweight](/features/infrastructure#project-core-options) core package. This means:
-- Resources are optimized for development workloads
-- Services can be started/stopped as needed during active development
-- Cost-effective configuration suitable for development and testing
- Set up a Laravel environment with Filament's admin panel and TALL stack components for efficient local development.
-
-## Environment Overview
-Your newly deployed Filament environment includes:
-- A fully configured Laravel application service with Filament
-- PostgreSQL database integration with migration automation
-- Valkey (Redis-compatible KV store) for sessions and cache
-- Built-in object storage for filesystem
-- Mailpit for development SMTP server
-- Automated build and deployment pipeline
-- Health and readiness checks
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/filament-prod).
-:::
-## What to Expect
-The deployment process takes just a few minutes. Once complete, you'll receive:
-- A live URL to access your application
-- Database credentials
-- Access to your project dashboard
-- CLI configuration details for VPN access
-## Setting Up Local Development
-Zerops provides a built-in VPN feature through its CLI tool, enabling seamless local development against remote resources. Here's how to set it up:
-### Prerequisites
-- Install the [Zerops CLI](/references/cli#get-started) and log in with [personal access token](/references/cli#personal-access-tokens)
-- Install [Wireguard](/references/networking/vpn) on your system
-### Setup Steps
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-filament) and clone it locally
-2. **Configure VPN Access**
- ```bash
- # Initialize VPN connection using project ID
- zcli vpn up
- # Or use interactive mode to select your project
- zcli vpn up
- ```
-3. **Set Up Environment**
- ```bash
- # Create and configure environment file
- cp .env.example .env
- ```
- Fill in database access details - in Zerops GUI go to the detail of `db` service and open **Access details** in the left menu.
- ```bash
- composer install
- php artisan key:generate
- npm install
- npm run dev
- ```
-4. **Start Development Server**
- ```bash
- php artisan serve # or use your preferred setup (Valet, Herd, Sail)
- ```
-Your local environment is now connected to the Zerops infrastructure, utilizing the database, redis and storage from Zerops while maintaining local development flexibility.
-## Application Configuration
-The app has been set up to utilize:
-- Valkey (Redis-compatible KV store) to handle sessions and cache
-- Built-in object storage for Laravel and Filament-specific filesystem operations
-- Mailpit as a mock SMTP server for development purposes
-Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-## Try the Build & Deploy Pipeline
-Now that you're logged into zcli, deploying your application is straightforward. Simply enter `zcli push` in your terminal from the root of your freshly cloned project.
-### Test Your Pipeline
-The best way to verify your setup is with a quick test:
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in your project dashboard
-### Setting Up Automated CI/CD
-To enable automatic deployments:
-1. Navigate to **Pipelines & CI/CD settings** in your service dashboard
-2. Connect the service with your new GitHub repository
-3. Set the trigger to **Push to Branch**
-## Integration with Existing Applications
-If you're looking to integrate an existing Filament application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-filament/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Filament Prod
-
-[Filament](https://filamentphp.com/) is a collection of tools for rapidly building beautiful TALL stack (Tailwind, Alpine, Laravel, Livewire) applications. It provides a powerful admin panel, form builder, table builder, and other components that help you build feature-rich web applications with minimal effort.
-This recipe demonstrates how to effectively integrate Laravel Filament applications with Zerops, providing a fully production-grade setup. It's built as a **production environment** with high-availability configuration and uses the [Serious](/features/infrastructure#project-core-options) core package, ensuring enterprise-grade reliability and robust performance.
- Set up a production-ready Laravel environment with Filament's admin panel and TALL stack, backed by enterprise-grade reliability.
-
-## Environment Overview
-Your newly deployed Laravel Filament environment includes:
-- A fully configured Laravel application service with Filament installed and high availability
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-- Configured Filament admin panel and components
-:::note
-For development environments with cost-efficient resource allocation, consider deploying the [development environment recipe](/frameworks/laravel/recipes/minimal-devel).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service and includes Filament's admin panel and components. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-- Filament assets compilation
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel Filament application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel Filament tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel Filament project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Jetstream Devel
-
-Laravel Jetstream provides a polished application scaffolding for Laravel, featuring authentication, registration, email verification, two-factor authentication, session management, API support via Laravel Sanctum, and optional team management features. It serves as the perfect starting point for your next Laravel application.
-This recipe demonstrates how to effectively integrate Laravel Jetstream applications with Zerops, providing a fully production-capable setup. While this setup is built for professional deployment, we call it a **development environment** due to its streamlined resource allocation and use of the [Lightweight](/features/infrastructure#project-core-options) core package, optimizing costs without compromising functionality.
- Set up a Laravel environment with Jetstream's team features and authentication system in a development-optimized configuration.
-
-## Environment Overview
-Your newly deployed Laravel Jetstream environment includes:
-- A fully configured Laravel application service with Jetstream installed
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-- Configured Jetstream authentication system
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/minimal-prod).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service and includes Jetstream's authentication scaffolding. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-- Jetstream assets compilation
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel Jetstream application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel Jetstream tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel Jetstream project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Jetstream Local
-
-Laravel Jetstream provides a polished application scaffolding for Laravel, featuring authentication, registration, email verification, two-factor authentication, session management, API support via Laravel Sanctum, and optional team management features. It serves as the perfect starting point for your next Laravel application.
-This recipe provides a comprehensive Laravel Jetstream setup with PostgreSQL database, Redis-compatible store, object storage, and automated deployment pipeline, designed for **local development** with cost-efficient resource allocation and the [Lightweight](/features/infrastructure#project-core-options) core package. This means:
-- Resources are optimized for development workloads
-- Services can be started/stopped as needed during active development
-- Cost-effective configuration suitable for development and testing
- Set up a Laravel environment with Jetstream's team features and authentication system for rapid local development.
-
-## Environment Overview
-Your newly deployed Laravel Jetstream environment includes:
-- A fully configured Laravel application service with Jetstream
-- PostgreSQL database integration with migration automation
-- Valkey (Redis-compatible KV store) for sessions and cache
-- Built-in object storage for filesystem
-- Mailpit for development SMTP server
-- Automated build and deployment pipeline
-- Health and readiness checks
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/jetstream-prod).
-:::
-## What to Expect
-The deployment process takes just a few minutes. Once complete, you'll receive:
-- A live URL to access your application
-- Database credentials
-- Access to your project dashboard
-- CLI configuration details for VPN access
-## Setting Up Local Development
-Zerops provides a built-in VPN feature through its CLI tool, enabling seamless local development against remote resources. Here's how to set it up:
-### Prerequisites
-- Install the [Zerops CLI](/references/cli#get-started) and log in with [personal access token](/references/cli#personal-access-tokens)
-- Install [Wireguard](/references/networking/vpn) on your system
-### Setup Steps
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-jetstream) and clone it locally
-2. **Configure VPN Access**
- ```bash
- # Initialize VPN connection using project ID
- zcli vpn up
- # Or use interactive mode to select your project
- zcli vpn up
- ```
-3. **Set Up Environment**
- ```bash
- # Create and configure environment file
- cp .env.example .env
- ```
- Fill in database access details - in Zerops GUI go to the detail of `db` service and open **Access details** in the left menu.
- ```bash
- composer install
- php artisan key:generate
- npm install
- npm run dev
- ```
-4. **Start Development Server**
- ```bash
- php artisan serve # or use your preferred setup (Valet, Herd, Sail)
- ```
-Your local environment is now connected to the Zerops infrastructure, utilizing the database, redis and storage from Zerops while maintaining local development flexibility.
-## Application Configuration
-The app has been set up to utilize:
-- Valkey (Redis-compatible KV store) to handle sessions and cache
-- Built-in S3 object storage for Laravel and Jetstream-specific filesystem operations
-- Mailpit as a mock SMTP server for development purposes
-Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-## Try the Build & Deploy Pipeline
-Now that you're logged into zcli, deploying your application is straightforward. Simply enter `zcli push` in your terminal from the root of your freshly cloned project.
-### Test Your Pipeline
-The best way to verify your setup is with a quick test:
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in your project dashboard
-### Setting Up Automated CI/CD
-To enable automatic deployments:
-1. Navigate to **Pipelines & CI/CD settings** in your service dashboard
-2. Connect the service with your new GitHub repository
-3. Set the trigger to **Push to Branch**
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel Jetstream application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-jetstream/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Jetstream Prod
-
-Laravel Jetstream provides a polished application scaffolding for Laravel, featuring authentication, registration, email verification, two-factor authentication, session management, API support via Laravel Sanctum, and optional team management features. It serves as the perfect starting point for your next Laravel application.
-This recipe demonstrates how to effectively integrate Laravel Jetstream applications with Zerops, providing a fully production-grade setup. It's built as a **production environment** with high-availability configuration and uses the [Serious](/features/infrastructure#project-core-options) core package, ensuring enterprise-grade reliability and robust performance.
- Set up a production-ready Laravel environment with Jetstream's team features and authentication system, backed by high-availability services.
-
-## Environment Overview
-Your newly deployed Laravel Jetstream environment includes:
-- A fully configured Laravel application service with Jetstream installed and high availability
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-- Configured Jetstream authentication system
-:::note
-For development environments with cost-efficient resource allocation, consider deploying the [development environment recipe](/frameworks/laravel/recipes/minimal-devel).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service and includes Jetstream's authentication scaffolding. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-- Jetstream assets compilation
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel Jetstream application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel Jetstream tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel Jetstream project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Minimal Devel
-
-This recipe demonstrates how to effectively integrate Laravel applications with Zerops, providing a fully production-capable setup. While it's built for professional deployment, we call it a **development environment** due to its streamlined resource allocation and use of the [Lightweight](/features/infrastructure#project-core-options) core package, optimizing costs without compromising functionality.
- Set up a streamlined Laravel environment with development-optimized resources and configurations.
-
-## Environment Overview
-Your newly deployed Laravel environment includes:
-- A fully configured Laravel application service
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/minimal-prod).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Minimal Local
-
-This recipe provides a streamlined Laravel setup with PostgreSQL database and automated deployment pipeline, designed for **local development** with cost-efficient resource allocation and the [Lightweight](/features/infrastructure#project-core-options) core package. This means:
-- Resources are optimized for development workloads
-- Services can be started/stopped as needed during active development
-- Cost-effective configuration suitable for development and testing
- Set up a streamlined Laravel environment optimized for local development with this lightweight, cost-efficient configuration.
-
-## Environment Overview
-Your newly deployed Laravel environment includes:
-- A fully configured Laravel application service
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/minimal-prod).
-:::
-## What to Expect
-The deployment process takes just a few minutes. Once complete, you'll receive:
-- A live URL to access your application
-- Database credentials
-- Access to your project dashboard
-- CLI configuration details for VPN access
-## Setting Up Local Development
-Zerops provides a built-in VPN feature through its CLI tool, enabling seamless local development against remote resources. Here's how to set it up:
-### Prerequisites
-- Install the [Zerops CLI](/references/cli#get-started) and log in with [personal access token](/references/cli#personal-access-tokens)
-- Install [Wireguard](/references/networking/vpn) on your system
-### Setup Steps
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. **Configure VPN Access**
- ```bash
- # Initialize VPN connection using project ID
- zcli vpn up
- # Or use interactive mode to select your project
- zcli vpn up
- ```
-3. **Set Up Environment**
- ```bash
- # Create and configure environment file
- cp .env.example .env
- ```
- Fill in database access details - in Zerops GUI go to the detail of `db` service and open **Access details** in the left menu.
- ```bash
- composer install
- php artisan key:generate
- ```
-4. **Start Development Server**
- ```bash
- php artisan serve # or use your preferred setup (Valet, Herd, Sail)
- ```
-Your local environment is now connected to the Zerops infrastructure, utilizing the remote PostgreSQL database while maintaining local development flexibility.
-## Application Configuration
-Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-## Try the Build & Deploy Pipeline
-Now that you're logged into zcli, deploying your application is straightforward. Simply enter `zcli push` in your terminal from the root of your freshly cloned project.
-### Test Your Pipeline
-The best way to verify your setup is with a quick test:
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in your project detail
-### Setting Up Automated CI/CD
-To enable automatic deployments:
-1. Navigate to **Pipelines & CI/CD settings** in your service dashboard
-2. Connect the service with your new GitHub repository
-3. Set the trigger to **Push to Branch**
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Minimal Prod
-
-This recipe demonstrates how to effectively integrate Laravel applications with Zerops, providing a fully production-grade setup. It's built as a **production environment** with high-availability configuration and uses the [Serious](/features/infrastructure#project-core-options) core package, ensuring enterprise-grade reliability and robust performance.
- Set up a production-ready Laravel environment with high-availability services and enterprise-grade reliability.
-
-## Environment Overview
-Your newly deployed Laravel environment includes:
-- A fully configured Laravel application service with high availability
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-:::note
-For development environments with cost-efficient resource allocation, consider deploying the [development environment recipe](/frameworks/laravel/recipes/minimal-devel).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Twill Devel
-
-[Twill](https://twillcms.com/) is a flexible CMS toolkit for Laravel that helps you rapidly create a custom administration interface for your application. It provides a robust set of features including content management, media library, block editor, and a powerful publishing workflow system.
-This recipe demonstrates how to effectively integrate Laravel Twill applications with Zerops, providing a fully production-capable setup. While this setup is built for professional deployment, we call it a **development environment** due to its streamlined resource allocation and use of the [Lightweight](/features/infrastructure#project-core-options) core package, optimizing costs without compromising functionality.
- Set up a Laravel environment with Twill's CMS framework in a development-optimized configuration.
-
-## Environment Overview
-Your newly deployed Laravel Twill environment includes:
-- A fully configured Laravel application service with Twill CMS installed
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-- Configured Twill admin interface and media library
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/minimal-prod).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service and includes Twill's CMS functionality. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-- Twill assets compilation
-- Media storage configuration
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel Twill application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel Twill tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel Twill project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Twill Local
-
-[Twill](https://twillcms.com/) is a flexible CMS toolkit for Laravel that helps you rapidly create a custom administration interface for your application. It provides a robust set of features including content management, media library, block editor, and a powerful publishing workflow system.
-This recipe provides a comprehensive Twill CMS setup with PostgreSQL database, Redis-compatible store, object storage, and automated deployment pipeline, designed for **local development** with cost-efficient resource allocation and the [Lightweight](/features/infrastructure#project-core-options) core package. This means:
-- Resources are optimized for development workloads
-- Services can be started/stopped as needed during active development
-- Cost-effective configuration suitable for development and testing
- Set up a Laravel environment with Twill's publishing workflow and media management features for local development.
-
-## Environment Overview
-Your newly deployed Twill CMS environment includes:
-- A fully configured Laravel application service with Twill CMS
-- PostgreSQL database integration with migration automation
-- Valkey (Redis-compatible KV store) for sessions and cache
-- Built-in object storage for filesystem
-- Mailpit for development SMTP server
-- Automated build and deployment pipeline
-- Health and readiness checks
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/filament-prod).
-:::
-## What to Expect
-The deployment process takes just a few minutes. Once complete, you'll receive:
-- A live URL to access your application
-- Database credentials
-- Access to your project dashboard
-- CLI configuration details for VPN access
-## Setting Up Local Development
-Zerops provides a built-in VPN feature through its CLI tool, enabling seamless local development against remote resources. Here's how to set it up:
-### Prerequisites
-- Install the [Zerops CLI](/references/cli#get-started) and log in with [personal access token](/references/cli#personal-access-tokens)
-- Install [Wireguard](/references/networking/vpn) on your system
-### Setup Steps
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-filament) and clone it locally
-2. **Configure VPN Access**
- ```bash
- # Initialize VPN connection using project ID
- zcli vpn up
- # Or use interactive mode to select your project
- zcli vpn up
- ```
-3. **Set Up Environment**
- ```bash
- # Create and configure environment file
- cp .env.example .env
- ```
- Fill in database access details - in Zerops GUI go to the detail of `db` service and open **Access details** in the left menu.
- ```bash
- composer install
- php artisan key:generate
- npm install
- npm run dev
- ```
-4. **Start Development Server**
- ```bash
- php artisan serve # or use your preferred setup (Valet, Herd, Sail)
- ```
-Your local environment is now connected to the Zerops infrastructure, utilizing the database, redis and storage from Zerops while maintaining local development flexibility.
-## Application Configuration
-The app has been set up to utilize:
-- Valkey (Redis-compatible KV store) to handle sessions and cache
-- Built-in object storage for Laravel and Twill-specific filesystem operations
-- Mailpit as a mock SMTP server for development purposes
-Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-## Try the Build & Deploy Pipeline
-Now that you're logged into zcli, deploying your application is straightforward. Simply enter `zcli push` in your terminal from the root of your freshly cloned project.
-### Test Your Pipeline
-The best way to verify your setup is with a quick test:
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in your project dashboard
-### Setting Up Automated CI/CD
-To enable automatic deployments:
-1. Navigate to **Pipelines & CI/CD settings** in your service dashboard
-2. Connect the service with your new GitHub repository
-3. Set the trigger to **Push to Branch**
-## Integration with Existing Applications
-If you're looking to integrate an existing Twill application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-twill/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Twill Prod
-
-[Twill](https://twillcms.com/) is a flexible CMS toolkit for Laravel that helps you rapidly create a custom administration interface for your application. It provides a robust set of features including content management, media library, block editor, and a powerful publishing workflow system.
-This recipe demonstrates how to effectively integrate Laravel Twill applications with Zerops, providing a fully production-grade setup. It's built as a **production environment** with high-availability configuration and uses the [Serious](/features/infrastructure#project-core-options) core package, ensuring enterprise-grade reliability and robust performance.
- Set up a production-ready Laravel environment with Twill's CMS framework, backed by high-availability services and enterprise-grade reliability.
-
-## Environment Overview
-Your newly deployed Laravel Twill environment includes:
-- A fully configured Laravel application service with Twill CMS installed and high availability
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-- Configured Twill admin interface and media library
-:::note
-For development environments with cost-efficient resource allocation, consider deploying the [development environment recipe](/frameworks/laravel/recipes/minimal-devel).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service and includes Twill's CMS functionality. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-- Twill assets compilation
-- Media storage configuration
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel Twill application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel Twill tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel Twill project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Redis
-
-Redis is a powerful in-memory data structure store serving as a database, cache, message broker, and queue. This guide walks you through Redis integration with your Laravel application in Zerops for high-performance caching, session management, and queue processing.
-Zerops provides [Valkey](https://valkey.io), an open-source Redis alternative that delivers high-performance key/value storage with full Redis compatibility. Valkey supports all common Redis use cases — from caching and message queues to primary database functionality.
-## Adding Redis Service
-To use Valkey (Redis) features with Laravel, first either import Valkey as a service to your Zerops project
-```yaml
-services:
- - hostname: valkey
- type: valkey@7.2
- mode: NON_HA # use HA in production
-```
-or add the Valkey service to your project manually from the Zerops GUI.
-:::tip High Availability Mode
-For production environments, we recommend using `HA` mode. This configuration:
-* Ensures automatic failover during node failures
-* Provides data replication across multiple nodes
-* Improves reliability and uptime
+ 50
+
+ Scale-Down Threshold Percentile
+ 40
+ 50
+ 50
+
+ Minimum Step
+ 1 (0.1 cores)
+ 0.125 GB
+ 0.5 GB
+
+ Maximum Step
+ 40
+ 32 GB
+ 128 GB
+
+## Part 2: Container Architecture — Service-Specific Approaches
+Container architecture in Zerops defines how services are distributed across containers. Different service types use fundamentally different approaches:
+1. **Horizontal Scaling** (Runtime Services, Linux Containers, and Docker)
+2. **Deployment Modes** (Databases and Shared Storage)
+### Horizontal Scaling (Runtime Services, Linux Containers, and Docker)
+Horizontal scaling adds or removes entire containers (or VMs for Docker) as demand fluctuates.
+* When vertical scaling reaches its defined maximum, new containers/VMs are automatically added to handle additional load.
+* As demand decreases, containers/VMs are gradually removed to optimize resource usage.
+:::important HA-ready Applications
+For applications to work properly across multiple containers, they must be designed to be HA-ready.
:::
-## Environment Configuration
-### Basic Redis Settings
-Environment variables control how your Laravel application connects to and uses Redis. Below are the core settings grouped by functionality:
-```yaml
-zerops:
- - setup: app
- build:
- base:
- - php@8.4
- os: alpine
- run:
- base: php-nginx@8.4
- os: alpine
- siteConfigPath: site.conf.tmpl
- envVariables:
- # Redis Connection Settings
- REDIS_CLIENT: phpredis # PHP Redis client for better performance
- REDIS_HOST: valkey # Internal hostname of Valkey service
- REDIS_PORT: 6379 # Standard Redis port number
- # Cache Configuration
- CACHE_PREFIX: cache # Namespace for cache keys
- CACHE_STORE: redis # Use Redis as primary cache
- # Session Configuration
- SESSION_DRIVER: redis # Store sessions in Redis
- SESSION_ENCRYPT: false # Disable session encryption
- SESSION_LIFETIME: 120 # Session timeout in minutes
- SESSION_PATH: / # Cookie path setting
- # Queue Configuration
- QUEUE_CONNECTION: redis # Use Redis for job queues
- BROADCAST_CONNECTION: redis # Redis for event broadcasting
-```
-## Feature-Specific Configuration
-### Redis Caching
-Laravel's cache system offers a unified API across different cache backends. The following configuration establishes Redis as your primary cache store for fast, reliable data caching:
-```php title="config/cache.php"
-'default' => env('CACHE_STORE', 'database'),
-'stores' => [
- 'redis' => [
- 'driver' => 'redis',
- 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'),
- 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'),
- ],
-],
-'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'),
-```
-### Session Management with Redis
-Using Redis for session storage provides better performance than file-based sessions and enables seamless session sharing across multiple application servers. You can also set up a custom session connection in the `config/session.php` file.
-```php title="config/session.php"
-'driver' => env('SESSION_DRIVER', 'redis'),
-'lifetime' => env('SESSION_LIFETIME', 120),
-'encrypt' => env('SESSION_ENCRYPT', false),
-```
-### Queue System Configuration
-Redis queues offer a robust solution for handling background jobs in Laravel. This configuration sets up Redis as your queue backend with retry policies and connection settings. You can also set up a custom queue connection in the `config/queue.php` file.
-```php title="config/queue.php"
-'default' => env('QUEUE_CONNECTION', 'redis'),
-'connections' => [
- 'redis' => [
- 'driver' => 'redis',
- 'connection' => 'default',
- 'queue' => 'default',
- 'retry_after' => 90, // Retry failed jobs after 90 seconds
- 'block_for' => null, // Don't block when no jobs available
- ],
-],
-```
-Consider using [Supervisor](https://laravel.com/docs/5.1/queues#supervisor-configuration) for managing Laravel queues in production.
-### Performance Optimization
-Configure your Redis connection pool for optimal performance:
-```php
-'redis' => [
- 'client' => env('REDIS_CLIENT', 'phpredis'),
- 'options' => [
- 'cluster' => env('REDIS_CLUSTER', 'redis'),
- 'prefix' => env('REDIS_PREFIX', ''),
- 'pool' => [
- 'max_connections' => 50,
- 'timeout' => 30,
- ],
- ],
-],
-```
-## Working with Redis Features
-### Cache Operations Examples
-```php
-// Store items in cache with expiration time
-Cache::put('key', 'value', $seconds);
-// Retrieve cached items with optional default value
-$value = Cache::get('key');
-// Store items indefinitely until manually removed
-Cache::forever('key', 'value');
-```
-### Queue Processing Examples
-```php
-// Dispatch a job to the Redis queue with specific connection
-ProcessPodcast::dispatch($podcast)->onConnection('redis');
-// Start the queue worker process for Redis
-php artisan queue:work redis
-```
-### Session Handling Examples
-```php
-// Store data in the Redis session
-session(['key' => 'value']);
-// Retrieve data from the session with optional default
-$value = session('key');
-```
-
-----------------------------------------
-
-# Frameworks > Laravel > Smtp
-
-# SMTP Configuration for Laravel in Zerops
-:::warning Important Security Note
-By default, SMTP ports are blocked by Zerops firewall for security reasons. To use external SMTP services, please [contact Zerops support](mailto:support@zerops.io) to have the necessary ports opened for your project.
-Include in your request:
-* Detailed explanation of your use case
-* Specific ports and protocols needed
-* Project ID and Organization ID from your Zerops Dashboard
-:::
-## Production Configuration
-### Laravel Mail Configuration
-Laravel comes with a default mail configuration in `config/mail.php`. You typically don't need to modify this file as all settings can be controlled through environment variables.
-The default configuration supports multiple mailer types and reads all sensitive information from your environment. In this example
-
-```php title="config/mail.php"
-return [
- 'default' => env('MAIL_MAILER', 'smtp'),
- 'mailers' => [
- 'smtp' => [
- 'transport' => 'smtp',
- 'url' => env('MAIL_URL'),
- 'host' => env('MAIL_HOST', '127.0.0.1'),
- 'port' => env('MAIL_PORT', 587),
- 'encryption' => env('MAIL_ENCRYPTION', 'tls'),
- 'username' => env('MAIL_USERNAME'),
- 'password' => env('MAIL_PASSWORD'),
- 'timeout' => null,
- 'local_domain' => env('MAIL_EHLO_DOMAIN'),
- ],
- 'ses' => [
- 'transport' => 'ses',
- ],
- 'postmark' => [
- 'transport' => 'postmark',
- ],
- 'failover' => [
- 'transport' => 'failover',
- 'mailers' => [
- 'smtp',
- 'log',
- ],
- ],
- ],
- 'from' => [
- 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
- 'name' => env('MAIL_FROM_NAME', 'Example'),
- ],
-];
-```
-:::tip Available Mail Transports
-Laravel supports multiple mail transport options:
-- 'smtp' - Standard SMTP server
-- 'sendmail' - Server's sendmail
-- 'mailgun' - Mailgun API
-- 'ses' - Amazon SES
-- 'postmark' - Postmark
-- 'log' - Log messages for testing
-- 'array' - Store in array for testing
-- 'failover' - Fallback to next mailer if one fails
-- 'roundrobin' - Rotate between multiple mailers
-:::
-### Environment Configuration
-Configure your Laravel service with the required mail variables. The following example shows SMTP configuration, but most settings are common across different mail transports:
-```yaml title="zerops.yaml"
-zerops:
- - setup: app
- run:
- envVariables:
- MAIL_MAILER: smtp
- MAIL_FROM_ADDRESS: noreply@yourdomain.com
- MAIL_FROM_NAME: YourApp
- MAIL_HOST: your-smtp-host
- MAIL_PORT: 587
- MAIL_USERNAME: your-username
- MAIL_PASSWORD: your-password
- MAIL_ENCRYPTION: tls
-```
-If using other mail transports, you might need additional environment variables. Refer to Laravel's Mail documentation for transport-specific configuration.
-## Implementing Email Functionality
-### Creating Mail Classes
-Generate a new mail class using Artisan:
-```bash
-php artisan make:mail WelcomeEmail
-```
-```php title="app/Mail/WelcomeEmail.php"
-view('emails.welcome')
- ->subject('Welcome to ' . config('app.name'));
- }
-}
-```
-### Email Template
-Create a blade template for your email content:
-```php title="resources/views/emails/welcome.blade.php"
-# Welcome {{ $user->name }}
-Thanks for joining our application!
-Visit Dashboard
-Thanks,
-{{ config('app.name') }}
-```
-### Sending Emails
-You can send emails either immediately or using a queue:
-```php
-use Illuminate\Support\Facades\Mail;
-use App\Mail\WelcomeEmail;
-// Send immediately
-Mail::to($user->email)->send(new WelcomeEmail($user));
-// Send using queue
-Mail::to($user->email)->queue(new WelcomeEmail($user));
-```
-## Queue Configuration
-For production environments, it's recommended to use a queue system for sending emails to prevent request timeouts and improve application performance. Zerops provides Valkey, an open-source Redis-compatible service that's perfect for handling email queues.
-First, add the Valkey service to your project:
-```yaml
-services:
- - hostname: redis
- type: valkey@7.2
- mode: NON_HA # use HA for high availability in production
-```
-Configure your Laravel service to use Redis for queues:
-```yaml title="zerops.yaml"
-zerops:
- - setup: app
- run:
- envVariables:
- # Queue Configuration
- QUEUE_CONNECTION: redis
- REDIS_HOST: redis
- REDIS_PORT: 6379
- REDIS_CLIENT: phpredis # PHP Redis client for better performance
- # Mail Configuration
- MAIL_MAILER: smtp
- MAIL_HOST: your-smtp-host.com
- MAIL_PORT: 587
- MAIL_USERNAME: your-username
- MAIL_PASSWORD: your-password
- MAIL_ENCRYPTION: tls
- MAIL_FROM_ADDRESS: noreply@yourdomain.com
- MAIL_FROM_NAME: YourApp
-```
-You can customize the queue behavior in your `config/queue.php`:
-```php title="config/queue.php"
-phpCopy'default' => env('QUEUE_CONNECTION', 'redis'),
-'connections' => [
- 'redis' => [
- 'driver' => 'redis',
- 'connection' => 'default',
- 'queue' => 'default',
- 'retry_after' => 90, // Retry failed jobs after 90 seconds
- 'block_for' => null, // Don't block when no jobs available
- ],
-],
-```
-## Development Environment
-For local development and testing, Zerops provides a Mailpit service that allows you to catch and inspect all outgoing emails.
-### Setting up Mailpit
-Add this to your project import configuration or import the service separately:
-```yaml
-services:
- - hostname: mailpit
- type: go@1
- buildFromGit: https://github.com/zeropsio/recipe-mailpit
- enableSubdomainAccess: true
-```
-See [Mailpit recipe repo](https://github.com/zeropsio/recipe-mailpit) for reference.
-Configure your Laravel service to use Mailpit for development:
-```yaml
-zerops:
- - setup: app
- run:
- envVariables:
- MAIL_MAILER: smtp
- MAIL_HOST: mailpit
- MAIL_PORT: 1025
- MAIL_FROM_ADDRESS: hello@example.com
- MAIL_FROM_NAME: ZeropsLaravel
-```
-:::tip
-Enable `enableSubdomainAccess` to access the Mailpit web interface where you can view all emails during development.
+#### Setting Horizontal Scaling Parameters
+To configure horizontal scaling, users need to set the minimum and maximum number of containers:
+- **Minimum Containers**: The baseline number of containers that should always be running (system limit: 1)
+- **Maximum Containers**: The upper limit of containers that can be created during high demand (system limit: 10)
+:::tip Disable Horizontal Scaling
+Setting identical minimum and maximum values creates a fixed number of containers (disables automatic horizontal scaling).
:::
-## Best Practices
-- Use queue for sending emails in production to prevent request timeouts
-- Configure proper timeouts for SMTP connections
-- Use environment variables for all mail settings
-- Implement proper error handling for failed email deliveries
-- Test email templates across different email clients
-- Monitor email delivery rates and bounce rates
-- Use Mailpit in development to catch and debug emails
+### Deployment Modes (Databases and Shared Storage)
+For databases and shared storage services, Zerops offers two deployment modes focused on reliability and data integrity.
+:::warning
+Deployment mode cannot be changed after creation.
+:::
+#### Single Container Mode
+Single Container Mode provides one container with vertical scaling only. This is suitable for development environments or non-critical data storage.
+**Characteristics:**
+- Limited redundancy
+- No automatic recovery if the container fails
+- Data since last backup (if available) may be lost if failure occurs
+- Cost-effective for non-production environments
+#### Highly Available (HA) Mode
+Highly Available (HA) Mode creates multiple containers with built-in redundancy. This mode is strongly recommended for production environments and mission-critical data.
+**Characteristics:**
+- Multiple containers distributed across different physical machines
+- Automatic failover and recovery mechanisms
+- Data redundancy and integrity protection
+- Higher reliability and availability
+- Recommended for production use
+:::important
+Database and shared storage services in HA mode have a **fixed number of containers** that cannot be increased or decreased.
+:::
+**Recovery process:**
+In HA mode, when a container or physical machine fails, recovery is handled automatically:
+1. The failed container is disconnected from the cluster
+2. A new container is created on a different physical machine
+3. Data is synchronized from remaining healthy copies
+4. The failed container is removed
+5. Service continues with minimal disruption
+### Fixed Resource Allocation (Docker Services)
+Docker services in Zerops operate differently from other service types:
+#### Docker Service Characteristics
+- **VM-Based Deployment**: Docker services run in virtual machines rather than containers
+- **Fixed Resources**: Unlike other services, Docker services do not support automatic vertical scaling
+- **User-Defined Resources**: Resources are set at creation and remain fixed until manually changed
+- **VM Count Changes**: The number of VMs can be changed, but this requires a VM restart
+- **No Automatic Scaling**: Resource levels do not automatically adjust based on usage
+**Important Considerations for Docker Services:**
+- Initial resource values should be chosen carefully, as they cannot automatically scale
+- Planning for expected peak loads is important when setting resource values
+- Runtime services or Linux containers should be considered instead if dynamic scaling is essential
+- VM restarts cause temporary service disruption when changing VM count or resources
+:::warning
+Docker services use fixed resources that do not automatically scale. Sufficient resources should be allocated at creation to handle expected workload. Additionally, disk space for Docker services can only be increased, not decreased without recreation of the service.
+:::
+## Monitoring Your Infrastructure
+Zerops provides comprehensive monitoring tools in the user interface to track both resource usage and container scaling activities:
+### Resource History Graphs
+Resource and container scaling can be visualized over time:
+- CPU utilization per container
+- RAM usage patterns
+- Disk space consumption
+- Container count changes
+These graphs help understand application resource needs, identify usage patterns, and fine-tune scaling settings for optimal performance and cost efficiency.
+## Troubleshooting
+#### Resource-Related Issues (All Service Types Except Docker)
+**Out of Memory Errors**
+* **Issue:** Application crashes with OOM errors despite resource scaling.
+* **Possible Cause:** Insufficient minimum free RAM setting.
+* **Solution:**
+ - Increase the "Minimum free RAM" setting
+ - Check for memory leaks in the application
+ - Consider setting a higher minimum RAM value
+**Excessive Resource Costs**
+* **Issue:** Resources scaling up but not scaling down efficiently.
+* **Possible Cause:** Scale-down thresholds not optimized.
+* **Solution:**
+ - Review usage patterns in monitoring graphs
+ - Adjust scale-down thresholds to be more aggressive
+ - Set appropriate resource minimums based on base requirements
+#### Runtime Service and Linux Container Issues (Horizontal Scaling)
+**Application Not Working Properly Across Multiple Containers**
+* **Issue:** Application errors or inconsistent behavior when horizontally scaled.
+* **Possible Cause:** Application not designed for distributed operation.
+* **Solution:**
+ - Ensure the application properly handles stateless operation
+ - Implement proper session management across containers
+ - Review and modify application code to support multiple instances
+#### Docker Service Issues
+**Insufficient Resources for Workload**
+* **Issue:** Docker service experiencing performance issues or crashes.
+* **Possible Cause:** Fixed resources inadequate for actual workload.
+* **Solution:**
+ - Since Docker services don't support automatic vertical scaling, a new service with higher resource allocations may be needed
+ - Consider migrating to a runtime service or Linux container if dynamic resource scaling is needed
+*Need help implementing scaling in your project? Join our [Discord community](https://discord.gg/zerops) where our team and other Zerops users can assist you!*
----------------------------------------
@@ -10660,12 +8601,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Gleam > How To > Delete
-
-
-
----------------------------------------
# Gleam > How To > Deploy Process
@@ -11683,12 +9618,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Go > How To > Delete
-
-
-
----------------------------------------
# Go > How To > Deploy Process
@@ -12830,12 +10759,6 @@ Build tools: When you need Maven, Gradle, or other build tools not included by d
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Java > How To > Delete
-
-
-
----------------------------------------
# Java > How To > Deploy Process
@@ -13072,42 +10995,7 @@ Different Zerops projects have no special connection. They can communicate with
# Keydb > How To > Control
-Zerops allows you to stop any service. Stopped services only consume disk.
-## Stop, start and restart KeyDB service in Zerops GUI
-To stop the KeyDB service in Zerops GUI go to the project dashboard and select the **Stop** menu item in the top right corner.
-To start the stopped KeyDB service choose the **Start** item from the same menu.
-To restart the KeyDB service choose the **Restart** item from the same menu.
-## Stop and start KeyDB using zCLI
-zCLI is the Zerops command-line tool. To stop and start the KeyDB service via the command-line, follow these steps:
-1. [Install & setup zCLI](/references/cli)
-2. Run the `zcli service stop` command
-```sh
-Usage:
- zcli service stop [service-id-or-name] [flags]
-Flags:
- -h, --help the enable Zerops subdomain command.
- --project-id string If you have access to more than one project, you must specify the project ID for which the
- command is to be executed.
- --service-id string If you have access to more than one service, you must specify the service ID for which the
- command is to be executed.
-```
-:::info
-zCLI commands are interactive, when you press enter after `zcli service stop`, you will be given a list of your projects and services to choose from.
-:::
-3. Run the `zcli service start` command
-```sh
-Usage:
- zcli service start [{serviceName | serviceId}] [flags]
-Flags:
- -h, --help the service start command.
- --project-id string If you have access to more than one project, you must specify the project ID for which the
- command is to be executed.
- --service-id string If you have access to more than one service, you must specify the service ID for which the
- command is to be executed.
-```
-:::info
-zCLI commands are interactive, when you press enter after `zcli service start`, you will be given a list of your projects and its services to choose from.
-:::
+
----------------------------------------
@@ -13328,12 +11216,6 @@ Flags:
zCLI commands are interactive, when you press enter after `zcli project service-import importYamlPath`, you will be given a list of your projects to choose from.
Maximum size of the `import.yaml` file is 100 kB.
-----------------------------------------
-
-# Keydb > How To > Delete
-
-
-
----------------------------------------
# Keydb > How To > Manage
@@ -13880,12 +11762,6 @@ SELECT @@lower_case_file_system, @@lower_case_table_names;
If you need to change this setting after the database has been initialized, you'll need to create a new MariaDB service with the correct configuration and migrate your data.
:::
-----------------------------------------
-
-# Mariadb > How To > Delete
-
-
-
----------------------------------------
# Mariadb > How To > Export Import Data
@@ -15195,12 +13071,6 @@ zerops:
The default Nginx configuration includes automatic prerender.io support for SEO optimization. When `PRERENDER_TOKEN` is set, Nginx will automatically serve pre-rendered content to search engines and social media crawlers.
See [environment variables](/nginx/how-to/env-variables#prerenderio-support) for configuration details.
-----------------------------------------
-
-# Nginx > How To > Delete
-
-
-
----------------------------------------
# Nginx > How To > Deploy Process
@@ -16252,12 +14122,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Nodejs > How To > Delete
-
-
-
----------------------------------------
# Nodejs > How To > Deploy Process
@@ -16428,6 +14292,12 @@ Zerops creates following environment variables when the Object storage service i
The name of the Object storage service.
+----------------------------------------
+
+# Object Storage > How To > Controls
+
+
+
----------------------------------------
# Object Storage > How To > Create
@@ -16736,12 +14606,6 @@ export SECRET_ACCESS_KEY=your-secret-key
- **File Not Found**: Verify bucket name and file path
- **Script Error**: Ensure the script has execute permissions
-----------------------------------------
-
-# Object Storage > How To > Delete
-
-
-
----------------------------------------
# Object Storage > How To > Update Bucket
@@ -17937,12 +15801,6 @@ zerops:
5. Ensure that the `build.deployFiles` contains the folder with the `siteConfigPath` or add the path to the Apache config file to the `deployFiles` list. Zerops will deploy the file to the runtime container(s).
6. [Trigger](/php/how-to/trigger-pipeline) the build & deploy pipeline.
-----------------------------------------
-
-# Php > How To > Delete
-
-
-
----------------------------------------
# Php > How To > Deploy Process
@@ -18459,12 +16317,6 @@ Flags:
zCLI commands are interactive, when you press enter after `zcli project service-import importYamlPath`, you will be given a list of your projects to choose from.
The maximum size of the `import.yaml` file is 100 kB.
-----------------------------------------
-
-# Postgresql > How To > Delete
-
-
-
----------------------------------------
# Postgresql > How To > Export Import Data
@@ -19608,12 +17460,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Python > How To > Delete
-
-
-
----------------------------------------
# Python > How To > Deploy Process
@@ -25084,12 +22930,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Rust > How To > Delete
-
-
-
----------------------------------------
# Rust > How To > Deploy Process
@@ -26835,12 +24675,6 @@ Shared storage mounts are not available during the runtime prepare phase.
## Troubleshooting
If your `prepareCommands` fail, check the prepare runtime log for specific error messages.
-----------------------------------------
-
-# Ubuntu > How To > Delete
-
-
-
----------------------------------------
# Ubuntu > How To > Deploy Process
diff --git a/apps/docs/static/llms-small.txt b/apps/docs/static/llms-small.txt
index 62bd03fb..d209e5cd 100644
--- a/apps/docs/static/llms-small.txt
+++ b/apps/docs/static/llms-small.txt
@@ -982,12 +982,6 @@ Shared storage mounts are not available during the runtime prepare phase.
## Troubleshooting
If your `prepareCommands` fail, check the prepare runtime log for specific error messages.
-----------------------------------------
-
-# Alpine > How To > Delete
-
-
-
----------------------------------------
# Alpine > How To > Deploy Process
@@ -1984,12 +1978,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Bun > How To > Delete
-
-
-
----------------------------------------
# Bun > How To > Deploy Process
@@ -3289,12 +3277,6 @@ Shared storage mounts are not available during the runtime prepare phase.
## Troubleshooting
If your `prepareCommands` fail, check the [prepare runtime log](/deno/how-to/logs#prepare-runtime-log) for specific error messages.
-----------------------------------------
-
-# Deno > How To > Delete
-
-
-
----------------------------------------
# Deno > How To > Deploy Process
@@ -4540,12 +4522,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Dotnet > How To > Delete
-
-
-
----------------------------------------
# Dotnet > How To > Deploy Process
@@ -5637,12 +5613,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Elixir > How To > Delete
-
-
-
----------------------------------------
# Elixir > How To > Deploy Process
@@ -7287,66 +7257,68 @@ You can configure scaling settings at three different stages:
This flexibility lets you plan scaling strategies upfront or adapt them as requirements evolve.
## Part 1: Resource Management
Resource management in Zerops focuses on efficiently allocating and adjusting CPU, RAM, and disk resources within individual containers based on actual usage patterns.
-### CPU Options
+These resource management capabilities apply to **runtime** services, **databases**, **shared storage**, and **Linux containers** (Alpine and Ubuntu).
+:::note
+Docker services do not support automatic vertical scaling. Resources for Docker services are fixed at the values set manually and do not automatically adjust based on usage.
+:::
+:::tip Disable Scaling for Specific Resources
+To prevent automatic scaling of specific resources, simply set identical minimum and maximum values for CPU, RAM, or Disk.
+:::
+### CPU Settings
+#### CPU Mode
Two CPU allocation modes are available for any service:
-#### Shared CPU
+**Shared CPU**
Shared CPU provides a physical CPU core shared with up to 10 other applications. Performance varies depending on neighbors, ranging from 1/10 to 10/10 power. This option is cost-effective for non-critical workloads, development, and testing environments.
-#### Dedicated CPU
+**Dedicated CPU**
Dedicated CPU gives exclusive access to a full physical CPU core(s), ensuring consistent and predictable performance. This option is ideal for production environments and CPU-intensive applications.
:::tip
CPU mode can be changed (once per hour) as needed.
:::
See the [pricing](/company/pricing#resource-pricing) for the difference between CPU modes.
-### Vertical Scaling
-Vertical scaling adjusts individual resources (CPU, RAM, Disk) within existing containers. When a container needs more/less power, allocated resources are increased/decreased instead of creating a new/removing container.
-This is the preferred scaling method and is attempted first before horizontal scaling.
-These resource management capabilities apply to **runtime** services, **databases**, **shared storage**, and **Linux containers** (Alpine and Ubuntu).
-:::note
-Docker services do not support vertical scaling. Resources for Docker services are fixed at the values set manually and do not automatically adjust based on usage.
-:::
-### Fine-Tuning Resource Allocation
-Resource allocation can be configured through basic and advanced settings:
-#### Minimum and Maximum Resources (Basic)
-Boundaries for CPU cores, RAM, and disk space can be established.
-:::tip Resource Scaling Control
-To prevent scaling of specific resources, simply set identical minimum and maximum values for CPU, RAM, or Disk.
-:::
-#### Start CPU Core Count (Advanced)
-How many CPU cores should be allocated when containers start to ensure reliable and fast startup:
+#### Minimum and Maximum CPU Cores
+Set boundaries for CPU core allocation. Zerops will scale CPU resources within these limits based on actual usage.
+#### Start CPU Core Count
+Determines how many CPU cores are allocated when containers start:
- Default: 2 cores
- Applies to both dedicated and shared CPU modes
- Higher values provide more processing power during application initialization
- After startup, resources are automatically adjusted based on actual usage and limits
-#### RAM Scaling Thresholds (Advanced)
+#### CPU Scaling Thresholds
+For services using [dedicated CPU](#cpu-mode) only, CPU scaling is controlled by:
+**Min. Free CPU Cores (%)**
+- Scale-up is triggered when free capacity drops below a fixed fraction of a single CPU core
+- Default: 10%
+- Set as a percentage of a single core's capacity
+- Example: Setting to 20% means that with one core, at least 20% of that core should remain free
+**Dynamic Min. Free Total Core Percent**
+- Scale-up is triggered when total free capacity across all cores falls below a percentage of total capacity
+- Default: 0% (disabled)
+- Dynamically adjusts as the number of cores changes
+- Ideal for accommodating varying load distributions
+- Example: 20% setting ensures at least 20% of the combined capacity of all cores remains free
+### RAM Settings
+#### Minimum and Maximum RAM
+Set boundaries for RAM allocation. Zerops will scale RAM within these limits based on actual usage.
+#### RAM Scaling Thresholds
RAM usage is monitored every 10 seconds to ensure optimal performance. The minimum free RAM settings serve multiple important purposes: they prevent Out of Memory (OOM) errors, provide space for kernel disk caching (which improves application performance), and maintain a buffer for sudden memory demands.
Swap is enabled for all containers to help prevent OOM errors, but proper minimum free RAM configuration is still essential—especially for services that use large amounts of RAM or benefit from kernel disk caching. Without sufficient free memory, performance may degrade due to increased disk access.
Two threshold types determine RAM scaling:
-1. **Minimum Free RAM (absolute value in GB)**
- - Specifies an absolute threshold for free RAM
- - Additional memory is triggered when available RAM falls below this fixed amount
- - Default: 0.0625 GB (64 MB) for most services
- - Ideal for maintaining system stability and responsiveness
-2. **Minimum Free RAM (% of Granted)**
- - Establishes a dynamic threshold based on a percentage of total granted memory
- - Default: 0% (disabled)
- - The buffer scales proportionally as total memory increases
- - Particularly useful for handling varying loads
+**Minimum Free RAM (absolute value in GB)**
+- Specifies an absolute threshold for free RAM
+- Additional memory is triggered when available RAM falls below this fixed amount
+- Default: 0.0625 GB (64 MB) for most services
+- Ideal for maintaining system stability and responsiveness
+**Minimum Free RAM (% of Granted)**
+- Establishes a dynamic threshold based on a percentage of total granted memory
+- Default: 0% (disabled)
+- The buffer scales proportionally as total memory increases
+- Particularly useful for handling varying loads
:::note
Whichever setting provides more free memory is used.
:::
-#### CPU Scaling Thresholds (Advanced)
-For services using [dedicated CPU](#dedicated-cpu) cores only, CPU scaling is controlled by:
-1. **Min. Free CPU Cores (%)**
- - Scale-up is triggered when free capacity drops below a fixed fraction of a single CPU core
- - Default: 10%
- - Set as a percentage of a single core's capacity
- - Example: Setting to 20% means that with one core, at least 20% of that core should remain free
-2. **Dynamic Min. Free Total Core Percent**
- - Scale-up is triggered when total free capacity across all cores falls below a percentage of total capacity
- - Default: 0% (disabled)
- - Dynamically adjusts as the number of cores changes
- - Ideal for accommodating varying load distributions
- - Example: 20% setting ensures at least 20% of the combined capacity of all cores remains free
+### Disk Settings
+#### Minimum and Maximum Disk
+Set boundaries for disk space allocation. Zerops will scale disk space within these limits based on actual usage.
### Resource Scaling Behavior
Zerops implements an exponential growth pattern ensuring that **resources grow gradually** for minor load increases but can scale rapidly when significant additional capacity is needed. When resource usage triggers scaling, Zerops initially adds smaller increments, but as demand continues to increase, it can add larger increments to quickly meet the needs of your application.
Below are the parameters that control this behavior across all services that support vertical scaling:
@@ -7379,2161 +7351,130 @@ Below are the parameters that control this behavior across all services that sup
300 seconds
Scale-Up Threshold Percentile
- 60
- 50
- 50
-
- Scale-Down Threshold Percentile
- 40
- 50
- 50
-
- Minimum Step
- 1 (0.1 cores)
- 0.125 GB
- 0.5 GB
-
- Maximum Step
- 40
- 32 GB
- 128 GB
-
-## Part 2: Container Architecture — Service-Specific Approaches
-Container architecture in Zerops defines how services are distributed across containers. Different service types use fundamentally different approaches:
-1. **Horizontal Scaling** (Runtime Services, Linux Containers, and Docker)
-2. **Deployment Modes** (Databases and Shared Storage)
-### Horizontal Scaling (Runtime Services, Linux Containers, and Docker)
-Horizontal scaling adds or removes entire containers (or VMs for Docker) as demand fluctuates.
-* When vertical scaling reaches its defined maximum, new containers/VMs are automatically added to handle additional load.
-* As demand decreases, containers/VMs are gradually removed to optimize resource usage.
-:::important HA-ready Applications
-For applications to work properly across multiple containers, they must be designed to be HA-ready.
-:::
-#### Setting Horizontal Scaling Parameters
-To configure horizontal scaling, users need to set the minimum and maximum number of containers:
-- **Minimum Containers**: The baseline number of containers that should always be running (system limit: 1)
-- **Maximum Containers**: The upper limit of containers that can be created during high demand (system limit: 10)
-:::tip Disable Horizontal Scaling
-Setting identical minimum and maximum values creates a fixed number of containers (disables automatic horizontal scaling).
-:::
-### Deployment Modes (Databases and Shared Storage)
-For databases and shared storage services, Zerops offers two deployment modes focused on reliability and data integrity.
-:::warning
-Deployment mode cannot be changed after creation.
-:::
-#### Single Container Mode
-Single Container Mode provides one container with vertical scaling only. This is suitable for development environments or non-critical data storage.
-**Characteristics:**
-- Limited redundancy
-- No automatic recovery if the container fails
-- Data since last backup (if available) may be lost if failure occurs
-- Cost-effective for non-production environments
-#### Highly Available (HA) Mode
-Highly Available (HA) Mode creates multiple containers with built-in redundancy. This mode is strongly recommended for production environments and mission-critical data.
-**Characteristics:**
-- Multiple containers distributed across different physical machines
-- Automatic failover and recovery mechanisms
-- Data redundancy and integrity protection
-- Higher reliability and availability
-- Recommended for production use
-:::important
-Database and shared storage services in HA mode have a **fixed number of containers** that cannot be increased or decreased.
-:::
-**Recovery process:**
-In HA mode, when a container or physical machine fails, recovery is handled automatically:
-1. The failed container is disconnected from the cluster
-2. A new container is created on a different physical machine
-3. Data is synchronized from remaining healthy copies
-4. The failed container is removed
-5. Service continues with minimal disruption
-### Fixed Resource Allocation (Docker Services)
-Docker services in Zerops operate differently from other service types:
-#### Docker Service Characteristics
-- **VM-Based Deployment**: Docker services run in virtual machines rather than containers
-- **Fixed Resources**: Unlike other services, Docker services do not support automatic vertical scaling
-- **User-Defined Resources**: Resources are set at creation and remain fixed until manually changed
-- **VM Count Changes**: The number of VMs can be changed, but this requires a VM restart
-- **No Automatic Scaling**: Resource levels do not automatically adjust based on usage
-**Important Considerations for Docker Services:**
-- Initial resource values should be chosen carefully, as they cannot automatically scale
-- Planning for expected peak loads is important when setting resource values
-- Runtime services or Linux containers should be considered instead if dynamic scaling is essential
-- VM restarts cause temporary service disruption when changing VM count or resources
-:::warning
-Docker services use fixed resources that do not automatically scale. Sufficient resources should be allocated at creation to handle expected workload. Additionally, disk space for Docker services can only be increased, not decreased without recreation of the service.
-:::
-## Monitoring Your Infrastructure
-Zerops provides comprehensive monitoring tools in the user interface to track both resource usage and container scaling activities:
-### Resource History Graphs
-Resource and container scaling can be visualized over time:
-- CPU utilization per container
-- RAM usage patterns
-- Disk space consumption
-- Container count changes
-These graphs help understand application resource needs, identify usage patterns, and fine-tune scaling settings for optimal performance and cost efficiency.
-## Troubleshooting
-#### Resource-Related Issues (All Service Types Except Docker)
-**Out of Memory Errors**
-* **Issue:** Application crashes with OOM errors despite resource scaling.
-* **Possible Cause:** Insufficient minimum free RAM setting.
-* **Solution:**
- - Increase the "Minimum free RAM" setting
- - Check for memory leaks in the application
- - Consider setting a higher minimum RAM value
-**Excessive Resource Costs**
-* **Issue:** Resources scaling up but not scaling down efficiently.
-* **Possible Cause:** Scale-down thresholds not optimized.
-* **Solution:**
- - Review usage patterns in monitoring graphs
- - Adjust scale-down thresholds to be more aggressive
- - Set appropriate resource minimums based on base requirements
-#### Runtime Service and Linux Container Issues (Horizontal Scaling)
-**Application Not Working Properly Across Multiple Containers**
-* **Issue:** Application errors or inconsistent behavior when horizontally scaled.
-* **Possible Cause:** Application not designed for distributed operation.
-* **Solution:**
- - Ensure the application properly handles stateless operation
- - Implement proper session management across containers
- - Review and modify application code to support multiple instances
-#### Docker Service Issues
-**Insufficient Resources for Workload**
-* **Issue:** Docker service experiencing performance issues or crashes.
-* **Possible Cause:** Fixed resources inadequate for actual workload.
-* **Solution:**
- - Since Docker services don't support automatic vertical scaling, a new service with higher resource allocations may be needed
- - Consider migrating to a runtime service or Linux container if dynamic resource scaling is needed
-*Need help implementing scaling in your project? Join our [Discord community](https://discord.gg/zerops) where our team and other Zerops users can assist you!*
-
-----------------------------------------
-
-# Frameworks > Laravel
-
-# Laravel in Zerops
-> Modern Laravel development demands infrastructure that doesn't get in your way. Zerops provides the foundation that lets you focus on building great apps, not wrestling with environment configuration or resource management.
-## Why Zerops for Laravel?
-Zerops implements what we call "transparent infrastructure" - you get enterprise-grade capabilities with development-friendly ergonomics. This means:
-- **Full system access** across all environments
-- **Granular resource control** starting at 0.125GB RAM
-- **True environment parity** from local to production
-- **Zero-downtime deployments** by default
-*No artificial limitations, no framework-specific compromises - just solid infrastructure that lets Laravel do what it does best.*
-:::tip
-New Zerops accounts receive $15 in free credits for testing. After verifying your account with a $10 initial payment, you'll get an additional $50 in credits.
-:::
-## Quick Start
-Choose a recipe that matches your needs and deploy with a single click. Each recipe sets up a complete environment with all necessary services preconfigured.
-All recipes include:
-- **PHP 8.3 + Nginx**
-- **PostgreSQL 16**
-- **L3/L7 balancers**
-- **Logging & metrics**
-
- The most bare-bones examples of Laravel app including core services + PostgreSQL.
-
- A full-stack setup including Redis, Object Storage, and Mailpit.
-
- Admin panel optimized setup including Redis, Object Storage, and Mailpit.
-
- Content management focused setup including Redis, Object Storage, and Mailpit.
-
-## Core Features
-### Infrastructure and Security
-Each project runs in its own isolated network with enterprise-level security features automatically configured.
-What makes this special is how it combines security with simplicity - this infrastructure requires zero configuration from you – it's all handled automatically when you create your project.
-### Native Service Discovery
-Services within your project communicate seamlessly using internal hostnames:
-```php title=".env"
-DB_HOST=${db_hostname}
-REDIS_HOST=${cache_hostname}
-```
-*Environment variables are automatically injected and synchronized across all containers.*
-### Intelligent Scaling
-One of Zerops' most powerful features is its intelligent autoscaling system, which:
-* Scales resources (CPU, RAM, Disk) up and down based on actual usage
-* Maintains minimum required resources to optimize costs
-* Handles both vertical and horizontal scaling automatically
-* Manages disk space dynamically (a unique feature in the industry)
-Through a simple configuration, you define resource boundaries while Zerops automatically handles the complex scaling decisions:
-```yaml
-# Example scaling configuration
-services:
- - hostname: app
- minContainers: 2
- maxContainers: 6
- cpu:
- min: 1
- max: 4
- ram:
- min: 0.25
- max: 4
-```
-### Zero-Downtime Deployments
-Deploy with confidence using our battle-tested pipeline:
-```yaml title="zerops.yaml"
-zerops:
- - setup: app
- build:
- base: php@8.3
- buildCommands:
- - composer install --no-dev --optimize-autoloader
- deployFiles: ./
- cache: vendor
- run:
- base: php-nginx@8.3
- initCommands:
- - php artisan config:cache
- - php artisan route:cache
- - php artisan migrate --force --isolated
-```
-### High Availability
-Every service can run in HA mode with automatic failover.
-```yaml
-services:
- - hostname: db
- type: postgresql@16
- mode: HA # Automatic primary-replica setup
- - hostname: cache
- type: valkey@7.2
- mode: HA # Redis cluster configuration
-```
-Setting up a production-grade HA database cluster typically requires deep DevOps expertise. Zerops automates this complexity, giving you an enterprise-grade setup with a single configuration flag:
-* **Database Cluster** distributed across multiple physical servers
-* **Automatic failover** and data replication
-* **Enhanced performance** through load distribution
-* **Production-grade reliability** out of the box
-## Development Workflow
-### Team Collaboration
-Zerops enables seamless team development through:
-* **Declarative Infrastructure** - version control your entire setup
-* **Identical Environments** - every team member gets production-parity
-* **Automated Setup** - new team members are productive in minutes
-* **Transparent Configuration** - easily review and audit changes
-### Local Development
-Connect to your production-grade databases without any local setup through Zerops' VPN.
-Start with
-```
-zcli vpn up
-```
-and select your project. Get your database credentials from the service's **Access details** in your project dashboard and update your local `.env`. See PostgreSQL example below:
-```yaml
-DB_CONNECTION=pgsql
-DB_HOST=db.zerops # References the service's hostname
-DB_PORT=5432
-DB_DATABASE=db
-DB_USERNAME=db
-DB_PASSWORD=[password from Access details]
-```
-With this configuration, you can use any database tool - no local installation needed.
-### Deployment Options
-Choose the workflow that fits your team:
-1. **GitHub/GitLab Integration**
- - Automatic deployments on push/merge
- - Branch-specific environments
- - Build caching and artifacts
-2. **CLI-Driven Pipeline**
- ```bash
- # Deploy from your terminal
- zcli push
- ```
-3. **Manual Triggers**
- - Deploy specific versions
- - Roll back to previous states
- - Test deployment configurations
-## Next Steps
-- [Environment Variables](/frameworks/laravel/env-variables)
-- [Database Migrations](/frameworks/laravel/migrations)
-- [Cache & Queue with Redis](/frameworks/laravel/redis)
-- [Schedule Jobs & CRON](//frameworks/laravel/cron)
-- [SMTP Configuration](/frameworks/laravel/smtp)
-- [Logs](/frameworks/laravel/logs)
-## Resources
-- [Laravel Documentation](https://laravel.com/docs)
-- [Laravel Recipe Repository](https://github.com/zeropsio/recipe-laravel-minimal)
-- [zCLI Documentation](/references/cli)
-*Need help? Join our [Discord community](https://discord.gg/zeropsio) or check out our [quickstart guide](/frameworks/laravel/introduction).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Cron
-
-Zerops provides a convenient way for managing scheduled tasks through CRON jobs, configured directly in your `zerops.yaml` file. These tasks can be scheduled to run on single or multiple containers with granular timing control.
-## Basic Configuration
-Cron jobs are defined in the `run.crontab` section of your `zerops.yaml`. Each job requires two essential parameters:
-- **command**: The command to execute
-- **timing**: The CRON schedule expression
-```yaml
-run:
- crontab:
- - command: "date >> /var/log/cron.log"
- timing: "0 * * * *"
-```
-This example logs the current timestamp every hour.
-:::tip Detailed Configuration
-For comprehensive configuration options and examples, refer to our [CRON configuration guide](/zerops-yaml/cron).
-:::
-## Common Implementation Patterns
-### Laravel Scheduler
-To run Laravel's scheduler, configure it to execute every minute:
-```yaml
-run:
- crontab:
- - command: "php artisan schedule:run"
- timing: "* * * * *"
- workingDir: /var/www/html
-```
-### Cleanup Tasks
-Execute maintenance tasks on all containers:
-```yaml
-run:
- crontab:
- - command: "rm -rf /tmp/*"
- timing: "0 0 * * *"
- allContainers: true
-```
-### Multiple Jobs
-Configure multiple scheduled tasks within a single service:
-```yaml
-run:
- crontab:
- - command: "php artisan schedule:run"
- timing: "* * * * *"
- workingDir: /var/www/html
-
- - command: "php artisan cache:clear"
- timing: "0 0 * * *"
- workingDir: /var/www/html
-
- - command: "php artisan queue:restart"
- timing: "0 */6 * * *"
- workingDir: /var/www/html
-```
-## Best Practices
-1. **Log Output**: Implement comprehensive logging for debugging and monitoring:
- ```yaml
- command: "php artisan schedule:run >> /var/log/scheduler.log 2>&1"
- ```
-2. **Working Directory**: Always specify `workingDir` for Laravel commands to ensure they are executed from the correct location.
-3. **Container Selection**: Use `allContainers: true` carefully to avoid duplicate operations in a multi-container setup.
-4. **Timing Considerations**: Schedule intensive tasks during off-peak hours.
-## Monitoring
-Enable detailed scheduler [logging](/frameworks/laravel/logs) in your `.env`:
-```
-LOG_CHANNEL=daily
-```
-
-----------------------------------------
-
-# Frameworks > Laravel > Env Variables
-
-Zerops manages environment variables without requiring manual `.env` files, enabling application deployment across different environments (development, staging, production) while keeping environment-specific configurations isolated from your code.
-Read more about how [environment variables](/features/env-variables) work in Zerops.
-## Laravel Environment Variables in Zerops
-### Secret Variables
-Some Laravel variables contain sensitive information that should never be exposed as plain text. Manage these using Zerops Secret Variables by:
-* Creating and managing them through the Zerops GUI
-* Defining them in a configuration file when importing a project or service (allows [automatic generation](#automatic-generation-during-import))
-When importing a project or service, you can define secret variables directly in your import configuration:
-```yaml
-services:
- - hostname: app
- type: php-nginx@8.4
- envSecrets:
- APP_KEY: your-secret-key
-```
-:::tip
-Secret variables can be updated at any time without requiring application redeployment.
-:::
-#### Automatic Generation During Import
-If you prefer to have certain secrets **generated automatically**, you can use the [yaml preprocessor](/references/import-yaml/pre-processor). This is optional and only available during import:
-```yaml
-#yamlPreprocessor=on
-services:
- - hostname: app
- type: php-nginx@8.4
- envSecrets:
- APP_KEY: )>
-```
-### Runtime Variables
-These variables, defined in `zerops.yaml`, are typically environment-specific but not sensitive.
-:::note
-Changes to runtime variables require application redeployment to take effect.
-:::
-Below is a complete working example of `envVariables` in `zerops.yaml` (sourced from [Laravel Jetstream recipe](https://github.com/zeropsio/recipe-laravel-jetstream/blob/main/zerops.yaml)):
-```yaml title="zerops.yaml"
-run:
- envVariables:
- APP_LOCALE: en
- APP_FAKER_LOCALE: en_US
- APP_FALLBACK_LOCALE: en
- APP_MAINTENANCE_DRIVER: file
- APP_MAINTENANCE_STORE: database
- APP_TIMEZONE: UTC
- APP_URL: ${zeropsSubdomain} # References generated variable
- ASSET_URL: ${APP_URL}
- VITE_APP_NAME: ${APP_NAME}
- # PostgreSQL connection settings
- DB_CONNECTION: pgsql
- DB_DATABASE: db
- DB_HOST: db # References database service hostname
- DB_PASSWORD: ${db_password} # References database password
- DB_PORT: 5432
- DB_USERNAME: ${db_user} # References database user
- # S3-compatible object storage settings
- AWS_ACCESS_KEY_ID: ${storage_accessKeyId}
- AWS_REGION: us-east-1
- AWS_BUCKET: ${storage_bucketName} # References bucket name of service 'storage'
- AWS_ENDPOINT: ${storage_apiUrl}
- AWS_SECRET_ACCESS_KEY: ${storage_secretAccessKey} # Safely references secret
- AWS_URL: ${storage_apiUrl}/${storage_bucketName}
- AWS_USE_PATH_STYLE_ENDPOINT: true
- FILESYSTEM_DISK: s3
- # Logging Configuration
- LOG_CHANNEL: syslog
- LOG_LEVEL: debug
- LOG_STACK: single
- # SMTP settings for email delivery
- MAIL_FROM_ADDRESS: hello@example.com
- MAIL_FROM_NAME: ZeropsLaravel
- MAIL_HOST: mailpit # References mail service hostname
- MAIL_MAILER: smtp
- MAIL_PORT: 1025
- # Redis-based caching and session management
- BROADCAST_CONNECTION: redis
- CACHE_PREFIX: cache
- CACHE_STORE: redis
- QUEUE_CONNECTION: redis
- REDIS_CLIENT: phpredis
- REDIS_HOST: valkey # References Redis service hostname
- REDIS_PORT: 6379
- SESSION_DRIVER: redis
- SESSION_ENCRYPT: false
- SESSION_LIFETIME: 120
- SESSION_PATH: /
- # Security Configuration
- BCRYPT_ROUNDS: 12
- TRUSTED_PROXIES: "*"
-```
-Let's look at variable configurations that may need additional context and where to find detailed implementation guides:
-#### Application Configuration
-Core application settings that define your Laravel app's identity, URL structure, and environment parameters. Reference environment variables from the same service.
-```yaml
-APP_URL: ${zeropsSubdomain} # zeropsSubdomain variable is system generated
-ASSET_URL: ${APP_URL}
-VITE_APP_NAME: ${APP_NAME} # APP_NAME variable was created during import (envSecrets)
-```
-#### Database Configuration
-Essential database connection parameters that securely reference your PostgreSQL service `db` by hostname and its variables - `password` and `user`.
-It is safe to store `DB_PASSWORD` in `envVariables` by reference as it does not contain the sensitive value itself.
-```yaml
-DB_HOST: db
-DB_PASSWORD: ${db_password}
-DB_USERNAME: ${db_user}
-```
-Read more about [database management](/frameworks/laravel/migrations) for Laravel in Zerops.
-#### Storage Configuration
-S3-compatible object storage settings that enable efficient file handling and asset management in your Laravel application. Reference variables of Object storage service called `storage`.
-```yaml
-AWS_ACCESS_KEY_ID: ${storage_accessKeyId}
-AWS_REGION: us-east-1
-AWS_BUCKET: ${storage_bucketName}
-AWS_ENDPOINT: ${storage_apiUrl}
-AWS_SECRET_ACCESS_KEY: ${storage_secretAccessKey}
-AWS_URL: ${storage_apiUrl}/${storage_bucketName}
-AWS_USE_PATH_STYLE_ENDPOINT: true
-FILESYSTEM_DISK: s3
-```
-Read more about [object storage](/object-storage/overview) in Zerops.
-#### Logging Configuration
-System monitoring and debugging configuration that determines how your application tracks events and errors. Use `syslog` channel to access logs from Zerops Dashboard.
-```
-LOG_CHANNEL: syslog
-```
-Learn how to properly [configure logging](/frameworks/laravel/logs) for Laravel in Zerops.
-#### Mail Configuration
-SMTP server settings that enable your application to send emails through a dedicated mail service. Reference service `mailpit` by hostname.
-```
-MAIL_HOST: mailpit
-```
-Learn how to properly [configure SMTP](/frameworks/laravel/smtp) for Laravel in Zerops.
-#### Cache and Session
-Redis-based configuration for handling application caching, queues, and session management to optimize performance. Reference service `valkey` by hostname.
-```
-REDIS_HOST: valkey
-```
-Learn how to properly [configure cache, queue & session management](/frameworks/laravel/redis) for Laravel in Zerops.
-:::tip
-For automatic execution with each deploy, add these commands to the `initCommands` section of your `zerops.yaml` file.
-```yaml title="zerops.yaml"
-initCommands:
- - php artisan view:cache
- - php artisan config:cache
- - php artisan route:cache
-```
-:::
-
-----------------------------------------
-
-# Frameworks > Laravel > Faq
-
- Question: How do I configure environment variables?
-Answer:
- You can set environment variables through the Zerops dashboard or in your `zerops.yaml` file under the `run.envVariables` section:
- ```yaml
- zerops:
- - setup: app
- run:
- envVariables:
- APP_KEY: "base64:your-key-here"
- DB_CONNECTION: "pgsql"
- DB_HOST: ${db_host}
- ```
-
- Question: How do I run database migrations?
-Answer:
- You can run migrations during initialization by adding the command to your `zerops.yaml`:
- ```yaml
- zerops:
- - setup: app
- run:
- initCommands:
- - php artisan migrate --isolated --force
- ```
-
- Question: Can I use Laravel queue with Zerops?
-Answer:
- Yes, Laravel Queue is fully supported. Configure Redis as your queue driver:
- ```yaml
- zerops:
- - setup: app
- run:
- envVariables:
- QUEUE_CONNECTION: redis
- REDIS_HOST: redis
- REDIS_PORT: 6379
- ```
-
- Question: How do I handle file storage?
-Answer:
- Zerops supports S3-compatible storage. Configure it using these environment variables:
- ```yaml
- zerops:
- - setup: app
- run:
- envVariables:
- FILESYSTEM_DISK: s3
- AWS_ACCESS_KEY_ID: ${storage_accessKeyId}
- AWS_SECRET_ACCESS_KEY: ${storage_secretAccessKey}
- AWS_BUCKET: ${storage_bucketName}
- AWS_ENDPOINT: ${storage_apiUrl}
- AWS_URL: ${storage_apiUrl}/${storage_bucketName}
- AWS_USE_PATH_STYLE_ENDPOINT: true
- ```
-
- Question: How do I enable HTTPS?
-Answer:
- HTTPS is automatically enabled when you use either a Zerops subdomain or configure your custom domain. No additional configuration is required.
-
- Question: Can I run scheduled tasks?
-Answer:
- Yes, you can configure cron jobs in your `zerops.yaml`:
- ```yaml
- zerops:
- - setup: app
- run:
- crontab:
- - command: "php artisan schedule:run"
- timing: "* * * * *"
- workingDir: /var/www/html
- ```
-
- Question: How do I configure Redis for caching?
-Answer:
- Configure Redis for caching, sessions, and queues:
- ```yaml
- zerops:
- - setup: app
- run:
- envVariables:
- CACHE_STORE: redis
- SESSION_DRIVER: redis
- REDIS_HOST: redis
- REDIS_PORT: 6379
- REDIS_CLIENT: phpredis
- ```
-
- Question: How do I optimize my Laravel application?
-Answer:
- Add these optimization commands to your initialization:
- ```yaml
- zerops:
- - setup: app
- run:
- initCommands:
- - php artisan view:cache
- - php artisan config:cache
- - php artisan route:cache
- - php artisan optimize
- ```
-
- Question: How do I handle asset compilation?
-Answer:
- Configure asset compilation in your build phase:
- ```yaml
- zerops:
- - setup: app
- build:
- base:
- - php@8.4
- - nodejs@18
- buildCommands:
- - composer install --optimize-autoloader --no-dev
- - npm install
- - npm run build
- cache:
- - vendor
- - node_modules
- ```
-
- Question: How do I implement health checks?
-Answer:
- Add health checks to ensure your application is running properly:
- ```yaml
- zerops:
- - setup: app
- deploy:
- readinessCheck:
- httpGet:
- port: 80
- path: /up
- run:
- healthCheck:
- httpGet:
- port: 80
- path: /up
- ```
-
-
-----------------------------------------
-
-# Frameworks > Laravel > Introduction
-
- Deploy the same Laravel setup as in this tutorial with a single click. All you need is a Zerops account.
-
-## Introduction
-In this tutorial, you'll learn how to deploy a Laravel application in Zerops. We'll configure a complete environment using Apache as the web server and PostgreSQL as the database.
-By the end of this tutorial, you will:
-- Have a fresh Laravel installation running locally
-- Set up a Zerops project with Apache and PostgreSQL
-- Configure zero-downtime deployment with environment variables
-- Deploy a production-ready Laravel application with Zerops subdomain access
-- Set up secure VPN access to your PostgreSQL database
-## Prerequisites
-This tutorial assumes you have:
-* PHP, Composer, git installed locally
-* [Zerops account](https://app.zerops.io/signup)
-* [zcli](/references/cli) tool installed
-:::note
-You don't need to install PostgreSQL locally - Zerops VPN lets you connect directly to the remote database for development.
-:::
-## Step 1 — Creating a New Laravel Project
-Let's start by creating a fresh Laravel project:
-```bash
-composer create-project laravel/laravel zerops-laravel
-cd zerops-laravel
-```
-Let's verify everything works locally. Start Laravel's development server:
-```bash
-php artisan serve
-```
-Visit http://localhost:8000 in your browser. You should see Laravel's welcome page.
-:::tip
-While we're using Laravel's built-in server for simplicity, you can use any local development setup you prefer (Valet, Sail, XAMPP, etc.).
-:::
-If you see the welcome page, great! Your local setup is working correctly.
-## Step 2 — Setting Up Your Zerops Project
-### Log in to zcli
-[Log in](/references/cli#personal-access-tokens) to zcli with your **Personal access token**.
-### Create Project Configuration
-When you create a project in Zerops, you get a production-grade infrastructure with automated security, load balancing, and SSL management. Each project runs in its own isolated network where services communicate securely using simple hostnames, all accessible through VPN for seamless local development.
-Learn more about infrastructure features in documentation section [Project & Services Structure](/features/infrastructure).
-#### Project Configuration File
-The project configuration defines your infrastructure using YAML. This approach provides clear, reproducible configuration that can be version controlled. Later in this tutorial, we'll also show how to achieve the same using the GUI.
-Create a new file in your project root called `zerops-project-import.yaml` with the following content:
-```yaml title="zerops-project-import.yaml"
-#yamlPreprocessor=on
-project:
- name: laravel-zerops
- tags:
- - zerops-tutorial # tag for easy filtering (optional)
-services:
- - hostname: app
- type: php-apache@8.4
- envSecrets:
- # yamlPreprocessor feat: generates a random 32 char and stores it
- APP_KEY: )>
- - hostname: db
- type: postgresql@16
- mode: HA # High Availability mode for robust production setup
-```
-:::tip Generate secrets
-The `#yamlPreprocessor=on` directive enables Zerops' [YAML preprocessing](/references/import-yaml/pre-processor) for this import file, allowing us to use dynamic values and built-in functions like `generateRandomString`.
-:::
-#### Automatic Resource Management
-Zerops features intelligent autoscaling that manages all resources (CPU, RAM, Disk) based on actual usage, automatically scaling up and down to optimize costs while maintaining performance.
-In this guide, we'll use default scaling ranges and that's why you won't find resource configurations in the import file. See [current ranges](/php/how-to/scaling#basic-settings) for horizontal and vertical scaling of PHP services.
-#### High-Availability Database
-In this guide, [enabling HA mode](/postgresql/how-to/scale) creates a database cluster across three physical servers, with all the complexity managed automatically by Zerops.
-Through Zerops VPN, you can securely access this database setup directly from your local machine, ensuring your development environment matches production exactly.
-#### Import the Project
-Now create the project by running:
-```bash
-zcli project project-import zerops-project-import.yaml
-```
-### Alternative: Creating Project via GUI
-You can also create and configure your project through the Zerops dashboard:
-1. Log into your [Zerops Dashboard](https://app.zerops.io)
-2. Click **Add new project**
-3. Set a project name (e.g., "laravel-zerops") and click **Create project**
-Then add the required services:
-1. **PHP + Apache Service:**
- - Click **Add Service** and select **PHP+Apache**
- - Set hostname to "app"
- - Keep all other settings as default
-2. **PostgreSQL Service:**
- - Click **Add Service** and select **PostgreSQL**
- - Set hostname to "db"
- - Keep all other settings as default
-## Step 3 — Configuring Your Application
-The [deployment configuration](/zerops-yaml/specification) controls how your application builds and runs. Create a `zerops.yaml` file in your project root:
-```yaml title="zerops.yaml"
-zerops:
- - setup: app
- build:
- base:
- - php@8.4
- buildCommands:
- - composer install --ignore-platform-reqs
- deployFiles: ./
- cache:
- - vendor
- - composer.lock
- deploy:
- readinessCheck:
- httpGet:
- port: 80
- path: /up
- run:
- base: php-apache@8.4
- envVariables:
- APP_NAME: "Laravel Zerops Demo"
- APP_DEBUG: false
- APP_ENV: production
- APP_URL: ${zeropsSubdomain}
- DB_CONNECTION: pgsql
- DB_HOST: db
- DB_PORT: 5432
- DB_DATABASE: db
- DB_USERNAME: ${db_user}
- DB_PASSWORD: ${db_password}
- LOG_CHANNEL: stack
- LOG_LEVEL: debug
- SESSION_DRIVER: database
- initCommands:
- - php artisan config:cache
- - php artisan route:cache
- - php artisan migrate --force --isolated
- - php artisan optimize
- healthCheck:
- httpGet:
- port: 80
- path: /up
-```
-Let's break down some important parts of this configuration:
-### Environment Variables
-Zerops automatically generates and securely manages various environment variables. For example, `zeropsSubdomain` provides your application's URL, while database credentials `user` and `password` are variables of the `db` service. It is possible to reference any variable or a service by hostname within your project's private network.
-```yaml
-APP_URL: ${zeropsSubdomain} # Automatically set to your app's Zerops URL
-DB_USERNAME: ${db_user} # Database credentials auto-injected
-DB_PASSWORD: ${db_password} # Securely managed by Zerops
-```
-Learn more about [environment variables](/frameworks/laravel/env-variables) for Laravel.
-### Safe Database Migrations
-```yaml
-php artisan migrate --force --isolated
-```
-The `--isolated` flag prevents multiple servers from running migrations simultaneously by using a cache lock, ensuring safe database updates during deployment.
-### Health Checks
-The health check configuration ensures your application is running correctly:
-```yaml
- readinessCheck:
- httpGet:
- port: 80
- path: /up
- ...
- healthCheck:
- httpGet:
- port: 80
- path: /up
-```
-By default, latest version of Laravel responds with a 200 OK status on the `/up` endpoint, so no additional configuration is needed.
-## Step 4 — Deploying Your Application
-Now comes the exciting part - deploying your application to Zerops!
-### Deploying Your Code
-Initialize git in your project directory:
-```bash
-git init
-```
-:::note
-Git is required to track changes for deployment. You don't need to commit, but initializing git helps Zerops manage the deployment files.
-:::
-Push your code to Zerops, select your project and service when prompted:
-```bash
-zcli push
-```
-### Monitoring the Deployment
-1. Go to the [Zerops Dashboard](https://app.zerops.io)
-2. In the top-left corner, you'll see a circle with **running process** text
-3. Click it to see the build progress overview
-4. Click **Open pipeline detail** button to view the detailed build process
-You'll see the deployment progress with timing for each step:
-- Initializing build container
-- Running build commands from zerops.yaml
-- Creating app version and upgrading PHP+Apache service
-The entire process usually takes less than a minute to complete.
-## Step 5 — Verifying Your Deployment
-Once the deployment completes, let's verify everything works:
-1. Go to your project's app service
-2. Click on **Public access & internal ports**
-3. Find the **Public Access through zerops.app Subdomain** section
-4. Toggle **Enable Zerops Subdomain Access**
-5. Click the generated URL (e.g., `https://app-xxx.prg1.zerops.app`) to view your application
-:::note
-The Zerops subdomain is perfect for testing and development, but for production, you should [set up your own domain](/references/networking/public-access#custom-domain-access) under **Public Access through Your Domains**.
-:::
-### Testing Database Connectivity
-Let's create a quick route to test database connectivity. Add this to your `routes/web.php`:
-```php
-Route::get('/db-test', function () {
- session()->save();
- return 'Current number of active sessions in database: ' . Illuminate\Support\Facades\DB::table('sessions')->count();
-});
-```
-Deploy this change:
-```bash
-zcli push
-```
-Visit `{your-app-url}/db-test` to verify database connectivity.
-## Accessing Your Database Locally
-Once your application is deployed, you might want to access the database directly from your local machine. Zerops makes this easy with VPN access.
-### Setting up VPN Access
-1. Start the VPN connection:
-```bash
-zcli vpn up
-```
-2. Select your project when prompted
-3. Try http://app.zerops/ to verify connectivity.
-That's it! You now have direct access to all services in your project.
-### Connecting to Database
-To get your database credentials:
-1. Go to the PostgreSQL service in your project
-2. Click **Access details** button
-3. Here you'll find all connection details including hostname, port, user, and password
-Update your local `.env` file with these credentials:
-```ini
-DB_CONNECTION=pgsql
-DB_HOST=db.zerops
-DB_PORT=5432
-DB_DATABASE=db
-DB_USERNAME=db
-DB_PASSWORD=[password from Access details]
-```
-Now you can use your favorite database management tool or run artisan commands while working with the database in Zerops - no local PostgreSQL installation needed!
-## Next Steps
-Now that your Laravel application is running in Zerops, consider:
-1. Setting up a [custom domain](/references/networking/public-access#custom-domain-access)
-2. Implementing basic CI/CD pipelines with [GitHub](/references/github-integration) or [GitLab](/references/gitlab-integration) integration
-3. Setting up [object storage](/object-storage/overview)
-## Conclusion
-Congratulations! 🎉 You've successfully deployed a Laravel application in Zerops with Apache and PostgreSQL. Your application is now running in a production-ready environment with automated builds and deployments.
-### Additional Resources
-- [Laravel Documentation](https://laravel.com/docs)
-- [Laravel Recipe Repository](https://github.com/zeropsio/recipe-laravel-minimal)
-- [zCLI Documentation](/references/cli)
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Logs
-
-Zerops provides comprehensive logging capabilities for Laravel applications using its distributed logging architecture. This guide shows you how to set up and optimize Laravel logging in Zerops, ensuring your application logs are properly captured and accessible.
-## Accessing Logs
-Learn how to [access and view your logs](/php/how-to/logs) in Zerops.
-## Configuration
-### Zerops Environment Variables
-Laravel logging in Zerops is configured through environment variables, such as:
-- `LOG_CHANNEL`: Specifies which logging channel to use (e.g., 'syslog', 'stack')
-- `LOG_STACK`: When using the stack channel, defines which channels to include
-- `LOG_LEVEL`: Sets the minimum log level to capture (e.g., 'debug', 'info', 'error')
-```yaml title="zerops.yaml"
-zerops:
- - setup: app
- run:
- envVariables:
- LOG_CHANNEL: syslog
- LOG_LEVEL: debug
- LOG_STACK: single
-```
-:::tip Available Log Channels
-Laravel supports several logging channels out of the box:
-- **stack**: Aggregates multiple logging channels into a single channel
-- **single**: Writes logs to a single file (storage/logs/laravel.log)
-- **daily**: Creates daily rotating log files
-- **syslog**: Writes to system log (recommended for Zerops)
-- **stderr**: Writes to PHP's standard error output stream
-- **errorlog**: Uses PHP's error_log function
-- **slack**: Sends log messages to Slack
-- **papertrail**: Sends logs to Papertrail
-- **mongodb**: Stores logs in MongoDB (requires additional package)
-:::
-To use multiple logging channels, [configure](#laravel-configuration) the stack channel:
-```yaml
-LOG_CHANNEL: stack
-LOG_STACK: syslog,daily
-```
-This configuration logs to both syslog (for Zerops) and daily files (for local access).
-:::tip
-Using appropriate log levels makes it easier to filter and find relevant messages in the Zerops GUI.
-:::
-### Laravel Configuration
-While Zerops is configured through environment variables, these variables are interpreted by Laravel's logging system. By default, Laravel includes a logging configuration that works out of the box - you don't need to modify anything.
-If you're curious about the underlying configuration or need to customize it beyond environment variables, here's what Laravel's logging configuration typically looks like:
-
-```php title="config/logging.php"
- env('LOG_CHANNEL', 'stack'),
- 'deprecations' => [
- 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
- 'trace' => env('LOG_DEPRECATIONS_TRACE', false),
- ],
- 'channels' => [
- 'stack' => [
- 'driver' => 'stack',
- 'channels' => explode(',', env('LOG_STACK', 'single')),
- 'ignore_exceptions' => false,
- ],
- 'single' => [
- 'driver' => 'single',
- 'path' => storage_path('logs/laravel.log'),
- 'level' => env('LOG_LEVEL', 'debug'),
- 'replace_placeholders' => true,
- ],
- 'daily' => [
- 'driver' => 'daily',
- 'path' => storage_path('logs/laravel.log'),
- 'level' => env('LOG_LEVEL', 'debug'),
- 'days' => env('LOG_DAILY_DAYS', 14),
- 'replace_placeholders' => true,
- ],
- 'stderr' => [
- 'driver' => 'monolog',
- 'handler' => StreamHandler::class,
- 'with' => [
- 'stream' => 'php://stderr',
- ],
- 'level' => env('LOG_LEVEL', 'debug'),
- ],
- 'syslog' => [
- 'driver' => 'syslog',
- 'level' => env('LOG_LEVEL', 'debug'),
- ],
- 'errorlog' => [
- 'driver' => 'errorlog',
- 'level' => env('LOG_LEVEL', 'debug'),
- ],
- ],
-];
-```
-### Using Logs
-Laravel provides several ways to write log messages:
-```php
-// Using facade
-use Illuminate\Support\Facades\Log;
-Log::emergency($message);
-Log::alert($message);
-Log::critical($message);
-Log::error($message);
-Log::warning($message);
-Log::notice($message);
-Log::info($message);
-Log::debug($message);
-// Using helper function
-logger()->info($message);
-logger($message); // defaults to info level
-// With context data
-Log::info('User failed to login.', ['id' => $user->id]);
-```
-
-----------------------------------------
-
-# Frameworks > Laravel > Migrations
-
-Database migrations are **version control** for your database schema, allowing you to evolve your database structure alongside your application versions. Each migration represents a specific version change in your application's database schema, ensuring your database structure stays synchronized with your codebase as your application evolves.
-This guide covers how to implement and manage these version-based database changes in Zerops, focusing on PostgreSQL as the recommended database system.
-## Environment Configuration
-Configure your database connection in your environment variables:
-```yaml
-zerops:
- - setup: app
- run:
- envVariables:
- DB_CONNECTION: pgsql
- DB_HOST: ${db_hostname}
- DB_PORT: 5432
- DB_DATABASE: myapp
- DB_USERNAME: ${db_user}
- DB_PASSWORD: ${db_password}
-```
-:::warning Backup your data
-Before running migrations in production, it's strongly recommended to back up your database. Zerops provides automated daily backups - see our [backup documentation](/features/backup) for details.
-:::
-## Running Migrations
-### Automatic Migrations
-The most reliable way to manage migrations in your deployment pipeline is through automatic execution. Configure this in your `zerops.yaml`:
-```yaml title="zerops.yaml"
-zerops:
- - setup: app
- run:
- initCommands:
- - php artisan migrate --force --isolated
-```
-:::caution
-When running automatic migrations in production, the `--force` flag is necessary to bypass Laravel's safety prompt. Without this flag, Laravel asks for confirmation to help prevent accidental data loss.
-:::
-:::note Migrations in HA mode
-The `--isolated` flag prevents multiple servers from running migrations simultaneously by using a cache lock.
-:::
-### Manual Migrations
-For development and troubleshooting purposes, you can execute migrations manually through SSH:
-```bash
-# Connect to your zerops project
-zcli vpn up
-# SSH into your service using it's hostname (app)
-ssh app
-# For MacOS users
-ssh app.zerops
-```
-## Migration Commands
-Essential migration commands for your workflow:
-```bash
-# Create a new migration file with timestamp
-php artisan make:migration create_users_table
-# Execute all pending migrations
-php artisan migrate
-# Revert the most recent migration operation
-php artisan migrate:rollback
-# Reset and rerun all migrations (warning: destroys existing data)
-php artisan migrate:fresh
-# Display current migration status
-php artisan migrate:status
-```
-## Best Practices
-### Migration Structure
-```php {title="database/migrations/create_users_table.php"}
-id(); // Auto-incrementing primary key
- $table->string('name'); // User's full name
- $table->string('email')->unique(); // Unique email address
- $table->timestamp('email_verified_at')->nullable(); // Email verification timestamp
- $table->string('password'); // Hashed password
- $table->rememberToken(); // Remember me token
- $table->timestamps(); // Created_at and updated_at timestamps
- });
- }
- /**
- * Reverse the migrations.
- * Removes the users table completely.
- */
- public function down()
- {
- Schema::dropIfExists('users');
- }
-};
-```
-### Safe Migration Practices
-1. **Implement Reversible Changes**
-```php
-public function down()
-{
- // Always provide a way to undo migration changes
- Schema::table('users', function (Blueprint $table) {
- $table->dropColumn('new_column');
- });
-}
-```
-2. **Use Foreign Key Contraints**
-```php
-public function up()
-{
- Schema::table('posts', function (Blueprint $table) {
- // Create relationship with cascading delete
- $table->foreignId('user_id')
- ->constrained()
- ->onDelete('cascade');
- });
-}
-```
-3. **Handle Large Tables Efficiently**
-```php
-public function up()
-{
- // Step 1: Add nullable column to prevent blocking operations
- Schema::table('large_table', function (Blueprint $table) {
- $table->string('new_column')->nullable();
- });
- // Step 2: Update data in manageable chunks
- DB::table('large_table')
- ->orderBy('id')
- ->chunk(1000, function ($records) {
- foreach ($records as $record) {
- DB::table('large_table')
- ->where('id', $record->id)
- ->update(['new_column' => 'default_value']);
- }
- });
-}
-```
-## Testing Migrations
-### Create a Test Database
-Add a testing connection to your `config/database.php`:
-```php
-'testing' => [
- 'driver' => 'pgsql',
- 'host' => env('DB_TEST_HOST', '127.0.0.1'),
- 'database' => env('DB_TEST_DATABASE', 'testing'),
- 'username' => env('DB_TEST_USERNAME', 'postgres'),
- 'password' => env('DB_TEST_PASSWORD', ''),
-],
-```
-### Migration Test Example
-Create a test file at `tests/Unit/MigrationTest.php`:
-```php
-/**
- * Test migration execution and schema verification
- */
-public function test_migrations_can_be_run()
-{
- // Execute all migrations
- Artisan::call('migrate');
- // Verify table creation
- $this->assertTrue(Schema::hasTable('users'));
- // Verify column structure
- $this->assertTrue(Schema::hasColumns('users', [
- 'id', 'name', 'email', 'password'
- ]));
-}
-```
-:::tip Migration Tips
-* Always create a backup before running migrations in production
-* Use database transactions for complex migrations
-* Thoroughly test migrations in development environment
-* Implement seeders for initial data population
-* Monitor execution time for migrations on large tables
-:::
-## Troubleshooting
-Common migration issues and their solutions:
-1. **Migration Timeout** Configure longer timeout in [zerops.yaml](/zerops-yaml/specification):
-```yaml
-zerops:
- - setup: app
- run:
- initCommands:
- - php artisan migrate --force --isolated --timeout=1000
-```
-2. **Database Lock Timeout** Adjust PDO settings in `config/database.php`:
-```php
-'pgsql' => [
- // ...
- 'options' => [
- PDO::ATTR_LOCK_TIMEOUT => 1000 // Milliseconds
- ]
-],
-```
-3. **Reset Migration State** Commands:
-```bash
-# Reset all migrations
-php artisan migrate:reset
-# Re-run all migrations
-php artisan migrate
-```
-## Additional Resources
-* [Laravel Migration Documentation](https://laravel.com/docs/11.x/migrations)
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Filament Devel
-
-[Filament](https://filamentphp.com/) is a collection of tools for rapidly building beautiful TALL stack (Tailwind, Alpine, Laravel, Livewire) applications. It provides a powerful admin panel, form builder, table builder, and other components that help you build feature-rich web applications with minimal effort.
-This recipe demonstrates how to effectively integrate Laravel Filament applications with Zerops, providing a fully production-capable setup. While this setup is built for professional deployment, we call it a **development environment** due to its streamlined resource allocation and use of the [Lightweight](/features/infrastructure#project-core-options) core package, optimizing costs without compromising functionality.
- Set up a Laravel environment with Filament's admin panel and TALL stack in a development-optimized configuration.
-
-## Environment Overview
-Your newly deployed Laravel Filament environment includes:
-- A fully configured Laravel application service with Filament installed
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-- Configured Filament admin panel and components
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/minimal-prod).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service and includes Filament's admin panel and components. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-- Filament assets compilation
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel Filament application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel Filament tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel Filament project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Filament Local
-
-[Filament](https://filamentphp.com/) is a collection of tools for rapidly building beautiful TALL stack (Tailwind, Alpine, Laravel, Livewire) applications. It provides a powerful admin panel, form builder, table builder, and other components that help you build feature-rich web applications with minimal effort.
-This recipe provides a comprehensive Filament setup with PostgreSQL database, Redis-compatible store, object storage, and automated deployment pipeline, designed for **local development** This recipe provides a streamlined Laravel setup with PostgreSQL database and automated deployment pipeline, designed for **local development** with cost-efficient resource allocation and the [Lightweight](/features/infrastructure#project-core-options) core package. This means:
-- Resources are optimized for development workloads
-- Services can be started/stopped as needed during active development
-- Cost-effective configuration suitable for development and testing
- Set up a Laravel environment with Filament's admin panel and TALL stack components for efficient local development.
-
-## Environment Overview
-Your newly deployed Filament environment includes:
-- A fully configured Laravel application service with Filament
-- PostgreSQL database integration with migration automation
-- Valkey (Redis-compatible KV store) for sessions and cache
-- Built-in object storage for filesystem
-- Mailpit for development SMTP server
-- Automated build and deployment pipeline
-- Health and readiness checks
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/filament-prod).
-:::
-## What to Expect
-The deployment process takes just a few minutes. Once complete, you'll receive:
-- A live URL to access your application
-- Database credentials
-- Access to your project dashboard
-- CLI configuration details for VPN access
-## Setting Up Local Development
-Zerops provides a built-in VPN feature through its CLI tool, enabling seamless local development against remote resources. Here's how to set it up:
-### Prerequisites
-- Install the [Zerops CLI](/references/cli#get-started) and log in with [personal access token](/references/cli#personal-access-tokens)
-- Install [Wireguard](/references/networking/vpn) on your system
-### Setup Steps
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-filament) and clone it locally
-2. **Configure VPN Access**
- ```bash
- # Initialize VPN connection using project ID
- zcli vpn up
- # Or use interactive mode to select your project
- zcli vpn up
- ```
-3. **Set Up Environment**
- ```bash
- # Create and configure environment file
- cp .env.example .env
- ```
- Fill in database access details - in Zerops GUI go to the detail of `db` service and open **Access details** in the left menu.
- ```bash
- composer install
- php artisan key:generate
- npm install
- npm run dev
- ```
-4. **Start Development Server**
- ```bash
- php artisan serve # or use your preferred setup (Valet, Herd, Sail)
- ```
-Your local environment is now connected to the Zerops infrastructure, utilizing the database, redis and storage from Zerops while maintaining local development flexibility.
-## Application Configuration
-The app has been set up to utilize:
-- Valkey (Redis-compatible KV store) to handle sessions and cache
-- Built-in object storage for Laravel and Filament-specific filesystem operations
-- Mailpit as a mock SMTP server for development purposes
-Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-## Try the Build & Deploy Pipeline
-Now that you're logged into zcli, deploying your application is straightforward. Simply enter `zcli push` in your terminal from the root of your freshly cloned project.
-### Test Your Pipeline
-The best way to verify your setup is with a quick test:
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in your project dashboard
-### Setting Up Automated CI/CD
-To enable automatic deployments:
-1. Navigate to **Pipelines & CI/CD settings** in your service dashboard
-2. Connect the service with your new GitHub repository
-3. Set the trigger to **Push to Branch**
-## Integration with Existing Applications
-If you're looking to integrate an existing Filament application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-filament/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Filament Prod
-
-[Filament](https://filamentphp.com/) is a collection of tools for rapidly building beautiful TALL stack (Tailwind, Alpine, Laravel, Livewire) applications. It provides a powerful admin panel, form builder, table builder, and other components that help you build feature-rich web applications with minimal effort.
-This recipe demonstrates how to effectively integrate Laravel Filament applications with Zerops, providing a fully production-grade setup. It's built as a **production environment** with high-availability configuration and uses the [Serious](/features/infrastructure#project-core-options) core package, ensuring enterprise-grade reliability and robust performance.
- Set up a production-ready Laravel environment with Filament's admin panel and TALL stack, backed by enterprise-grade reliability.
-
-## Environment Overview
-Your newly deployed Laravel Filament environment includes:
-- A fully configured Laravel application service with Filament installed and high availability
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-- Configured Filament admin panel and components
-:::note
-For development environments with cost-efficient resource allocation, consider deploying the [development environment recipe](/frameworks/laravel/recipes/minimal-devel).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service and includes Filament's admin panel and components. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-- Filament assets compilation
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel Filament application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel Filament tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel Filament project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Jetstream Devel
-
-Laravel Jetstream provides a polished application scaffolding for Laravel, featuring authentication, registration, email verification, two-factor authentication, session management, API support via Laravel Sanctum, and optional team management features. It serves as the perfect starting point for your next Laravel application.
-This recipe demonstrates how to effectively integrate Laravel Jetstream applications with Zerops, providing a fully production-capable setup. While this setup is built for professional deployment, we call it a **development environment** due to its streamlined resource allocation and use of the [Lightweight](/features/infrastructure#project-core-options) core package, optimizing costs without compromising functionality.
- Set up a Laravel environment with Jetstream's team features and authentication system in a development-optimized configuration.
-
-## Environment Overview
-Your newly deployed Laravel Jetstream environment includes:
-- A fully configured Laravel application service with Jetstream installed
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-- Configured Jetstream authentication system
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/minimal-prod).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service and includes Jetstream's authentication scaffolding. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-- Jetstream assets compilation
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel Jetstream application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel Jetstream tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel Jetstream project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Jetstream Local
-
-Laravel Jetstream provides a polished application scaffolding for Laravel, featuring authentication, registration, email verification, two-factor authentication, session management, API support via Laravel Sanctum, and optional team management features. It serves as the perfect starting point for your next Laravel application.
-This recipe provides a comprehensive Laravel Jetstream setup with PostgreSQL database, Redis-compatible store, object storage, and automated deployment pipeline, designed for **local development** with cost-efficient resource allocation and the [Lightweight](/features/infrastructure#project-core-options) core package. This means:
-- Resources are optimized for development workloads
-- Services can be started/stopped as needed during active development
-- Cost-effective configuration suitable for development and testing
- Set up a Laravel environment with Jetstream's team features and authentication system for rapid local development.
-
-## Environment Overview
-Your newly deployed Laravel Jetstream environment includes:
-- A fully configured Laravel application service with Jetstream
-- PostgreSQL database integration with migration automation
-- Valkey (Redis-compatible KV store) for sessions and cache
-- Built-in object storage for filesystem
-- Mailpit for development SMTP server
-- Automated build and deployment pipeline
-- Health and readiness checks
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/jetstream-prod).
-:::
-## What to Expect
-The deployment process takes just a few minutes. Once complete, you'll receive:
-- A live URL to access your application
-- Database credentials
-- Access to your project dashboard
-- CLI configuration details for VPN access
-## Setting Up Local Development
-Zerops provides a built-in VPN feature through its CLI tool, enabling seamless local development against remote resources. Here's how to set it up:
-### Prerequisites
-- Install the [Zerops CLI](/references/cli#get-started) and log in with [personal access token](/references/cli#personal-access-tokens)
-- Install [Wireguard](/references/networking/vpn) on your system
-### Setup Steps
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-jetstream) and clone it locally
-2. **Configure VPN Access**
- ```bash
- # Initialize VPN connection using project ID
- zcli vpn up
- # Or use interactive mode to select your project
- zcli vpn up
- ```
-3. **Set Up Environment**
- ```bash
- # Create and configure environment file
- cp .env.example .env
- ```
- Fill in database access details - in Zerops GUI go to the detail of `db` service and open **Access details** in the left menu.
- ```bash
- composer install
- php artisan key:generate
- npm install
- npm run dev
- ```
-4. **Start Development Server**
- ```bash
- php artisan serve # or use your preferred setup (Valet, Herd, Sail)
- ```
-Your local environment is now connected to the Zerops infrastructure, utilizing the database, redis and storage from Zerops while maintaining local development flexibility.
-## Application Configuration
-The app has been set up to utilize:
-- Valkey (Redis-compatible KV store) to handle sessions and cache
-- Built-in S3 object storage for Laravel and Jetstream-specific filesystem operations
-- Mailpit as a mock SMTP server for development purposes
-Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-## Try the Build & Deploy Pipeline
-Now that you're logged into zcli, deploying your application is straightforward. Simply enter `zcli push` in your terminal from the root of your freshly cloned project.
-### Test Your Pipeline
-The best way to verify your setup is with a quick test:
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in your project dashboard
-### Setting Up Automated CI/CD
-To enable automatic deployments:
-1. Navigate to **Pipelines & CI/CD settings** in your service dashboard
-2. Connect the service with your new GitHub repository
-3. Set the trigger to **Push to Branch**
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel Jetstream application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-jetstream/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Jetstream Prod
-
-Laravel Jetstream provides a polished application scaffolding for Laravel, featuring authentication, registration, email verification, two-factor authentication, session management, API support via Laravel Sanctum, and optional team management features. It serves as the perfect starting point for your next Laravel application.
-This recipe demonstrates how to effectively integrate Laravel Jetstream applications with Zerops, providing a fully production-grade setup. It's built as a **production environment** with high-availability configuration and uses the [Serious](/features/infrastructure#project-core-options) core package, ensuring enterprise-grade reliability and robust performance.
- Set up a production-ready Laravel environment with Jetstream's team features and authentication system, backed by high-availability services.
-
-## Environment Overview
-Your newly deployed Laravel Jetstream environment includes:
-- A fully configured Laravel application service with Jetstream installed and high availability
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-- Configured Jetstream authentication system
-:::note
-For development environments with cost-efficient resource allocation, consider deploying the [development environment recipe](/frameworks/laravel/recipes/minimal-devel).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service and includes Jetstream's authentication scaffolding. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-- Jetstream assets compilation
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel Jetstream application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel Jetstream tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel Jetstream project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Minimal Devel
-
-This recipe demonstrates how to effectively integrate Laravel applications with Zerops, providing a fully production-capable setup. While it's built for professional deployment, we call it a **development environment** due to its streamlined resource allocation and use of the [Lightweight](/features/infrastructure#project-core-options) core package, optimizing costs without compromising functionality.
- Set up a streamlined Laravel environment with development-optimized resources and configurations.
-
-## Environment Overview
-Your newly deployed Laravel environment includes:
-- A fully configured Laravel application service
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/minimal-prod).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Minimal Local
-
-This recipe provides a streamlined Laravel setup with PostgreSQL database and automated deployment pipeline, designed for **local development** with cost-efficient resource allocation and the [Lightweight](/features/infrastructure#project-core-options) core package. This means:
-- Resources are optimized for development workloads
-- Services can be started/stopped as needed during active development
-- Cost-effective configuration suitable for development and testing
- Set up a streamlined Laravel environment optimized for local development with this lightweight, cost-efficient configuration.
-
-## Environment Overview
-Your newly deployed Laravel environment includes:
-- A fully configured Laravel application service
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/minimal-prod).
-:::
-## What to Expect
-The deployment process takes just a few minutes. Once complete, you'll receive:
-- A live URL to access your application
-- Database credentials
-- Access to your project dashboard
-- CLI configuration details for VPN access
-## Setting Up Local Development
-Zerops provides a built-in VPN feature through its CLI tool, enabling seamless local development against remote resources. Here's how to set it up:
-### Prerequisites
-- Install the [Zerops CLI](/references/cli#get-started) and log in with [personal access token](/references/cli#personal-access-tokens)
-- Install [Wireguard](/references/networking/vpn) on your system
-### Setup Steps
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. **Configure VPN Access**
- ```bash
- # Initialize VPN connection using project ID
- zcli vpn up
- # Or use interactive mode to select your project
- zcli vpn up
- ```
-3. **Set Up Environment**
- ```bash
- # Create and configure environment file
- cp .env.example .env
- ```
- Fill in database access details - in Zerops GUI go to the detail of `db` service and open **Access details** in the left menu.
- ```bash
- composer install
- php artisan key:generate
- ```
-4. **Start Development Server**
- ```bash
- php artisan serve # or use your preferred setup (Valet, Herd, Sail)
- ```
-Your local environment is now connected to the Zerops infrastructure, utilizing the remote PostgreSQL database while maintaining local development flexibility.
-## Application Configuration
-Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-## Try the Build & Deploy Pipeline
-Now that you're logged into zcli, deploying your application is straightforward. Simply enter `zcli push` in your terminal from the root of your freshly cloned project.
-### Test Your Pipeline
-The best way to verify your setup is with a quick test:
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in your project detail
-### Setting Up Automated CI/CD
-To enable automatic deployments:
-1. Navigate to **Pipelines & CI/CD settings** in your service dashboard
-2. Connect the service with your new GitHub repository
-3. Set the trigger to **Push to Branch**
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Minimal Prod
-
-This recipe demonstrates how to effectively integrate Laravel applications with Zerops, providing a fully production-grade setup. It's built as a **production environment** with high-availability configuration and uses the [Serious](/features/infrastructure#project-core-options) core package, ensuring enterprise-grade reliability and robust performance.
- Set up a production-ready Laravel environment with high-availability services and enterprise-grade reliability.
-
-## Environment Overview
-Your newly deployed Laravel environment includes:
-- A fully configured Laravel application service with high availability
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-:::note
-For development environments with cost-efficient resource allocation, consider deploying the [development environment recipe](/frameworks/laravel/recipes/minimal-devel).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Twill Devel
-
-[Twill](https://twillcms.com/) is a flexible CMS toolkit for Laravel that helps you rapidly create a custom administration interface for your application. It provides a robust set of features including content management, media library, block editor, and a powerful publishing workflow system.
-This recipe demonstrates how to effectively integrate Laravel Twill applications with Zerops, providing a fully production-capable setup. While this setup is built for professional deployment, we call it a **development environment** due to its streamlined resource allocation and use of the [Lightweight](/features/infrastructure#project-core-options) core package, optimizing costs without compromising functionality.
- Set up a Laravel environment with Twill's CMS framework in a development-optimized configuration.
-
-## Environment Overview
-Your newly deployed Laravel Twill environment includes:
-- A fully configured Laravel application service with Twill CMS installed
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-- Configured Twill admin interface and media library
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/minimal-prod).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service and includes Twill's CMS functionality. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-- Twill assets compilation
-- Media storage configuration
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel Twill application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel Twill tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel Twill project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Twill Local
-
-[Twill](https://twillcms.com/) is a flexible CMS toolkit for Laravel that helps you rapidly create a custom administration interface for your application. It provides a robust set of features including content management, media library, block editor, and a powerful publishing workflow system.
-This recipe provides a comprehensive Twill CMS setup with PostgreSQL database, Redis-compatible store, object storage, and automated deployment pipeline, designed for **local development** with cost-efficient resource allocation and the [Lightweight](/features/infrastructure#project-core-options) core package. This means:
-- Resources are optimized for development workloads
-- Services can be started/stopped as needed during active development
-- Cost-effective configuration suitable for development and testing
- Set up a Laravel environment with Twill's publishing workflow and media management features for local development.
-
-## Environment Overview
-Your newly deployed Twill CMS environment includes:
-- A fully configured Laravel application service with Twill CMS
-- PostgreSQL database integration with migration automation
-- Valkey (Redis-compatible KV store) for sessions and cache
-- Built-in object storage for filesystem
-- Mailpit for development SMTP server
-- Automated build and deployment pipeline
-- Health and readiness checks
-:::note
-For production environments with high-availability services and enterprise-grade reliability, consider deploying the [production environment recipe](/frameworks/laravel/recipes/filament-prod).
-:::
-## What to Expect
-The deployment process takes just a few minutes. Once complete, you'll receive:
-- A live URL to access your application
-- Database credentials
-- Access to your project dashboard
-- CLI configuration details for VPN access
-## Setting Up Local Development
-Zerops provides a built-in VPN feature through its CLI tool, enabling seamless local development against remote resources. Here's how to set it up:
-### Prerequisites
-- Install the [Zerops CLI](/references/cli#get-started) and log in with [personal access token](/references/cli#personal-access-tokens)
-- Install [Wireguard](/references/networking/vpn) on your system
-### Setup Steps
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-filament) and clone it locally
-2. **Configure VPN Access**
- ```bash
- # Initialize VPN connection using project ID
- zcli vpn up
- # Or use interactive mode to select your project
- zcli vpn up
- ```
-3. **Set Up Environment**
- ```bash
- # Create and configure environment file
- cp .env.example .env
- ```
- Fill in database access details - in Zerops GUI go to the detail of `db` service and open **Access details** in the left menu.
- ```bash
- composer install
- php artisan key:generate
- npm install
- npm run dev
- ```
-4. **Start Development Server**
- ```bash
- php artisan serve # or use your preferred setup (Valet, Herd, Sail)
- ```
-Your local environment is now connected to the Zerops infrastructure, utilizing the database, redis and storage from Zerops while maintaining local development flexibility.
-## Application Configuration
-The app has been set up to utilize:
-- Valkey (Redis-compatible KV store) to handle sessions and cache
-- Built-in object storage for Laravel and Twill-specific filesystem operations
-- Mailpit as a mock SMTP server for development purposes
-Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-## Try the Build & Deploy Pipeline
-Now that you're logged into zcli, deploying your application is straightforward. Simply enter `zcli push` in your terminal from the root of your freshly cloned project.
-### Test Your Pipeline
-The best way to verify your setup is with a quick test:
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in your project dashboard
-### Setting Up Automated CI/CD
-To enable automatic deployments:
-1. Navigate to **Pipelines & CI/CD settings** in your service dashboard
-2. Connect the service with your new GitHub repository
-3. Set the trigger to **Push to Branch**
-## Integration with Existing Applications
-If you're looking to integrate an existing Twill application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-twill/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Recipes > Twill Prod
-
-[Twill](https://twillcms.com/) is a flexible CMS toolkit for Laravel that helps you rapidly create a custom administration interface for your application. It provides a robust set of features including content management, media library, block editor, and a powerful publishing workflow system.
-This recipe demonstrates how to effectively integrate Laravel Twill applications with Zerops, providing a fully production-grade setup. It's built as a **production environment** with high-availability configuration and uses the [Serious](/features/infrastructure#project-core-options) core package, ensuring enterprise-grade reliability and robust performance.
- Set up a production-ready Laravel environment with Twill's CMS framework, backed by high-availability services and enterprise-grade reliability.
-
-## Environment Overview
-Your newly deployed Laravel Twill environment includes:
-- A fully configured Laravel application service with Twill CMS installed and high availability
-- PostgreSQL database integration with migration automation
-- Automated build and deployment pipeline
-- Health and readiness checks
-- Configured Twill admin interface and media library
-:::note
-For development environments with cost-efficient resource allocation, consider deploying the [development environment recipe](/frameworks/laravel/recipes/minimal-devel).
-:::
-## Application Configuration
-The app has been set up to utilize PostgreSQL service and includes Twill's CMS functionality. Your application's deployment process is managed through [zerops.yaml](/zerops-yaml/specification), which handles:
-- Database migrations
-- Cache management
-- File cleanup
-- Health check implementation
-- Service orchestration
-- Twill assets compilation
-- Media storage configuration
-## Try the build & deploy pipeline in 30 seconds
-While Zerops supports various CI/CD workflows (CLI, GitHub Actions, built-in CI/CD), let's start with the simplest path to get you familiar with the core concepts:
-1. Create your own repository from our [GitHub template](https://github.com/zeropsio/recipe-laravel-minimal) and clone it locally
-2. Navigate to **Pipelines & CI/CD settings** and connect the service with your new GitHub repository, setting the trigger to **Push to Branch**
-### Test Your Pipeline
-- Make a small change directly in the GitHub UI
-- Commit the change and watch the magic happen in project detail
-## Integration with Existing Applications
-If you're looking to integrate an existing Laravel Twill application with Zerops, review the [changes made over the default installation](https://github.com/zeropsio/recipe-laravel-minimal/blob/main/README.md#changes-made-over-the-default-installation) to understand the necessary modifications.
-## Get to know Zerops core concepts in depth
-Ready to build from scratch? Our [step-by-step Laravel Twill tutorial](/frameworks/laravel/introduction) takes you through the entire process of integrating Zerops with a new Laravel Twill project.
-*Need help? Join our [Discord community](https://discord.gg/zeropsio).*
-
-----------------------------------------
-
-# Frameworks > Laravel > Redis
-
-Redis is a powerful in-memory data structure store serving as a database, cache, message broker, and queue. This guide walks you through Redis integration with your Laravel application in Zerops for high-performance caching, session management, and queue processing.
-Zerops provides [Valkey](https://valkey.io), an open-source Redis alternative that delivers high-performance key/value storage with full Redis compatibility. Valkey supports all common Redis use cases — from caching and message queues to primary database functionality.
-## Adding Redis Service
-To use Valkey (Redis) features with Laravel, first either import Valkey as a service to your Zerops project
-```yaml
-services:
- - hostname: valkey
- type: valkey@7.2
- mode: NON_HA # use HA in production
-```
-or add the Valkey service to your project manually from the Zerops GUI.
-:::tip High Availability Mode
-For production environments, we recommend using `HA` mode. This configuration:
-* Ensures automatic failover during node failures
-* Provides data replication across multiple nodes
-* Improves reliability and uptime
+ 60
+ 50
+ 50
+
+ Scale-Down Threshold Percentile
+ 40
+ 50
+ 50
+
+ Minimum Step
+ 1 (0.1 cores)
+ 0.125 GB
+ 0.5 GB
+
+ Maximum Step
+ 40
+ 32 GB
+ 128 GB
+
+## Part 2: Container Architecture — Service-Specific Approaches
+Container architecture in Zerops defines how services are distributed across containers. Different service types use fundamentally different approaches:
+1. **Horizontal Scaling** (Runtime Services, Linux Containers, and Docker)
+2. **Deployment Modes** (Databases and Shared Storage)
+### Horizontal Scaling (Runtime Services, Linux Containers, and Docker)
+Horizontal scaling adds or removes entire containers (or VMs for Docker) as demand fluctuates.
+* When vertical scaling reaches its defined maximum, new containers/VMs are automatically added to handle additional load.
+* As demand decreases, containers/VMs are gradually removed to optimize resource usage.
+:::important HA-ready Applications
+For applications to work properly across multiple containers, they must be designed to be HA-ready.
:::
-## Environment Configuration
-### Basic Redis Settings
-Environment variables control how your Laravel application connects to and uses Redis. Below are the core settings grouped by functionality:
-```yaml
-zerops:
- - setup: app
- build:
- base:
- - php@8.4
- os: alpine
- run:
- base: php-nginx@8.4
- os: alpine
- siteConfigPath: site.conf.tmpl
- envVariables:
- # Redis Connection Settings
- REDIS_CLIENT: phpredis # PHP Redis client for better performance
- REDIS_HOST: valkey # Internal hostname of Valkey service
- REDIS_PORT: 6379 # Standard Redis port number
- # Cache Configuration
- CACHE_PREFIX: cache # Namespace for cache keys
- CACHE_STORE: redis # Use Redis as primary cache
- # Session Configuration
- SESSION_DRIVER: redis # Store sessions in Redis
- SESSION_ENCRYPT: false # Disable session encryption
- SESSION_LIFETIME: 120 # Session timeout in minutes
- SESSION_PATH: / # Cookie path setting
- # Queue Configuration
- QUEUE_CONNECTION: redis # Use Redis for job queues
- BROADCAST_CONNECTION: redis # Redis for event broadcasting
-```
-## Feature-Specific Configuration
-### Redis Caching
-Laravel's cache system offers a unified API across different cache backends. The following configuration establishes Redis as your primary cache store for fast, reliable data caching:
-```php title="config/cache.php"
-'default' => env('CACHE_STORE', 'database'),
-'stores' => [
- 'redis' => [
- 'driver' => 'redis',
- 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'),
- 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'),
- ],
-],
-'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'),
-```
-### Session Management with Redis
-Using Redis for session storage provides better performance than file-based sessions and enables seamless session sharing across multiple application servers. You can also set up a custom session connection in the `config/session.php` file.
-```php title="config/session.php"
-'driver' => env('SESSION_DRIVER', 'redis'),
-'lifetime' => env('SESSION_LIFETIME', 120),
-'encrypt' => env('SESSION_ENCRYPT', false),
-```
-### Queue System Configuration
-Redis queues offer a robust solution for handling background jobs in Laravel. This configuration sets up Redis as your queue backend with retry policies and connection settings. You can also set up a custom queue connection in the `config/queue.php` file.
-```php title="config/queue.php"
-'default' => env('QUEUE_CONNECTION', 'redis'),
-'connections' => [
- 'redis' => [
- 'driver' => 'redis',
- 'connection' => 'default',
- 'queue' => 'default',
- 'retry_after' => 90, // Retry failed jobs after 90 seconds
- 'block_for' => null, // Don't block when no jobs available
- ],
-],
-```
-Consider using [Supervisor](https://laravel.com/docs/5.1/queues#supervisor-configuration) for managing Laravel queues in production.
-### Performance Optimization
-Configure your Redis connection pool for optimal performance:
-```php
-'redis' => [
- 'client' => env('REDIS_CLIENT', 'phpredis'),
- 'options' => [
- 'cluster' => env('REDIS_CLUSTER', 'redis'),
- 'prefix' => env('REDIS_PREFIX', ''),
- 'pool' => [
- 'max_connections' => 50,
- 'timeout' => 30,
- ],
- ],
-],
-```
-## Working with Redis Features
-### Cache Operations Examples
-```php
-// Store items in cache with expiration time
-Cache::put('key', 'value', $seconds);
-// Retrieve cached items with optional default value
-$value = Cache::get('key');
-// Store items indefinitely until manually removed
-Cache::forever('key', 'value');
-```
-### Queue Processing Examples
-```php
-// Dispatch a job to the Redis queue with specific connection
-ProcessPodcast::dispatch($podcast)->onConnection('redis');
-// Start the queue worker process for Redis
-php artisan queue:work redis
-```
-### Session Handling Examples
-```php
-// Store data in the Redis session
-session(['key' => 'value']);
-// Retrieve data from the session with optional default
-$value = session('key');
-```
-
-----------------------------------------
-
-# Frameworks > Laravel > Smtp
-
-# SMTP Configuration for Laravel in Zerops
-:::warning Important Security Note
-By default, SMTP ports are blocked by Zerops firewall for security reasons. To use external SMTP services, please [contact Zerops support](mailto:support@zerops.io) to have the necessary ports opened for your project.
-Include in your request:
-* Detailed explanation of your use case
-* Specific ports and protocols needed
-* Project ID and Organization ID from your Zerops Dashboard
-:::
-## Production Configuration
-### Laravel Mail Configuration
-Laravel comes with a default mail configuration in `config/mail.php`. You typically don't need to modify this file as all settings can be controlled through environment variables.
-The default configuration supports multiple mailer types and reads all sensitive information from your environment. In this example
-
-```php title="config/mail.php"
-return [
- 'default' => env('MAIL_MAILER', 'smtp'),
- 'mailers' => [
- 'smtp' => [
- 'transport' => 'smtp',
- 'url' => env('MAIL_URL'),
- 'host' => env('MAIL_HOST', '127.0.0.1'),
- 'port' => env('MAIL_PORT', 587),
- 'encryption' => env('MAIL_ENCRYPTION', 'tls'),
- 'username' => env('MAIL_USERNAME'),
- 'password' => env('MAIL_PASSWORD'),
- 'timeout' => null,
- 'local_domain' => env('MAIL_EHLO_DOMAIN'),
- ],
- 'ses' => [
- 'transport' => 'ses',
- ],
- 'postmark' => [
- 'transport' => 'postmark',
- ],
- 'failover' => [
- 'transport' => 'failover',
- 'mailers' => [
- 'smtp',
- 'log',
- ],
- ],
- ],
- 'from' => [
- 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
- 'name' => env('MAIL_FROM_NAME', 'Example'),
- ],
-];
-```
-:::tip Available Mail Transports
-Laravel supports multiple mail transport options:
-- 'smtp' - Standard SMTP server
-- 'sendmail' - Server's sendmail
-- 'mailgun' - Mailgun API
-- 'ses' - Amazon SES
-- 'postmark' - Postmark
-- 'log' - Log messages for testing
-- 'array' - Store in array for testing
-- 'failover' - Fallback to next mailer if one fails
-- 'roundrobin' - Rotate between multiple mailers
-:::
-### Environment Configuration
-Configure your Laravel service with the required mail variables. The following example shows SMTP configuration, but most settings are common across different mail transports:
-```yaml title="zerops.yaml"
-zerops:
- - setup: app
- run:
- envVariables:
- MAIL_MAILER: smtp
- MAIL_FROM_ADDRESS: noreply@yourdomain.com
- MAIL_FROM_NAME: YourApp
- MAIL_HOST: your-smtp-host
- MAIL_PORT: 587
- MAIL_USERNAME: your-username
- MAIL_PASSWORD: your-password
- MAIL_ENCRYPTION: tls
-```
-If using other mail transports, you might need additional environment variables. Refer to Laravel's Mail documentation for transport-specific configuration.
-## Implementing Email Functionality
-### Creating Mail Classes
-Generate a new mail class using Artisan:
-```bash
-php artisan make:mail WelcomeEmail
-```
-```php title="app/Mail/WelcomeEmail.php"
-view('emails.welcome')
- ->subject('Welcome to ' . config('app.name'));
- }
-}
-```
-### Email Template
-Create a blade template for your email content:
-```php title="resources/views/emails/welcome.blade.php"
-# Welcome {{ $user->name }}
-Thanks for joining our application!
-Visit Dashboard
-Thanks,
-{{ config('app.name') }}
-```
-### Sending Emails
-You can send emails either immediately or using a queue:
-```php
-use Illuminate\Support\Facades\Mail;
-use App\Mail\WelcomeEmail;
-// Send immediately
-Mail::to($user->email)->send(new WelcomeEmail($user));
-// Send using queue
-Mail::to($user->email)->queue(new WelcomeEmail($user));
-```
-## Queue Configuration
-For production environments, it's recommended to use a queue system for sending emails to prevent request timeouts and improve application performance. Zerops provides Valkey, an open-source Redis-compatible service that's perfect for handling email queues.
-First, add the Valkey service to your project:
-```yaml
-services:
- - hostname: redis
- type: valkey@7.2
- mode: NON_HA # use HA for high availability in production
-```
-Configure your Laravel service to use Redis for queues:
-```yaml title="zerops.yaml"
-zerops:
- - setup: app
- run:
- envVariables:
- # Queue Configuration
- QUEUE_CONNECTION: redis
- REDIS_HOST: redis
- REDIS_PORT: 6379
- REDIS_CLIENT: phpredis # PHP Redis client for better performance
- # Mail Configuration
- MAIL_MAILER: smtp
- MAIL_HOST: your-smtp-host.com
- MAIL_PORT: 587
- MAIL_USERNAME: your-username
- MAIL_PASSWORD: your-password
- MAIL_ENCRYPTION: tls
- MAIL_FROM_ADDRESS: noreply@yourdomain.com
- MAIL_FROM_NAME: YourApp
-```
-You can customize the queue behavior in your `config/queue.php`:
-```php title="config/queue.php"
-phpCopy'default' => env('QUEUE_CONNECTION', 'redis'),
-'connections' => [
- 'redis' => [
- 'driver' => 'redis',
- 'connection' => 'default',
- 'queue' => 'default',
- 'retry_after' => 90, // Retry failed jobs after 90 seconds
- 'block_for' => null, // Don't block when no jobs available
- ],
-],
-```
-## Development Environment
-For local development and testing, Zerops provides a Mailpit service that allows you to catch and inspect all outgoing emails.
-### Setting up Mailpit
-Add this to your project import configuration or import the service separately:
-```yaml
-services:
- - hostname: mailpit
- type: go@1
- buildFromGit: https://github.com/zeropsio/recipe-mailpit
- enableSubdomainAccess: true
-```
-See [Mailpit recipe repo](https://github.com/zeropsio/recipe-mailpit) for reference.
-Configure your Laravel service to use Mailpit for development:
-```yaml
-zerops:
- - setup: app
- run:
- envVariables:
- MAIL_MAILER: smtp
- MAIL_HOST: mailpit
- MAIL_PORT: 1025
- MAIL_FROM_ADDRESS: hello@example.com
- MAIL_FROM_NAME: ZeropsLaravel
-```
-:::tip
-Enable `enableSubdomainAccess` to access the Mailpit web interface where you can view all emails during development.
+#### Setting Horizontal Scaling Parameters
+To configure horizontal scaling, users need to set the minimum and maximum number of containers:
+- **Minimum Containers**: The baseline number of containers that should always be running (system limit: 1)
+- **Maximum Containers**: The upper limit of containers that can be created during high demand (system limit: 10)
+:::tip Disable Horizontal Scaling
+Setting identical minimum and maximum values creates a fixed number of containers (disables automatic horizontal scaling).
:::
-## Best Practices
-- Use queue for sending emails in production to prevent request timeouts
-- Configure proper timeouts for SMTP connections
-- Use environment variables for all mail settings
-- Implement proper error handling for failed email deliveries
-- Test email templates across different email clients
-- Monitor email delivery rates and bounce rates
-- Use Mailpit in development to catch and debug emails
+### Deployment Modes (Databases and Shared Storage)
+For databases and shared storage services, Zerops offers two deployment modes focused on reliability and data integrity.
+:::warning
+Deployment mode cannot be changed after creation.
+:::
+#### Single Container Mode
+Single Container Mode provides one container with vertical scaling only. This is suitable for development environments or non-critical data storage.
+**Characteristics:**
+- Limited redundancy
+- No automatic recovery if the container fails
+- Data since last backup (if available) may be lost if failure occurs
+- Cost-effective for non-production environments
+#### Highly Available (HA) Mode
+Highly Available (HA) Mode creates multiple containers with built-in redundancy. This mode is strongly recommended for production environments and mission-critical data.
+**Characteristics:**
+- Multiple containers distributed across different physical machines
+- Automatic failover and recovery mechanisms
+- Data redundancy and integrity protection
+- Higher reliability and availability
+- Recommended for production use
+:::important
+Database and shared storage services in HA mode have a **fixed number of containers** that cannot be increased or decreased.
+:::
+**Recovery process:**
+In HA mode, when a container or physical machine fails, recovery is handled automatically:
+1. The failed container is disconnected from the cluster
+2. A new container is created on a different physical machine
+3. Data is synchronized from remaining healthy copies
+4. The failed container is removed
+5. Service continues with minimal disruption
+### Fixed Resource Allocation (Docker Services)
+Docker services in Zerops operate differently from other service types:
+#### Docker Service Characteristics
+- **VM-Based Deployment**: Docker services run in virtual machines rather than containers
+- **Fixed Resources**: Unlike other services, Docker services do not support automatic vertical scaling
+- **User-Defined Resources**: Resources are set at creation and remain fixed until manually changed
+- **VM Count Changes**: The number of VMs can be changed, but this requires a VM restart
+- **No Automatic Scaling**: Resource levels do not automatically adjust based on usage
+**Important Considerations for Docker Services:**
+- Initial resource values should be chosen carefully, as they cannot automatically scale
+- Planning for expected peak loads is important when setting resource values
+- Runtime services or Linux containers should be considered instead if dynamic scaling is essential
+- VM restarts cause temporary service disruption when changing VM count or resources
+:::warning
+Docker services use fixed resources that do not automatically scale. Sufficient resources should be allocated at creation to handle expected workload. Additionally, disk space for Docker services can only be increased, not decreased without recreation of the service.
+:::
+## Monitoring Your Infrastructure
+Zerops provides comprehensive monitoring tools in the user interface to track both resource usage and container scaling activities:
+### Resource History Graphs
+Resource and container scaling can be visualized over time:
+- CPU utilization per container
+- RAM usage patterns
+- Disk space consumption
+- Container count changes
+These graphs help understand application resource needs, identify usage patterns, and fine-tune scaling settings for optimal performance and cost efficiency.
+## Troubleshooting
+#### Resource-Related Issues (All Service Types Except Docker)
+**Out of Memory Errors**
+* **Issue:** Application crashes with OOM errors despite resource scaling.
+* **Possible Cause:** Insufficient minimum free RAM setting.
+* **Solution:**
+ - Increase the "Minimum free RAM" setting
+ - Check for memory leaks in the application
+ - Consider setting a higher minimum RAM value
+**Excessive Resource Costs**
+* **Issue:** Resources scaling up but not scaling down efficiently.
+* **Possible Cause:** Scale-down thresholds not optimized.
+* **Solution:**
+ - Review usage patterns in monitoring graphs
+ - Adjust scale-down thresholds to be more aggressive
+ - Set appropriate resource minimums based on base requirements
+#### Runtime Service and Linux Container Issues (Horizontal Scaling)
+**Application Not Working Properly Across Multiple Containers**
+* **Issue:** Application errors or inconsistent behavior when horizontally scaled.
+* **Possible Cause:** Application not designed for distributed operation.
+* **Solution:**
+ - Ensure the application properly handles stateless operation
+ - Implement proper session management across containers
+ - Review and modify application code to support multiple instances
+#### Docker Service Issues
+**Insufficient Resources for Workload**
+* **Issue:** Docker service experiencing performance issues or crashes.
+* **Possible Cause:** Fixed resources inadequate for actual workload.
+* **Solution:**
+ - Since Docker services don't support automatic vertical scaling, a new service with higher resource allocations may be needed
+ - Consider migrating to a runtime service or Linux container if dynamic resource scaling is needed
+*Need help implementing scaling in your project? Join our [Discord community](https://discord.gg/zerops) where our team and other Zerops users can assist you!*
----------------------------------------
@@ -10465,12 +8406,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Gleam > How To > Delete
-
-
-
----------------------------------------
# Gleam > How To > Deploy Process
@@ -11488,12 +9423,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Go > How To > Delete
-
-
-
----------------------------------------
# Go > How To > Deploy Process
@@ -12589,12 +10518,6 @@ Build tools: When you need Maven, Gradle, or other build tools not included by d
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Java > How To > Delete
-
-
-
----------------------------------------
# Java > How To > Deploy Process
@@ -12831,42 +10754,7 @@ Different Zerops projects have no special connection. They can communicate with
# Keydb > How To > Control
-Zerops allows you to stop any service. Stopped services only consume disk.
-## Stop, start and restart KeyDB service in Zerops GUI
-To stop the KeyDB service in Zerops GUI go to the project dashboard and select the **Stop** menu item in the top right corner.
-To start the stopped KeyDB service choose the **Start** item from the same menu.
-To restart the KeyDB service choose the **Restart** item from the same menu.
-## Stop and start KeyDB using zCLI
-zCLI is the Zerops command-line tool. To stop and start the KeyDB service via the command-line, follow these steps:
-1. [Install & setup zCLI](/references/cli)
-2. Run the `zcli service stop` command
-```sh
-Usage:
- zcli service stop [service-id-or-name] [flags]
-Flags:
- -h, --help the enable Zerops subdomain command.
- --project-id string If you have access to more than one project, you must specify the project ID for which the
- command is to be executed.
- --service-id string If you have access to more than one service, you must specify the service ID for which the
- command is to be executed.
-```
-:::info
-zCLI commands are interactive, when you press enter after `zcli service stop`, you will be given a list of your projects and services to choose from.
-:::
-3. Run the `zcli service start` command
-```sh
-Usage:
- zcli service start [{serviceName | serviceId}] [flags]
-Flags:
- -h, --help the service start command.
- --project-id string If you have access to more than one project, you must specify the project ID for which the
- command is to be executed.
- --service-id string If you have access to more than one service, you must specify the service ID for which the
- command is to be executed.
-```
-:::info
-zCLI commands are interactive, when you press enter after `zcli service start`, you will be given a list of your projects and its services to choose from.
-:::
+
----------------------------------------
@@ -13087,12 +10975,6 @@ Flags:
zCLI commands are interactive, when you press enter after `zcli project service-import importYamlPath`, you will be given a list of your projects to choose from.
Maximum size of the `import.yaml` file is 100 kB.
-----------------------------------------
-
-# Keydb > How To > Delete
-
-
-
----------------------------------------
# Keydb > How To > Manage
@@ -13639,12 +11521,6 @@ SELECT @@lower_case_file_system, @@lower_case_table_names;
If you need to change this setting after the database has been initialized, you'll need to create a new MariaDB service with the correct configuration and migrate your data.
:::
-----------------------------------------
-
-# Mariadb > How To > Delete
-
-
-
----------------------------------------
# Mariadb > How To > Export Import Data
@@ -14954,12 +12830,6 @@ zerops:
The default Nginx configuration includes automatic prerender.io support for SEO optimization. When `PRERENDER_TOKEN` is set, Nginx will automatically serve pre-rendered content to search engines and social media crawlers.
See [environment variables](/nginx/how-to/env-variables#prerenderio-support) for configuration details.
-----------------------------------------
-
-# Nginx > How To > Delete
-
-
-
----------------------------------------
# Nginx > How To > Deploy Process
@@ -16011,12 +13881,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Nodejs > How To > Delete
-
-
-
----------------------------------------
# Nodejs > How To > Deploy Process
@@ -16187,6 +14051,12 @@ Zerops creates following environment variables when the Object storage service i
The name of the Object storage service.
+----------------------------------------
+
+# Object Storage > How To > Controls
+
+
+
----------------------------------------
# Object Storage > How To > Create
@@ -16495,12 +14365,6 @@ export SECRET_ACCESS_KEY=your-secret-key
- **File Not Found**: Verify bucket name and file path
- **Script Error**: Ensure the script has execute permissions
-----------------------------------------
-
-# Object Storage > How To > Delete
-
-
-
----------------------------------------
# Object Storage > How To > Update Bucket
@@ -17696,12 +15560,6 @@ zerops:
5. Ensure that the `build.deployFiles` contains the folder with the `siteConfigPath` or add the path to the Apache config file to the `deployFiles` list. Zerops will deploy the file to the runtime container(s).
6. [Trigger](/php/how-to/trigger-pipeline) the build & deploy pipeline.
-----------------------------------------
-
-# Php > How To > Delete
-
-
-
----------------------------------------
# Php > How To > Deploy Process
@@ -18218,12 +16076,6 @@ Flags:
zCLI commands are interactive, when you press enter after `zcli project service-import importYamlPath`, you will be given a list of your projects to choose from.
The maximum size of the `import.yaml` file is 100 kB.
-----------------------------------------
-
-# Postgresql > How To > Delete
-
-
-
----------------------------------------
# Postgresql > How To > Export Import Data
@@ -19367,12 +17219,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Python > How To > Delete
-
-
-
----------------------------------------
# Python > How To > Deploy Process
@@ -20446,12 +18292,6 @@ System packages for processing: When your app processes images, videos, or files
'Different base OS: When you need Ubuntu instead of Alpine for specific compatibility requirements'
]} />
-----------------------------------------
-
-# Rust > How To > Delete
-
-
-
----------------------------------------
# Rust > How To > Deploy Process
@@ -22197,12 +20037,6 @@ Shared storage mounts are not available during the runtime prepare phase.
## Troubleshooting
If your `prepareCommands` fail, check the prepare runtime log for specific error messages.
-----------------------------------------
-
-# Ubuntu > How To > Delete
-
-
-
----------------------------------------
# Ubuntu > How To > Deploy Process
diff --git a/apps/docs/static/llms.txt b/apps/docs/static/llms.txt
index 21e7ad84..484dde7d 100644
--- a/apps/docs/static/llms.txt
+++ b/apps/docs/static/llms.txt
@@ -14,7 +14,6 @@
- [Alpine > How To > Controls](https://docs.zerops.io/alpine/how-to/controls)
- [Alpine > How To > Create](https://docs.zerops.io/alpine/how-to/create)
- [Alpine > How To > Customize Runtime](https://docs.zerops.io/alpine/how-to/customize-runtime)
-- [Alpine > How To > Delete](https://docs.zerops.io/alpine/how-to/delete)
- [Alpine > How To > Deploy Process](https://docs.zerops.io/alpine/how-to/deploy-process)
- [Alpine > How To > Env Variables](https://docs.zerops.io/alpine/how-to/env-variables)
- [Alpine > How To > Filebrowser](https://docs.zerops.io/alpine/how-to/filebrowser)
@@ -29,7 +28,6 @@
- [Bun > How To > Controls](https://docs.zerops.io/bun/how-to/controls)
- [Bun > How To > Create](https://docs.zerops.io/bun/how-to/create)
- [Bun > How To > Customize Runtime](https://docs.zerops.io/bun/how-to/customize-runtime)
-- [Bun > How To > Delete](https://docs.zerops.io/bun/how-to/delete)
- [Bun > How To > Deploy Process](https://docs.zerops.io/bun/how-to/deploy-process)
- [Bun > How To > Env Variables](https://docs.zerops.io/bun/how-to/env-variables)
- [Bun > How To > Filebrowser](https://docs.zerops.io/bun/how-to/filebrowser)
@@ -49,7 +47,6 @@
- [Deno > How To > Controls](https://docs.zerops.io/deno/how-to/controls)
- [Deno > How To > Create](https://docs.zerops.io/deno/how-to/create)
- [Deno > How To > Customize Runtime](https://docs.zerops.io/deno/how-to/customize-runtime)
-- [Deno > How To > Delete](https://docs.zerops.io/deno/how-to/delete)
- [Deno > How To > Deploy Process](https://docs.zerops.io/deno/how-to/deploy-process)
- [Deno > How To > Env Variables](https://docs.zerops.io/deno/how-to/env-variables)
- [Deno > How To > Filebrowser](https://docs.zerops.io/deno/how-to/filebrowser)
@@ -65,7 +62,6 @@
- [Dotnet > How To > Controls](https://docs.zerops.io/dotnet/how-to/controls)
- [Dotnet > How To > Create](https://docs.zerops.io/dotnet/how-to/create)
- [Dotnet > How To > Customize Runtime](https://docs.zerops.io/dotnet/how-to/customize-runtime)
-- [Dotnet > How To > Delete](https://docs.zerops.io/dotnet/how-to/delete)
- [Dotnet > How To > Deploy Process](https://docs.zerops.io/dotnet/how-to/deploy-process)
- [Dotnet > How To > Env Variables](https://docs.zerops.io/dotnet/how-to/env-variables)
- [Dotnet > How To > Filebrowser](https://docs.zerops.io/dotnet/how-to/filebrowser)
@@ -81,7 +77,6 @@
- [Elixir > How To > Controls](https://docs.zerops.io/elixir/how-to/controls)
- [Elixir > How To > Create](https://docs.zerops.io/elixir/how-to/create)
- [Elixir > How To > Customize Runtime](https://docs.zerops.io/elixir/how-to/customize-runtime)
-- [Elixir > How To > Delete](https://docs.zerops.io/elixir/how-to/delete)
- [Elixir > How To > Deploy Process](https://docs.zerops.io/elixir/how-to/deploy-process)
- [Elixir > How To > Env Variables](https://docs.zerops.io/elixir/how-to/env-variables)
- [Elixir > How To > Filebrowser](https://docs.zerops.io/elixir/how-to/filebrowser)
@@ -101,33 +96,11 @@
- [Features > Infrastructure](https://docs.zerops.io/features/infrastructure)
- [Features > Pipeline](https://docs.zerops.io/features/pipeline)
- [Features > Scaling Ha](https://docs.zerops.io/features/scaling-ha)
-- [Frameworks > Laravel](https://docs.zerops.io/frameworks/laravel)
-- [Frameworks > Laravel > Cron](https://docs.zerops.io/frameworks/laravel/cron)
-- [Frameworks > Laravel > Env Variables](https://docs.zerops.io/frameworks/laravel/env-variables)
-- [Frameworks > Laravel > Faq](https://docs.zerops.io/frameworks/laravel/faq)
-- [Frameworks > Laravel > Introduction](https://docs.zerops.io/frameworks/laravel/introduction)
-- [Frameworks > Laravel > Logs](https://docs.zerops.io/frameworks/laravel/logs)
-- [Frameworks > Laravel > Migrations](https://docs.zerops.io/frameworks/laravel/migrations)
-- [Frameworks > Laravel > Recipes > Filament Devel](https://docs.zerops.io/frameworks/laravel/recipes/filament-devel)
-- [Frameworks > Laravel > Recipes > Filament Local](https://docs.zerops.io/frameworks/laravel/recipes/filament-local)
-- [Frameworks > Laravel > Recipes > Filament Prod](https://docs.zerops.io/frameworks/laravel/recipes/filament-prod)
-- [Frameworks > Laravel > Recipes > Jetstream Devel](https://docs.zerops.io/frameworks/laravel/recipes/jetstream-devel)
-- [Frameworks > Laravel > Recipes > Jetstream Local](https://docs.zerops.io/frameworks/laravel/recipes/jetstream-local)
-- [Frameworks > Laravel > Recipes > Jetstream Prod](https://docs.zerops.io/frameworks/laravel/recipes/jetstream-prod)
-- [Frameworks > Laravel > Recipes > Minimal Devel](https://docs.zerops.io/frameworks/laravel/recipes/minimal-devel)
-- [Frameworks > Laravel > Recipes > Minimal Local](https://docs.zerops.io/frameworks/laravel/recipes/minimal-local)
-- [Frameworks > Laravel > Recipes > Minimal Prod](https://docs.zerops.io/frameworks/laravel/recipes/minimal-prod)
-- [Frameworks > Laravel > Recipes > Twill Devel](https://docs.zerops.io/frameworks/laravel/recipes/twill-devel)
-- [Frameworks > Laravel > Recipes > Twill Local](https://docs.zerops.io/frameworks/laravel/recipes/twill-local)
-- [Frameworks > Laravel > Recipes > Twill Prod](https://docs.zerops.io/frameworks/laravel/recipes/twill-prod)
-- [Frameworks > Laravel > Redis](https://docs.zerops.io/frameworks/laravel/redis)
-- [Frameworks > Laravel > Smtp](https://docs.zerops.io/frameworks/laravel/smtp)
- [Gleam > How To > Build Pipeline](https://docs.zerops.io/gleam/how-to/build-pipeline)
- [Gleam > How To > Build Process](https://docs.zerops.io/gleam/how-to/build-process)
- [Gleam > How To > Controls](https://docs.zerops.io/gleam/how-to/controls)
- [Gleam > How To > Create](https://docs.zerops.io/gleam/how-to/create)
- [Gleam > How To > Customize Runtime](https://docs.zerops.io/gleam/how-to/customize-runtime)
-- [Gleam > How To > Delete](https://docs.zerops.io/gleam/how-to/delete)
- [Gleam > How To > Deploy Process](https://docs.zerops.io/gleam/how-to/deploy-process)
- [Gleam > How To > Env Variables](https://docs.zerops.io/gleam/how-to/env-variables)
- [Gleam > How To > Filebrowser](https://docs.zerops.io/gleam/how-to/filebrowser)
@@ -142,7 +115,6 @@
- [Go > How To > Controls](https://docs.zerops.io/go/how-to/controls)
- [Go > How To > Create](https://docs.zerops.io/go/how-to/create)
- [Go > How To > Customize Runtime](https://docs.zerops.io/go/how-to/customize-runtime)
-- [Go > How To > Delete](https://docs.zerops.io/go/how-to/delete)
- [Go > How To > Deploy Process](https://docs.zerops.io/go/how-to/deploy-process)
- [Go > How To > Env Variables](https://docs.zerops.io/go/how-to/env-variables)
- [Go > How To > Filebrowser](https://docs.zerops.io/go/how-to/filebrowser)
@@ -160,7 +132,6 @@
- [Java > How To > Controls](https://docs.zerops.io/java/how-to/controls)
- [Java > How To > Create](https://docs.zerops.io/java/how-to/create)
- [Java > How To > Customize Runtime](https://docs.zerops.io/java/how-to/customize-runtime)
-- [Java > How To > Delete](https://docs.zerops.io/java/how-to/delete)
- [Java > How To > Deploy Process](https://docs.zerops.io/java/how-to/deploy-process)
- [Java > How To > Env Variables](https://docs.zerops.io/java/how-to/env-variables)
- [Java > How To > Filebrowser](https://docs.zerops.io/java/how-to/filebrowser)
@@ -174,7 +145,6 @@
- [Keydb > How To > Connect](https://docs.zerops.io/keydb/how-to/connect)
- [Keydb > How To > Control](https://docs.zerops.io/keydb/how-to/control)
- [Keydb > How To > Create](https://docs.zerops.io/keydb/how-to/create)
-- [Keydb > How To > Delete](https://docs.zerops.io/keydb/how-to/delete)
- [Keydb > How To > Manage](https://docs.zerops.io/keydb/how-to/manage)
- [Keydb > How To > Scale](https://docs.zerops.io/keydb/how-to/scale)
- [Keydb > Overview](https://docs.zerops.io/keydb/overview)
@@ -182,7 +152,6 @@
- [Mariadb > How To > Connect](https://docs.zerops.io/mariadb/how-to/connect)
- [Mariadb > How To > Control](https://docs.zerops.io/mariadb/how-to/control)
- [Mariadb > How To > Create](https://docs.zerops.io/mariadb/how-to/create)
-- [Mariadb > How To > Delete](https://docs.zerops.io/mariadb/how-to/delete)
- [Mariadb > How To > Export Import Data](https://docs.zerops.io/mariadb/how-to/export-import-data)
- [Mariadb > How To > Manage](https://docs.zerops.io/mariadb/how-to/manage)
- [Mariadb > How To > Scale](https://docs.zerops.io/mariadb/how-to/scale)
@@ -197,7 +166,6 @@
- [Nginx > How To > Create](https://docs.zerops.io/nginx/how-to/create)
- [Nginx > How To > Customize Runtime](https://docs.zerops.io/nginx/how-to/customize-runtime)
- [Nginx > How To > Customize Web Server](https://docs.zerops.io/nginx/how-to/customize-web-server)
-- [Nginx > How To > Delete](https://docs.zerops.io/nginx/how-to/delete)
- [Nginx > How To > Deploy Process](https://docs.zerops.io/nginx/how-to/deploy-process)
- [Nginx > How To > Env Variables](https://docs.zerops.io/nginx/how-to/env-variables)
- [Nginx > How To > Filebrowser](https://docs.zerops.io/nginx/how-to/filebrowser)
@@ -213,7 +181,6 @@
- [Nodejs > How To > Controls](https://docs.zerops.io/nodejs/how-to/controls)
- [Nodejs > How To > Create](https://docs.zerops.io/nodejs/how-to/create)
- [Nodejs > How To > Customize Runtime](https://docs.zerops.io/nodejs/how-to/customize-runtime)
-- [Nodejs > How To > Delete](https://docs.zerops.io/nodejs/how-to/delete)
- [Nodejs > How To > Deploy Process](https://docs.zerops.io/nodejs/how-to/deploy-process)
- [Nodejs > How To > Env Variables](https://docs.zerops.io/nodejs/how-to/env-variables)
- [Nodejs > How To > Filebrowser](https://docs.zerops.io/nodejs/how-to/filebrowser)
@@ -224,9 +191,9 @@
- [Nodejs > How To > Upgrade](https://docs.zerops.io/nodejs/how-to/upgrade)
- [Nodejs > Overview](https://docs.zerops.io/nodejs/overview)
- [Object Storage > How To > Access](https://docs.zerops.io/object-storage/how-to/access)
+- [Object Storage > How To > Controls](https://docs.zerops.io/object-storage/how-to/controls)
- [Object Storage > How To > Create](https://docs.zerops.io/object-storage/how-to/create)
- [Object Storage > How To > Curl File](https://docs.zerops.io/object-storage/how-to/curl-file)
-- [Object Storage > How To > Delete](https://docs.zerops.io/object-storage/how-to/delete)
- [Object Storage > How To > Update Bucket](https://docs.zerops.io/object-storage/how-to/update-bucket)
- [Object Storage > Overview](https://docs.zerops.io/object-storage/overview)
- [Php > How To > Build Pipeline](https://docs.zerops.io/php/how-to/build-pipeline)
@@ -235,7 +202,6 @@
- [Php > How To > Create](https://docs.zerops.io/php/how-to/create)
- [Php > How To > Customize Runtime](https://docs.zerops.io/php/how-to/customize-runtime)
- [Php > How To > Customize Web Server](https://docs.zerops.io/php/how-to/customize-web-server)
-- [Php > How To > Delete](https://docs.zerops.io/php/how-to/delete)
- [Php > How To > Deploy Process](https://docs.zerops.io/php/how-to/deploy-process)
- [Php > How To > Env Variables](https://docs.zerops.io/php/how-to/env-variables)
- [Php > How To > Filebrowser](https://docs.zerops.io/php/how-to/filebrowser)
@@ -250,7 +216,6 @@
- [Postgresql > How To > Connect](https://docs.zerops.io/postgresql/how-to/connect)
- [Postgresql > How To > Control](https://docs.zerops.io/postgresql/how-to/control)
- [Postgresql > How To > Create](https://docs.zerops.io/postgresql/how-to/create)
-- [Postgresql > How To > Delete](https://docs.zerops.io/postgresql/how-to/delete)
- [Postgresql > How To > Export Import Data](https://docs.zerops.io/postgresql/how-to/export-import-data)
- [Postgresql > How To > Manage](https://docs.zerops.io/postgresql/how-to/manage)
- [Postgresql > How To > Scale](https://docs.zerops.io/postgresql/how-to/scale)
@@ -260,7 +225,6 @@
- [Python > How To > Controls](https://docs.zerops.io/python/how-to/controls)
- [Python > How To > Create](https://docs.zerops.io/python/how-to/create)
- [Python > How To > Customize Runtime](https://docs.zerops.io/python/how-to/customize-runtime)
-- [Python > How To > Delete](https://docs.zerops.io/python/how-to/delete)
- [Python > How To > Deploy Process](https://docs.zerops.io/python/how-to/deploy-process)
- [Python > How To > Env Variables](https://docs.zerops.io/python/how-to/env-variables)
- [Python > How To > Filebrowser](https://docs.zerops.io/python/how-to/filebrowser)
@@ -298,7 +262,6 @@
- [Rust > How To > Controls](https://docs.zerops.io/rust/how-to/controls)
- [Rust > How To > Create](https://docs.zerops.io/rust/how-to/create)
- [Rust > How To > Customize Runtime](https://docs.zerops.io/rust/how-to/customize-runtime)
-- [Rust > How To > Delete](https://docs.zerops.io/rust/how-to/delete)
- [Rust > How To > Deploy Process](https://docs.zerops.io/rust/how-to/deploy-process)
- [Rust > How To > Env Variables](https://docs.zerops.io/rust/how-to/env-variables)
- [Rust > How To > Filebrowser](https://docs.zerops.io/rust/how-to/filebrowser)
@@ -322,7 +285,6 @@
- [Ubuntu > How To > Controls](https://docs.zerops.io/ubuntu/how-to/controls)
- [Ubuntu > How To > Create](https://docs.zerops.io/ubuntu/how-to/create)
- [Ubuntu > How To > Customize Runtime](https://docs.zerops.io/ubuntu/how-to/customize-runtime)
-- [Ubuntu > How To > Delete](https://docs.zerops.io/ubuntu/how-to/delete)
- [Ubuntu > How To > Deploy Process](https://docs.zerops.io/ubuntu/how-to/deploy-process)
- [Ubuntu > How To > Env Variables](https://docs.zerops.io/ubuntu/how-to/env-variables)
- [Ubuntu > How To > Filebrowser](https://docs.zerops.io/ubuntu/how-to/filebrowser)