# Application parameters

Every key on this page is set per application, under `system_users[].vhosts[]`.
A [!badge variant="success" text="GUI"] key has a field in the interface; a
[!badge variant="warning" text="YAML only"] key is set in the
[Source (YAML) view](../../concepts/yaml-view.md), which accepts the same configuration.

## Domain and application type

Every application needs at least a domain and a certificate. The application type tells
TurboStack which software to provision and configure.

**Example** - every key in this section, with realistic values:

```yaml
system_users:
  - username: prod
    vhosts:
      - server_name: example.com www.example.com
        app_type: wordpress       # leave empty for a plain PHP site
        app_install: true         # run the installer, not just prepare the config
        app_name: shop            # only for a second app under the same user
        monitoring_url: /health    # what uptime monitoring requests
```

### `server_name`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"] [!badge variant="danger" text="required"]

The domain names this application answers on, separated by spaces. This is the application's address. Without it the application is not reachable.

**Note:** required. Must be unique across the host.

### `app_type`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"]

For example `wordpress`, `magento2`, `shopware`, `laravel`, `odoo`, `generic` - the GUI dropdown lists the values available now.

Tells TurboStack which application to provision, so it applies the right web server rules, caching and file layout. Saves you from configuring the stack by hand for a known application.

**Note:** leave it empty for a plain PHP site. The GUI dropdown lists the currently supported types.

### `app_install`

[!badge variant="info" text="boolean"] [!badge variant="warning" text="YAML only"]

Default `false`.

Actually runs the installer for the chosen application type, instead of only preparing the configuration. Get a working installation without downloading and installing the software yourself.

### `app_name`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"]

Names a secondary application under the same system user, in its own subfolder. Run several applications under one account, for example a shop and a separate blog.

**Note:** lowercase letters and digits, starting with a letter, at most 33 characters. Only one application per user may leave this empty.

### `monitoring_url`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"]

The URL that uptime monitoring requests for this application. Point monitoring at a health-check endpoint instead of the homepage.

## Certificates

Every application gets HTTPS through a Transport Layer Security (TLS) certificate. The
certificate source is set per application. See
[TLS certificates](../../platform/hosts/applications/tls-certificates.md) for the full
explanation.

**Example** - every key in this section, with realistic values:

```yaml
system_users:
  - username: prod
    vhosts:
      - server_name: example.com www.example.com
        cert_type: letsencrypt         # letsencrypt | selfsigned | custom
        cert_challenge: dns            # http | dns (dns is needed for wildcards)
        cert_provider: cloudflare      # hostedpower | cloudflare
        cert_cloudflare_api_token: "cf_xxxxxxxxxxxx"
        # For a certificate you bought instead of Let's Encrypt:
        # cert_type: custom
        # cert_fullchain: |
        #   -----BEGIN CERTIFICATE-----
        # cert_pvk: |
        #   -----BEGIN PRIVATE KEY-----
```

### `cert_type`

[!badge variant="info" text="enum"] [!badge variant="success" text="GUI"] [!badge variant="danger" text="required"]

One of `letsencrypt`, `selfsigned`, `custom`.

Selects where the certificate comes from - issued automatically, self-signed, or supplied by you. Choose `letsencrypt` for free automatic HTTPS that renews itself, or `custom` for a certificate you bought.

**Note:** required once `server_name` is set.

### `cert_fullchain`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"]

The certificate chain, in PEM format, for a certificate you supply yourself. Use a certificate from your own supplier, for example an extended-validation certificate.

**Note:** only with `cert_type: custom`. Must match `cert_pvk`, which is verified before deployment.

### `cert_pvk`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"]

The private key, in PEM format, belonging to `cert_fullchain`. Required alongside your own certificate.

**Note:** only with `cert_type: custom`.

> [!WARNING]
> A mismatch between key and certificate stops the deployment.

### `cert_challenge`

[!badge variant="info" text="enum"] [!badge variant="success" text="GUI"]

One of `http`, `dns`. Default `http`.

How ownership of the domain is proven when a certificate is issued. Domain Name System (DNS) validation is the only way to get a wildcard certificate, and it works before the domain points at the server.

### `cert_provider`

[!badge variant="info" text="enum"] [!badge variant="success" text="GUI"]

One of `hostedpower`, `cloudflare`.

Which DNS provider is used for DNS validation. Lets the platform create the validation record for you automatically.

**Note:** only with `cert_challenge: dns`.

### `cert_cloudflare_api_token`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

The API token used to create the DNS validation record. Needed when your domain is managed at Cloudflare and you use DNS validation.

**Note:** only with `cert_provider: cloudflare`.

## Runtimes

Each application picks its own runtime and version, so applications on one host can run
different versions side by side. Setting the version key is what enables that runtime -
there is no separate "enable" key.

Prefer a version that is still supported. Older versions keep working if your application
needs them, but they may no longer receive security updates, so plan to upgrade one
application at a time. The GUI dropdown always lists the versions available now.

**Example** - every key in this section, with realistic values:

```yaml
system_users:
  - username: prod
    vhosts:
      - server_name: example.com
        php_version: "8.4"           # one runtime per application
        # nodejs_version: "24"       # Node.js app (usually with proxy_enabled)
        # python_version: "3.13"     # Python app
        # ruby_version: "3.4"        # Ruby app
        # ruby_start_cmd: bundle exec puma -C config/puma.rb
        # ruby_sidekiq: true
        # ruby_sidekiq_cmd: bundle exec sidekiq -q default
        # dotnet_version: "10.0"     # .NET app
        docker_enabled: false        # run a containerized app
        k8s_enabled: false           # run Kubernetes workloads
        rabbitmq_enabled: false      # give this app a message broker
```

### `php_version`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"]

For example `8.2`, `8.3`, `8.4` - the GUI dropdown lists the values available now.

The PHP version this application runs on, with its own process pool. Match the version your application supports, and upgrade one application at a time.

**Note:** quote the value, for example `"8.4"`. The GUI dropdown lists the installed versions.

### `nodejs_version`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"]

For example `22`, `24` - the GUI dropdown lists the values available now.

Installs the given Node.js major version for this application. Run a Node.js application. Setting this key is what enables the runtime.

**Note:** quote the value, for example `"24"`. Usually combined with `proxy_enabled`.

### `python_version`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"]

For example `3.12`, `3.13` - the GUI dropdown lists the values available now.

Installs the given Python version for this application. Run a Python application.

### `ruby_version`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

For example `3.3`, `3.4` - the GUI dropdown lists the values available now.

Installs the given Ruby version for this application. Run a Ruby application such as Rails.

### `ruby_start_cmd`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

Default: A standard Puma start command.

The command used to start the Ruby application server. Use a different application server than the default.

### `ruby_sidekiq`

[!badge variant="info" text="boolean"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

Default `false`.

Runs a Sidekiq background-worker service for this application. Process background jobs for a Ruby application.

### `ruby_sidekiq_cmd`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

Overrides the command used to start Sidekiq. Pass your own queue or concurrency options.

### `dotnet_version`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

For example `8.0`, `10.0` - the GUI dropdown lists the values available now.

Installs the given .NET version and runs your application as a service behind the web server. Run a .NET application.

### `docker_enabled`

[!badge variant="info" text="boolean"] [!badge variant="success" text="GUI"]

Default `false`.

Allows this application's system user to run containers. Run a containerized application, with the web server proxying to the container.

**Note:** usually combined with `proxy_enabled` and `proxy_upstream_port`.

### `k8s_enabled`

[!badge variant="info" text="boolean"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

Default `false`.

Installs a lightweight Kubernetes orchestrator on the host. Run container workloads that need orchestration.

### `rabbitmq_enabled`

[!badge variant="info" text="boolean"] [!badge variant="success" text="GUI"]

Default `false`.

Provisions a message-broker account for this application, and installs the broker on the host if needed. Applications that process work in the background, such as OroCommerce, need a message broker.

## Application code from a Git repository

TurboStack can clone a Git repository for an application and update it on every publish, so
the code on the server always matches the branch or tag you chose. Add repositories in the
interface under **Configure application**, on the **GIT** tab.

**Example** - every key in this section, with realistic values:

```yaml
system_users:
  - username: prod
    vhosts:
      - server_name: example.com
        git:
          - repo: git@github.com:example/shop.git
            version: main            # branch, tag or commit
            path: public_html        # relative to the account's own folder
```

### `git`

[!badge variant="info" text="list"] [!badge variant="success" text="GUI"]

Default `empty`.

The repositories that are cloned and kept up to date for this application. Deploy from your own repository instead of copying files to the server by hand.

**Note:** the clone runs as the account that owns the application, so the files get the right owner straight away.

### `git.repo`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"] [!badge variant="danger" text="required"]

The address of the repository to clone, either an HTTPS or an SSH address. Tells the platform where your code lives.

**Note:** required for every entry. An entry without it is skipped.

### `git.version`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"]

Default `main`.

Which branch, tag or commit is checked out. Follow a branch on a staging host, and pin a production host to a released tag.

### `git.path`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"]

Default: The account's own folder.

Where the repository is placed, relative to the account's folder. Put the code straight into the folder the application is served from, for example `public_html`.

**Note:** the path is read as relative to the account's folder, so a leading slash is ignored. Leave it empty to clone into the account's folder itself.

## Caching and proxying

Use these to put a cache in front of an application, or to publish an application that runs
as its own process such as Node.js, Python or a container.

**Example** - every key in this section, with realistic values:

```yaml
system_users:
  - username: prod
    vhosts:
      - server_name: example.com
        varnish_enabled: true        # full-page cache (PHP storefronts)
        # For a Node.js/Python/.NET/container app instead:
        # proxy_enabled: true
        # proxy_upstream_port: 3000   # local port your app listens on
        # proxy_upstream_host: 127.0.0.1
```

### `varnish_enabled`

[!badge variant="info" text="boolean"] [!badge variant="success" text="GUI"]

Default `false`.

Puts this application behind the full-page cache. The single biggest speed win for PHP storefronts such as Magento and Shopware.

**Note:** nothing at host level - turning this on is what installs Varnish on the host, and the platform picks the version. The host keys under Caching and queues only tune it. Do not use this for Node.js applications.

### `proxy_enabled`

[!badge variant="info" text="boolean"] [!badge variant="success" text="GUI"]

Default `false`.

Makes the web server forward requests to an application running on a local port. The standard way to publish a Node.js, Python, .NET or containerized application.

### `proxy_upstream_port`

[!badge variant="info" text="integer"] [!badge variant="secondary" text="port"] [!badge variant="success" text="GUI"] [!badge variant="danger" text="required"]

Default `3000`.

The local port your application listens on. Tells the web server where to send the requests.

**Note:** required when `proxy_enabled` is true.

### `proxy_upstream_host`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

Default `127.0.0.1`.

The address the web server forwards to. Only change it when the application runs somewhere other than this server.

## PHP tuning

These override the automatically tuned PHP process pool for one application. The defaults
suit almost every site - change them only with measured evidence.

**Example** - every key in this section, with realistic values:

```yaml
system_users:
  - username: prod
    vhosts:
      - server_name: example.com
        php_version: "8.4"
        # Override the auto-tuned PHP-FPM pool only with evidence:
        php_fpm_pm_max_children: 40
        php_fpm_pm_start_servers: 8
        php_fpm_pm_min_spare_servers: 5
        php_fpm_pm_max_spare_servers: 12
        php_fpm_pm_max_requests: 500
        php_enhance: true            # skip file-change checks (reload after deploy)
        php_opcache_preload_script: /var/www/prod/example.com/config/preload.php
        php_user_tmp_dir: true       # dedicated temp folder for this app
```

### `php_fpm_pm_max_children`

[!badge variant="info" text="integer"] [!badge variant="secondary" text="count"] [!badge variant="warning" text="YAML only"] [!badge variant="ghost" text="advanced"]

Default: Inherited from the host.

The maximum number of PHP processes this application may run at once. Raise it for a busy application, lower it to stop one application using all the memory.

> [!WARNING]
> Too high a value can exhaust server memory and take down every application on the host.

### `php_fpm_pm_start_servers`

[!badge variant="info" text="integer"] [!badge variant="secondary" text="count"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

Default: Inherited from the host.

How many PHP processes are started immediately. Reduces warm-up delay after a restart on a busy application.

### `php_fpm_pm_min_spare_servers`

[!badge variant="info" text="integer"] [!badge variant="secondary" text="count"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

Default: Inherited from the host.

The minimum number of idle PHP processes kept ready. Absorbs traffic spikes without waiting for new processes.

### `php_fpm_pm_max_spare_servers`

[!badge variant="info" text="integer"] [!badge variant="secondary" text="count"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

Default: Inherited from the host.

The maximum number of idle PHP processes kept ready. Frees memory again after a spike.

### `php_fpm_pm_max_requests`

[!badge variant="info" text="integer"] [!badge variant="secondary" text="count"] [!badge variant="warning" text="YAML only"] [!badge variant="ghost" text="advanced"]

Default: Inherited from the host.

How many requests a PHP process handles before it is recycled. Recycling limits the impact of memory leaks in application code.

### `php_enhance`

[!badge variant="info" text="boolean"] [!badge variant="warning" text="YAML only"] [!badge variant="ghost" text="advanced"]

Default `false`.

Stops PHP from checking whether source files changed on disk. A real speed gain on production applications that are deployed, not edited live.

> [!WARNING]
> Code changes are ignored until PHP is reloaded. Never use it on a site you edit directly.

### `php_opcache_preload_script`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

Loads your framework into memory once at startup, instead of on every request. A large speed gain for frameworks that support preloading, such as Symfony and Laravel.

**Note:** only one application per PHP version may set this, and the file must exist. Otherwise the deployment fails.

### `php_user_tmp_dir`

[!badge variant="info" text="boolean"] [!badge variant="warning" text="YAML only"] [!badge variant="ghost" text="advanced"]

Default `false`.

Gives this application its own temporary folder instead of the shared one. Keeps sessions and uploads separated between applications on the same host.

## Performance monitoring

Connect an external application-performance monitoring product to a single application.

**Example** - every key in this section, with realistic values:

```yaml
system_users:
  - username: prod
    vhosts:
      - server_name: example.com
        newrelic_appname: "Example production"
        newrelic_license: "nr_xxxxxxxxxxxx"
        # Tideways instead of, or next to, New Relic:
        tideways_apikey: "tw_xxxxxxxxxxxx"
        tideways_service: web
        tideways_sample_rate: 25
```

### `newrelic_appname`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

The name this application reports under in New Relic. Recognise the application in your monitoring dashboard.

### `newrelic_license`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

The licence key used to send performance data. Enables application performance monitoring for this application only.

### `tideways_apikey`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

The key used to send profiling data to Tideways. Find slow code paths in a PHP application.

### `tideways_service`

[!badge variant="info" text="string"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

The service name this application reports under. Separate several applications in the same Tideways account.

### `tideways_sample_rate`

[!badge variant="info" text="integer"] [!badge variant="success" text="GUI"] [!badge variant="ghost" text="advanced"]

What percentage of requests is profiled. Lower it to reduce the overhead of profiling on a busy site.

## Related

- [YAML configuration reference](index.md)
- [The Source (YAML) view](../../concepts/yaml-view.md)
- [Publishing changes](../../platform/hosts/publishing.md)
