# Webscale Product Documentation - Complete Documentation > Comprehensive documentation for building, deploying, and managing your infrastructure, applications, and security with Webscale Networks. This document contains the complete documentation for Webscale Product Documentation except for the [Webscale API](https://docs.webscale.com/docs/api/), which is independently generated and whose OpenAPI specification is at https://control.webscale.com/docs/openapi.json. --- # 2026.40 URL: https://docs.webscale.com/docs/reference/images/2026.40/ Description: Released 2026-08-21 ## Changes ### V4: pass environment to web server The environment provided to containers running in a V4 web server image can now receive environment variables through cluster metadata by specifying a set of space-separated metadata keys in a metadata entry `CONTAINER_ENVIRONMENT`. ### Essentials: Vinyl bypass The relay proxy on essentials servers has been updated to bypass the Vinyl cache entirely if either of `Range` or `Bypass-Vinyl` headers are included in a request. ### V4: New web-server-php stack A new stack, `web-server-php` is now supported in the `web-server-v4` image family that will run php code in containers using a Symfony type front controller dispatch. A container image is specified by configuration of a cluster but defaults to displaying the system welcome page. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34
composer-2.10.2
newrelic 12.9.0.38 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.40 | | Container | php-fpm:8.2-arm64 | Debian 13.6 | 8.2.33
composer-2.10.2
newrelic 12.9.0.38 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.40 | | Container | php-fpm:8.3-arm64 | Debian 13.6 | 8.3.33
composer-2.10.2
newrelic 12.9.0.38 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.40 | | Container | php-fpm:8.4-arm64 | Debian 13.6 | 8.4.24
composer-2.10.2
newrelic 12.9.0.38 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.40 | | Container | php-fpm:8.5-arm64 | Debian 13.6 | 8.5.9
composer-2.10.2
newrelic 12.9.0.38 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.40 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.40 | | Container | php-fpm:8.2-deb | Debian 13.6 | 8.2.33
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.40 | | Container | php-fpm:8.3-deb | Debian 13.6 | 8.3.33
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.40 | | Container | php-fpm:8.4-deb | Debian 13.6 | 8.4.24
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.40 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.40 | | Container | php-fpm:8.2 | Alpine 3.24.1 | 8.2.33
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.40 | | Container | php-fpm:8.3 | Alpine 3.24.1 | 8.3.33
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.40 | | Container | php-fpm:8.4 | Alpine 3.24.1 | 8.4.24
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.40 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.5 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.40 | | Container | varnish | Debian 12.15 | 6.0.18 | arm64 | public.ecr.aws/webscale/varnish:2026.40 | --- # 2026.39 URL: https://docs.webscale.com/docs/reference/images/2026.39/ Description: Released 2026-08-18 ## Changes ### Always build containers with latest New Relic Previously, the New Relic PHP agent installed on container images was fixed at a specific version and periodically updated, last to 12.4.0.29. This change updates the agent install to always use the latest version, currently 12.9.0.38. ### Manage service dependencies within stacker For the V4 web server image family, this change moves the responsibility for managing `/share/www` mount dependencies from a systemd stacker service declaration to a stack resource definition using a new `required_services` declaration. During resource configuration, a required resource is started as necessary until it becomes active. This occurs in an infinite loop with a small delay to recover from transient that might occur during unit start. This creates the possibility for a stack based on a web server image that does not require a `/share/www` directory. ### Essentials: Fix file descriptor exhaustion The php-fpm relay ran out of file descriptors on an essentials system after enabling Vinyl, repeating the messsage `dial unix /run/php-fpm.sock: connect: resource temporarily unavailable` in the `php-fpm` unit logs. Two factors contributed to this problem. First, poor tuning of the Vinyl proxy led to connections to the Vinyl server being closed almost immediately after use, leading to port exhaustion as connections were held in TIME_WAIT. Second, a deadlock could occur when a client closed a connection early without waiting for a complete response, leaving a connection and its associated file descriptors forever held. Both of these issues have been addressed in this change. ### Essentials: Vinyl client commands Commands `varnishadm`, `varnishhist`, `varnishlog`, `varnishstat`, and `varnishtop` are now available on the core server. ### Support for web-server stack Two new services added to `webscale-web-server` package: `web-server` and `relay`. The web server service simply launches the container provided in the cluster server metadata. The relay service, in this case, runs on the host and routes port 80 traffic to the container listening on port 3000. Providing a value for metadata key `CONTAINER_HTTP_PORT` is used to override the container port. ### Add Elasticsearch plugin support When the `webscale-opensearch` is installed and configured for the `elasticsearch` variant, `OPENSEARCH_PLUGINS` can be used to install plugins at startup as is already supported for OpenSearch. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | RabbitMQ | 4.3.4 | 4.3.5 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34
composer-2.10.2
newrelic 12.9.0.38 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.39 | | Container | php-fpm:8.2-arm64 | Debian 13.6 | 8.2.33
composer-2.10.2
newrelic 12.9.0.38 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.39 | | Container | php-fpm:8.3-arm64 | Debian 13.6 | 8.3.33
composer-2.10.2
newrelic 12.9.0.38 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.39 | | Container | php-fpm:8.4-arm64 | Debian 13.6 | 8.4.24
composer-2.10.2
newrelic 12.9.0.38 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.39 | | Container | php-fpm:8.5-arm64 | Debian 13.6 | 8.5.9
composer-2.10.2
newrelic 12.9.0.38 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.39 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.39 | | Container | php-fpm:8.2-deb | Debian 13.6 | 8.2.33
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.39 | | Container | php-fpm:8.3-deb | Debian 13.6 | 8.3.33
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.39 | | Container | php-fpm:8.4-deb | Debian 13.6 | 8.4.24
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.39 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.39 | | Container | php-fpm:8.2 | Alpine 3.24.1 | 8.2.33
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.39 | | Container | php-fpm:8.3 | Alpine 3.24.1 | 8.3.33
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.39 | | Container | php-fpm:8.4 | Alpine 3.24.1 | 8.4.24
composer-2.10.2
newrelic 12.9.0.38 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.39 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.5 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.39 | | Container | varnish | Debian 12.15 | 6.0.18 | arm64 | public.ecr.aws/webscale/varnish:2026.39 | --- # 2026.38 URL: https://docs.webscale.com/docs/reference/images/2026.38/ Description: Released 2026-08-11 ## Changes ### Allow V3 web-server to mount V4 core share This adds a `share-www.mount` unit that can be enabled with `command.EnableService` that will mount a V4 core server share defined in the same VPC at `/share/www`. ### Allow username and password to be omitted for AWS ECR Previously, although the ECR credential helper was installed and the AWS instance profile was granted authority to pull images by obtaining a password, the `ContainerRun` command required an explicit username and password. This in turn required it be preceded by a `PrepareEcrLoginPassword`, because the credentials have a short lifespan. This was needless, tedious configuration. A `ContainerRun` command can now omit the `username` and `password` parameters, in which case an image pull to an authorized registry is handled automatically. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.38 | | Container | php-fpm:8.2-arm64 | Debian 13.6 | 8.2.33, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.38 | | Container | php-fpm:8.3-arm64 | Debian 13.6 | 8.3.33, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.38 | | Container | php-fpm:8.4-arm64 | Debian 13.6 | 8.4.24, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.38 | | Container | php-fpm:8.5-arm64 | Debian 13.6 | 8.5.9, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.38 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.38 | | Container | php-fpm:8.2-deb | Debian 13.6 | 8.2.33, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.38 | | Container | php-fpm:8.3-deb | Debian 13.6 | 8.3.33, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.38 | | Container | php-fpm:8.4-deb | Debian 13.6 | 8.4.24, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.38 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.38 | | Container | php-fpm:8.2 | Alpine 3.24.1 | 8.2.33, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.38 | | Container | php-fpm:8.3 | Alpine 3.24.1 | 8.3.33, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.38 | | Container | php-fpm:8.4 | Alpine 3.24.1 | 8.4.24, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.38 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.4 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.38 | | Container | varnish | Debian 12.15 | 6.0.18 | arm64 | public.ecr.aws/webscale/varnish:2026.38 | --- # 2026.37 URL: https://docs.webscale.com/docs/reference/images/2026.37/ Description: Released 2026-08-11 ## Changes This release contains only internal changes. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.37 | | Container | php-fpm:8.2-arm64 | Debian 13.6 | 8.2.33, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.37 | | Container | php-fpm:8.3-arm64 | Debian 13.6 | 8.3.33, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.37 | | Container | php-fpm:8.4-arm64 | Debian 13.6 | 8.4.24, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.37 | | Container | php-fpm:8.5-arm64 | Debian 13.6 | 8.5.9, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.37 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.37 | | Container | php-fpm:8.2-deb | Debian 13.6 | 8.2.33, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.37 | | Container | php-fpm:8.3-deb | Debian 13.6 | 8.3.33, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.37 | | Container | php-fpm:8.4-deb | Debian 13.6 | 8.4.24, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.37 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.37 | | Container | php-fpm:8.2 | Alpine 3.24.1 | 8.2.33, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.37 | | Container | php-fpm:8.3 | Alpine 3.24.1 | 8.3.33, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.37 | | Container | php-fpm:8.4 | Alpine 3.24.1 | 8.4.24, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.37 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.4 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.37 | | Container | varnish | Debian 12.15 | 6.0.18 | arm64 | public.ecr.aws/webscale/varnish:2026.37 | --- # 2026.36 URL: https://docs.webscale.com/docs/reference/images/2026.36/ Description: Released 2026-08-10 ## Changes ### V3: Supervisor support on web-server It is apparently typical practice to create cron servers and supervisor servers with clusters based on a `web-server` image. Therefore, this release adds the supervisor shims that are included in the `nfs-server` image as an optional service. Configuration files may be placed in the host `/etc/supervisor` directory and are normally expected to be placed there by the invoker bootstrap sequence. A new `command.EnableService` invoker command accepting a `name` parameter can be used to enable a systemd service such as `supervisor`. To use supervisor in this way, it is required that the image for a cluster is configured via cluster attributes so that the `CONTAINER_IMAGE_URI` metadata variable is set. ### V3: shell command on web-server Supervisor is run through the `shell` command, which is now provided on web servers. For mapping network shared files into the shell, the metadata variables `WEBSCALE_SHARE` and `WEBSCALE_SHARED_DIRS` is used to set the directory where the file system is mounted and a space- separated set of subdirectories (or files) that are mapped into the shell. For example, `/var/www/shared/mysite.com` and `pub/media var` are usual, respective values. Note that unlike `V4` systems, the `html` prefix is *not* included and it is not possible to share at the top level. ### V3: Invoker configuration from metadata This release adds a metadata variable `WEBSCALE_BOOTSTRAP` that specifies a locator for a bootstrap sequence. In combination with metadata variables `WEBSCALE_CUSTOMER` and `WEBSCALE_ENVIRONMENT`, it is no longer necessary to write any files to the file system (as was formerly done in a cloud-init script). ### Datadog collector The Datadog collector is now added to all images and can be enabled by defining metadata variable `DATADOG_API_KEY` or by providing file `/etc/datadog-agent/datadog.yaml`. ### New tools New tools are added to all images: - `btop`: Command line resource monitor - `mtr-tiny`: Full screen ncurses traceroute tool - `ncdu`: Disk usage viewer - `psmisc`: Proc file system utilities - `rclone`: Rsync for commercial cloud storage - `ripgrep`: Recursively searches directories for a regex pattern - `wget`: Retrieves files from the web ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | PHP | 8.2.32 | 8.2.33 | | PHP | 8.3.32 | 8.3.33 | | PHP | 8.4.23 | 8.4.24 | | PHP | 8.5.8 | 8.5.9 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.36 | | Container | php-fpm:8.2-arm64 | Debian 13.6 | 8.2.33, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.36 | | Container | php-fpm:8.3-arm64 | Debian 13.6 | 8.3.33, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.36 | | Container | php-fpm:8.4-arm64 | Debian 13.6 | 8.4.24, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.36 | | Container | php-fpm:8.5-arm64 | Debian 13.6 | 8.5.9, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.36 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.36 | | Container | php-fpm:8.2-deb | Debian 13.6 | 8.2.33, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.36 | | Container | php-fpm:8.3-deb | Debian 13.6 | 8.3.33, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.36 | | Container | php-fpm:8.4-deb | Debian 13.6 | 8.4.24, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.36 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.36 | | Container | php-fpm:8.2 | Alpine 3.24.1 | 8.2.33, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.36 | | Container | php-fpm:8.3 | Alpine 3.24.1 | 8.3.33, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.36 | | Container | php-fpm:8.4 | Alpine 3.24.1 | 8.4.24, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.36 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.4 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.36 | | Container | varnish | Debian 12.15 | 6.0.18 | arm64 | public.ecr.aws/webscale/varnish:2026.36 | --- # 2026.35 URL: https://docs.webscale.com/docs/reference/images/2026.35/ Description: Released 2026-08-07 ## Changes ### Prevent private networks from SSHGuard block Requests from networks `10.0.0.0/8`, `172.16.0.0/12`, and `192.168.0.0/16` will no longer be blocked by SSHGuard. ### V4 essentials: Fix default.vcl is overwritten by stacker For an essentials server, the file `/etc/vinyl/default.vcl` is meant to be populated by the stack and made writable by the `dev` group on initial install and then not touched afterward. Instead, it was being treated as a template and overwritten on each execution of stacker and without the permissions being set correctly. This change corrects the handling to install the file only on the initial run. ### V4: Fix core server root disk fills up As images are changed and used as part of `dev` or cron execution, they are not pruned by the default image pruner because it only functions if docker is installed. This creates a core server pruner that runs hourly that prunes all unused images except the one currently in use. ### Fix logrotate package mistakenly omitted Since 2026.29 logrotate was not automatically included in the web-server and nfs-server builds because "recommended" packages are no longer automatically installed. This change updates the server init script so that all images will now contain logrotate. ### Add eu-west-3 as a sharing region for images ### Add OpenSearch plugin support Adds support for installing OpenSearch plugins at container startup via a custom entrypoint script. Plugins listed in `OPENSEARCH_PLUGINS` in `/etc/opensearch/env` are installed on startup if not already present. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.35 | | Container | php-fpm:8.2-arm64 | Debian 13.6 | 8.2.32, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.35 | | Container | php-fpm:8.3-arm64 | Debian 13.6 | 8.3.32, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.35 | | Container | php-fpm:8.4-arm64 | Debian 13.6 | 8.4.23, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.35 | | Container | php-fpm:8.5-arm64 | Debian 13.6 | 8.5.8, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.35 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.35 | | Container | php-fpm:8.2-deb | Debian 13.6 | 8.2.32, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.35 | | Container | php-fpm:8.3-deb | Debian 13.6 | 8.3.32, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.35 | | Container | php-fpm:8.4-deb | Debian 13.6 | 8.4.23, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.35 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.35 | | Container | php-fpm:8.2 | Alpine 3.24.1 | 8.2.32, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.35 | | Container | php-fpm:8.3 | Alpine 3.24.1 | 8.3.32, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.35 | | Container | php-fpm:8.4 | Alpine 3.24.1 | 8.4.23, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.35 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.4 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.35 | | Container | varnish | Debian 12.15 | 6.0.18 | arm64 | public.ecr.aws/webscale/varnish:2026.35 | --- # 2026.34 URL: https://docs.webscale.com/docs/reference/images/2026.34/ Description: Released 2026-07-21 ## Changes ### Simplify image sharing Images are now shared within the Webscale Networks AWS organization directly instead of account by account, simplifying image access for new accounts. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | Debian | 12.14 | 12.15 | | Debian | 13.5 | 13.6 | | PHP | 8.2.31 | 8.2.32 | | PHP | 8.3.31 | 8.3.32 | | PHP | 8.4.22 | 8.4.23 | | PHP | 8.5.7 | 8.5.8 | | RabbitMQ | 4.3.2 | 4.3.3 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.34 | | Container | php-fpm:8.2-arm64 | Debian 13.6 | 8.2.32, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.34 | | Container | php-fpm:8.3-arm64 | Debian 13.6 | 8.3.32, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.34 | | Container | php-fpm:8.4-arm64 | Debian 13.6 | 8.4.23, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.34 | | Container | php-fpm:8.5-arm64 | Debian 13.6 | 8.5.8, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.34 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.34 | | Container | php-fpm:8.2-deb | Debian 13.6 | 8.2.32, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.34 | | Container | php-fpm:8.3-deb | Debian 13.6 | 8.3.32, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.34 | | Container | php-fpm:8.4-deb | Debian 13.6 | 8.4.23, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.34 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.34 | | Container | php-fpm:8.2 | Alpine 3.24.1 | 8.2.32, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.34 | | Container | php-fpm:8.3 | Alpine 3.24.1 | 8.3.32, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.34 | | Container | php-fpm:8.4 | Alpine 3.24.1 | 8.4.23, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.34 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.3 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.34 | | Container | varnish | Debian 12.15 | 6.0.18 | arm64 | public.ecr.aws/webscale/varnish:2026.34 | --- # 2026.33 URL: https://docs.webscale.com/docs/reference/images/2026.33/ Description: Released 2026-07-01 ## Changes ### New Pro Magento V4 stack This adds hosting image support for the `pro-magento-v4` stack type. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | Composer | 2.10.1 | 2.10.2 | | Alpine | 3.24.0 | 3.24.1 | | RabbitMQ | 4.3.1 | 4.3.2 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.33 | | Container | php-fpm:8.2-arm64 | Debian 13.5 | 8.2.31, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.33 | | Container | php-fpm:8.3-arm64 | Debian 13.5 | 8.3.31, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.33 | | Container | php-fpm:8.4-arm64 | Debian 13.5 | 8.4.22, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.33 | | Container | php-fpm:8.5-arm64 | Debian 13.5 | 8.5.7, composer-2.10.2 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.33 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.33 | | Container | php-fpm:8.2-deb | Debian 13.5 | 8.2.31, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.33 | | Container | php-fpm:8.3-deb | Debian 13.5 | 8.3.31, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.33 | | Container | php-fpm:8.4-deb | Debian 13.5 | 8.4.22, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.33 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.33 | | Container | php-fpm:8.2 | Alpine 3.24.1 | 8.2.31, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.33 | | Container | php-fpm:8.3 | Alpine 3.24.1 | 8.3.31, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.33 | | Container | php-fpm:8.4 | Alpine 3.24.1 | 8.4.22, composer-2.10.2 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.33 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.2 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.33 | | Container | varnish | Debian 12.14 | 6.0.18 | arm64 | public.ecr.aws/webscale/varnish:2026.33 | --- # 2026.32 URL: https://docs.webscale.com/docs/reference/images/2026.32/ Description: Released 2026-06-10 ## Changes ### Varnish transient memory Update varnish to use 1/8th of overall system memory for the transient pool, increased from a fixed 1GB. ### Opensearch network access Fix the opensearch binding to always use host networking, for both the essentials systems and those where `webscale-opensearch` is installed. This avoids a problem where podman does not create the correct nftables rules. ### Core server image on Standard V4 Add a new `image-monitor` unit to the core server that allows it to receive the same image as an associated cluster so that it can be used to run cron, for example. ### Remove dotfiles restriction Update the relay proxy to no longer exclude all dot files from being served, but only `.git`, `.htpasswd`, `.htaccess`, `.user.ini`, and `.env`. ### Debian packaging version numbering Update the versions numbering scheme of the debian packages to drop the constant `.0` suffix. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.10.1 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.32 | | Container | php-fpm:8.2-arm64 | Debian 13.5 | 8.2.31, composer-2.10.1 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.32 | | Container | php-fpm:8.3-arm64 | Debian 13.5 | 8.3.31, composer-2.10.1 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.32 | | Container | php-fpm:8.4-arm64 | Debian 13.5 | 8.4.22, composer-2.10.1 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.32 | | Container | php-fpm:8.5-arm64 | Debian 13.5 | 8.5.7, composer-2.10.1 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.32 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.32 | | Container | php-fpm:8.2-deb | Debian 13.5 | 8.2.31, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.32 | | Container | php-fpm:8.3-deb | Debian 13.5 | 8.3.31, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.32 | | Container | php-fpm:8.4-deb | Debian 13.5 | 8.4.22, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.32 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.32 | | Container | php-fpm:8.2 | Alpine 3.24.0 | 8.2.31, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.32 | | Container | php-fpm:8.3 | Alpine 3.24.0 | 8.3.31, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.32 | | Container | php-fpm:8.4 | Alpine 3.24.0 | 8.4.22, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.32 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.1 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.32 | | Container | varnish | Debian 12.14 | 6.0.18 | arm64 | public.ecr.aws/webscale/varnish:2026.32 | --- # 2026.31 URL: https://docs.webscale.com/docs/reference/images/2026.31/ Description: Released 2026-06-10 ## Changes ### New webscale-valkey package A new `webscale-valkey` package is added to the `webscale` debian repository that allows `valkey` to be used on NFS servers. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | Composer | 2.9.8 | 2.10.1 | | PHP | 8.4.21 | 8.4.22 | | PHP | 8.5.6 | 8.5.7 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.10.1 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.31 | | Container | php-fpm:8.2-arm64 | Debian 13.5 | 8.2.31, composer-2.10.1 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.31 | | Container | php-fpm:8.3-arm64 | Debian 13.5 | 8.3.31, composer-2.10.1 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.31 | | Container | php-fpm:8.4-arm64 | Debian 13.5 | 8.4.22, composer-2.10.1 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.31 | | Container | php-fpm:8.5-arm64 | Debian 13.5 | 8.5.7, composer-2.10.1 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.31 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.31 | | Container | php-fpm:8.2-deb | Debian 13.5 | 8.2.31, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.31 | | Container | php-fpm:8.3-deb | Debian 13.5 | 8.3.31, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.31 | | Container | php-fpm:8.4-deb | Debian 13.5 | 8.4.22, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.31 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.31 | | Container | php-fpm:8.2 | Alpine 3.23.4 | 8.2.31, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.31 | | Container | php-fpm:8.3 | Alpine 3.23.4 | 8.3.31, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.31 | | Container | php-fpm:8.4 | Alpine 3.23.4 | 8.4.22, composer-2.10.1 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.31 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.1 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.31 | | Container | varnish | Debian 12.14 | 6.0.18 | arm64 | public.ecr.aws/webscale/varnish:2026.31 | --- # 2026.30 URL: https://docs.webscale.com/docs/reference/images/2026.30/ Description: Released 2026-05-27 ## Changes ### Standard Magento stack improvements - Opensearch and Valkey instances are properly bound to allow external network traffic. - The `html/app/etc` directory can be included in the `share` variable, allowing it to be shared and the automatic configuration to be suppressed. - An authorization bug preventing the `php-fpm` service from starting has been fixed. - A default `/etc/php/env.php` is made available and can be incorporated into a site `env.php` using `array_replace_recursive`. - An error causing the `/etc/php/registry-auth.json` to fail to generate has been corrected. - An issue with the relay proxy using the wrong document root has been corrected. It also now prints additional information about its config at startup in its log. - Stack definitions now include default variable values. - The relay proxy now runs within the php-fpm container context to simplify file system access. - The relay proxy uses a specific Magento behavior module that provides greater fidelity to Magento requirements. Similar modules for Symfony (Shopware), and Wordpress are also included. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | RabbitMQ | 4.3.0 | 4.3.1 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.30 | | Container | php-fpm:8.2-arm64 | Debian 13.5 | 8.2.31, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.30 | | Container | php-fpm:8.3-arm64 | Debian 13.5 | 8.3.31, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.30 | | Container | php-fpm:8.4-arm64 | Debian 13.5 | 8.4.21, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.30 | | Container | php-fpm:8.5-arm64 | Debian 13.5 | 8.5.6, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.30 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.30 | | Container | php-fpm:8.2-deb | Debian 13.5 | 8.2.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.30 | | Container | php-fpm:8.3-deb | Debian 13.5 | 8.3.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.30 | | Container | php-fpm:8.4-deb | Debian 13.5 | 8.4.21, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.30 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.30 | | Container | php-fpm:8.2 | Alpine 3.23.4 | 8.2.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.30 | | Container | php-fpm:8.3 | Alpine 3.23.4 | 8.3.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.30 | | Container | php-fpm:8.4 | Alpine 3.23.4 | 8.4.21, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.30 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.1 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.30 | | Container | varnish | Debian 12.14 | 6.0.18 | arm64 | public.ecr.aws/webscale/varnish:2026.30 | --- # 2026.29 URL: https://docs.webscale.com/docs/reference/images/2026.29/ Description: Released 2026-05-21 ## Changes ### Fix CONTAINER_IMAGE_URI not propagated Previously, when `CONTAINER_IMAGE_URI` metadata is set on a cluster, it was not propagated to the web server stack, and instead the default base image was run. This change updates stack variable processing, making metadata available and updates the php-fpm template to use `CONTAINER_IMAGE_URI` if it is present. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.29 | | Container | php-fpm:8.2-arm64 | Debian 13.5 | 8.2.31, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.29 | | Container | php-fpm:8.3-arm64 | Debian 13.5 | 8.3.31, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.29 | | Container | php-fpm:8.4-arm64 | Debian 13.5 | 8.4.21, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.29 | | Container | php-fpm:8.5-arm64 | Debian 13.5 | 8.5.6, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.29 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.29 | | Container | php-fpm:8.2-deb | Debian 13.5 | 8.2.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.29 | | Container | php-fpm:8.3-deb | Debian 13.5 | 8.3.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.29 | | Container | php-fpm:8.4-deb | Debian 13.5 | 8.4.21, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.29 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.29 | | Container | php-fpm:8.2 | Alpine 3.23.4 | 8.2.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.29 | | Container | php-fpm:8.3 | Alpine 3.23.4 | 8.3.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.29 | | Container | php-fpm:8.4 | Alpine 3.23.4 | 8.4.21, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.29 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.0 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.29 | | Container | varnish | Debian 12.14 | 6.0.18 | arm64 | public.ecr.aws/webscale/varnish:2026.29 | --- # 2026.28 URL: https://docs.webscale.com/docs/reference/images/2026.28/ Description: Released 2026-05-21 ## Changes ### Mitigation for CVE-2026-46333 This release includes mitigation for CVE-2026-46333, disabling ptrace for non-root users. ### Relay proxy improvements Updates to the relay proxy for essentials and standard stacks. This allows for Wordpress to be installed at /var/www/html. ### Fix bad permissions for opensearch Updates to the nfs-server `fix-shared-permissions` command to exclude opensearch and redis directories. ### PHP logging improvements Use `REQUEST_URI` instead of `%r%Q%q` for URI logging in PHP-FPM container logs. This avoids the problem of all logs containing the path of the front controller (usually `/index.php`). ### Reduced PHP attack surface Setting `cgi.fix_pathinfo = 0` for essentials and standard packages. This disallows old-style PHP paths such as `/entry.php/some/path`, which are not expected to be used in modern environments. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | Debian | 13.4 | 13.5 | | Varnish | 6.0.17 | 6.0.18 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.28 | | Container | php-fpm:8.2-arm64 | Debian 13.5 | 8.2.31, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.28 | | Container | php-fpm:8.3-arm64 | Debian 13.5 | 8.3.31, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.28 | | Container | php-fpm:8.4-arm64 | Debian 13.5 | 8.4.21, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.28 | | Container | php-fpm:8.5-arm64 | Debian 13.5 | 8.5.6, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.28 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.28 | | Container | php-fpm:8.2-deb | Debian 13.5 | 8.2.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.28 | | Container | php-fpm:8.3-deb | Debian 13.5 | 8.3.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.28 | | Container | php-fpm:8.4-deb | Debian 13.5 | 8.4.21, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.28 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.28 | | Container | php-fpm:8.2 | Alpine 3.23.4 | 8.2.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.28 | | Container | php-fpm:8.3 | Alpine 3.23.4 | 8.3.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.28 | | Container | php-fpm:8.4 | Alpine 3.23.4 | 8.4.21, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.28 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.0 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.28 | | Container | varnish | Debian 12.14 | 6.0.18 | arm64 | public.ecr.aws/webscale/varnish:2026.28 | --- # 2026.27 URL: https://docs.webscale.com/docs/reference/images/2026.27/ Description: Released 2026-05-14 ## Changes ### Mitigate CVE-2026-42945 This release includes an update to nginx 1.24.0-2ubuntu7.8 for relevant images to prevent the attack described in CVE-2026-42945. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.27 | | Container | php-fpm:8.2-arm64 | Debian 13.4 | 8.2.31, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.27 | | Container | php-fpm:8.3-arm64 | Debian 13.4 | 8.3.31, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.27 | | Container | php-fpm:8.4-arm64 | Debian 13.4 | 8.4.21, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.27 | | Container | php-fpm:8.5-arm64 | Debian 13.4 | 8.5.6, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.27 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.27 | | Container | php-fpm:8.2-deb | Debian 13.4 | 8.2.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.27 | | Container | php-fpm:8.3-deb | Debian 13.4 | 8.3.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.27 | | Container | php-fpm:8.4-deb | Debian 13.4 | 8.4.21, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.27 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.27 | | Container | php-fpm:8.2 | Alpine 3.23.4 | 8.2.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.27 | | Container | php-fpm:8.3 | Alpine 3.23.4 | 8.3.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.27 | | Container | php-fpm:8.4 | Alpine 3.23.4 | 8.4.21, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.27 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.0 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.27 | | Container | varnish | Debian 12.13 | 6.0.17 | arm64 | public.ecr.aws/webscale/varnish:2026.27 | --- # 2026.26 URL: https://docs.webscale.com/docs/reference/images/2026.26/ Description: Released 2026-05-13 ## Changes ### Mitigate CVE-2026-43284 and CVE-2026-43500 This release includes mitigation for CVE-2026-43284 and CVE-2026-43500, aka ["Dirty Frag"](https://github.com/V4bel/dirtyfrag). ### Relay proxy dropped connection fix Improvements are made in error recovery for the relay proxy when clients close connections. Previously, when a client closed a connection, it could result in connection in an inconsistent state. Then subsequent requests could attempt to use the connection and fail because the state maintained by the proxy server was not consistent with the state of the connection in PHP-FPM. This change causes a FastCGI abort to be used when a client terminates a connection early, releasing PHP-FPM resources as early as possible and preventing connection reuse. ### New "Standard Magento" stack This release introduces a new `web-server-v4` image family. Note that this family is not compatible with images in the invoker based `web-server` and they must not be considered interchangeable. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | PHP | 8.2.30 | 8.2.31 | | PHP | 8.3.30 | 8.3.31 | | PHP | 8.4.20 | 8.4.21 | | PHP | 8.5.5 | 8.5.6 | | Composer | 2.9.7 | 2.9.8 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.26 | | Container | php-fpm:8.2-arm64 | Debian 13.4 | 8.2.31, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.26 | | Container | php-fpm:8.3-arm64 | Debian 13.4 | 8.3.31, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.26 | | Container | php-fpm:8.4-arm64 | Debian 13.4 | 8.4.21, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.26 | | Container | php-fpm:8.5-arm64 | Debian 13.4 | 8.5.6, composer-2.9.8 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.26 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.26 | | Container | php-fpm:8.2-deb | Debian 13.4 | 8.2.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.26 | | Container | php-fpm:8.3-deb | Debian 13.4 | 8.3.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.26 | | Container | php-fpm:8.4-deb | Debian 13.4 | 8.4.21, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.26 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.26 | | Container | php-fpm:8.2 | Alpine 3.23.4 | 8.2.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.26 | | Container | php-fpm:8.3 | Alpine 3.23.4 | 8.3.31, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.26 | | Container | php-fpm:8.4 | Alpine 3.23.4 | 8.4.21, composer-2.9.8 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.26 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.0 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.26 | | Container | varnish | Debian 12.13 | 6.0.17 | arm64 | public.ecr.aws/webscale/varnish:2026.26 | --- # 2026.25 URL: https://docs.webscale.com/docs/reference/images/2026.25/ Description: Released 2026-04-29 ## Changes ### Mitigate CVE-2026-31431 This change mitigates the local privilege escalation vulnerability registered as CVE-2026-31431 and documented with an exploit at https://copy.fail/. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.25 | | Container | php-fpm:8.2-arm64 | Debian 13.4 | 8.2.30, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.25 | | Container | php-fpm:8.3-arm64 | Debian 13.4 | 8.3.30, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.25 | | Container | php-fpm:8.4-arm64 | Debian 13.4 | 8.4.20, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.25 | | Container | php-fpm:8.5-arm64 | Debian 13.4 | 8.5.5, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.25 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.25 | | Container | php-fpm:8.2-deb | Debian 13.4 | 8.2.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.25 | | Container | php-fpm:8.3-deb | Debian 13.4 | 8.3.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.25 | | Container | php-fpm:8.4-deb | Debian 13.4 | 8.4.20, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.25 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.25 | | Container | php-fpm:8.2 | Alpine 3.23.4 | 8.2.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.25 | | Container | php-fpm:8.3 | Alpine 3.23.4 | 8.3.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.25 | | Container | php-fpm:8.4 | Alpine 3.23.4 | 8.4.20, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.25 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.0 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.25 | | Container | varnish | Debian 12.13 | 6.0.17 | arm64 | public.ecr.aws/webscale/varnish:2026.25 | --- # 2026.24 URL: https://docs.webscale.com/docs/reference/images/2026.24/ Description: Released 2026-04-29 ## Changes ### Add custom image support to essentials Essentials servers have been fitted with optional PHP-FPM custom image support. By placing a Dockerfile at `/etc/php/image/Dockerfile` and running the `build-php-image` command, a custom image is created that will be used for the `dev` environment and the `php-fpm` service. The image may be updated at any time by repeating the command, which will update the configuration and reload php-fpm. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.24 | | Container | php-fpm:8.2-arm64 | Debian 13.4 | 8.2.30, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.24 | | Container | php-fpm:8.3-arm64 | Debian 13.4 | 8.3.30, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.24 | | Container | php-fpm:8.4-arm64 | Debian 13.4 | 8.4.20, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.24 | | Container | php-fpm:8.5-arm64 | Debian 13.4 | 8.5.5, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.24 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.24 | | Container | php-fpm:8.2-deb | Debian 13.4 | 8.2.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.24 | | Container | php-fpm:8.3-deb | Debian 13.4 | 8.3.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.24 | | Container | php-fpm:8.4-deb | Debian 13.4 | 8.4.20, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.24 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.24 | | Container | php-fpm:8.2 | Alpine 3.23.4 | 8.2.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.24 | | Container | php-fpm:8.3 | Alpine 3.23.4 | 8.3.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.24 | | Container | php-fpm:8.4 | Alpine 3.23.4 | 8.4.20, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.24 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.0 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.24 | | Container | varnish | Debian 12.13 | 6.0.17 | arm64 | public.ecr.aws/webscale/varnish:2026.24 | --- # 2026.23 URL: https://docs.webscale.com/docs/reference/images/2026.23/ Description: Released 2026-04-27 ## Changes ### Add supervisor to essentials and nfs-server This release defines a new `supervisor` systemd service on the essentials and nfs-server images. When enabled it will run `supervisord` in the standard php container for the system. Logs are written to the host at `/var/log/supervisor/supervisor.log`. Program configuration can be provided either in a custom container at `/etc/supervisor/conf.d/*.conf` or via the host `/etc/supervisor/*.conf`. The configuration for supervisor itself is not modifiable directly. A shim, `supervisorctl`, is provided on the host that allows for controlling it as though it were installed on the host. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | RabbitMQ | 4.2.5 | 4.3.0 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.23 | | Container | php-fpm:8.2-arm64 | Debian 13.4 | 8.2.30, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.23 | | Container | php-fpm:8.3-arm64 | Debian 13.4 | 8.3.30, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.23 | | Container | php-fpm:8.4-arm64 | Debian 13.4 | 8.4.20, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.23 | | Container | php-fpm:8.5-arm64 | Debian 13.4 | 8.5.5, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.23 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.23 | | Container | php-fpm:8.2-deb | Debian 13.4 | 8.2.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.23 | | Container | php-fpm:8.3-deb | Debian 13.4 | 8.3.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.23 | | Container | php-fpm:8.4-deb | Debian 13.4 | 8.4.20, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.23 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.23 | | Container | php-fpm:8.2 | Alpine 3.23.4 | 8.2.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.23 | | Container | php-fpm:8.3 | Alpine 3.23.4 | 8.3.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.23 | | Container | php-fpm:8.4 | Alpine 3.23.4 | 8.4.20, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.23 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.3.0 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.23 | | Container | varnish | Debian 12.13 | 6.0.17 | arm64 | public.ecr.aws/webscale/varnish:2026.23 | --- # 2026.22 URL: https://docs.webscale.com/docs/reference/images/2026.22/ Description: Released 2026-04-15 ## Changes ### Add amd64 container-host image For those cases where an arm64 container-host will not work, an amd64 `container-host` image is published starting with this release. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | Alpine | 3.21.6 | 3.21.7 | | Alpine | 3.23.3 | 3.23.4 | | Composer | 2.9.5 | 2.9.7 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.22 | | Container | php-fpm:8.2-arm64 | Debian 13.4 | 8.2.30, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.22 | | Container | php-fpm:8.3-arm64 | Debian 13.4 | 8.3.30, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.22 | | Container | php-fpm:8.4-arm64 | Debian 13.4 | 8.4.20, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.22 | | Container | php-fpm:8.5-arm64 | Debian 13.4 | 8.5.5, composer-2.9.7 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.22 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.22 | | Container | php-fpm:8.2-deb | Debian 13.4 | 8.2.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.22 | | Container | php-fpm:8.3-deb | Debian 13.4 | 8.3.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.22 | | Container | php-fpm:8.4-deb | Debian 13.4 | 8.4.20, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.22 | | Container | php-fpm:8.1 | Alpine 3.21.7 | 8.1.34, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.22 | | Container | php-fpm:8.2 | Alpine 3.23.4 | 8.2.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.22 | | Container | php-fpm:8.3 | Alpine 3.23.4 | 8.3.30, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.22 | | Container | php-fpm:8.4 | Alpine 3.23.4 | 8.4.20, composer-2.9.7 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.22 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.2.5 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.22 | | Container | varnish | Debian 12.13 | 6.0.17 | arm64 | public.ecr.aws/webscale/varnish:2026.22 | --- # 2026.21 URL: https://docs.webscale.com/docs/reference/images/2026.21/ Description: Released 2026-04-13 ## Changes ### NFS server commands for managing packages With the creation of the `webscale-redis` and `webscale-opensearch` packages comes the need to be able to install them on newer base images where root access is not provided. To enable this, this release contains commands `install-package` and `uninstall-package` that take a package name (`redis` or `opensearch`) and automatically handle the privilege escalation to install or uninstall the packages. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | PHP | 8.4.19 | 8.4.20 | | PHP | 8.5.4 | 8.5.5 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.21 | | Container | php-fpm:8.2-arm64 | Debian 13.4 | 8.2.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.21 | | Container | php-fpm:8.3-arm64 | Debian 13.4 | 8.3.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.21 | | Container | php-fpm:8.4-arm64 | Debian 13.4 | 8.4.20, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.21 | | Container | php-fpm:8.5-arm64 | Debian 13.4 | 8.5.5, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.21 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.21 | | Container | php-fpm:8.2-deb | Debian 13.4 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.21 | | Container | php-fpm:8.3-deb | Debian 13.4 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.21 | | Container | php-fpm:8.4-deb | Debian 13.4 | 8.4.20, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.21 | | Container | php-fpm:8.1 | Alpine 3.21.6 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.21 | | Container | php-fpm:8.2 | Alpine 3.23.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.21 | | Container | php-fpm:8.3 | Alpine 3.23.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.21 | | Container | php-fpm:8.4 | Alpine 3.23.3 | 8.4.20, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.21 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.2.5 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.21 | | Container | varnish | Debian 12.13 | 6.0.17 | arm64 | public.ecr.aws/webscale/varnish:2026.21 | --- # 2026.20 URL: https://docs.webscale.com/docs/reference/images/2026.20/ Description: Released 2026-04-09 ## Changes ### New webscale-opensearch package This release begins publishing a new `webscale-opensearch` debian package that is used on V4 and older hosting environments to install an NFS-server-local OpenSearch or Elasticsearch service. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.20 | | Container | php-fpm:8.2-arm64 | Debian 13.4 | 8.2.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.20 | | Container | php-fpm:8.3-arm64 | Debian 13.4 | 8.3.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.20 | | Container | php-fpm:8.4-arm64 | Debian 13.4 | 8.4.19, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.20 | | Container | php-fpm:8.5-arm64 | Debian 13.4 | 8.5.4, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.20 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.20 | | Container | php-fpm:8.2-deb | Debian 13.4 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.20 | | Container | php-fpm:8.3-deb | Debian 13.4 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.20 | | Container | php-fpm:8.4-deb | Debian 13.4 | 8.4.19, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.20 | | Container | php-fpm:8.1 | Alpine 3.21.6 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.20 | | Container | php-fpm:8.2 | Alpine 3.23.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.20 | | Container | php-fpm:8.3 | Alpine 3.23.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.20 | | Container | php-fpm:8.4 | Alpine 3.23.3 | 8.4.19, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.20 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.2.5 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.20 | | Container | varnish | Debian 12.13 | 6.0.17 | arm64 | public.ecr.aws/webscale/varnish:2026.20 | --- # 2026.19 URL: https://docs.webscale.com/docs/reference/images/2026.19/ Description: Released 2026-03-30 ## Changes ### Improvements to webscale-redis This release makes multiple improvements to the `webscale-redis` package. * The default version is now 6.2.6 to match current usage. * Ownership of `/etc/redis/*` and `/var/log/redis/*` has been fixed so that the `adm` group members can update configuration and view logs. * Control of the `redis-volatile` and `redis-persistent` systemd services can now be done by members of the `adm` group. * `/etc/redis/env` is added as a conf file so it will be retained on future upgrades. * The previous network bind was for loopback only. This change updates it to listen on all interfaces. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.19 | | Container | php-fpm:8.2-arm64 | Debian 13.4 | 8.2.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.19 | | Container | php-fpm:8.3-arm64 | Debian 13.4 | 8.3.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.19 | | Container | php-fpm:8.4-arm64 | Debian 13.4 | 8.4.19, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.19 | | Container | php-fpm:8.5-arm64 | Debian 13.4 | 8.5.4, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.19 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.19 | | Container | php-fpm:8.2-deb | Debian 13.4 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.19 | | Container | php-fpm:8.3-deb | Debian 13.4 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.19 | | Container | php-fpm:8.4-deb | Debian 13.4 | 8.4.19, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.19 | | Container | php-fpm:8.1 | Alpine 3.21.6 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.19 | | Container | php-fpm:8.2 | Alpine 3.23.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.19 | | Container | php-fpm:8.3 | Alpine 3.23.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.19 | | Container | php-fpm:8.4 | Alpine 3.23.3 | 8.4.19, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.19 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.2.5 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.19 | | Container | varnish | Debian 12.13 | 6.0.17 | arm64 | public.ecr.aws/webscale/varnish:2026.19 | --- # 2026.18 URL: https://docs.webscale.com/docs/reference/images/2026.18/ Description: Released 2026-03-26 ## Changes ### New webscale-redis package This release begins publishing a new `webscale-redis` debian package that is used on V4 and before hosting environments to install NFS-server-local volatile and persistent Redis services. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.18 | | Container | php-fpm:8.2-arm64 | Debian 13.4 | 8.2.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.18 | | Container | php-fpm:8.3-arm64 | Debian 13.4 | 8.3.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.18 | | Container | php-fpm:8.4-arm64 | Debian 13.4 | 8.4.19, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.18 | | Container | php-fpm:8.5-arm64 | Debian 13.4 | 8.5.4, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.18 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.18 | | Container | php-fpm:8.2-deb | Debian 13.4 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.18 | | Container | php-fpm:8.3-deb | Debian 13.4 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.18 | | Container | php-fpm:8.4-deb | Debian 13.4 | 8.4.19, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.18 | | Container | php-fpm:8.1 | Alpine 3.21.6 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.18 | | Container | php-fpm:8.2 | Alpine 3.23.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.18 | | Container | php-fpm:8.3 | Alpine 3.23.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.18 | | Container | php-fpm:8.4 | Alpine 3.23.3 | 8.4.19, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.18 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.2.5 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.18 | | Container | varnish | Debian 12.13 | 6.0.17 | arm64 | public.ecr.aws/webscale/varnish:2026.18 | --- # 2026.17 URL: https://docs.webscale.com/docs/reference/images/2026.17/ Description: Released 2026-03-26 ## Changes ### Fix: docker compose fails with $ in secret When a `$` character was included in a secret, invoker would naively write it to a docker compose `.env` file. However, docker compose interpolates variables using the `$` character resulting in unwanted behavior. This change first updates the web server image to remove the relatively ancient `docker-compose` command; `docker compose` must now be used instead. Invoker is updated to use the new command and properly encodes values in the `.env` file using single quotes and proper escaping, correcting the reported problem. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | Debian | 13.3 | 13.4 | | RabbitMQ | 4.2.4 | 4.2.5 | | Varnish | 6.0.16 | 6.0.17 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.17 | | Container | php-fpm:8.2-arm64 | Debian 13.4 | 8.2.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.17 | | Container | php-fpm:8.3-arm64 | Debian 13.4 | 8.3.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.17 | | Container | php-fpm:8.4-arm64 | Debian 13.4 | 8.4.19, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.17 | | Container | php-fpm:8.5-arm64 | Debian 13.4 | 8.5.4, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.17 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.17 | | Container | php-fpm:8.2-deb | Debian 13.4 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.17 | | Container | php-fpm:8.3-deb | Debian 13.4 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.17 | | Container | php-fpm:8.4-deb | Debian 13.4 | 8.4.19, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.17 | | Container | php-fpm:8.1 | Alpine 3.21.6 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.17 | | Container | php-fpm:8.2 | Alpine 3.23.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.17 | | Container | php-fpm:8.3 | Alpine 3.23.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.17 | | Container | php-fpm:8.4 | Alpine 3.23.3 | 8.4.19, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.17 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.2.5 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.17 | | Container | varnish | Debian 12.13 | 6.0.17 | arm64 | public.ecr.aws/webscale/varnish:2026.17 | --- # 2026.16 URL: https://docs.webscale.com/docs/reference/images/2026.16/ Description: Released 2026-03-13 ## Changes This release contains Webscale-internal changes and component upgrades. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | PHP | 8.4.18 | 8.4.19 | | PHP | 8.5.3 | 8.5.4 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.16 | | Container | php-fpm:8.2-arm64 | Debian 13.3 | 8.2.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.16 | | Container | php-fpm:8.3-arm64 | Debian 13.3 | 8.3.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.16 | | Container | php-fpm:8.4-arm64 | Debian 13.3 | 8.4.19, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.16 | | Container | php-fpm:8.5-arm64 | Debian 13.3 | 8.5.4, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.16 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.16 | | Container | php-fpm:8.2-deb | Debian 13.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.16 | | Container | php-fpm:8.3-deb | Debian 13.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.16 | | Container | php-fpm:8.4-deb | Debian 13.3 | 8.4.19, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.16 | | Container | php-fpm:8.1 | Alpine 3.21.6 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.16 | | Container | php-fpm:8.2 | Alpine 3.23.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.16 | | Container | php-fpm:8.3 | Alpine 3.23.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.16 | | Container | php-fpm:8.4 | Alpine 3.23.3 | 8.4.19, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.16 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.2.4 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.16 | | Container | varnish | Debian 12.13 | 6.0.16 | arm64 | public.ecr.aws/webscale/varnish:2026.16 | --- # 2026.15 URL: https://docs.webscale.com/docs/reference/images/2026.15/ Description: Released 2026-02-26 ## Changes ### Minor Debian container image updates For Debian-based php-fpm container images, the `jq`, `npm`, `openssh-client`, `rsync`, and `supervisor` packages are now included. ### Bug fix for auxiliary clusters When multiple auxiliary clusters were configured in `/var/www/deploy/conf.yml` and an earlier one was running no servers, later clusters would not be processed as expected. This change causes processing to continue in almost every case. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.15 | | Container | php-fpm:8.2-arm64 | Debian 13.3 | 8.2.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.15 | | Container | php-fpm:8.3-arm64 | Debian 13.3 | 8.3.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.15 | | Container | php-fpm:8.4-arm64 | Debian 13.3 | 8.4.18, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.15 | | Container | php-fpm:8.5-arm64 | Debian 13.3 | 8.5.3, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.15 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.15 | | Container | php-fpm:8.2-deb | Debian 13.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.15 | | Container | php-fpm:8.3-deb | Debian 13.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.15 | | Container | php-fpm:8.4-deb | Debian 13.3 | 8.4.18, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.15 | | Container | php-fpm:8.1 | Alpine 3.21.6 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.15 | | Container | php-fpm:8.2 | Alpine 3.23.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.15 | | Container | php-fpm:8.3 | Alpine 3.23.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.15 | | Container | php-fpm:8.4 | Alpine 3.23.3 | 8.4.18, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.15 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.2.4 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.15 | | Container | varnish | Debian 12.13 | 6.0.16 | arm64 | public.ecr.aws/webscale/varnish:2026.15 | --- # 2026.13 URL: https://docs.webscale.com/docs/reference/images/2026.13/ Description: Released 2026-02-19 ## Changes ### Minor Debian container image updates - PHP-FPM container images now include full vim instead of vim-tiny. - Containers are given a more user-friendly bash prompt. - Some temporary installation files used during PHP-FPM container builds are removed. ### Minor VM image updates - The command `configure-environment` is made specific to the web server VM images builds only, since that is where it is useful. - The `clinvoker` which is included in every web server VM image will now process cluster metadata. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.13 | | Container | php-fpm:8.2-arm64 | Debian 13.3 | 8.2.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.13 | | Container | php-fpm:8.3-arm64 | Debian 13.3 | 8.3.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.13 | | Container | php-fpm:8.4-arm64 | Debian 13.3 | 8.4.18, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.13 | | Container | php-fpm:8.5-arm64 | Debian 13.3 | 8.5.3, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.13 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.13 | | Container | php-fpm:8.2-deb | Debian 13.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.13 | | Container | php-fpm:8.3-deb | Debian 13.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.13 | | Container | php-fpm:8.4-deb | Debian 13.3 | 8.4.18, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.13 | | Container | php-fpm:8.1 | Alpine 3.21.6 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.13 | | Container | php-fpm:8.2 | Alpine 3.23.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.13 | | Container | php-fpm:8.3 | Alpine 3.23.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.13 | | Container | php-fpm:8.4 | Alpine 3.23.3 | 8.4.18, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.13 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.2.4 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.13 | | Container | varnish | Debian 12.13 | 6.0.16 | arm64 | public.ecr.aws/webscale/varnish:2026.13 | --- # 2026.11 URL: https://docs.webscale.com/docs/reference/images/2026.11/ Description: Released 2026-02-18 ## Changes Only Webscale-internal changes are included in this release. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | RabbitMQ | 4.2.3 | 4.2.4 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.11 | | Container | php-fpm:8.2-arm64 | Debian 13.3 | 8.2.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.11 | | Container | php-fpm:8.3-arm64 | Debian 13.3 | 8.3.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.11 | | Container | php-fpm:8.4-arm64 | Debian 13.3 | 8.4.18, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.11 | | Container | php-fpm:8.5-arm64 | Debian 13.3 | 8.5.3, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.11 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.11 | | Container | php-fpm:8.2-deb | Debian 13.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.11 | | Container | php-fpm:8.3-deb | Debian 13.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.11 | | Container | php-fpm:8.4-deb | Debian 13.3 | 8.4.18, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.11 | | Container | php-fpm:8.1 | Alpine 3.21.6 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.11 | | Container | php-fpm:8.2 | Alpine 3.23.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.11 | | Container | php-fpm:8.3 | Alpine 3.23.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.11 | | Container | php-fpm:8.4 | Alpine 3.23.3 | 8.4.18, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.11 | | Container | rabbitmq | Ubuntu 24.04.4 LTS | 4.2.4 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.11 | | Container | varnish | Debian 12.13 | 6.0.16 | arm64 | public.ecr.aws/webscale/varnish:2026.11 | --- # 2026.10 URL: https://docs.webscale.com/docs/reference/images/2026.10/ Description: Released 2026-02-17 ## Changes ### Fix egress-proxy not applied in containerized environments Previously, when code requiring an egress-proxy was run as a container, the configuration given in `PROXY_HOSTNAMES` and `PROXY_ADDRESS` were ineffective. This release fixes the issue by adding additional directives to container creation so that named hosts will be directed at a specified proxy address from within a container environment. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | PHP | 8.4.17 | 8.4.18 | | PHP | 8.5.2 | 8.5.3 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.10 | | Container | php-fpm:8.2-arm64 | Debian 13.3 | 8.2.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.10 | | Container | php-fpm:8.3-arm64 | Debian 13.3 | 8.3.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.10 | | Container | php-fpm:8.4-arm64 | Debian 13.3 | 8.4.18, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.10 | | Container | php-fpm:8.5-arm64 | Debian 13.3 | 8.5.3, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.10 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.10 | | Container | php-fpm:8.2-deb | Debian 13.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.10 | | Container | php-fpm:8.3-deb | Debian 13.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.10 | | Container | php-fpm:8.4-deb | Debian 13.3 | 8.4.18, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.10 | | Container | php-fpm:8.1 | Alpine 3.21.6 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.10 | | Container | php-fpm:8.2 | Alpine 3.23.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.10 | | Container | php-fpm:8.3 | Alpine 3.23.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.10 | | Container | php-fpm:8.4 | Alpine 3.23.3 | 8.4.18, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.10 | | Container | rabbitmq | Ubuntu 24.04.3 LTS | 4.2.3 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.10 | | Container | varnish | Debian 12.13 | 6.0.16 | arm64 | public.ecr.aws/webscale/varnish:2026.10 | --- # 2026.9 URL: https://docs.webscale.com/docs/reference/images/2026.9/ Description: Released 2026-02-12 ## Changes ### Fix egress-proxy mistakenly returns 421 In previous release [2026.6](/docs/reference/images/2026.6/), if an origin certificate was generated with uppercase characters, the egress proxy could fail to match the request hostname. This resulted in either a 421 Misdirected Request response or an unrecognized_name (112) TLS alert. The issue was caused by a case-sensitive hostname comparison when validating configured hosts. Since DNS hostnames are case-insensitive, this behavior was incorrect. This release fixes the issue by performing hostname comparisons in a case-insensitive manner, ensuring correct request routing regardless of character casing in the origin certificate. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.9 | | Container | php-fpm:8.2-arm64 | Debian 13.3 | 8.2.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.9 | | Container | php-fpm:8.3-arm64 | Debian 13.3 | 8.3.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.9 | | Container | php-fpm:8.4-arm64 | Debian 13.3 | 8.4.17, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.9 | | Container | php-fpm:8.5-arm64 | Debian 13.3 | 8.5.2, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.9 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.9 | | Container | php-fpm:8.2-deb | Debian 13.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.9 | | Container | php-fpm:8.3-deb | Debian 13.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.9 | | Container | php-fpm:8.4-deb | Debian 13.3 | 8.4.17, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.9 | | Container | php-fpm:8.1 | Alpine 3.21.6 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.9 | | Container | php-fpm:8.2 | Alpine 3.23.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.9 | | Container | php-fpm:8.3 | Alpine 3.23.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.9 | | Container | php-fpm:8.4 | Alpine 3.23.3 | 8.4.17, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.9 | | Container | rabbitmq | Ubuntu 24.04.3 LTS | 4.2.3 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.9 | | Container | varnish | Debian 12.13 | 6.0.16 | arm64 | public.ecr.aws/webscale/varnish:2026.9 | --- # 2026.8 URL: https://docs.webscale.com/docs/reference/images/2026.8/ Description: Released 2026-02-04 ## Changes There are two changes for PHP container images. ### Bad configuration support Release [2026.7](/docs/reference/images/2026.7/) described a problem caused by upstream changes exposing bad configuration files. This release contains a workaround that allows bad configurations to continue to be used. A new configuration file `x-webscale.conf` adds an explicit `listen = 9000` and is processed after `www.conf`. This effectively reverts the upstream change and avoids immediate problems for consumers of the latest image. ### Fixed msmtp path When Debian images (amd64 and arm64) were first introduced in `2025.30`, the `sendmail_path` PHP configuration directive inadvertently referred to the wrong path for the `msmtp` program, causing mail to fail to send. The path is now correct. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | Composer | 2.9.4 | 2.9.5 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | VM | nfs-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | web-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | container-host | Ubuntu Minimal 24.04 | | arm64 | | | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.8 | | Container | php-fpm:8.2-arm64 | Debian 13.3 | 8.2.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.8 | | Container | php-fpm:8.3-arm64 | Debian 13.3 | 8.3.30, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.8 | | Container | php-fpm:8.4-arm64 | Debian 13.3 | 8.4.17, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.8 | | Container | php-fpm:8.5-arm64 | Debian 13.3 | 8.5.2, composer-2.9.5 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.8 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.8 | | Container | php-fpm:8.2-deb | Debian 13.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.8 | | Container | php-fpm:8.3-deb | Debian 13.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.8 | | Container | php-fpm:8.4-deb | Debian 13.3 | 8.4.17, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.8 | | Container | php-fpm:8.1 | Alpine 3.21.6 | 8.1.34, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.8 | | Container | php-fpm:8.2 | Alpine 3.23.3 | 8.2.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.8 | | Container | php-fpm:8.3 | Alpine 3.23.3 | 8.3.30, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.8 | | Container | php-fpm:8.4 | Alpine 3.23.3 | 8.4.17, composer-2.9.5 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.8 | | Container | rabbitmq | Ubuntu 24.04.3 LTS | 4.2.3 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.8 | | Container | varnish | Debian 12.13 | 6.0.16 | arm64 | public.ecr.aws/webscale/varnish:2026.8 | --- # 2026.7 URL: https://docs.webscale.com/docs/reference/images/2026.7/ Description: Released 2026-01-28 ## Changes ### PHP 8.3 and PHP 8.4 compatibility This release resolves the issue that led to the withdrawal of PHP 8.3 and PHP 8.4 container images at version 2026.6. #### Background Upstream packaging changes moved the `listen = 9000` override from `zz-docker.conf` to `docker.conf`. Because `docker.conf` is loaded before the default `www.conf`, the legacy setting `listen = 127.0.0.1:9000` in `www.conf` took precedence, making PHP-FPM inaccessible from outside the container. This release corrects the default `www.conf` provided in Webscale-built images. #### Important note for custom images Building custom images derived from these base images without replacing `www.conf` will work without issue. However, if your build replaces `www.conf` and includes `listen = 127.0.0.1:9000`, you must remove that line for the container to function correctly. * **Recommendation**: We strongly recommend avoiding the replacement of the entire `www.conf file`. Instead, use `z-overrides.conf` (or similar) to include only the specific settings that differ from the default. This ensures your image automatically inherits future upstream fixes. ### Improved logging The log format specification in the `www.conf` supplied with PHP container images has been corrected. * **Fix:** Resolved quoting issues in the Dockerfile that caused logs to contain extra backslashes and missing quotes around the constructed HTTP request. * **New Feature:** Added the `Webscale-Request-Id` header to the logs. This facilitates easy correlation of PHP-FPM access logs with Traffic Viewer. ### Composer changes * **Composer 1 Removal:** PHP 8.3 and PHP 8.4 container images no longer include Composer version 1. * **Default Version:** The command `/usr/local/bin/composer` now invokes Composer version 2. * **Backward Compatibility:** The command `composer2` remains supported as an alias. ### PHP 8.5 A new arm64-based container image is released for PHP 8.5. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | Alpine | 3.23.2 | 3.23.3 | | Composer | 2.9.3 | 2.9.4 | | PHP | 8.3.29 | 8.3.30 | | PHP | 8.4.16 | 8.4.17 | | rabbitmq | 4.2.2 | 4.2.3 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | VM | nfs-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | web-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | container-host | Ubuntu Minimal 24.04 | | arm64 | | | Container | php-fpm:8.1-arm64 | Debian 13.2 | 8.1.34, composer-2.9.4 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.7 | | Container | php-fpm:8.2-arm64 | Debian 13.3 | 8.2.30, composer-2.9.4 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.7 | | Container | php-fpm:8.3-arm64 | Debian 13.3 | 8.3.30, composer-2.9.4 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.7 | | Container | php-fpm:8.4-arm64 | Debian 13.3 | 8.4.17, composer-2.9.4 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.7 | | Container | php-fpm:8.5-arm64 | Debian 13.3 | 8.5.2, composer-2.9.4 | arm64 | public.ecr.aws/webscale/php-fpm:8.5-arm64-2026.7 | | Container | php-fpm:8.1-deb | Debian 13.2 | 8.1.34, composer-2.9.4 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.7 | | Container | php-fpm:8.2-deb | Debian 13.3 | 8.2.30, composer-2.9.4 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.7 | | Container | php-fpm:8.3-deb | Debian 13.3 | 8.3.30, composer-2.9.4 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.7 | | Container | php-fpm:8.4-deb | Debian 13.3 | 8.4.17, composer-2.9.4 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.7 | | Container | php-fpm:8.1 | Alpine 3.21.6 | 8.1.34, composer-2.9.4 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.7 | | Container | php-fpm:8.2 | Alpine 3.23.3 | 8.2.30, composer-2.9.4 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.7 | | Container | php-fpm:8.3 | Alpine 3.23.3 | 8.3.30, composer-2.9.4 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.7 | | Container | php-fpm:8.4 | Alpine 3.23.3 | 8.4.17, composer-2.9.4 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.7 | | Container | rabbitmq | Ubuntu 24.04.3 LTS | 4.2.3 | arm64 | public.ecr.aws/webscale/rabbitmq:2026.7 | | Container | varnish | Debian 12.13 | 6.0.16 | arm64 | public.ecr.aws/webscale/varnish:2026.7 | --- # 2026.6 URL: https://docs.webscale.com/docs/reference/images/2026.6/ Description: Released 2026-01-21 ## Changes ### New egress-proxy An egress proxy is an optional component within a hosting environment designed to route outbound HTTP and HTTPS traffic through a fixed, static IP address. Structurally, this proxy is deployed on the NFS server and is configured for specific hostnames via the web server cluster metadata settings. See [the docs](/docs/how-tos/egress-proxy/) for more detail. **NOTE** Container images for PHP 8.3 and PHP 8.4 are not part of this release because of apparent upstream problems. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | VM | nfs-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | web-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | container-host | Ubuntu Minimal 24.04 | | arm64 | | | Container | php-fpm:8.1-arm64 | Debian 13.2 | php 8.1.34, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.6 | | Container | php-fpm:8.2-arm64 | Debian 13.3 | php 8.2.30, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.6 | | Container | php-fpm:8.1-deb | Debian 13.2 | php 8.1.34, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.6 | | Container | php-fpm:8.2-deb | Debian 13.3 | php 8.2.30, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.6 | | Container | php-fpm:8.1 | Alpine 3.21.5 | php 8.1.34, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.6 | | Container | php-fpm:8.2 | Alpine 3.23.2 | php 8.2.30, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.6 | | Container | rabbitmq | Ubuntu 24.04.3 LTS | rabbitmq 4.2.2 | arm64 | public.ecr.aws/webscale/rabbitmq | | Container | varnish | Debian 12.13 | varnish-6.0.16 | arm64 | public.ecr.aws/webscale/varnish | --- # 2026.5 URL: https://docs.webscale.com/docs/reference/images/2026.5/ Description: Released 2026-01-13 ## Changes This release makes two changes with respect to origin certificates for applications using web-server images in a cluster: 1. The origin certificate authority is automatically trusted. 2. Server certificates for all applications are made available for use. ### Origin certificate authority The origin certificate authority is used to sign origin certificates for all applications within a control plane account. This CA is written to `/usr/local/share/ca-certificates/webscale-account-ca.crt` and added to the system's trusted certificate authorities by running `update-ca-certificates`. ### Certificates for a single application The server certificate for the application is written to the file `/etc/nginx/snippets/webscale.pem`. To use it, the nginx site configuration should contain `include snippets/webscale.conf` in a server block with `listen 443 ssl;`. No other `ssl_*` parameters should be configured. This enables all aliases configured for a cluster-using application at the time the web server is created. If additional aliases are added or removed, the cluster must be re-deployed to receive the updated configuration. When utilizing this feature, the responsibility for TLS configuration shfits to the base image instead of being assigned to each environment. #### Multiple applications When multiple applications are assigned to a cluster server, multiple server blocks must be used because nginx supports only a single server certificate per server block. In this case each application should have its own server block and use `include snippets/id.conf` where `id` is the application id. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | VM | nfs-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | web-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | container-host | Ubuntu Minimal 24.04 | | arm64 | | | Container | php-fpm:8.1-arm64 | Debian 13.2 | php 8.1.34, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.3 | | Container | php-fpm:8.2-arm64 | Debian 13.2 | php 8.2.30, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.3 | | Container | php-fpm:8.3-arm64 | Debian 13.2 | php 8.3.29, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.3 | | Container | php-fpm:8.4-arm64 | Debian 13.2 | php 8.4.16, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.3 | | Container | php-fpm:8.1-deb | Debian 13.2 | php 8.1.34, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.3 | | Container | php-fpm:8.2-deb | Debian 13.2 | php 8.2.30, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.3 | | Container | php-fpm:8.3-deb | Debian 13.2 | php 8.3.29, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.3 | | Container | php-fpm:8.4-deb | Debian 13.2 | php 8.4.16, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.3 | | Container | php-fpm:8.1 | Alpine 3.21.5 | php 8.1.34, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.3 | | Container | php-fpm:8.2 | Alpine 3.23.2 | php 8.2.30, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.3 | | Container | php-fpm:8.3 | Alpine 3.23.2 | php 8.3.29, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.3 | | Container | php-fpm:8.4 | Alpine 3.23.2 | php 8.4.16, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.3 | | Container | rabbitmq | Ubuntu 24.04.3 LTS | rabbitmq 4.2.2 | arm64 | public.ecr.aws/webscale/rabbitmq | | Container | varnish | Debian 12.12 | varnish-6.0.16 | arm64 | public.ecr.aws/webscale/varnish | --- # 2026.4 URL: https://docs.webscale.com/docs/reference/images/2026.4/ Description: Released 2026-01-08 ## Changes This release addresses a regression in the nfs-server image and introduces significant enhancements to deployment orchestration and environment management. ### Fix EE-1846 list-images fails - deploy-cli: Restored the command to nfs-server VM images. It was previously omitted in releases 2026.2 and 2026.3. This had no impact on existing servers. ### Improvements to ComposeUp - Project names are now inferred from compose.yaml (manual override still supported). - Now runs natively within the project directory rather than using explicit --file flags. - Added support for environment specification and AWS Secrets Manager to match ContainerRun logic. - Generated environment variables are persisted to a local .env file for subsequent command use. ### Deployment with managed clusters - run-deploy-and-cleanup: Now supports managed clusters via a `cluster` key in `/var/www/deploy/conf.yml`. - Maintenance Mode: Add `enter_maintenance: true` to `conf.yml` to toggle maintenance mode during the deployment lifecycle when using managed clusters. - Hook lifecycle for managed clusters: 1. App enters maintenance mode (optional) 2. "Started" hooks execute 3. New deployment activates 4. "Verified" hooks execute 5. App exits maintenance mode (optional) - Compatibility: When using managed clusters, `blue-green-deploy` is no longer supported and legacy `conf.yml` attributes are ignored. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | VM | nfs-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | web-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | container-host | Ubuntu Minimal 24.04 | | arm64 | | | Container | php-fpm:8.1-arm64 | Debian 13.2 | php 8.1.34, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.3 | | Container | php-fpm:8.2-arm64 | Debian 13.2 | php 8.2.30, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.3 | | Container | php-fpm:8.3-arm64 | Debian 13.2 | php 8.3.29, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.3 | | Container | php-fpm:8.4-arm64 | Debian 13.2 | php 8.4.16, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.3 | | Container | php-fpm:8.1-deb | Debian 13.2 | php 8.1.34, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.3 | | Container | php-fpm:8.2-deb | Debian 13.2 | php 8.2.30, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.3 | | Container | php-fpm:8.3-deb | Debian 13.2 | php 8.3.29, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.3 | | Container | php-fpm:8.4-deb | Debian 13.2 | php 8.4.16, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.3 | | Container | php-fpm:8.1 | Alpine 3.21.5 | php 8.1.34, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.3 | | Container | php-fpm:8.2 | Alpine 3.23.2 | php 8.2.30, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.3 | | Container | php-fpm:8.3 | Alpine 3.23.2 | php 8.3.29, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.3 | | Container | php-fpm:8.4 | Alpine 3.23.2 | php 8.4.16, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.3 | | Container | rabbitmq | Ubuntu 24.04.3 LTS | rabbitmq 4.2.2 | arm64 | public.ecr.aws/webscale/rabbitmq | | Container | varnish | Debian 12.12 | varnish-6.0.16 | arm64 | public.ecr.aws/webscale/varnish | --- # 2026.3 URL: https://docs.webscale.com/docs/reference/images/2026.3/ Description: Released 2026-01-07 ## Changes - The `web-server` VM image is enhanced to use instance profile permissions with the `amazon-ecr-credential-helper` so that invoker will be able to automatically pull images without `PrepareEcrLoginPassword`. This is necessary for the new `ComposeUp` command, since it does not have a mechanism to pass credentials using a file reference, but can also be used with `ContainerRun` by omitting `username` and `password` parameters. ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | VM | nfs-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | web-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | container-host | Ubuntu Minimal 24.04 | | arm64 | | | Container | php-fpm:8.1-arm64 | Debian 13.2 | php 8.1.34, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.3 | | Container | php-fpm:8.2-arm64 | Debian 13.2 | php 8.2.30, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.3 | | Container | php-fpm:8.3-arm64 | Debian 13.2 | php 8.3.29, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.3 | | Container | php-fpm:8.4-arm64 | Debian 13.2 | php 8.4.16, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.3 | | Container | php-fpm:8.1-deb | Debian 13.2 | php 8.1.34, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.3 | | Container | php-fpm:8.2-deb | Debian 13.2 | php 8.2.30, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.3 | | Container | php-fpm:8.3-deb | Debian 13.2 | php 8.3.29, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.3 | | Container | php-fpm:8.4-deb | Debian 13.2 | php 8.4.16, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.3 | | Container | php-fpm:8.1 | Alpine 3.21.5 | php 8.1.34, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.3 | | Container | php-fpm:8.2 | Alpine 3.23.2 | php 8.2.30, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.3 | | Container | php-fpm:8.3 | Alpine 3.23.2 | php 8.3.29, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.3 | | Container | php-fpm:8.4 | Alpine 3.23.2 | php 8.4.16, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.3 | | Container | rabbitmq | Ubuntu 24.04.3 LTS | rabbitmq 4.2.2 | arm64 | public.ecr.aws/webscale/rabbitmq | | Container | varnish | Debian 12.12 | varnish-6.0.16 | arm64 | public.ecr.aws/webscale/varnish | --- # 2026.2 URL: https://docs.webscale.com/docs/reference/images/2026.2/ Description: Released 2026-01-06 ## Changes - The debian-based php 8.1 build is now available for the arm64 architecture. - The `unzip` package is now installed on all debian-based php 8.1+ container images, allowing Magento to install without requiring permissions changes. - The `/var/www` directory is created in debian-based php 8.1+ container images to allow it to be bind-mounted to a host directory. - The file `/var/log/msmtp.log` is created with owner www-data and group www-data in debian-based php 8.1+ container images to allow msmtp logging to occur without changes to customer-specific builds. - The web server VM image now includes docker compose support. - A new invoker command `command.ComposeUp` allows running docker compose up as part of an invoker sequence. - The package `vim-tiny` is used on new servers instead of the full `vim`. - A new command on NFS servers, `label-shared-disk`, sets the `shared` label on an unassigned NVMe device, allowing a previous shared disk to be labeled on a new instance after its attachment in AWS. - A new command on NFS servers, `unmount-shared-disk`, allows an existing shared disk to be unmounted so that it can be safely detached. - A new command on NFS servers, `mount-shared-disk`, allows mounting a volume with the `shared` label. - The unused invoker service has been removed from `nfs-server` and `generic-server` VM images. ## Component upgrades | Component | Previous | Current | |--- |--- |--- | | Alpine | 3.22.2 | 3.23.2 | | Composer | 2.9.1 | 2.9.3 | | PHP | 8.1.33 | 8.1.34 | | PHP | 8.2.29 | 8.2.30 | | PHP | 8.3.27 | 8.3.29 | | PHP | 8.4.14 | 8.4.16 | | rabbitmq | 4.2.1 | 4.2.2 | ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | VM | nfs-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | web-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | container-host | Ubuntu Minimal 24.04 | | arm64 | | | Container | php-fpm:8.1-arm64 | Debian 13.2 | php 8.1.34, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.1-arm64-2026.2 | | Container | php-fpm:8.2-arm64 | Debian 13.2 | php 8.2.30, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2026.2 | | Container | php-fpm:8.3-arm64 | Debian 13.2 | php 8.3.29, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2026.2 | | Container | php-fpm:8.4-arm64 | Debian 13.2 | php 8.4.16, composer-2.9.3 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2026.2 | | Container | php-fpm:8.1-deb | Debian 13.2 | php 8.1.34, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2026.2 | | Container | php-fpm:8.2-deb | Debian 13.2 | php 8.2.30, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2026.2 | | Container | php-fpm:8.3-deb | Debian 13.2 | php 8.3.29, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2026.2 | | Container | php-fpm:8.4-deb | Debian 13.2 | php 8.4.16, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2026.2 | | Container | php-fpm:8.1 | Alpine 3.21.5 | php 8.1.34, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2026.2 | | Container | php-fpm:8.2 | Alpine 3.23.2 | php 8.2.30, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2026.2 | | Container | php-fpm:8.3 | Alpine 3.23.2 | php 8.3.29, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2026.2 | | Container | php-fpm:8.4 | Alpine 3.23.2 | php 8.4.16, composer-2.9.3 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2026.2 | | Container | rabbitmq | Ubuntu 24.04.3 LTS | rabbitmq 4.2.2 | arm64 | public.ecr.aws/webscale/rabbitmq | | Container | varnish | Debian 12.12 | varnish-6.0.16 | arm64 | public.ecr.aws/webscale/varnish | --- # 2025.44 URL: https://docs.webscale.com/docs/reference/images/2025.44/ Description: Released 2025-11-19 ## Changes - Add [container shutdown hooks](/docs/reference/shutdown-hooks/) - Install libzip on Debian container images. In versions 2025.33 through 2025.41, the zip extension was non-functional on Debian-13-based images - Container images based on Debian 13 have been upgraded from 13.1 to 13.2 - PHP 8.4 container images are updated to php 8.4.14 from 8.4.13 - PHP 8.3 container images are updated to php 8.3.27 from 8.3.26 ## Artifacts matrix | Image Type | Family / Variant | OS | Packages | Architectures | URI | |--- |--- |--- |--- |--- |---| | VM | nfs-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | web-server | Ubuntu Minimal 24.04 | | amd64, arm64 | | | VM | container-host | Ubuntu Minimal 24.04 | | arm64 | | | Container | php-fpm:8.2-arm64 | Debian 13.2 | php 8.2.29 | arm64 | public.ecr.aws/webscale/php-fpm:8.2-arm64-2025.44 | | Container | php-fpm:8.3-arm64 | Debian 13.2 | php 8.3.27 | arm64 | public.ecr.aws/webscale/php-fpm:8.3-arm64-2025.44 | | Container | php-fpm:8.4-arm64 | Debian 13.2 | php 8.4.14 | arm64 | public.ecr.aws/webscale/php-fpm:8.4-arm64-2025.44 | | Container | php-fpm:8.1-deb | Debian 13.2 | php 8.1.33 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-deb-2025.44 | | Container | php-fpm:8.2-deb | Debian 13.2 | php 8.2.29 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-deb-2025.44 | | Container | php-fpm:8.3-deb | Debian 13.2 | php 8.3.27 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-deb-2025.44 | | Container | php-fpm:8.4-deb | Debian 13.2 | php 8.4.14 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-deb-2025.44 | | Container | php-fpm:8.1 | Alpine 3.21.5 | php 8.1.33 | amd64 | public.ecr.aws/webscale/php-fpm:8.1-2025.44 | | Container | php-fpm:8.2 | Alpine 3.22.2 | php 8.2.29 | amd64 | public.ecr.aws/webscale/php-fpm:8.2-2025.44 | | Container | php-fpm:8.3 | Alpine 3.22.2 | php 8.3.27 | amd64 | public.ecr.aws/webscale/php-fpm:8.3-2025.44 | | Container | php-fpm:8.4 | Alpine 3.22.2 | php 8.4.14 | amd64 | public.ecr.aws/webscale/php-fpm:8.4-2025.44 | | Container | rabbitmq | Ubuntu 24.04.3 LTS | rabbitmq 4.2.1 | arm64 | public.ecr.aws/webscale/rabbitmq | | Container | varnish | Debian 12.12 | varnish-6.0.16 | arm64 | public.ecr.aws/webscale/varnish | --- # 2025.41 URL: https://docs.webscale.com/docs/reference/images/2025.41/ Description: Released 2025-10-23 **Highlights** - Add rabbitmq-delayed-message-exchange plugin - Alpine 3.21.4 has been updated to 3.21.5 - Alpine 3.22.1 has been updated to 3.22.2 ## Artifacts matrix | Image Type | Family / Variant | Base / Details | Architectures | |--- |--- |--- |---| | VM | `nfs-server` | Ubuntu Minimal 24.04 | amd64, arm64 | | VM | `web-server` | Ubuntu Minimal 24.04 | amd64, arm64 | | VM | `container-host` | Ubuntu Minimal 24.04 | arm64 | | Container | `php-fpm` 8.1 (debian) | Debian 13 “Trixie” | amd64 | | Container | `php-fpm` 8.2 (debian) | Debian 13 “Trixie” | amd64, arm64 | | Container | `php-fpm` 8.3 (debian) | Debian 13 “Trixie” | amd64, arm64 | | Container | `php-fpm` 8.4 (debian) | Debian 13 “Trixie” | amd64, arm64 | | Container | `php-fpm` 8.1 (alpine) | Alpine 3.21.5, php 8.1.33 | amd64 | | Container | `php-fpm` 8.2 (alpine) | Alpine 3.22.2, php 8.2.29 | amd64 | | Container | `php-fpm` 8.3 (alpine) | Alpine 3.22.2, php 8.3.26 | amd64 | | Container | `php-fpm` 8.4 (alpine) | Alpine 3.22.2, php 8.4.13 | amd64 | | Container | `rabbitmq` 4.1.4 | Debian 13 “Trixie” | amd64, arm64 | | Container | `varnish` (entrypoint) | Varnish Cache 6.0.16 | arm64 | ## Changes - Add rabbitmq-delayed-message-exchange plugin - Began republishing latest rabbitmq with `rabbitmq-delayed-message-exchange` plugin installed (but not enabled). - Removed `set-rabbitmq-version` command as it is no longer used. --- # 2025.38 URL: https://docs.webscale.com/docs/reference/images/2025.38/ Description: Released 2025-10-02 **Highlights** - Corrected Varnish memory leak. - The PHP 8.3 version is updated to PHP 8.3.26 - The PHP 8.4 version is updated to PHP 8.4.13 ## Artifacts matrix | Image Type | Family / Variant | Base / Details | Architectures | |--- |--- |--- |---| | VM | `nfs-server` | Ubuntu Minimal 24.04 | amd64, arm64 | | VM | `web-server` | Ubuntu Minimal 24.04 | amd64, arm64 | | VM | `container-host` | Ubuntu Minimal 24.04 | arm64 | | Container | `php-fpm` 8.1 (debian) | Debian 13 “Trixie” | amd64 | | Container | `php-fpm` 8.2 (debian) | Debian 13 “Trixie” | amd64, arm64 | | Container | `php-fpm` 8.3 (debian) | Debian 13 “Trixie” | amd64, arm64 | | Container | `php-fpm` 8.4 (debian) | Debian 13 “Trixie” | amd64, arm64 | | Container | `php-fpm` 8.1 (alpine) | Alpine 3.21.4, php 8.1.33 | amd64 | | Container | `php-fpm` 8.2 (alpine) | Alpine 3.22.1, php 8.2.29 | amd64 | | Container | `php-fpm` 8.3 (alpine) | Alpine 3.22.1, php 8.3.26 | amd64 | | Container | `php-fpm` 8.4 (alpine) | Alpine 3.22.1, php 8.4.13 | amd64 | | Container | `varnish` (entrypoint) | Varnish Cache 6.0.16 | arm64 | ## Changes - Downgraded the Varnish Cache version to the stable version, fixing a memory leak. - Instance upgrade scripts are corrected --- # 2025.36 URL: https://docs.webscale.com/docs/reference/images/2025.36/ Description: Released 2025-09-20 **Highlights** - Fixed issue causing long headers to fail in the varnish cache ## Artifacts matrix | Image Type | Family / Variant | Base / Details | Architectures | |--- |--- |--- |---| | VM | `nfs-server` | Ubuntu Minimal 24.04 | amd64, arm64 | | VM | `web-server` | Ubuntu Minimal 24.04 | amd64, arm64 | | VM | `container-host` | Ubuntu Minimal 24.04 | arm64 | | Container | `php-fpm` 8.1 (debian) | Debian 13 “Trixie” | amd64 | | Container | `php-fpm` 8.2 (debian) | Debian 13 “Trixie” | amd64, arm64 | | Container | `php-fpm` 8.3 (debian) | Debian 13 “Trixie” | amd64, arm64 | | Container | `php-fpm` 8.4 (debian) | Debian 13 “Trixie” | amd64, arm64 | | Container | `php-fpm` 8.1 (alpine) | Alpine 3.21.4, php 8.1.33 | amd64 | | Container | `php-fpm` 8.2 (alpine) | Alpine 3.22.1, php 8.2.29 | amd64 | | Container | `php-fpm` 8.3 (alpine) | Alpine 3.22.1, php 8.3.25 | amd64 | | Container | `php-fpm` 8.4 (alpine) | Alpine 3.22.1, php 8.4.12 | amd64 | | Container | `varnish` (entrypoint) | Varnish Cache 7.6.5 | arm64 | ## Changes - Fixed issue causing long headers to fail in the varnish cache --- # 2025.34 URL: https://docs.webscale.com/docs/reference/images/2025.34/ Description: Released 2025-09-19 **Highlights** - Added an arm64 container image for php 8.2. ## Artifacts matrix | Image Type | Family / Variant | Base / Details | Architectures | |--- |--- |--- |---| | VM | `nfs-server` | Ubuntu Minimal 24.04 | amd64, arm64 | | VM | `web-server` | Ubuntu Minimal 24.04 | amd64, arm64 | | VM | `container-host` | Ubuntu Minimal 24.04 | arm64 | | Container | `php-fpm` 8.1 (debian) | Debian 13 “Trixie” | amd64 | | Container | `php-fpm` 8.2 (debian) | Debian 13 “Trixie” | amd64, **arm64** | | Container | `php-fpm` 8.3 (debian) | Debian 13 “Trixie” | amd64, arm64 | | Container | `php-fpm` 8.4 (debian) | Debian 13 “Trixie” | amd64, arm64 | | Container | `php-fpm` 8.1 (alpine) | Alpine 3.21.4, php 8.1.33 | amd64 | | Container | `php-fpm` 8.2 (alpine) | Alpine 3.22.1, php 8.2.29 | amd64 | | Container | `php-fpm` 8.3 (alpine) | Alpine 3.22.1, php 8.3.25 | amd64 | | Container | `php-fpm` 8.4 (alpine) | Alpine 3.22.1, php 8.4.12 | amd64 | | Container | `varnish` (entrypoint) | Varnish 7.6.5 | arm64 | ## Changes - Added an arm64 container image for php 8.2. --- # 2025.33 URL: https://docs.webscale.com/docs/reference/images/2025.33/ Description: Released 2025-09-18 **Highlights** - Debian variants move to **Debian 13.1 “Trixie”**. - Alpine variants updated to **3.21.4 / 3.22.1** as applicable. - `varnish` container now auto-allocates **~80%** of host RAM for caching. ## Artifacts matrix | Image Type | Family / Variant | Base / Details | Architectures | |--- |--- |--- |---| | VM | `nfs-server` | `rabbitmq` service available | amd64, arm64 | | VM | `web-server` | `libnginx-mod-http-image-filter` available | amd64, arm64 | | VM | `container-host` | — | **arm64 only** | | Container | `php-fpm` 8.1 (debian) | Debian 13 “Trixie” | amd64 | | Container | `php-fpm` 8.2 (debian) | Debian 13 “Trixie” | amd64 | | Container | `php-fpm` 8.3 (debian) | Debian 13 “Trixie” | amd64, **arm64** | | Container | `php-fpm` 8.4 (debian) | Debian 13 “Trixie” | amd64, **arm64** | | Container | `php-fpm` 8.1 (alpine) | Alpine 3.21.4 | amd64 | | Container | `php-fpm` 8.2 (alpine) | Alpine 3.22.1 | amd64 | | Container | `php-fpm` 8.3 (alpine) | Alpine 3.22.1 | amd64 | | Container | `php-fpm` 8.4 (alpine) | Alpine 3.22.1 | amd64 | | Container | `varnish` (entrypoint) | Memory ~80% of host | **arm64 only** | ## Changes ### [vm:nfs-server] rabbitmq service - Removed unused `rabbitmq-server` package; added containerized `rabbitmq`. - Config: `/etc/rabbitmq/rabbitmq.conf`; data: `/var/lib/rabbitmq`. - `adm` users may edit config; default version **3.13**. - Manage with `/opt/webscale/sbin/set-rabbitmq-version 3.13` or systemd: - `sudo systemctl enable|disable|restart|start|stop rabbitmq` - Reset tool: `/opt/webscale/sbin/reset-rabbitmq` (cleans data, restarts). ### [vm:nfs-server] WMA configurability - `adm` users can edit `/etc/webscale/wma-config.json` and restart `webscale-monitoring-agent` for log capture. ### [vm:web-server] libnginx-mod-http-image-filter - Module installed and available for configuration. ### [vm:web-server] host networking mode - `ContainerRun` invoker supports `network_mode: host`. ### [container:php-fpm:8.1-deb] - PHP **8.1.33**; base **Debian 13 “Trixie”**. ### [container:php-fpm:8.2-deb] - PHP **8.2.29**; base **Debian 13 “Trixie”**. ### [container:php-fpm:8.3-deb] - PHP **8.3.25**; base **Debian 13 “Trixie”**. ### [container:php-fpm:8.3-arm64] - PHP **8.3.25**; base **Debian 13 “Trixie”**. ### [container:php-fpm:8.4-deb] - PHP **8.4.12**; base **Debian 13 “Trixie”**. ### [container:php-fpm:8.4-arm64] - PHP **8.4.12**; base **Debian 13 “Trixie”**. ### [container:php-fpm:8.1 (alpine)] - PHP **8.1.33**; base **Alpine 3.21.4**. ### [container:php-fpm:8.2 (alpine)] - PHP **8.2.29**; base **Alpine 3.22.1**. ### [container:php-fpm:8.3 (alpine)] - PHP **8.3.25**; base **Alpine 3.22.1**. ### [container:php-fpm:8.4 (alpine)] - PHP **8.4.12**; base **Alpine 3.22.1**. ### [container:varnish] - Entrypoint now sizes cache to **~80% of host memory**. --- # ASN is URL: https://docs.webscale.com/docs/reference/web-controls/conditions/asn-is/ Description: Matches when the request originates from one or more Autonomous System Numbers included in the Defined ASNs list. This condition determines if a request originated from a specific Autonomous System Number (ASN) by performing a geolocation lookup on the requester's IP address. {{% alert title="Note:" %}} This web control condition is available on both Request and Response web controls. {{% /alert %}} ## Configuration * **Defined ASNs:** A list of one or more ASNs to match against, each a positive number with no leading zero. The condition returns true if the request's ASN is present in this list. At least one ASN must be defined. ## Measurement To evaluate this condition, the proxy resolves the IP address from the incoming request and matches it against a geolocation database. It retrieves the ASN associated with that IP and returns true if the number exists within the **Defined ASNs** list. If the IP address cannot be mapped to an ASN, the condition returns false. --- # ASN is not URL: https://docs.webscale.com/docs/reference/web-controls/conditions/asn-is-not/ Description: Matches when the request originates from an Autonomous System Number not included in the Defined ASNs list. This condition determines if a request originated from an Autonomous System Number (ASN) that is not present in a specified list. {{% alert title="Note:" %}} This web control condition is available on both Request and Response web controls. {{% /alert %}} ## Configuration * **Defined ASNs:** A list of one or more ASNs to exclude from matching, each a positive number with no leading zero. The condition returns true if the request's ASN is not present in this list. At least one ASN must be defined. ## Measurement To evaluate this condition, the proxy resolves the IP address from the incoming request and performs a lookup against a geolocation database. It retrieves the ASN for the IP and returns true only if that number is absent from the **Defined ASNs** list. If the IP address cannot be mapped to an ASN, the condition returns true. --- # Conditions URL: https://docs.webscale.com/docs/reference/web-controls/conditions/ Description: Conditions are logical criteria used to determine if one or more actions are applied to an incoming request or response. --- # Cookie is set URL: https://docs.webscale.com/docs/reference/web-controls/conditions/cookie-is-set/ Description: Matches when a cookie with the exact specified name is present in the request. This condition inspects the `Cookie` request header to verify the existence of a specific cookie name. It returns true if the named cookie is present in the incoming request. ## Configuration * **Case sensitive**: Whether to enable case sensitivity during the name comparison. When disabled, the condition performs a case-insensitive match against all cookies sent in the request. * **Name**: The exact name the condition must match to return true. This field is required and supports a maximum of 50 characters. ## Measurement The condition parses the `Cookie` header from the incoming request and evaluates the presence of the specified key. * **Cookie present**: If a cookie key matching the configured **Name** is identified, the condition returns true. * **Cookie absent**: If the specific cookie name is not found, the condition returns false. * **Missing header**: If the `Cookie` header is absent from the request, the condition returns false. --- # Cookie is not set URL: https://docs.webscale.com/docs/reference/web-controls/conditions/cookie-is-not-set/ Description: Matches when a cookie with the exact specified name is absent from the request. This condition inspects the `Cookie` request header to verify the absence of a specific cookie name. It returns true if the named cookie is missing from the incoming request. ## Configuration * **Case sensitive**: Whether to enable case sensitivity during the name comparison. When disabled, the condition performs a case-insensitive match against all cookies sent in the request. * **Name**: The exact name the condition must not match to return true. This field is required and supports a maximum of 50 characters. ## Measurement The condition parses the `Cookie` header from the incoming request and evaluates the presence of the specified key. * **Cookie present**: If a cookie key matching the configured **Name** is identified, the condition returns false. * **Cookie absent**: If the specific cookie name is not found, the condition returns true. * **Missing header**: If the `Cookie` header is absent from the request, the condition returns true. --- # Cookie value matches URL: https://docs.webscale.com/docs/reference/web-controls/conditions/cookie-value-matches/ Description: Matches when a specific request cookie's value matches a regular expression pattern. This condition inspects the `Cookie` request header to determine if the value of a specific cookie matches a [regular expression](https://www.regular-expressions.info/). It returns true if the named cookie contains a value that matches the defined pattern. ## Configuration * **Case sensitive**: Whether to enable case sensitivity during the name and value comparison. When disabled, the condition performs a case-insensitive match for the cookie name and evaluates the pattern against all cookies that match that name. * **Cookie name**: The exact name of the cookie to inspect. This field is required and supports a maximum of 50 characters. * **Cookie value pattern**: The [RE2 regular expression](https://github.com/google/re2/wiki/Syntax) used to evaluate the cookie's value. The condition returns true if the pattern matches the value of the specified cookie. This field is required and supports a maximum of 255 characters. ## Measurement The condition extracts the specified cookie name from the `Cookie` request header and evaluates its value against the configured pattern. * **Match found**: If the cookie's value matches the regular expression, the condition returns true. * **No match found**: If the cookie's value does not match the pattern, the condition returns false. * **Missing cookie**: If the specified cookie is absent from the request, the condition returns false. --- # Cookie value does not match URL: https://docs.webscale.com/docs/reference/web-controls/conditions/cookie-value-does-not-match/ Description: Matches when a specific request cookie's value does not match a regular expression pattern. This condition inspects the `Cookie` request header to determine if the value of a specific cookie does not match a [regular expression](https://www.regular-expressions.info/). It returns true if the named cookie contains no values that match the defined pattern. ## Configuration * **Case sensitive**: Whether to enable case sensitivity during the name and value comparison. When disabled, the condition performs a case-insensitive match for the cookie name and evaluates the pattern against all cookies that match that name. * **Cookie name**: The exact name of the cookie to inspect. This field is required and supports a maximum of 50 characters. * **Cookie value pattern**: The [RE2 regular expression](https://github.com/google/re2/wiki/Syntax) used to evaluate the cookie's value. The condition returns true if the pattern does not match the value of the specified cookie. This field is required and supports a maximum of 255 characters. ## Measurement The condition extracts the specified cookie name from the `Cookie` request header and evaluates its value against the configured pattern. * **Match found**: If the cookie's value matches the regular expression, the condition returns false. * **No match found**: If the cookie's value does not match the pattern, the condition returns true. * **Missing cookie**: If the specified cookie is absent from the request, the condition returns true. --- # Country of origin is URL: https://docs.webscale.com/docs/reference/web-controls/conditions/country-of-origin-is/ Description: Matches when the request originates from one or more countries included in the Selected countries list. This condition determines if a request originated from a specific country by performing a geolocation lookup on the requester's IP address. ## Configuration * **Selected countries**: A list of one or more countries to match against. The condition returns true if the request originates from any country in this list. At least one country must be selected. ## Measurement The condition resolves the IP address from the incoming request and matches it against a geolocation database (MaxMind GeoLite2). It retrieves the ISO country code associated with that IP and returns true if the code exists within the **Selected countries** list. If the IP address cannot be mapped to a country, the condition returns false. --- # Country of origin is not URL: https://docs.webscale.com/docs/reference/web-controls/conditions/country-of-origin-is-not/ Description: Matches when the request originates from a country not included in the Selected countries list. This condition determines if a request originated from a country that is not present in a specified list. ## Configuration * **Selected countries**: A list of one or more countries to exclude from matching. The condition returns true if the request originates from any country that is not in this list. At least one country must be selected. ## Measurement The condition resolves the IP address from the incoming request and performs a lookup against a geolocation database (MaxMind GeoLite2). It retrieves the ISO country code for the IP and returns true only if that code is absent from the **Selected countries** list. If the IP address cannot be mapped to a country, the condition returns true. --- # IP address in set URL: https://docs.webscale.com/docs/reference/web-controls/conditions/ip-address-in-set/ Description: Matches when the requester's IP address is present within a specified address set. This condition identifies if the requester's IP address is in a pre-defined address set. ## Configuration * **Select address set**: The named collection of IP addresses or CIDR ranges to match against. The condition returns true only if the requester's IP is found within this set. This field is required. ## Measurement The condition resolves the IP address from the incoming request and evaluates it against the specified address set. The process validates the request IP against both individual addresses and CIDR notations. If the IP falls within the defined range, the condition returns true. --- # IP address not in set URL: https://docs.webscale.com/docs/reference/web-controls/conditions/ip-address-not-in-set/ Description: Matches when the requester's IP address is absent from a specified address set. This condition identifies if the requester's IP address is not in a pre-defined address set. ## Configuration * **Select address set**: The named collection of IP addresses or CIDR ranges to check against. The condition returns true only if the requester's IP is not found within this set. This field is required. ## Measurement The condition resolves the IP address from the incoming request and evaluates it against the specified address set. The process validates the request IP against both individual addresses and CIDR notations. If the IP falls outside the defined range, the condition returns true. --- # IP address is allowlisted URL: https://docs.webscale.com/docs/reference/web-controls/conditions/ip-address-is-allowlisted/ Description: Matches when the requester's IP address is present in the allowlist. This condition checks if the requester's IP address is included in the Allowlist within an account's address set. It compares the address from the request to the list of addresses managed in that section of the dashboard and returns true if a match is found. ## Configuration No further configurations are necessary for this condition. The logic is applied automatically to all addresses currently present in the Allowlist. --- # Create an environment URL: https://docs.webscale.com/hosting-platforms/hosting-v4/how-tos/create-an-environment/ Description: How to create an environment with the Webscale API. An environment is a named group of [stacks](/hosting-platforms/hosting-v4/stacks/) and [clusters](/docs/how-tos/general/clusters/), such as production or staging. Every stack belongs to one. Post the name of the environment: ``` curl -X POST "https://api.webscale.com/v2/environments" \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{"name": "Production"}' ``` ``` { "href": "/v2/environments/3ps666yxcanq", "name": "Production", "keyword": "production" } ``` A stack takes that whole `href` in its `environment` field. See [Create an EKS stack](/hosting-platforms/hosting-v4/how-tos/create-an-eks-stack/) for an example. Webscale builds the `keyword` from the name unless you send your own, as the response above shows. Stacks put it into the names and tags of the resources they create. --- # Deploy a new release URL: https://docs.webscale.com/docs/how-tos/deployment/essentials/essentials-deploy/ Description: How to deploy a new Magento or Shopware release on Webscale Essentials. Follow these steps to deploy a new application release. --- ## Prerequisites - [SSH Connect](/docs/how-tos/ssh-connect/) access to the Essentials server - The branch/tag or build you want to deploy --- ## 1. Open SSH Connect and dev shell Webscale CP > Accordion Menu (top left) > SSH Connect Find the instance you want to connect to and open a terminal session by clicking on the instance link. Then run: ```bash dev ``` to jump to `php-fpm` container. --- ## 2. Go to the web root {{< alert title="" color="info" >}} All commands below are run inside this dev shell in `/var/www/html`. {{< /alert >}} ```bash cd /var/www/html ``` --- ## 3. Update the code ### Example: Git-based deployment ```bash git fetch origin git checkout git pull origin ``` --- ## 4. Run deployment tasks (example) ### Magento ```bash php bin/magento maintenance:enable && \ rm -rf generated/* \ var/view_preprocessed/* \ var/di/* \ var/cache/* \ var/page_cache/* \ pub/static/frontend/* \ pub/static/adminhtml/* && \ php bin/magento setup:upgrade && \ php bin/magento cache:clean && \ php bin/magento cache:flush && \ php bin/magento cache:enable && \ php bin/magento setup:di:compile && \ php -d memory_limit=2G bin/magento setup:static-content:deploy en_US -f --jobs=4 && \ php bin/magento maintenance:disable ``` ### Shopware ```bash # Run once to install the deployment helper if it is not installed yet composer require --no-audit shopware/deployment-helper # Deployment commands vendor/bin/shopware-deployment-helper run --skip-asset-install --skip-theme-compile php bin/console database:migrate --all php bin/console theme:compile --sync php bin/console theme:refresh php bin/console cache:clear php bin/console cache:warmup ``` --- ## 5. Verify the deployment - Load the site in a browser - Optionally check versions: ```bash php bin/magento --version # or php bin/console --version ``` --- ## 6. When to contact Webscale Contact Webscale support if: - Database migrations fail - Deployment completes but the site shows errors ## 7. Related how-to guides - [Magento and Shopware commands](/docs/how-tos/Deployment/Essentials/essentials-commands/) - [Essentials environment reference](/docs/reference/essentials-environment-reference/) --- # Deploy a new release URL: https://docs.webscale.com/docs/how-tos/deployment/standard/standard-deploy/ Description: How to deploy a new Magento or Shopware release on Webscale Pro V3 environments. Webscale Pro V3 runs your application in containers with supporting services managed by Webscale. Use this guide to deploy a new release for your environment. --- ## 1. Open SSH connect and container shell Login to the [Webscale Control Panel](https://control.webscale.com/): - Click the three bars in the upper left site navigation > **[SSH connect](https://control.webscale.com/ssh-connect)** - Find the NFS instance for your environment and open a terminal session by clicking on the instance link. --- ## 2. Switch to the deployment user On the NFS host, switch to the deployment user (for example `webscalebuilder`): ```bash sudo -iu webscalebuilder ``` --- ## 3. List available images Use the helper script to list available images for this environment: ```bash list-images ``` This shows a list of the available container images along with their associated tags. For example: ```bash "sha256:5cc440543cc9acf7abfb4875ba149e5bb339b248c15507475a39f04da12f0c1c": [ "commit-da25261-20240829-192048", "commit-da25261" ] "sha256:5d9d78fdc7f6ae26861aafeec977b5db6adc9d757995a7c1b880130c18246621": [ "commit-65d7766-20240903-192941", "commit-65d7766" ] "sha256:9dd60263109cacfb16fa85d8c40ccd5e22c50ae924fb137eb76a4aa4c55b7aff": [ "commit-1f723a4", "commit-1f723a4-20240904-160243" ] ``` --- ## 4. Check the current deploy tag Check which tag is currently in use: ```bash grep DEPLOY_TAG /home/webscalebuilder/.env ``` Example output: ```text DEPLOY_TAG=staging ``` --- ## 5. Tag the new image for deployment Choose the image you want to deploy and tag it, using [deployment helper scripts](/hosting-platforms/hosting-v3/#deployment-helper-scripts), with the deploy tag from the previous step. The following helper scripts are available for deployments on Webscale Pro V3 environments: ### Example: tag by commit ```bash tag-by-commit commit- ``` ### Example: tag by branch ```bash tag-by-branch branch- ``` Replace `` with the value from `DEPLOY_TAG` (for example `staging` or `production`). --- ## 6. Run the deployment using run-deploy-and-cleanup The `run-deploy-and-cleanup` script organizes the necessary actions for deployment into a single command. Running this command will: - Pull the tagged image from above - Apply any environment hooks if configured (migrations, cache warmups, etc.) - Update the running containers It is recommended to run the deployment in a `screen` session so it continues if your SSH session drops: ```bash screen -S deploy run-deploy-and-cleanup ``` Monitor the terminal output for any errors or warnings during the process. Deployment logs are also available at: ```bash /var/log/deploy/* ``` --- ## 7. Verify the deployment After `run-deploy-and-cleanup` completes: 1. Verify the site works as expected in a browser 2. Connect to a container shell ```bash shell ``` 3. Run a quick version check using your framework-specific command: ```bash php bin/magento --version # or php bin/console --version ``` --- ## When to contact Webscale Contact Webscale support if: - `run-deploy-and-cleanup` exits with an error you do not understand - Containers are not updated to the expected image - The site shows errors after a successful deployment ## Related how-to guides - [Magento and Shopware commands](/docs/how-tos/Deployment/Standard/standard-commands/) - [Standard environment reference](/hosting-platforms/hosting-v3/) --- # Essentials URL: https://docs.webscale.com/docs/how-tos/deployment/essentials/ Description: Deployment guides for Webscale Essentials. Essentials runs all application and supporting services on a single instance. Use these guides to: - Deploy a new release - Run Magento and Shopware CLI commands - Look up environment-specific commands and services --- # Essentials URL: https://docs.webscale.com/hosting-platforms/hosting-v4/stacks/essentials/ Description: Guide for understanding and configuring an Essentials stack The Essentials stack provides a robust, streamlined foundation for applications that do not yet require horizontal scaling. It provisions a comprehensive, all-in-one environment on a single, highly optimized server. **Architecture**: Single-server deployment. **How it Works**: A single server accommodates the complete application stack, including the web tier, an NFS shared filesystem, cron execution, relational database (MySQL or MariaDB), caching (Valkey), message brokering (RabbitMQ), and search (OpenSearch). **Best For**: Baseline workloads, staging environments, or applications with predictable, moderate traffic. ## Supported variants - Magento (`type: essentials-magento`) - Shopware (`type: essentials-shopware`) ## Variables | Variable name | Type | Description | | :--- | :--- | :---| :--- | | `region` | `string` | *Required* The region to deploy the stack. | | `zone` | `string` | Optional. Availability zone. Specify only when a specific zone is required. Otherwise, derived from the `region`. | | `size` | `string` | *Required* Plan size. Must be one of `dev`, `micro`, `mini`, `small`, `medium`, `large`, or `xlarge`. | | `server_size` | `object` | Optional override for core server compute. Must map to a specific ARM64 instance type based on vCPU and memory. | | ↳`vcpu` | `number` | vCPU count. | | ↳`memory` | `number`| GiB. | | `data_disk_size` | `number` | Optional. The size of the data disk in GiBs. If this is provided, it will override the default disk size. | | `db_endpoint` | `string` | Optional. Only provide when an add-on database has been created. Typically a reference to an RDS stack output. | | `db_password_secret_name` | `string` | Optional. Only provide when an add-on database has been created. A reference to a Secrets Manager secret for retrieving the database password. Typically a reference to an RDS stack output. | | `stacker_variables` | `object` | | | ↳`mysql` | `object` | Optional Mysql configuration variables. See [**MySQL**](/hosting-platforms/hosting-v4/services/mysql/) for details. | | ↳`php` | `object` | Optional PHP configuration variables. See [**PHP-FPM**](/hosting-platforms/hosting-v4/services/php-fpm/) for details. | | ↳`vinyl` | `object` | Optional Vinyl configuration variables. See [**Vinyl**](/hosting-platforms/hosting-v4/services/vinyl/) for details. | ### Example: ``` { "type": "essentials-magento", "environment": "/v2/environments/tu8aovkn7waj", "service": "/v2/services/2tpkjj7e0b28", "name": "magento-production-store", "variables": { "region": "us-east-1", "size": "medium", "stacker_variables": { "php": { "version": "8.3" }, "mysql": { "variant": "mariadb", "version": "10.5.18" } } } } ``` ## Outputs | Output name | Description | | :--- | :--- | | `data_subnets` | Array of subnet IDs for backend services [subnet]. | | `public_subnets` | Array of subnet IDs for public services [primary, secondary]. | --- # IP address is not allowlisted URL: https://docs.webscale.com/docs/reference/web-controls/conditions/ip-address-is-not-allowlisted/ Description: Matches when the requester's IP address is absent from the allowlist. This condition checks if the requester's IP address is missing from the Allowlist within an account's address set. It compares the address from the request to the list of addresses managed in that section of the dashboard and returns true if no match is found. ## Configuration No further configurations are necessary for this condition. The logic is applied automatically to all addresses currently present in the Allowlist. --- # Shared Responsibilities URL: https://docs.webscale.com/docs/reference/shared-responsibilities/ Description: Reference for shared responsibilities. Read the step-by-step [How-Tos](/docs/how-tos/) to learn about common tasks you can perform with your Webscale platform. Check out the [FAQ section](/docs/faq/) for answers to commonly asked questions. --- # Software Products URL: https://docs.webscale.com/docs/reference/software/software-products/ Description: Full reference for CloudEDGE Security and the Webscale Platform Software tiers, including the comparison matrix, per-tier detail and the features glossary. ## CloudEDGE Security CloudEDGE Security is the Webscale security product for customers whose applications are hosted outside Webscale. It deploys Webscale's security layer in front of an existing application. It provides origin protection, DDoS defense, bot management, a Web Application Firewall, OWASP Top 10 coverage, role-based access control, carding attack protection and data loss prevention. It does not include the platform's performance and delivery features. Those are offered through the Webscale Platform Software paired with a Webscale hosting plan. ### Allowances and capabilities | Allowance | Included | | --- | --- | | Data Transfer | 50 GB | | Requests | 25 M | | Application Hostnames | 5 (guidance) | | Elastic Data Plane | Shared | | CDN | Included | | Custom Web Controls | 20 | | Traffic Viewer storage | 50 GB | | Monitors | 5 | Metered allowances are consumption-based above the included amount. Application Hostnames counts are guidance. See the Application Hostnames entry in the features glossary. ### Included security features | Feature | Included | | --- | --- | | Origin Protection (App Shield) | Level 1 | | Auto HTTPS | Included | | Bring Your Own SSL Certificate | Included | | Geo-blocking | Included | | DDoS Protection | Included | | Origin Certificates | Included | | CSP | Included | | Rate Limiting | Basic | | Bot Management | Included | | Bot Mitigation | Included | | WAF (WAAP) | Basic | | OWASP Protection | Included | | Role-based Access Control | Included | | Carding Attack Protection | Included | | Trusted Proxies | Included | | Secure Access | Included | | Data Loss Prevention | Included | ### Included observability features | Feature | Included | | --- | --- | | Traffic Viewer storage | 50 GB | | Event Logs (audit) | 5 years, no additional cost | | Session Tracking | Included | | Real User Monitoring (RUM) | Included | | Additional Online Logs | Included | | Archived Logs | Included | | Monitors | 5 | | Custom Log Capture | Included | ### Who this product is for Customers running an application outside Webscale who need a managed security layer in front of it. Customers hosting on Webscale should look at the Webscale Platform Software instead. ## Webscale Platform Software The Webscale Platform Software is sold in four tiers. Each tier includes a fixed set of performance, security and observability capabilities along with a defined allowance for metered resources. - **Essentials.** The entry Platform tier, suitable for smaller applications. It includes the core performance and delivery features of the platform with a basic security and observability baseline. - **Advanced.** Adds dynamic site caching, image optimization, expanded Traffic Viewer storage, session tracking, real user monitoring, archived logs, OWASP protection, CSP and expanded Web Controls and Monitors allowances. - **Premier.** Adds Site Splicing, Bot Management and Bot Mitigation, Advanced WAF, role-based access control, carding attack protection, data loss prevention and custom log capture. - **Ultra.** Adds a dedicated elastic data plane, Level 3 origin protection, Advanced rate limiting, Trusted Proxies, Secure Access and the largest included allowances for every metered feature. All four Platform tiers are paired with a Webscale hosting plan. The available pairings, pricing and upgrade rules are published on webscale.com. ## Platform Software comparison matrix ### Headline allowances | Allowance | Essentials | Advanced | Premier | Ultra | | --- | --- | --- | --- | --- | | Included Data Transfer | 50 GB | 250 GB | 500 GB | 1,000 GB | | Included Requests | 25 M | 125 M | 250 M | 500 M | | Application Hostnames | 2 | 5 | 20 | 100 | | Elastic Data Plane | Shared | Shared | Shared | Dedicated | All metered allowances are consumption-based above the included amount. Rates are published on webscale.com. Application Hostnames counts are guidance. See the Application Hostnames entry in the features glossary. ### Performance and delivery | Feature | Essentials | Advanced | Premier | Ultra | | --- | --- | --- | --- | --- | | Predictive Auto-scaling | Included | Included | Included | Included | | Self-healing | Included | Included | Included | Included | | Load Balancing | Included | Included | Included | Included | | Elastic Data Plane | Shared | Shared | Shared | Dedicated | | CDN | Included | Included | Included | Included | | Dynamic Site Cache | Not included | 1 GB | 5 GB | 10 GB | | Dynamic Site Cache Rules | Not included | 1 | 5 | 10 | | Custom Web Controls | Not included | 10 | 20 | 100 | | Site Splicing | Not included | Not included | Included | Included | | Custom Microsites | Not included | 1 (5 MB) | 5 (20 MB) | 10 (50 MB) | | Image Optimization | Not included | 100K/mo | 200K/mo | 500K/mo | ### Security | Feature | Essentials | Advanced | Premier | Ultra | | --- | --- | --- | --- | --- | | Origin Protection (App Shield) | Level 1 | Level 2 | Level 2 | Level 3 | | Auto HTTPS | Included | Included | Included | Included | | Bring Your Own SSL | Included | Included | Included | Included | | Geo-blocking | Included | Included | Included | Included | | DDoS Protection | Included | Included | Included | Included | | Origin Certificates | Included | Included | Included | Included | | CSP | Not included | Included | Included | Included | | Rate Limiting | Not included | Basic | Basic | Advanced | | Bot Management | Not included | Not included | Included | Included | | Bot Mitigation | Not included | Not included | Included | Included | | WAF (WAAP) | Basic | Basic | Advanced | Advanced | | OWASP Protection | Not included | Included | Included | Included | | Role-based Access Control | Not included | Not included | Included | Included | | Carding Attack Protection | Not included | Not included | Included | Included | | Trusted Proxies | Not included | Not included | Not included | Included | | Secure Access | Not included | Not included | Not included | Included | | Data Loss Prevention | Not included | Not included | Included | Included | ### Observability | Feature | Essentials | Advanced | Premier | Ultra | | --- | --- | --- | --- | --- | | Traffic Viewer storage | 10 GB | 50 GB | 75 GB | 100 GB | | Event Logs (audit, 5yr free) | Included | Included | Included | Included | | Session Tracking | Not included | Included | Included | Included | | Real User Monitoring (RUM) | Not included | Included | Included | Included | | Additional Online Logs | Not included | Not included | Included | Included | | Archived Logs | Not included | Included | Included | Included | | Monitors (included) | Not included | 5 | 10 | 50 | | Custom Log Capture | Not included | Not included | Included | Included | Event Logs are configuration audit logs. They are retained at no additional cost for 5 years across all products and tiers. Other Traffic Viewer log types such as request logs and custom logs count against the tier's GB storage allowance. ### Add-ons | Add-on | Essentials | Advanced | Premier | Ultra | | --- | --- | --- | --- | --- | | Varnish | Optional | Optional | Optional | Optional | ## Per-tier detail Each tier follows the same template: a positioning paragraph, headline allowances, a note on who the tier is for and a pointer to the features glossary for full feature definitions. ### Essentials Essentials is the entry Webscale Platform tier. It includes the core performance and delivery capabilities of the platform such as predictive auto-scaling, self-healing, load balancing and CDN, along with a baseline security layer covering Auto HTTPS, Bring Your Own SSL, geo-blocking, DDoS protection, origin certificates and basic WAF. It is intended for smaller applications and lower-traffic workloads. | Allowance | Included | | --- | --- | | Included Data Transfer | 50 GB | | Included Requests | 25 M | | Application Hostnames | 2 (guidance) | | Elastic Data Plane | Shared | | CDN | Included | | Custom Web Controls | 0 | | Traffic Viewer storage | 10 GB | | Monitors | 0 | **Who this tier is for.** Customers running smaller applications who need Webscale's hosting and core delivery features with a baseline security and observability layer. Customers needing dynamic site caching, image optimization, expanded Traffic Viewer storage, RUM or stronger security should consider Advanced. ### Advanced Advanced is the mid Platform tier. It builds on Essentials by adding dynamic site caching at 1 GB, image optimization at 100K transforms per month, expanded Traffic Viewer storage, session tracking, real user monitoring, archived logs, OWASP protection, CSP support, Level 2 origin protection, basic rate limiting and 10 Custom Web Controls and Monitors. | Allowance | Included | | --- | --- | | Included Data Transfer | 250 GB | | Included Requests | 125 M | | Application Hostnames | 5 (guidance) | | Elastic Data Plane | Shared | | CDN | Included | | Dynamic Site Cache | 1 GB (1 rule) | | Custom Microsites | 1 (up to 5 MB) | | Image Optimization | 100K transforms/month | | Custom Web Controls | 10 | | Traffic Viewer storage | 50 GB | | Monitors | 5 | | Origin Protection | Level 2 | **Who this tier is for.** Mid-sized applications needing serious performance, baseline security and full observability. Customers needing Site Splicing, bot management, advanced WAF, role-based access control, carding attack protection or data loss prevention should consider Premier. ### Premier Premier is the upper Platform tier, suitable for high-traffic applications with substantive performance, security and observability needs. It adds Site Splicing, Bot Management and Bot Mitigation, Advanced WAF, role-based access control, carding attack protection, data loss prevention and custom log capture. | Allowance | Included | | --- | --- | | Included Data Transfer | 500 GB | | Included Requests | 250 M | | Application Hostnames | 20 (guidance) | | Elastic Data Plane | Shared | | CDN | Included | | Dynamic Site Cache | 5 GB (5 rules) | | Custom Microsites | 5 (up to 20 MB) | | Image Optimization | 200K transforms/month | | Custom Web Controls | 20 | | Traffic Viewer storage | 75 GB | | Monitors | 10 | | WAF | Advanced | | Origin Protection | Level 2 | **Who this tier is for.** High-traffic applications needing the platform's full delivery and security capabilities at substantial scale but able to operate on a shared data plane. Customers needing a dedicated data plane, Level 3 origin protection, advanced rate limiting, trusted proxies or secure access should consider Ultra. ### Ultra Ultra is the top Platform tier. It is differentiated from Premier by a dedicated elastic data plane, Level 3 origin protection, Advanced rate limiting, trusted proxies and secure access, along with the largest included allowances for every metered feature. Ultra is intended for the highest-traffic and most security-sensitive applications on the Webscale platform. | Allowance | Included | | --- | --- | | Included Data Transfer | 1,000 GB | | Included Requests | 500 M | | Application Hostnames | 100 (guidance) | | Elastic Data Plane | Dedicated | | CDN | Included | | Dynamic Site Cache | 10 GB (10 rules) | | Custom Microsites | 10 (up to 50 MB) | | Image Optimization | 500K transforms/month | | Custom Web Controls | 100 | | Traffic Viewer storage | 100 GB | | Monitors | 50 | | WAF | Advanced | | Origin Protection | Level 3 | | Rate Limiting | Advanced | **Who this tier is for.** Customers with the highest performance, isolation and security requirements, including those who require a dedicated data plane for compliance or traffic isolation reasons. ## Features glossary This section is the educational feature reference. Each feature is defined once and used identically across CloudEDGE Security, the Platform comparison matrix and the per-tier detail. ### Performance and delivery | Feature | Definition | Available in | | --- | --- | --- | | Predictive Auto-scaling | Uses automation and predictive analytics to increase or decrease application resources to maintain consistent performance without over-allocation. | All Platform tiers. Not in CloudEDGE Security. | | Self-healing | An extension of auto-scaling that ensures failed application components are promptly replaced to avoid timeouts and error pages. | All Platform tiers. Not in CloudEDGE Security. | | Load Balancing | Actively distributes requests across application servers and routes around servers experiencing performance or availability issues. | All Platform tiers. Not in CloudEDGE Security. | | Elastic Data Plane | The intermediary between web browsers and your application. A shared data plane uses IP addresses socialized with other applications. A dedicated data plane uses addresses unique to your application and can deploy data plane assets into a public subnet of your own VPC for enhanced security. | Shared on CloudEDGE Security, Essentials, Advanced and Premier. Dedicated on Ultra. | | CDN | A globally distributed set of servers that delivers cacheable content from a location close to the visitor, reducing latency and origin load. Includes standard caching rules for static content and media. Additional caching behavior can be configured using Custom Web Controls. | All products. | | Application Hostnames | The hostnames to which an application responds. No hard limit is enforced today. Included counts are guidance. Auto HTTPS provisions one certificate per group of up to roughly 150 hostnames. | CloudEDGE Security 5, Essentials 2, Advanced 5, Premier 20, Ultra 100. | | Data Transfer | The aggregate volume of data delivered through the Webscale Data Plane to end users in a billing period. Overage is consumption-based. | All products. 50, 50, 250, 500, 1,000 GB. | | Included Requests | Total number of HTTP requests handled by the Webscale Data Plane in a billing period. Overage is consumption-based. | All products. 25 M, 25 M, 125 M, 250 M, 500 M. | | Dynamic Site Cache | A cache located in the Webscale Data Plane that provides extremely fast access near application servers. Combined with the CDN it can substantially reduce origin load. | Advanced 1 GB, Premier 5 GB, Ultra 10 GB. | | Dynamic Site Cache Rules | Rules that determine what is cacheable, for how long and on which browser or user-state. Multiple cache versions of the same resource can be maintained by request characteristics. | Advanced 1, Premier 5, Ultra 10. | | Custom Web Controls | A configurable policy and rules engine in the Webscale Portal that combines conditions with actions applied to requests proxied by the Data Plane. Used for both security and performance customization. | CloudEDGE Security 20, Advanced 10, Premier 20, Ultra 100. Not in Essentials. | | Site Splicing | Combines multiple origins into a single site, allowing different application components to serve specific paths or roles within one customer-facing site. | Premier, Ultra. | | Custom Microsites | Allows content to be injected into a site without modifying the application. For PWA or headless applications, microsites can serve the entire application. | Advanced 1 site up to 5 MB, Premier 5 sites up to 20 MB, Ultra 10 sites up to 50 MB. | | Image Optimization | Automated image management that delivers an appropriately sized image to each device, served from the nearest cache. Overage is consumption-based. | Advanced 100K/mo, Premier 200K/mo, Ultra 500K/mo. | ### Security | Feature | Definition | Available in | | --- | --- | --- | | Origin Protection (App Shield) | Because the Data Plane sits between users and the application, application servers are not directly exposed. Level 1 hides server addresses behind the Data Plane. Level 2 manages a cloud Security Group or Firewall so only Webscale proxies can connect. Level 3 places a dedicated Data Plane on the same private network as application servers, isolating them from the internet. | Level 1 on CloudEDGE Security and Essentials. Level 2 on Advanced and Premier. Level 3 on Ultra. | | Auto HTTPS | Webscale automatically obtains and renews site certificates so HTTPS is always functional. Adding a new hostname triggers automatic certificate handling. | All products. | | Bring Your Own SSL Certificate | The Data Plane supports management of one or more customer-provided certificates alongside Auto HTTPS. | All products. | | Geo-blocking | Requests are geo-located by origin country and Web Controls rules can allow or block access by country. | All products. | | DDoS Protection | Always-on protection that limits the maximum number of concurrent requesters and uses dynamic address sets to block repeat requesters. Predictive Auto-scaling of the Data Plane absorbs the attacks. | All products. | | Origin Certificates | Long-lasting certificates that protect communication from the Data Plane to application servers, avoiding downtime caused by unexpected expiry of publicly trusted certificates. | All products. | | CSP (Content Security Policy) | Over-the-top CSP support independent of the application's implementation, separating policy from the site so injected attacks cannot succeed. | CloudEDGE Security, Advanced, Premier, Ultra. Not in Essentials. | | Rate Limiting | Rejects requests from a single source that exceed a defined rate for a defined blocking period. Basic provides a built-in rate with automatic enforcement. Advanced provides per-area configurable rates and configurable blocking periods. | Basic on CloudEDGE Security, Advanced and Premier. Advanced on Ultra. Not in Essentials. | | Bot Management | Separates legitimate bots from malicious ones using Webscale-provided, dynamically updated Address Sets. Automatically detects and categorizes malicious bot behavior. | CloudEDGE Security, Premier, Ultra. | | Bot Mitigation | A coordinated set of mechanisms for distinguishing automated traffic from legitimate users and challenging or blocking suspect requests. Today it is delivered as a combination of reCAPTCHA integration, user-agent classification rules configured in Web Controls and forthcoming ASN-level blocking. These mechanisms will be unified under a single feature surface in a future UI release. | CloudEDGE Security, Premier, Ultra. | | WAF (WAAP) | The Cloud WAF protects applications by examining HTTP requests and blocking or modifying malicious ones. Basic provides automatic blocking of known attack signatures. Advanced provides custom configurable conditions for advanced attacks. | Basic on CloudEDGE Security, Essentials and Advanced. Advanced on Premier and Ultra. | | OWASP Protection | Automated protection against the OWASP Top 10 and other common web vulnerabilities such as SQL Injection, XSS and CSRF. | CloudEDGE Security, Advanced, Premier, Ultra. Not in Essentials. | | Role-based Access Control (RBAC) | Fine-grained permission assignment for users managing application configurations and other resources. | CloudEDGE Security, Premier, Ultra. | | Carding Attack Protection (CAP) | Uses knowledge of user behavior on e-commerce sites to recognize and stop carding attacks before they occur. | CloudEDGE Security, Premier, Ultra. | | Trusted Proxies | Allows another technology in front of the Data Plane to be registered as trusted, so requests passing through it are correctly identified and can be restricted to come only from a trusted proxy. | CloudEDGE Security, Ultra. | | Secure Access | Role-based permissions applied to sections of the application to restrict access from the general internet to authenticated, role-authorized users. | CloudEDGE Security, Ultra. | | Data Loss Prevention | Prevents exfiltration of data by limiting access or request volume to sensitive parts of the site. | CloudEDGE Security, Premier, Ultra. | ### Observability | Feature | Definition | Available in | | --- | --- | --- | | Traffic Viewer | A real-time view inside the Webscale Portal of CDN requests, application server requests, Data Plane requests, monitor-generated events, configuration changes and custom application logs. Storage is measured in gigabytes and retention duration is configurable per application and account. | All products. | | Event Logs (configuration audit) | Logs that record configuration changes and access to the Webscale platform, including who made what changes and when. These are the platform's audit trail. | All products. Retained 5 years at no additional cost. | | Session Tracking | Automatically tracks user sessions and makes session IDs available in the Traffic Viewer so requests belonging to a session can be analyzed together. | CloudEDGE Security, Advanced, Premier, Ultra. | | Real User Monitoring (RUM) | Collects performance data from end users' browsers to inform Core Web Vitals tuning and measure the impact of site changes. | CloudEDGE Security, Advanced, Premier, Ultra. | | Additional Online Logs | All online logs are viewed via the Traffic Viewer. Online log storage counts against the Traffic Viewer GB allowance for the tier and retention is configurable. | CloudEDGE Security, Premier, Ultra. | | Archived Logs | Logs that no longer need to be viewable in the Traffic Viewer but must be retained for audit. Available for download via API. Archived log storage is billed on consumption separately from Traffic Viewer storage. | CloudEDGE Security, Advanced, Premier, Ultra. | | Monitors | A configurable observer of an application component, used to notify or take action when a condition is met, for example average response time exceeding a threshold for critical pages. | CloudEDGE Security 5, Advanced 5, Premier 10, Ultra 50. Not in Essentials. | | Custom Log Capture | A feature of the Webscale Monitoring Agent that captures logs from files in real-time and stores them as online custom logs viewable in the Traffic Viewer. Captured logs count against the tier's Traffic Viewer GB allowance. | CloudEDGE Security, Premier, Ultra. | ### Add-ons | Feature | Definition | Available in | | --- | --- | --- | | Varnish | An industry-standard caching solution integrated completely with Webscale's core features. Webscale operates and maintains the Varnish layer so customers receive its caching benefits with zero maintenance overhead and automatic failover. | Optional on all Platform tiers. Not offered with CloudEDGE Security. | --- # Support Packages & Service Matrix URL: https://docs.webscale.com/docs/reference/support/support-packages/ Description: The full tier-by-tier Webscale support matrix — channels, incident response, onboarding, monitoring, developer enablement, reviews, and the DevOps add-on. Webscale support is sold in three tiers, independently of the hosting and infrastructure product tiers: - **Tier 1 — Essentials Support.** Standard single-ticket coverage. - **Tier 2 — Proactive Support.** Expanded response and engineering. - **Tier 3 — Strategic Support.** White-glove; high-availability (HA) available. Incident commitments are defined by priority: **P0 Urgent** (site down), **P1 High** (degraded performance), **P2 Normal** (non-emergency), and **P3 Low** (information or minor issue). ## Support channels | Feature | Tier 1 · Essentials | Tier 2 · Proactive | Tier 3 · Strategic | | --- | --- | --- | --- | | **Ticket Portal** — Standard support ticketing system | Yes | Yes | Yes | | **Dedicated Slack Channel** — Private real-time support channel | No | No | Yes | | **Phone Support** — Direct line for critical escalations | No | No | Yes | | **Dedicated Support SME** — Named SME with dedicated hrs/month; guardrails apply, not 24/7 | No | No | Yes | ## Incident response | Feature | Tier 1 · Essentials | Tier 2 · Proactive | Tier 3 · Strategic | | --- | --- | --- | --- | | **Monthly Incident Volume** — Included P0 tickets/month (customer-opened only; alert tickets excluded) | 10 P0 tickets / month | 25 P0 tickets / month | Unlimited P0 tickets / month | | **Incident First Response** — Committed initial response time by priority | P0 30 min · P1 4 hrs · P2 8 hrs · P3 16 hrs | P0 30 min · P1 2 hrs · P2 4 hrs · P3 8 hrs | P0 15 min · P1 30 min · P2 2 hrs · P3 4 hrs | | **Response Update Interval** — Update cadence during active incidents | P0 2 hrs · P1 4 hrs · P2 8 hrs · P3 16 hrs | P0 60 min · P1 2 hrs · P2 4 hrs · P3 8 hrs | P0 15 min · P1 30 min · P2 2 hrs · P3 4 hrs | ## Onboarding support | Feature | Tier 1 · Essentials | Tier 2 · Proactive | Tier 3 · Strategic | | --- | --- | --- | --- | | **Onboarding Hours Included** — Initial environment setup only; additional environments billed separately (first 90 days) | 2 hrs included | 8 hrs included | 16–32 hrs (Tier 3 / HA) | | **Dedicated Onboarding Engineer** — Named engineer assigned to your launch | No | No | Yes | ## Platform monitoring | Feature | Tier 1 · Essentials | Tier 2 · Proactive | Tier 3 · Strategic | | --- | --- | --- | --- | | **Active Monitoring Coverage** — Areas covered 24/7 by the Webscale SDS team | Uptime · Basic Alerts · Error Rate | Uptime · Alerts · Error Rate · Performance · CDN Health | Uptime · Alerts · Error Rate · Performance · CDN Health · Cache Hit Rate · Database · Container Health · Security Events · Traffic Anomalies · Availability Zones · Custom Dashboards · Proactive Alerting · Synthetic Monitoring · Business KPI Tracking | | **App Monitoring Setup Assistance** — Help configuring your monitoring stack | No | No | Yes | | **Event Preparation & Monitoring** — Peak season / launch event coverage (see note 8) | No | No | Yes | ## Developer Enablement (DE) access | Feature | Tier 1 · Essentials | Tier 2 · Proactive | Tier 3 · Strategic | | --- | --- | --- | --- | | **Monthly DE Hours** — Code review, troubleshooting and platform-level engineering | None | 4 hrs / month | 10–20 hrs / month (Tier 3 / HA) | ## Reviews & audits | Feature | Tier 1 · Essentials | Tier 2 · Proactive | Tier 3 · Strategic | | --- | --- | --- | --- | | **Product Update Reviews** — Scheduled review of platform and product updates | Yes | Yes | Yes | | **Environment Audit** — Moved to add-on services (see the DevOps add-on below) | See add-on | See add-on | See add-on | | **Monthly Business Review (MBR)** — Performance summary, incident review and roadmap | Not included | Not included | Yes | | **Control Panel Configuration Review** — Expert review and optimization of the control panel | Not included | Not included | Yes | ## Platform add-ons — included on all plans | Feature | Tier 1 · Essentials | Tier 2 · Proactive | Tier 3 · Strategic | | --- | --- | --- | --- | | **Virus / Malware Scanning** — Automated security scanning on all environments | Yes | Yes | Yes | | **Backups — Every 24 Hours** — Daily automated environment backups | Yes | Yes | Yes | ## DevOps support add-on | Add-on service | Tier 1 · Essentials | Tier 2 · Proactive | Tier 3 · Strategic | | --- | --- | --- | --- | | **Event Preparation & Monitoring** — 10-hour buckets for Tier 1 and Tier 2 (see note 8) | 10 hr bucket | 10 hr bucket | Included | | **Short-Term Scaling Upgrades** — Temporary capacity for peaks or launches | 10 hr bucket | 10 hr bucket | 10 hr bucket | | **Application Load Testing Assistance** — Performance validation before go-live (see note 9) | 10 hr bucket | 10 hr bucket | 10 hr bucket | | **Environment Audit (new)** — Infrastructure / coding / best practices; per-request, billed as professional services | On request | On request | On request | ## Notes & definitions 1. Support tiers are sold independently of hosting and infrastructure product tiers. 2. Tier 3 HA includes a fully redundant high-availability infrastructure configuration in the backend. 3. Monthly incident volume limits apply to P0 (customer-opened) tickets only; system alert tickets are excluded. 4. Onboarding hours cover the initial environment setup within the first 90 days. Additional environments are billed separately as a one-time implementation cost. 5. Dedicated Support SME (Tier 3) includes a defined number of dedicated hours per month; guardrails and schedules apply — not an on-demand 24/7 resource. 6. DE (Developer Enablement) hours are pooled monthly and do not roll over. 7. Environment Audits are no longer tiered — available as a per-request add-on billed as professional services. 8. Event Preparation & Monitoring is included at Tier 3; a 10-hour bucket add-on for Tier 1 and Tier 2. 9. Application Load Testing and the DevOps package are available as add-ons. --- # IP address is a threat URL: https://docs.webscale.com/docs/reference/web-controls/conditions/ip-address-is-a-threat/ Description: Matches when the requester's IP address is a known malicious source. This condition inspects the client IP address of an incoming request to determine if it is a known malicious source. It returns true if the address matches an entry in the threat database. ## Configuration * **Bot IP shield**: This condition requires the Bot IP Shield add-on to be active for the application. * **Setup**: No further configurations are necessary for this condition. The underlying threat data is automatically updated via [Webroot’s BrightCloud® IP Reputation Service](https://www.brightcloud.com/) every five minutes to reflect the latest global attack sources. ## Measurement The condition resolves the IP address from the incoming request and evaluates it against the threat reputation database. * **Database lookup**: The reputation service is queried to determine if the IP address is categorized as a known threat. * **Error handling**: If the reputation service returns an error or cannot be reached, the condition returns false. * **Logging**: The threat status of the IP address is recorded in the application logs for visibility. The condition returns true if the IP address is successfully identified as a known threat. --- # IP address is not a threat URL: https://docs.webscale.com/docs/reference/web-controls/conditions/ip-address-is-not-a-threat/ Description: Matches when the requester's IP address is not a known malicious source. This condition inspects the client IP address of an incoming request to verify it is not a known malicious source. It returns true if the address is absent from the threat database. ## Configuration * **Bot IP shield**: This condition requires the Bot IP Shield add-on to be active for the application. * **Setup**: No further configurations are necessary for this condition. The underlying threat data is automatically updated via [Webroot’s BrightCloud® IP Reputation Service](https://www.brightcloud.com/) every five minutes to reflect the latest global attack sources. ## Measurement The condition resolves the IP address from the incoming request and evaluates it against the threat reputation database. * **Database lookup**: The reputation service is queried to determine if the IP address is categorized as a known threat. * **Error handling**: If the reputation service returns an error or cannot be reached, the condition returns true. * **Logging**: The threat status of the IP address is recorded in the application logs for visibility. The condition returns true if the IP address is confirmed as not being a known threat. --- # Random URL: https://docs.webscale.com/docs/reference/web-controls/conditions/random/ Description: Matches a specified percentage of traffic based on a random selection. This condition triggers actions randomly based on a specified percentage of traffic. ## Configuration * **Percentage of traffic**: A numerical value between 0 and 100 that defines the likelihood of the condition matching. A value of 0 will never return true, while a value of 100 will always return true. This field is required. ## Measurement For every incoming request, the condition evaluates a uniform random float between `0.0` and `1.0`. The configured **Percentage of traffic** is converted to a probability (e.g. 20% becomes `0.2`). The condition returns true if the generated random value is less than this probability. --- # Rate limit URL: https://docs.webscale.com/docs/reference/web-controls/conditions/rate-limit/ Description: Matches when requests for a specific client exceed a defined threshold within a set duration. This condition tracks the volume of requests from a specific requester and returns true if that volume exceeds a defined threshold within a set time period. Rate counters are measured centrally across all proxies serving an application, and each evaluated client ID is allocated its own counter as long as requests are received for it within the interval. Counting only occurs if the other conditions within the web control are met. The counter set for a rate limit condition is unique to the specific web control that contains it; an identical condition in another web control maintains its own independent counter set. ## Configuration * **Client ID**: A [value template](https://control.webscale.com/docs/api#:~:text=value%20template) evaluated to identify the requester. By default, this is set to `$(request_address)` to track by the requester's IP address. This field is required. * **Threshold**: The maximum number of requests allowed within the duration before the condition triggers. This must be a number greater than 0. This field is required. * **Duration**: The amount of time over which to accumulate the request count. This must be a number of at least 5 when the unit of time is seconds, but can be as low as 1 if the unit of time is minutes or hours. This field is required. * **Unit**: The unit of time (Seconds, Minutes, or Hours) used for the duration. This field is required. ## Measurement Rate measurement is not exact. For efficiency, a sliding window is used with a fixed number of buckets. While a triggered condition confirms the client is over the limit, a client strictly over the limit may be measured under the limit if a significant number of requests fall at the beginning of the interval. --- # Standard URL: https://docs.webscale.com/hosting-platforms/hosting-v4/stacks/standard/ Description: Guide for understanding and configuring a Standard stack The Standard stack introduces dynamic capacity by decoupling the web delivery layer from the backend services. **Architecture**: An autoscaling web tier supported by a single "core" server. **How it Works**: The web server is moved into a horizontally scaling layer that automatically expands or contracts based on real-time request demand. The core server processes and manages common backend services (databases, caching, search, NFS, and cron). **Best For**: Applications prone to traffic spikes or those experiencing rapid growth that require immediate, automated scaling at the web tier. ## Supported variants - Magento (`type: standard-magento`) - Shopware (`type: standard-shopware`) ## Variables | Variable name | Type | Description | | :--- | :--- | :---| :--- | | `region` | `string` | *Required* The region to deploy the stack. | | `zone` | `string` | Optional. Availability zone. Specify only when a specific zone is required. Otherwise, derived from the `region`. | | `size` | `string` | *Required* Plan size. Must be one of `dev`, `micro`, `mini`, `small`, `medium`, `large`, or `xlarge`. | | `server_size` | `object` | Optional override for core server compute. Must map to a specific ARM64 instance type based on vCPU and memory. | | ↳`vcpu` | `number` | vCPU count | | ↳`memory` | `number`| GiB | | `cluster_size` | `object` | Optional override for cluster server compute. Must map to a specific ARM64 instance type based on vCPU and memory. | | ↳`vcpu` | `number` | vCPU count. | | ↳`memory` | `number`| GiB. | | `data_disk_size` | `number` | Optional. The size of the data disk in GiBs. If this is provided, it will override the default disk size. | | `db_endpoint` | `string` | Optional. Only provide when an add-on database has been created. Typically a reference to an RDS stack output. | | `db_password_secret_name` | `string` | Optional. Only provide when an add-on database has been created. A reference to a Secrets Manager secret for retrieving the database password. Typically a reference to an RDS stack output. | | `stacker_variables` | `object` | | | ↳`mysql` | `object` | Optional Mysql configuration variables. See [**MySQL**](/hosting-platforms/hosting-v4/services/mysql/) for details. | | ↳`php` | `object` | Optional PHP configuration variables. See [**PHP-FPM**](/hosting-platforms/hosting-v4/services/php-fpm/) for details. | | ↳`vinyl` | `object` | Optional Vinyl configuration variables. See [**Vinyl**](/hosting-platforms/hosting-v4/services/vinyl/) for details. | | ↳`share` | `list(string)` | A list of specific subdirectory paths within the core server's file system to bind-mount into the application container's web root.
Example: `"share":["html/app/etc/env.php","html/pub/media","html/var"]`| ### Example: ``` { "type": "standard-magento", "environment": "/v2/environments/tu8aovkn7waj", "service": "/v2/services/2tpkjj7e0b28", "name": "magento-production-store", "variables": { "region": "us-east-1", "size": "medium", "stacker_variables": { "php": { "version": "8.3" }, "mysql": { "variant": "mariadb", "version": "10.5.18" }, "share": ["html/app/etc/env.php","html/pub/media","html/var"] } } } ``` ## Outputs | Output name | Description | | :--- | :--- | | `data_subnets` | Array of subnet IDs for backend services [subnet]. | | `public_subnets` | Array of subnet IDs for public services [primary, secondary]. | --- # Referrer is URL: https://docs.webscale.com/docs/reference/web-controls/conditions/referrer-is/ Description: Matches when the Referer request header matches one or more specified wildcard patterns. This condition inspects the `Referer` request header to determine if it matches a specified list of wildcard patterns. It returns true if the header value matches any of the defined patterns. ## Configuration * **Case sensitive**: Whether to enable case sensitivity during the comparison. When disabled, the condition performs a case-insensitive match against the `Referer` header sent in the request. * **Referrer pattern**: The input field used to add new wildcard patterns. Multiple entries can be added simultaneously by separating them with a comma, a pipe (`|`), or a new line. * **Defined patterns**: The list of all active patterns for this condition. The condition returns true if the requester's referrer matches any entry in this list. ## Pattern matching The system supports flexible wildcard entries to simplify configuration. To ensure comprehensive matching, the system automatically translates wildcard entries into optimized regular expressions during processing: * **Automatic conversion**: Hostname-only patterns (e.g. `*example*`) are automatically converted to `*://*example*` to match any protocol. * **Explicit patterns**: You may provide full URLs or specific paths using wildcards (e.g. `https://example.com/path/*`). ## Measurement The condition extracts the `Referer` header from the incoming request and evaluates it against the **Defined patterns**. * **Match found**: If the header value matches any pattern in the list, the condition returns true. * **No match found**: If the header value matches none of the patterns, the condition returns false. * **Missing header**: If the `Referer` header is absent from the request, the condition returns false. ## Performance * **Sequential validation**: Evaluation time increases incrementally with the number of patterns in the list. For requests that do not match any pattern, the system must evaluate every entry before returning false. * **Short-circuit optimization**: The condition iterates through the list and returns true as soon as the first match is identified. To minimize processing time, place the most frequently matched patterns at the top of the list. --- # Referrer is not URL: https://docs.webscale.com/docs/reference/web-controls/conditions/referrer-is-not/ Description: Matches when the Referer request header does not match any wildcard patterns. This condition inspects the `Referer` request header to determine if it does not match a specified list of wildcard patterns. It returns true if the header value matches none of the defined patterns. ## Configuration * **Case sensitive**: Whether to enable case sensitivity during the comparison. When disabled, the condition performs a case-insensitive match against the `Referer` header sent in the request. * **Referrer pattern**: The input field used to add new wildcard patterns for exclusion. Multiple entries can be added simultaneously by separating them with a comma, a pipe (`|`), or a new line. * **Defined patterns**: The list of all active patterns for this condition. The condition returns true only if the requester's referrer matches none of the entries in this list. ## Pattern matching The system supports flexible wildcard entries to simplify configuration. To ensure comprehensive matching, the system automatically translates wildcard entries into optimized regular expressions during processing: * **Automatic conversion**: Hostname-only patterns (e.g. `*example*`) are automatically converted to `*://*example*` to match any protocol. * **Explicit patterns**: You may provide full URLs or specific paths using wildcards (e.g. `https://example.com/path/*`). ## Measurement The condition extracts the `Referer` header from the incoming request and evaluates it against the **Defined patterns**. * **Match found**: If the header value matches any pattern in the list, the condition returns false. * **No match found**: If the header value matches none of the patterns, the condition returns true. * **Missing header**: If the `Referer` header is absent from the request, the condition returns true. ## Performance * **Sequential validation**: To return true, the system must evaluate the entire list of patterns to ensure no matches exist. Large lists add an incremental processing cost to every request that passes through the filter. * **Short-circuit optimization**: The system stops processing and returns false as soon as it identifies a match. To optimize performance for traffic that should be excluded, place the patterns most likely to match at the top of the list. --- # Referrer is defined URL: https://docs.webscale.com/docs/reference/web-controls/conditions/referrer-is-defined/ Description: Matches when the Referer request header matches one or more application aliases. This condition checks if the `Referer` header sent in the request matches any of the aliases associated with the application. It returns true if the requester's referrer hostname is recognized as an application alias. ## Configuration No further configurations are necessary for this condition. The logic is applied automatically by comparing the request header against the application's current list of aliases. ## Measurement The condition extracts the hostname from the `Referer` header of the incoming request. It then performs a lookup against the list of aliases configured for the application and returns true if a match is found. This is commonly used to identify traffic originating from within the same application. --- # Referrer is not defined URL: https://docs.webscale.com/docs/reference/web-controls/conditions/referrer-is-not-defined/ Description: Matches when the Referer request header does not match any application aliases. This condition checks if the `Referer` header sent in the request does not match any of the aliases associated with the application. It returns true if the requester's referrer hostname is not recognized as an application alias. ## Configuration No further configurations are necessary for this condition. The logic is applied automatically by comparing the request header against the application's current list of aliases. ## Measurement The condition extracts the hostname from the `Referer` header of the incoming request. It then performs a lookup against the list of aliases configured for the application and returns true if no match is found. This is commonly used to identify traffic originating from outside the application. --- # Request header value matches URL: https://docs.webscale.com/docs/reference/web-controls/conditions/request-header-value-matches/ Description: Matches when the value of a specific request header matches a regular expression. This condition inspects the value of a specified header sent in the request to determine if it matches a [regular expression](https://www.regular-expressions.info/). It returns true if the named header contains a value that matches the defined pattern. ## Configuration * **Case sensitive**: Whether to enable case sensitivity during the name and value comparison. When disabled, the condition performs a case-insensitive match for the header name and evaluates the pattern against all headers sent in the request that match that name. * **Name**: The exact name of the request header to inspect. This field is required and supports a maximum of 50 characters. * **Pattern**: The [RE2 regular expression](https://github.com/google/re2/wiki/Syntax) used to evaluate the header's value. The condition returns true if the pattern matches the value of the specified header. This field is required and supports a maximum of 255 characters. ## Measurement The condition extracts all values for the specified header name from the incoming request and evaluates them against the configured pattern. * **Match found**: If any instance of the header matches the regular expression, the condition returns true. * **No match found**: If none of the header values match the pattern, the condition returns false. * **Missing header**: If the specified header is absent from the request, the condition returns false. --- # Magento and Shopware commands URL: https://docs.webscale.com/docs/how-tos/deployment/essentials/essentials-commands/ Description: How to run Magento and Shopware CLI commands on Webscale Essentials. Use the `dev` helper to run Magento and Shopware commands inside the application container. --- ## 1. Open SSH Connect and dev shell In Webscale CP: - Accordion Menu (top left) > [SSH Connect](/docs/how-tos/ssh-connect/) - Find the instance you want to connect to and open a terminal session by clicking on the instance link. Then run: ```bash dev ``` to jump to the `php-fpm` container. {{< alert title="" color="info" >}} All commands below are run inside this dev shell in `/var/www/html`. {{< /alert >}} --- ## 2. Magento commands ### Pattern ```bash php bin/magento ``` ### Common examples ```bash php bin/magento cache:flush php bin/magento indexer:reindex php bin/magento setup:upgrade --keep-generated php bin/magento setup:static-content:deploy en_US -f --jobs=4 ``` --- ## 3. Shopware commands ### Pattern ```bash php bin/console ``` ### Common examples ```bash php bin/console database:migrate --all php bin/console cache:clear:all php bin/console cache:warmup php bin/console theme:compile ``` --- ## 4. Related how-to guides - [Deploy a new release](/docs/how-tos/Deployment/Essentials/essentials-deploy/) - [Essentials environment reference](/docs/reference/essentials-environment-reference/) --- # Magento and Shopware commands URL: https://docs.webscale.com/docs/how-tos/deployment/standard/standard-commands/ Description: How to run Magento and Shopware CLI commands on Webscale Pro V3 environments. Use your environment-specific shell helper to run Magento and Shopware commands inside the application container. --- ## 1. Open SSH connect and container shell Login to the [Webscale Control Panel](https://control.webscale.com/): - Click the three bars in the upper left site navigation > **[SSH connect](https://control.webscale.com/ssh-connect)** - Find the NFS / web worker instance for your environment and open a terminal session by clicking on the instance link. ##### On the NFS host Run the shell helper script: ```bash shell ``` This opens a shell inside the application container as the appropriate user with the site code mounted. ##### On the web worker host Identify container: ```bash docker ps ``` Using obtained container ID you can review container logs, ssh to container, etc. ```bash docker logs -f docker exec -it bash ``` --- ## 2. Quick cheat sheet | Task | Command | Common examples | |---------------|-----------------------------------|-----------------| | Magento CLI | `php bin/magento ` | `php bin/magento cache:flush`
`php bin/magento indexer:reindex` | | Shopware CLI | `php bin/console ` | `php bin/console database:migrate --all`
`php bin/console cache:clear:all`
`php bin/console cache:warmup` | ## Related how-to guides - [Deploy a new release](/docs/how-tos/Deployment/Standard/standard-deploy/) - [Standard environment reference](/hosting-platforms/hosting-v3/) --- # Create an EKS stack URL: https://docs.webscale.com/hosting-platforms/hosting-v4/how-tos/create-an-eks-stack/ Description: How to create an EKS stack with the Webscale API. Follow these steps to create an EKS stack and prepare it for Helm deployments. ## Prerequisites - **Access key:** An access key for the account, created in the **Access keys** section of your **Profile** page. See [Webscale service users](/docs/how-tos/general/service-users/) for a key that belongs to automation. - **AWS provider:** An AWS provider in the account. See [Working with Providers](/docs/how-tos/general/providers/). - **Environment:** An environment to hold the stack. See [Create an environment](/hosting-platforms/hosting-v4/how-tos/create-an-environment/). - **Network:** Subnet IDs when you bring a network you already have. A new network does not need them. See [Network topology](/hosting-platforms/hosting-v4/stacks/eks/#network-topology). - **Name:** A name for the stack, which becomes the name of the EKS cluster. It must be unique within the environment and among the stacks that share your AWS account. Use 3 to 30 characters from `a-z`, `0-9`, and `-`, starting with a lowercase letter or a digit. Every request goes to `https://api.webscale.com` and carries the access key: ``` ACCESS_KEY= ``` ## 1. Find the environment ``` curl -s "https://api.webscale.com/v2/environments" \ -H "Authorization: Bearer $ACCESS_KEY" ``` ``` [ { "href": "/v2/environments/3ps666yxcanq", "name": "Production", ... } ] ``` Note the `href` of the environment the stack belongs to. An empty list means the account has no environment. See [Create an environment](/hosting-platforms/hosting-v4/how-tos/create-an-environment/). ## 2. Find the AWS service Saving an AWS provider creates the service that lets a stack build in your AWS account. The service takes the name of the provider. ``` curl -s "https://api.webscale.com/v2/services" \ -H "Authorization: Bearer $ACCESS_KEY" ``` ``` [ { "href": "/v2/services/u91dkrui39cj", "category": "vm", "type": "aws", "name": "AWS production" }, { "href": "/v2/services/2tk18ei6581v", "category": "cloud", "type": "aws", "name": "AWS production", ... } ] ``` Note the `href` of the entry whose `category` is `vm` and whose `type` is `aws`. ## 3. Create the stack The stack has two network modes, and each takes a different request body. Save the one you want as `stack.json` and fill in your own environment, service, name, and network values. See [Network topology](/hosting-platforms/hosting-v4/stacks/eks/#network-topology) for the differences between the modes and [Variables](/hosting-platforms/hosting-v4/stacks/eks/#variables) for the other variables. Either body can also set `api_ingress_cidrs` in `variables`. Add the networks you connect from, so tools such as `kubectl` or Helm reach the EKS cluster's public API endpoint. Only the Webscale Control Plane reaches the endpoint otherwise. See [Cluster access](/hosting-platforms/hosting-v4/stacks/eks/#cluster-access). ### Existing network The stack puts the nodes and the EKS cluster's API in subnets you already have, all in one VPC. It opens the NodePort range to that VPC's primary CIDR block and nothing else. Add any other network to `service_ingress_cidrs`. ``` { "type": "eks", "environment": "/v2/environments/3ps666yxcanq", "service": "/v2/services/u91dkrui39cj", "name": "production-eks", "variables": { "region": "us-east-1", "node_subnets": ["subnet-0123456789abcdef0", "subnet-0fedcba9876543210"], "api_subnets": ["subnet-0aaaa1111bbbb2222", "subnet-0cccc3333dddd4444"] } } ``` ### New network The stack creates a VPC for the nodes and the EKS cluster's API. It builds a public and a private subnet in each of two zones, and `public_nodes` puts the nodes on the public pair. The proxies reach public nodes from their public addresses, which is why `service_ingress_cidrs` holds `0.0.0.0/0`. The NodePort range `30000-32767` is then open to any address. ``` { "type": "eks", "environment": "/v2/environments/3ps666yxcanq", "service": "/v2/services/u91dkrui39cj", "name": "production-eks", "variables": { "region": "us-east-1", "public_nodes": true, "service_ingress_cidrs": ["0.0.0.0/0"] } } ``` ### Post the stack ``` curl -X POST "https://api.webscale.com/v2/stacks" \ -H "Authorization: Bearer $ACCESS_KEY" \ -H "Content-Type: application/json" \ --data @stack.json ``` ``` { "href": "/v2/stacks/imawpe1lq6lc", "name": "production-eks", "type": "eks", "state": "pending", ... } ``` Note the `href` of the stack. ## 4. Monitor stack provisioning The **Task monitor** shows the log of the stack as it builds. The first create takes about 20 minutes. Read the `state` of the stack: ``` curl -s "https://api.webscale.com/v2/stacks/imawpe1lq6lc" \ -H "Authorization: Bearer $ACCESS_KEY" ``` The `state` runs from `pending` to `synchronizing` to `synchronized`. Repeat the request until it reaches `synchronized`. A `state` of `sync-failed` means the stack stopped, and the log names the reason. ## 5. Deploy to the EKS cluster The EKS cluster is ready for deployments once the stack reaches `synchronized`. It has the same name as the stack, and the end of the log gives that name as the `kubernetes_cluster_name` output. Enable **Use for Kubernetes** on the AWS provider and enter the name in **Cluster Name**. The provider's region must be the region of the EKS cluster. See [Working with Providers](/docs/how-tos/general/providers/) for more information. Then create a Kubernetes cluster with a Helm blueprint. See [Kubernetes Clusters](/docs/how-tos/general/kubernetes-clusters/). ## Further reading - [EKS stack](/hosting-platforms/hosting-v4/stacks/eks/) - [Kubernetes Clusters](/docs/how-tos/general/kubernetes-clusters/) - [Create an environment](/hosting-platforms/hosting-v4/how-tos/create-an-environment/) - [Working with Providers](/docs/how-tos/general/providers/) - [API documentation](/docs/api/) --- # Request header value does not match URL: https://docs.webscale.com/docs/reference/web-controls/conditions/request-header-value-does-not-match/ Description: Matches when the value of a specific request header does not match a regular expression. This condition inspects the value of a specified header sent in the request to determine if it does not match a [regular expression](https://www.regular-expressions.info/). It returns true if the named header contains no values that match the defined pattern. ## Configuration * **Case sensitive**: Whether to enable case sensitivity during the name and value comparison. When disabled, the condition performs a case-insensitive match for the header name and evaluates the pattern against all headers sent in the request that match that name. * **Name**: The exact name of the request header to inspect. This field is required and supports a maximum of 50 characters. * **Pattern**: The [RE2 regular expression](https://github.com/google/re2/wiki/Syntax) used to evaluate the header's value. The condition returns true if the pattern does not match the value of the specified header. This field is required and supports a maximum of 255 characters. ## Measurement The condition extracts all values for the specified header name from the incoming request and evaluates them against the configured pattern. * **Match found**: If any instance of the header matches the regular expression, the condition returns false. * **No match found**: If none of the header values match the pattern, the condition returns true. * **Missing header**: If the specified header is absent from the request, the condition returns true. --- # Webscale Pro V3 URL: https://docs.webscale.com/docs/how-tos/deployment/standard/ Description: Deployment guides for Webscale Pro V3 environments. Webscale Pro V3 runs your application in containers with supporting services managed by Webscale. Use these guides to: - Deploy a new Magento or Shopware release - Run Magento and Shopware CLI commands --- # Request headers match URL: https://docs.webscale.com/docs/reference/web-controls/conditions/request-headers-match/ Description: Matches when any specified request header names and patterns match. This condition inspects the incoming request to verify the presence of a specific set of header names and their corresponding values. It returns true if any defined header name is present and contains a value that matches its respective [regular expression](https://www.regular-expressions.info/). ## Configuration * **Case sensitive**: Whether to enable case sensitivity during the comparison. When disabled, the condition performs a case-insensitive match for both the header names and the values against the defined patterns. * **Name**: The exact name of the request header to inspect. Multiple headers can be added to the list. * **Pattern**: The [RE2 regular expression](https://github.com/google/re2/wiki/Syntax) used to evaluate the specific header's value. * **Defined patterns**: The list of all active name-pattern pairs for this condition. The condition returns true only if the request matches every entry in this list. ## Measurement The condition resolves the specified headers from the incoming request and evaluates them against the **Defined patterns** as a collective set. * **Match found**: The condition returns true upon the first match found. * **No match found**: The condition returns false if no matches are found. * **Missing header**: The condition returns false if the specified header names are missing from the request. ## Performance * **Sequential validation**: The system must evaluate each header entry in the list until a result is determined. Processing time increases incrementally with each additional name-pattern pair defined. * **Short-circuit optimization**: The system stops processing and returns false as soon as a mismatch is identified or a missing header is detected. To minimize processing time, place the headers most likely to be missing or mismatched at the top of the list. --- # Request headers do not match URL: https://docs.webscale.com/docs/reference/web-controls/conditions/request-headers-do-not-match/ Description: Matches when any specified request header name or pattern is missing or mismatched. This condition inspects the incoming request to verify if a specific set of header names and their corresponding values is absent. It returns true if any specified header name is missing or if any header value does not match its respective [regular expression](https://www.regular-expressions.info/). ## Configuration * **Case sensitive**: Whether to enable case sensitivity during the comparison. When disabled, the condition performs a case-insensitive match for both the header names and the values against the defined patterns. * **Name**: The exact name of the request header to inspect. Multiple headers can be added to the list. * **Pattern**: The [RE2 regular expression](https://github.com/google/re2/wiki/Syntax) used to evaluate the specific header's value. * **Defined patterns**: The list of all active name-pattern pairs for this condition. The condition returns true if the request fails to match the entire set defined in this list. ## Measurement The condition resolves the specified headers from the incoming request and evaluates them against the **Defined patterns** as a collective set. * **Match found**: If any header value fails to match its defined pattern, the condition returns true. * **No match found**: The condition returns false only if every header name is present and every corresponding value matches its defined regular expression. * **Missing header**: If any specified header name is absent from the request, the condition returns true. ## Performance * **Sequential validation**: The system must evaluate each header entry in the list until a result is determined. Processing time increases incrementally with each additional name-pattern pair defined. * **Short-circuit optimization**: The system stops processing and returns true as soon as a mismatch is identified or a missing header is detected. To minimize processing time, place the headers most likely to be missing or mismatched at the top of the list. --- # Request method is URL: https://docs.webscale.com/docs/reference/web-controls/conditions/request-method-is/ Description: Matches when the request method is one of the selected methods. This condition inspects the HTTP method of the incoming request and returns true if it matches any of the methods in the selected list. ## Configuration * **Available request methods**: A list of standard HTTP methods available for selection, including `CONNECT`, `DELETE`, `GET`, `HEAD`, `OPTIONS`, `PATCH`, `POST`, `PUT`, and `TRACE`. * **Selected methods**: The specific methods that trigger the condition. The condition returns true if the request uses any method present in this list. ## Measurement The condition extracts the method name from the incoming request and performs a lookup against the **Selected methods** list. It returns true as soon as a match is found. If the request method is not in the list, or if the request context is unavailable during evaluation, the condition returns false. --- # Request method is not URL: https://docs.webscale.com/docs/reference/web-controls/conditions/request-method-is-not/ Description: Matches when the request method is not one of the selected methods. This condition inspects the HTTP method of the incoming request and returns true if it does not match any of the methods in the selected list. ## Configuration * **Available request methods**: A list of standard HTTP methods available for selection, including `CONNECT`, `DELETE`, `GET`, `HEAD`, `OPTIONS`, `PATCH`, `POST`, `PUT`, and `TRACE`. * **Selected methods**: The list of methods that the request must not use for the condition to return true. If a request uses a method present in this list, the condition returns false. ## Measurement The condition extracts the method name from the incoming request and compares it against the **Selected methods** list. It returns true only if the request method is absent from that list. If the request method is found in the list, or if the request context is unavailable, the condition returns false. --- # Response headers match URL: https://docs.webscale.com/docs/reference/web-controls/conditions/response-headers-match/ Description: Matches when any specified response header names and patterns match. This condition inspects the outgoing response to verify the presence of a specific set of header names and their corresponding values. It returns true if any defined header name is present and contains a value that matches its respective [regular expression](https://www.regular-expressions.info/). {{% alert title="Note:" %}} This web control condition is only available on Response web controls. {{% /alert %}} ## Configuration * **Case sensitive**: Whether to enable case sensitivity during the comparison. When disabled, the condition performs a case-insensitive match for both the header names and the values against the defined patterns. * **Name**: The exact name of the response header to inspect. Multiple headers can be added to the list. * **Pattern**: The [RE2 regular expression](https://github.com/google/re2/wiki/Syntax) used to evaluate the specific header's value. * **Defined patterns**: The list of all active name-pattern pairs for this condition. The condition returns true only if the response matches every entry in this list. ## Measurement The condition resolves the specified headers from the outgoing response and evaluates them against the **Defined patterns** as a collective set. * **Match found**: The condition returns true upon the first match found. * **No match found**: The condition returns false if no matches are found. * **Missing header**: The condition returns false if the specified header names are missing from the request. ## Performance * **Sequential validation**: The system must evaluate each header entry in the list until a result is determined. Processing time increases incrementally with each additional name-pattern pair defined. * **Short-circuit optimization**: The system stops processing and returns false as soon as a mismatch is identified or a missing header is detected. To minimize processing time, place the headers most likely to be missing or mismatched at the top of the list. --- # Response headers do not match URL: https://docs.webscale.com/docs/reference/web-controls/conditions/response-headers-do-not-match/ Description: Matches when any specified response header name or pattern is missing or mismatched. This condition inspects the outgoing response to verify if a specific set of header names and their corresponding values is absent. It returns true if any specified header name is missing or if any header value does not match its respective [regular expression](https://www.regular-expressions.info/). {{% alert title="Note:" %}} This web control condition is only available on Response web controls. {{% /alert %}} ## Configuration * **Case sensitive**: Whether to enable case sensitivity during the comparison. When disabled, the condition performs a case-insensitive match for both the header names and the values against the defined patterns. * **Name**: The exact name of the response header to inspect. Multiple headers can be added to the list. * **Pattern**: The [RE2 regular expression](https://github.com/google/re2/wiki/Syntax) used to evaluate the specific header's value. * **Defined patterns**: The list of all active name-pattern pairs for this condition. The condition returns true if the response fails to match the entire set defined in this list. ## Measurement The condition resolves the specified headers from the outgoing response and evaluates them against the **Defined patterns** as a collective set. * **Match found**: If any header value fails to match its defined pattern, the condition returns true. * **No match found**: The condition returns false only if every header name is present and every corresponding value matches its defined regular expression. * **Missing header**: If any specified header name is absent from the response, the condition returns true. ## Performance * **Sequential validation**: The system must evaluate each header entry in the list until a result is determined. Processing time increases incrementally with each additional name-pattern pair defined. * **Short-circuit optimization**: The system stops processing and returns true as soon as a mismatch is identified or a missing header is detected. To minimize processing time, place the headers most likely to be missing or mismatched at the top of the list. --- # Status code matches URL: https://docs.webscale.com/docs/reference/web-controls/conditions/status-code-matches/ Description: Matches when the HTTP response status code matches provided codes or classes. This condition inspects the HTTP status code returned in the response to determine if it matches a specified value or category. It returns true if the status code matches the codes or shorthand classes defined in the configuration. {{% alert title="Note:" %}} This web control condition is only available on Response web controls. {{% /alert %}} ## Configuration * **Enter status code(s)**: The values used to evaluate the response status code. This field supports specific codes, shorthand classes, and comma-separated lists. * **Specific codes**: Enter the exact three-digit number (e.g., `200`). * **Code classes**: Use shorthand notation to match an entire range of codes (e.g., `2xx` matches any 200-level success code). * **Multiple entries**: Separate multiple values with a comma (e.g., `200,404,5xx`). ## Measurement The condition extracts the numerical HTTP status code from the response and converts it into a string representation (e.g., `200` becomes `"200"`). It then evaluates this string against a regular expression pattern generated from your input. The condition returns true only if the status code string matches the pattern. If the response context is unavailable or missing during evaluation, the condition returns false. --- # User agent matches URL: https://docs.webscale.com/docs/reference/web-controls/conditions/user-agent-matches/ Description: Matches when the User-Agent request header matches one or more regular expressions. This condition inspects the `User-Agent` header of the incoming request to determine if it matches a [regular expression](https://www.regular-expressions.info/). It returns true if the header value satisfies any of the defined patterns. ## Configuration * **Case sensitive**: Whether to enable case sensitivity during the comparison. When disabled, the condition performs a case-insensitive match against the `User-Agent` string. * **Enter your pattern(s)**: The [RE2 regular expression](https://github.com/google/re2/wiki/Syntax) used to evaluate the `User-Agent` string. Entries should be separated by a new line. * **Defined patterns**: The list of all active patterns for this condition. The condition returns true if the `User-Agent` header matches any pattern in this list. ## Measurement The condition extracts the `User-Agent` header from the incoming request and evaluates it against the **Defined patterns**. * **Match found**: If the header value matches any regular expression in the list, the condition returns true. * **No match found**: If the header value matches none of the patterns, the condition returns false. * **Missing header**: If the `User-Agent` header is absent from the request, the condition returns false. ## Performance * **Sequential validation**: Evaluation time increases incrementally with the number of patterns in the list. For requests that do not match any pattern, the system must evaluate every entry before returning false. * **Short-circuit optimization**: The condition iterates through the list and returns true as soon as the first match is identified. To minimize processing time, place the most frequently matched patterns at the top of the list. --- # User agent does not match URL: https://docs.webscale.com/docs/reference/web-controls/conditions/user-agent-does-not-match/ Description: Matches when the User-Agent request header does not match any specified regular expressions. This condition inspects the `User-Agent` header of the incoming request to determine if it does not match a [regular expression](https://www.regular-expressions.info/). It returns true if the header value does not satisfy any of the defined patterns. ## Configuration * **Case sensitive**: Whether to enable case sensitivity during the comparison. When disabled, the condition performs a case-insensitive match against the `User-Agent` string. * **Enter your pattern(s)**: The [RE2 regular expression](https://github.com/google/re2/wiki/Syntax) used to evaluate the `User-Agent` string. Entries should be separated by a new line. * **Defined patterns**: The list of all active patterns for this condition. The condition returns true only if the `User-Agent` header fails to match every pattern in this list. ## Measurement The condition extracts the `User-Agent` header from the incoming request and evaluates it against the **Defined patterns**. * **Match found**: If the header value matches any regular expression in the list, the condition returns false. * **No match found**: If the header value matches none of the patterns, the condition returns true. * **Missing header**: If the `User-Agent` header is absent from the request, the condition returns true. ## Performance * **Sequential validation**: To return true, the system must evaluate the entire list of patterns to ensure no matches exist. Large lists add an incremental processing cost to every request that passes through the filter. * **Short-circuit optimization**: The system stops processing and returns false as soon as it identifies a match. To optimize performance for traffic that should be excluded, place the patterns most likely to match at the top of the list. --- # Essentials environment reference URL: https://docs.webscale.com/docs/reference/essentials-environment-reference/ Description: Reference for services, sudo commands, and helper tools on Webscale Essentials environments. Lookup-style reference for Essentials environments. --- ## 1. Service management These services can be managed with `systemctl` (no password) by allowed users: | Unit | Description | |-----------------------------|----------------------------| | `rabbitmq` | Message queue | | `opensearch` | Search backend | | `valkey-persistent` | Persistent key-value store | | `valkey-volatile` | Volatile cache | | `vinyl` | Vinyl (Varnish) HTTP Cache | | `php-fpm` | PHP application processes | | `mysql` | MySQL database | | `relay` | HTTP relay / reverse proxy | ### Examples ```bash systemctl status php-fpm systemctl restart rabbitmq systemctl restart mysql ``` --- ## 2. Helper commands Available to users in the `adm` group: - `dev` – run commands in the `php-fpm` container ### Examples ```bash dev 'php bin/magento --version' # or dev 'php bin/console --version' ``` --- ## 3. Web root and key paths - Web root: ```bash /var/www/html ``` - Logs and reports: ```bash /var/log/{php-fpm,vinyl,opensearch,mysql, ... } ``` --- ## 4. Queue / cache examples ```bash # RabbitMQ rabbitmqctl list_queues # Valkey valkey-cli ping ``` If it is password protected: ```bash valkey-cli -p 6379 -a ping valkey-cli -p 6380 -a ping ``` --- ## 5. Related how-to guides - [Deploy a new release](/docs/how-tos/Deployment/Essentials/essentials-deploy/) - [Magento and Shopware commands](/docs/how-tos/Deployment/Essentials/essentials-commands/) --- # URL matches URL: https://docs.webscale.com/docs/reference/web-controls/conditions/url-matches/ Description: Matches when the request URL matches a wildcard pattern or regular expression. This condition inspects the incoming request URL to determine if it matches the specified criteria. It supports a segmented wildcard interface for common URL structures or a list of regular expressions for complex matching logic. ## Configuration * **Case sensitive**: Determines if the comparison ignores character casing. When disabled, the system performs a case-insensitive match against all URL components. * **Use regular expressions**: Whether to enable regular expression matching. When enabled, the input mode switches from segmented wildcard fields to a list of regex patterns. * **Disabled**: Provides separate fields for **Scheme**, **Domain**, **Path**, and **Query**. * **Enabled**: Provides a list of regex patterns evaluated against the full, normalized, and unescaped unicode URL string. * **Defined patterns**: The list of URL objects. The condition returns true if the request matches any single entry in this list. ### Wildcard patterns When **Use regular expressions** is disabled, you define a URL structure using these components: * **Scheme**: The protocol, such as `http` or `https`. If omitted or set to `*`, both protocols match. * **Domain**: The requested hostname, such as `www.example.com`. This field supports wildcards like `*.example.com`. If omitted, all domains configured for the application match. * **Path**: The resource location, such as `/blog/*`. If omitted, all paths match. * **Query**: The query string parameters, such as `id=*&type=json`. If omitted, all query values match. ## Measurement The condition evaluates to true if any single entry in the list evaluates to true. ### Wildcard processing Wildcard matching uses the asterisk (`*`) as a placeholder for any sequence of characters. The system automatically optimizes the underlying regular expression generation for these segments to minimize CPU overhead. * **Multi-field matching**: All specified fields (Scheme, Domain, Path, and Query) must match simultaneously for that specific object to return true. * **Omissions**: Any field left blank is treated as an implicit wildcard and is considered an automatic match. ### Regular expression processing When enabled, the system evaluates the full URL string against the defined patterns. * **Dialect**: The system uses the [RE2 regular expression](https://github.com/google/re2/wiki/Syntax) dialect. * **Capture groups**: Capture groups are assigned to variables `$1` through `$9`, which can be substituted in subsequent actions. * **Assertions**: The system does not add line-begin (`^`) or line-end (`$`) assertions automatically; these must be provided explicitly for exact matching. ## Performance * **Sequential validation**: Evaluation time increases incrementally with the number of patterns in the list. For requests that do not match any pattern, the system must evaluate every entry before returning false. * **Short-circuit optimization**: The condition iterates through the list and returns true as soon as the first match is identified. To minimize processing time, place the most frequently matched patterns at the top of the list. --- # URL does not match URL: https://docs.webscale.com/docs/reference/web-controls/conditions/url-does-not-match/ Description: Matches when the request URL does not match any configured wildcard pattern or regular expression. This condition inspects the incoming request URL to determine if it does not match the specified criteria. It supports a segmented wildcard interface for common URL structures or a list of regular expressions for complex matching logic. ## Configuration * **Case sensitive**: Determines if the comparison ignores character casing. When disabled, the system performs a case-insensitive match against all URL components. * **Use regular expressions**: Whether to enable regular expression matching. When enabled, the input mode switches from segmented wildcard fields to a list of regex patterns. * **Disabled**: Provides separate fields for **Scheme**, **Domain**, **Path**, and **Query**. * **Enabled**: Provides a list of regex patterns evaluated against the full, normalized, and unescaped unicode URL string. * **Defined patterns**: The list of URL objects. The condition returns true only if the request fails to match every single entry in this list. ### Wildcard patterns When **Use regular expressions** is disabled, you define a URL structure using these components: * **Scheme**: The protocol, such as `http` or `https`. If omitted or set to `*`, both protocols match. * **Domain**: The requested hostname, such as `www.example.com`. This field supports wildcards like `*.example.com`. If omitted, all domains configured for the application match. * **Path**: The resource location, such as `/blog/*`. If omitted, all paths match. * **Query**: The query string parameters, such as `id=*&type=json`. If omitted, all query values match. ## Measurement The condition evaluates to true if every single entry in the list evaluates to false. ### Wildcard processing Wildcard matching uses the asterisk (`*`) as a placeholder for any sequence of characters. The system automatically optimizes the underlying regular expression generation for these segments to minimize CPU overhead. * **Multi-field matching**: All specified fields (Scheme, Domain, Path, and Query) must match simultaneously for that specific object to be considered a match. * **Omissions**: Any field left blank is treated as an implicit wildcard and is considered an automatic match. ### Regular expression processing When enabled, the system evaluates the full URL string against the defined patterns. * **Dialect**: The system uses the [RE2 regular expression](https://github.com/google/re2/wiki/Syntax) dialect. * **Capture groups**: Capture groups are assigned to variables `$1` through `$9`, which can be substituted in subsequent actions. * **Assertions**: The system does not add line-begin (`^`) or line-end (`$`) assertions automatically; these must be provided explicitly for exact matching. ## Performance * **Sequential validation**: To return true, the system must evaluate the entire list of patterns to ensure no matches exist. Large lists add an incremental processing cost to every request that passes through the filter. * **Short-circuit optimization**: The system stops processing and returns false as soon as it identifies a match. To optimize performance for traffic that should be excluded, place the patterns most likely to match at the top of the list. --- # EKS URL: https://docs.webscale.com/hosting-platforms/hosting-v4/stacks/eks/ Description: Guide for understanding and configuring an EKS stack The EKS stack creates and manages an Amazon Elastic Kubernetes Service (EKS) cluster in your AWS account. Webscale deploys Helm charts to the EKS cluster through the Control Plane. Your own tools, such as `kubectl` or Helm, reach it from the networks you allow. See [Create an EKS stack](/hosting-platforms/hosting-v4/how-tos/create-an-eks-stack/). An EKS stack consists of: - An EKS cluster with a private API endpoint inside its VPC and a public one that only the Webscale Control Plane reaches by default - A fixed-size node group of Arm nodes - The `vpc-cni`, `kube-proxy`, `coredns`, and `metrics-server` add-ons - [External Secrets Operator](https://external-secrets.io/) with a ClusterSecretStore for AWS Secrets Manager (enabled by default) - [Karpenter](https://karpenter.sh/) node autoscaling (enabled by default) - Supporting infrastructure (subnets and their route tables, a NAT gateway, IAM roles, and the security group rules, plus a VPC in the new network mode) ## Network topology The stack can be deployed in two modes: * **Existing network:** Uses the subnets you list in `node_subnets` and `api_subnets` (the stack creates no network). The subnets must already have a route to the internet, or the nodes cannot pull images. Their VPC must have DNS support and DNS hostnames enabled, or the stack update fails. The stack opens the NodePort range to the primary CIDR block of that VPC. Private subnets in the VPC of your dedicated data plane need nothing more, because the proxies already reach the nodes over that VPC's own routing. Connect the two networks yourself when the subnets are in another VPC, and add the network of the proxies to `service_ingress_cidrs`. * **New network:** Creates a VPC from `network_cidr` with a public and a private subnet in each of two availability zones. The EKS cluster takes all four subnets for its API. The nodes take the private subnets. They reach the internet through one NAT gateway, whose address the `nat_ip` output reports for allowlisting. The proxies have no route to those nodes. Connect the two networks yourself and add the network of the proxies to `service_ingress_cidrs`, or every deployment fails its reachability test. Set `public_nodes` to put the nodes in the public subnets instead. Each node then gets its own public address, the stack creates no NAT gateway, and `nat_ip` is null. `service_ingress_cidrs` needs `0.0.0.0/0`, because the proxies reach the nodes from their public addresses. Ports `30000-32767` are then reachable from any address. The mode cannot change for the life of the EKS cluster, which cannot move between VPCs. A different mode needs a new stack. ## Data plane A data plane is a set of Webscale proxies that receive the traffic for your applications, and a dedicated data plane serves your account alone. Its proxies send traffic directly to the EKS cluster's nodes on the node port of the release's Service. Because the port can change with every deployment, the stack opens the whole NodePort range (`30000-32767`) to the network of the proxies. It takes that network from the primary CIDR block of the VPC the nodes are in. `service_ingress_cidrs` opens the range to any other network you name, which is how proxies outside that VPC reach the nodes. ## Variables {{% alert title="Note:" %}} The stack `name` becomes the EKS cluster name and prefixes the IAM roles the stack creates. Use 3 to 30 characters from `a-z`, `0-9`, and `-`, starting with a lowercase letter or a digit. Stacks that share an AWS account need unique names. {{% /alert %}} | Variable name | Type | Description | | :--- | :--- | :--- | | `region` | `string` | *(Required)* **(Permanent)** The AWS region to create the EKS cluster in. | | `kubernetes_version` | `string` | Kubernetes version of the EKS cluster, its nodes, and its add-ons. Defaults to `"1.36"`. A change upgrades all three. A version past standard support keeps running under EKS extended support, which AWS bills at a higher price. See [Amazon EKS pricing](https://aws.amazon.com/eks/pricing/). | | `network_cidr` | `string` | **(Permanent)** Network block of the created VPC. Defaults to `10.0.0.0/16`. The stack splits it into a public and a private subnet in each of two availability zones. Provide your own block when the default overlaps a network the EKS cluster must reach. Ignored when `node_subnets` is set. The EKS cluster cannot move between VPCs, and its NAT gateway cannot move between subnets. | | `node_subnets` | `list(string)` | **(Permanent)** Existing subnet IDs to adopt for the nodes. They must span two or more availability zones and share one VPC with `api_subnets`. When set, the stack creates no network, and `api_subnets` must be set with it. See [Network topology](#network-topology). | | `api_subnets` | `list(string)` | **(Permanent)** Existing subnet IDs to adopt for the EKS cluster's API. They must span two or more availability zones and share one VPC with `node_subnets`. The EKS cluster places network interfaces in these subnets to reach the nodes, and its private endpoint answers on those interface addresses. Setting one of the two without the other fails the update. See [Network topology](#network-topology). | | `public_nodes` | `bool` | Whether the nodes launch in the created public subnets instead of the private ones. Defaults to `false`. Ignored when `node_subnets` is set, where the adopted subnets decide the addressing. When `true`, each node carries its own public address and egresses from it, the stack creates no NAT gateway, and `nat_ip` is null. `service_ingress_cidrs` needs `0.0.0.0/0`, because the proxies reach the nodes from those addresses. **Do not change the value on a live EKS cluster.** The change forces a node group migration to the other subnets and removes or adds the NAT gateway. The old nodes can lose their internet access during the migration. | | `base_instance_type` | `string` | Arm instance type of the base nodes, such as `t4g.large` (default) or `m7g.large`. A change builds a new node group before the stack removes the old one. | | `base_node_count` | `number` | Node count of the base node group. Defaults to `2`. The group never scales. Karpenter adds temporary nodes on top when enabled. | | `disk_size` | `number` | Root disk size in GiB of every node. Defaults to `80`. A change builds a new node group before the stack removes the old one. | | `kubernetes_admins` | `list(string)` | ARNs of IAM roles or users granted cluster admin. Empty by default. See [Cluster access](#cluster-access). | | `api_ingress_cidrs` | `list(string)` | Networks your API clients reach the public endpoint from, such as your office network or your CI provider's ranges. Defaults to an empty list, so only the Webscale Control Plane reaches it. The public endpoint accepts 40 networks, a limit this list shares with the Control Plane. A change updates the live EKS cluster in place. See [Cluster access](#cluster-access). | | `service_ingress_cidrs` | `list(string)` | Networks allowed to reach the NodePort range `30000-32767` on the nodes. Defaults to an empty list. The stack already opens the range to the primary CIDR block of the VPC the node subnets are in, and listing that block again fails the stack update. Anything on a listed network reaches every Service the EKS cluster exposes on a node port. See [Data plane](#data-plane). | | `enable_external_secrets` | `bool` | Whether to install External Secrets Operator and its `aws-secretsmanager` store. Defaults to `true`. When `false`, a chart that declares an ExternalSecret fails to install. Setting it to `false` on a live EKS cluster deletes every ExternalSecret and the Secrets it created. See [Secrets](#secrets). | | `enable_karpenter` | `bool` | Whether to install Karpenter node autoscaling. Defaults to `true`. When `false`, the EKS cluster stays at `base_node_count` nodes. See [Node autoscaling](#node-autoscaling). | | `karpenter_cpu_limit` | `number` | Total vCPUs of the temporary nodes Karpenter may add. Defaults to `512`. Karpenter stops adding nodes at the cap. | | `karpenter_node_lifetime` | `string` | Lifetime of each temporary node, a duration built from `s`, `m`, and `h`. Defaults to `720h`. Karpenter replaces a node at this age, and `Never` disables the rotation. The base node group never expires. | | `permissions_boundary_arn` | `string` | Optional ARN of a customer-managed permissions boundary policy. See [**AWS Setup**](/hosting-platforms/hosting-v4/aws-setup/). *Not necessary for Webscale managed AWS accounts.*| | `provisioner_role_name` | `string` | Optional role name to assume for Stack provisioning in the customer account. Defaults to `AccountProvisioner`. See [**AWS Setup**](/hosting-platforms/hosting-v4/aws-setup/). *Not necessary for Webscale managed AWS accounts.* | ### Example: ``` { "type": "eks", "environment": "/v2/environments/3ps666yxcanq", "service": "/v2/services/u91dkrui39cj", "name": "production-eks", "variables": { "region": "us-east-1", "node_subnets": ["subnet-0123456789abcdef0", "subnet-0fedcba9876543210"], "api_subnets": ["subnet-0aaaa1111bbbb2222", "subnet-0cccc3333dddd4444"], "kubernetes_admins": ["arn:aws:iam::123456789012:role/PlatformAdmin"], "api_ingress_cidrs": ["203.0.113.0/24"] } } ``` ## Outputs | Output name | Description | | :--- | :--- | | `kubernetes_cluster_name` | The name of the EKS cluster. Enter it in **Cluster Name** when you enable **Use for Kubernetes** on the AWS provider. | | `nat_ip` | Public address of the NAT gateway, the fixed address the nodes use to reach the internet. Null when `node_subnets` is set or `public_nodes` is `true`. | ## Cluster access The stack grants cluster admin through EKS access entries to the `Webscale` IAM user and to each ARN in `kubernetes_admins`. Webscale creates that user in your account during onboarding. Use `kubernetes_admins` for your own roles and users, and for a provider whose access key belongs to another user. The `Webscale` user and the stack's own IAM roles already have entries, and listing one of them fails the stack update. An access entry grants permissions, not network access. Only the Webscale Control Plane reaches the public API endpoint until you list your own networks in `api_ingress_cidrs`. A client inside the EKS cluster's VPC reaches the private endpoint instead. `api_ingress_cidrs` does not apply to it, and the cluster security group decides its access. To deploy through Webscale, enable **Use for Kubernetes** on the AWS provider and enter the `kubernetes_cluster_name` output in **Cluster Name**. Then create a [**Kubernetes cluster**](/docs/how-tos/general/kubernetes-clusters/) with a Helm blueprint. See [**Working with Providers**](/docs/how-tos/general/providers/) for the provider settings. ## Secrets When `enable_external_secrets` is `true`, the stack installs [External Secrets Operator](https://external-secrets.io/) in the `external-secrets` namespace and a ClusterSecretStore named `aws-secretsmanager` for AWS Secrets Manager. The operator reads each value directly from Secrets Manager, so no value passes through Webscale. It can read only secrets whose names start with `webscale/`. Your chart declares an ExternalSecret that names the secret, and the operator writes a Kubernetes Secret in the namespace of the deployment. ``` apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: example spec: refreshInterval: 1h secretStoreRef: kind: ClusterSecretStore name: aws-secretsmanager target: name: secret-to-be-created dataFrom: - extract: key: webscale/acme-api/prod ``` Reference the Secret in the container spec of your Deployment with `envFrom`: ``` envFrom: - secretRef: name: secret-to-be-created ``` Containers read environment variables at start. A rotated value reaches the application on the next deployment. ## Node autoscaling When `enable_karpenter` is `true`, [Karpenter](https://karpenter.sh/) adds temporary nodes when pods do not fit on the existing nodes and removes them as demand falls. It launches on-demand Arm instances from the `c`, `m`, and `r` families, generation 3 or newer, size `large` or larger. They share the disk size, node role, and security group of the base nodes. `karpenter_cpu_limit` caps the total, and `karpenter_node_lifetime` sets when Karpenter replaces a node. Karpenter evicts pods when it removes a node and honors a PodDisruptionBudget for up to 20 minutes, then deletes the remaining pods. Add a budget that selects each Deployment's pods. ## Deleting the stack Delete the Kubernetes clusters that deploy to the EKS cluster before you delete the stack, and wait for Karpenter to remove its temporary nodes. Karpenter launches and terminates those instances itself, so the stack cannot delete them. If temporary nodes are still running, the delete waits for Karpenter to drain them, which can take up to 20 minutes. The stack releases the NAT address when you delete it, and a replacement stack gets a different one. The stack removes only the network pieces it created. --- # RDS URL: https://docs.webscale.com/hosting-platforms/hosting-v4/stacks/rds/ Description: Guide for understanding and configuring an RDS stack The RDS stack is an add-on AWS RDS instance or cluster deployed into an existing network. ## Variables {{% alert title="Note:" %}} Backend stateful services (like databases) should be isolated from direct internet access on private subnets. Provide the `data_subnets` variable when creating the stack to specify the subnets to deploy into. See [**Configuration**](/hosting-platforms/hosting-v4/stacks/configuration/) for details. {{% /alert %}} | Variable Name | Type | Description | | :--- | :--- | :--- | :--- | | `region` | `string` | *(Required)* The region to deploy the RDS cluster - must match the `data_subnets` region. | | `size` | `string` | *(Required)* Plan size. Must be one of `dev`, `micro`, `mini`, `small`, `medium`, `large`, or `xlarge`. | | ↳`dev` | | 20 GiB disk, MySQL | | ↳`micro` | | 20 GiB disk, MySQL | | ↳`mini` | | 20 GiB disk, MySQL | | ↳`small` | | 100 GiB disk, MySQL | | ↳`medium` | | 100 GiB disk, aurora-mysql | | ↳`large` | | 100 GiB disk, aurora-mysql | | ↳`xlarge` | | 100 GiB disk, aurora-mysql | | `data_subnets` | `list(string)` or `string` | *(Required)* Array of subnet IDs [primary, secondary]. May also be a reference to another stack's output. | | `stacker_variables` | `object` | Optional configurations for MySQL. | | ↳`mysql.variant` | `string` | Engine variant (e.g., `mysql`, `aurora-mysql`). Default depends on the plan size. | | ↳`mysql.version` | `string` | `"8.0"` / `"8.0.mysql_aurora.3.06.0"` | Engine version override. Defaults to `"8.0"` for the `mysql` variant and `"8.0.mysql_aurora.3.06.0"` for the `aurora-mysql` variant. | | ↳`mysql.snapshot_identifier` | `string` | Snapshot identifier to restore the database from. | ### Example: ``` { "type": "rds", "environment": "/v2/environments/tu8aovkn7waj", "service": "/v2/services/2tpkjj7e0b28", "name": "RDS", "variables": { "size": "medium", "region": "us-east-1", "data_subnets": "/v2/stacks/4d4d1d4koe12/outputs/data_subnets" "stacker_variables":{ "mysql": { "snapshot_identifier": "arn:aws:rds:us-east-1:123456789012:cluster-snapshot:my-snapshot-08242026" } } } } ``` ## Outputs | Output name | Description | | :--- | :--- | | `db_endpoint` | The connection endpoint for the RDS database. | | `db_password_secret_name` | The name of the Secrets Manager secret containing the RDS password. | --- # Agentic Commerce OS URL: https://docs.webscale.com/docs/agentic-commerce-os/ --- # Components URL: https://docs.webscale.com/hosting-platforms/hosting-v4/components/ Description: Components that make up a V4 stack ## Data volume To ensure data durability and architectural flexibility, all application file data in the V4 platform is allocated separately from the compute layer and stored on an independent, persistent cloud data volume. Because this data volume exists independently of the core server instance, the compute layer can be destroyed, upgraded, or reconfigured without any risk to the underlying data. In single-server configurations, this volume acts as the local storage for the application's stateful files. As you scale to multi-server tiers (Standard, Pro, HA Pro), this same volume serves as a centralized file database, exported via an NFS shared filesystem to feed the horizontally autoscaling web nodes. Snapshots of the data volume are performed at least daily and serve as a point of recovery against unintended software behaviors, human error, or malicious activity. ## Core server At the heart of the Webscale V4 platform is the core server, a highly optimized, multi-purpose environment configured to handle the entire application ecosystem out of the box. Its role adapts dynamically depending on the architectural tier in use, shifting from an all-in-one host to a specialized backend manager as a stack scales. **Essentials**: The core server is the entire environment. It functions as a single-tenant node hosting every layer of your stack: serving the web application code, handling cron jobs, and running critical infrastructure components like MySQL/MariaDB, Valkey, RabbitMQ, and OpenSearch on a localized, high-performance filesystem. **Scaling Upward**: As workloads grow and you transition to higher tiers, the core server is systematically offloaded to maximize efficiency and resilience: * **Standard**: It hands off the web delivery layer to a dedicated, horizontally autoscaling web tier, retaining responsibility for the database, caching, queueing, and file layers. * **Pro** and **HA Pro**: Critical infrastructure services (databases, caches, and search services) are migrated to cloud-native managed services. The core server still provides message queueing, data volume sharing, and central cron execution. Regardless of tier, the [**dev**](/hosting-platforms/hosting-v4/commands/dev/) command provides consistent access to a shell in an application container environment. Shared directories and files are configured in the `shared` stack attribute, and they are automatically mounted into the container at execution time. ## Web servers In scaling tiers (Standard and above), the web delivery layer is decoupled from backend services and managed as a dynamic, horizontally autoscaling cluster. Application code is provided to a scaling cluster by creating a custom container image and configuring the cluster to run it. Shared directories and files are configured in the `shared` stack attribute, and they are automatically mounted into the container at execution time. The configuration of the scaling cluster is managed at the Webscale control plane. [CodeDirect](/docs/how-tos/codedirect/) is recommended to build and auto deploy new images to a stack. ## Cloud native services For the **Pro** and **HA Pro** tiers, the most critical services are offloaded to managed, cloud-native services. This provides dedicated resources, separate backups, and enhanced recoverability, while allowing backend components to scale independently and significantly reducing routine maintenance overhead. --- # Essentials V4 Architecture Overview URL: https://docs.webscale.com/docs/reference/plans/essentials-v4-overview/ Description: A Brief Overview of the Essentials V4 Architecture Webscale Essentials V4 is a next-generation e-commerce hosting environment built on a **Decoupled Plane Architecture**. By utilizing a "Three-Plane" model, we separate administrative overhead and security processing from your core storefront, ensuring that your customer experience remains fast and resilient. {{< figure src="essentials-v4.png" caption="Essentials V4 architecture">}} --- ## **1\. The Design Philosophy** ### **Decoupling for Performance** In traditional hosting, the "Control" of the server (backups, logging, analytics) happens on the same resources as the "Traffic." If your logs grow too fast or a backup kicks off during a sale, your site slows down. * **The Essentials V4 Advantage:** We move the "Brain" of the site to a dedicated **Control Plane**. This ensures that even under heavy management tasks, your **Data Plane** (the storefront) has 100% of its resources dedicated to serving customers. ### **Daemonless Container Security** V4 utilizes **Podman** for container orchestration. This means every service from Magento to MySQL runs as an isolated, rootless process. If one container needs a restart, it doesn't affect the others, providing a higher level of security and "Self-Healing" stability. --- ## **2\. Traffic Flow & The AWS Foundation** *This section **Explains** how we utilize AWS services to deliver your site.* 1. **The Edge (AWS Route 53 & CloudFront):** Traffic is first routed via **AWS Route 53** to the **Webscale CDN (CloudFront)**. This ensures that static assets are served from the global location closest to your customer. 2. **The Perimeter (Webscale Data Plane):** Before reaching your server, requests are scrubbed by the Webscale. This prevents malicious traffic from ever impacting the performance of your site. 3. **The Core (AWS EC2 & VPC):** Your application resides within a secure **AWS VPC**. The storefront and its persistent services (Database, Redis, etc.) are hosted on high-performance **AWS EC2** instance, orchestrated by Podman to ensure maximum efficiency. --- ## **3\. The Essentials V4 Baseline** *This **Reference** table serves as the technical source of truth for the V4 stack.* | Component | Technology | AWS Service utilized | Deployment Location | | :---- | :---- | :---- | :---- | | **DNS** | Webscale Managed | **AWS Route 53** | Global Edge | | **Edge Delivery** | Webscale CDN | **AWS CloudFront** | Global Edge | | **Security** | WAF & DDoS Protection | **Webscale Data Plane** | Perimeter Filter | | **Compute** | Proxy & App Layer | **AWS EC2** | Shared & Dedicated | | **Orchestration** | Podman | **Linux Runtime \- PHP\_FPM Caching (Edge) \- Vinyl (Varnish Caching (Data) \- Redis (Tri-Partitioned) Database \- MySQL / MariaDB Search \- Opensearch** | Daemonless Container | | **Storage** | Persistent Media | **AWS EBS / EFS** | Persistent Volume | | **Backups** | 7 day snapshot | | | | **SSH** | SSH Connect / SSH Gateway | | | --- # Hosting V4 URL: https://docs.webscale.com/hosting-platforms/hosting-v4/ Description: V4 is Webscale’s fourth-generation hosting platform, combining battle-tested architectures and systems engineering patterns with improved security, performance, cost-management, and re-configurability — all accessible from the Webscale Control Plane. # Primary stacks To accommodate a wide range of application needs, traffic patterns, and reliability requirements, the V4 platform is built around four distinct architectural stacks. Whether hosting Magento, Shopware, WordPress, or custom PHP and Node.js applications, these stacks provide a clear upgrade path as traffic and complexity grow. ## Essentials The Essentials stack provides a robust, streamlined foundation for applications that do not yet require horizontal scaling. It provisions a comprehensive, all-in-one environment on a single, highly optimized server. **Architecture**: Single-server deployment. **How it Works**: A single server accommodates the complete application stack, including the web tier, an NFS shared filesystem, cron execution, relational database (MySQL or MariaDB), caching (Valkey), message brokering (RabbitMQ), and search (OpenSearch). **Best For**: Baseline workloads, staging environments, or applications with predictable, moderate traffic. ## Standard The Standard stack introduces dynamic capacity by decoupling the web delivery layer from the backend services. **Architecture**: An autoscaling web tier supported by a single "core" server. **How it Works**: The web server is moved into a horizontally scaling layer that automatically expands or contracts based on real-time request demand. The core server processes and manages common backend services (databases, caching, search, NFS, and cron). **Best For**: Applications prone to traffic spikes or those experiencing rapid growth that require immediate, automated scaling at the web tier. ## Pro The Pro stack optimizes performance and reduces management overhead by offloading critical backend services to highly resilient, cloud-native managed services. **Architecture**: Autoscaling web tier + cloud provider managed services + core server. **How it Works**: Building on the Standard stack, Pro moves heavy-lifting services off the core server and into the cloud provider's ecosystem. For example, MySQL is managed via AWS RDS, Valkey is transitioned to ElastiCache, and OpenSearch utilizes the AWS OpenSearch service. The core server remains strictly for shared files (NFS), cron execution, and message queueing. **Best For**: Resource-intensive applications that benefit from the dedicated performance, separate backups, and reduced operational overhead of managed cloud services. ## Pro HA The Pro HA (High Availability) stack is the pinnacle of the V4 architecture, designed for mission-critical applications where uptime is the ultimate priority. **Architecture**: Multi-zone deployment of the Pro stack with automatic failover. **How it Works**: HA Pro takes the distributed architecture of the Pro stack and spans it across two isolated availability zones. By redundantly defining most components across these zones, the platform provides seamless, automatic failover in the event of a total zone failure. **Best For**: Enterprise-grade workloads and revenue-critical applications that require strict Service Level Agreements (SLAs) and maximum fault tolerance. # Additional stacks To provide further flexibility and adaptability, the primary stacks can be combined with additional infrastructure using add-on stacks. These stacks can be configured as standalone or seamlessly interconnected to other architectural components. ## EKS stack The EKS stack creates and manages an Amazon EKS cluster in your AWS account. The stack also builds the add-ons, a base node group, External Secrets Operator, Karpenter node autoscaling, and a network unless you bring subnets. Webscale deploys Helm charts to the cluster through the Control Plane. Explore [**this guide**](/hosting-platforms/hosting-v4/stacks/eks/) for network topologies, variables, outputs, cluster access, secrets, and autoscaling. ## RDS stack The RDS stack is an add-on AWS RDS instance or cluster deployed into an existing network. Explore [**this guide**](/hosting-platforms/hosting-v4/stacks/rds/) for details. ## Web server stack The Web server stack is a language-agnostic environment designed for hosting web-facing containerized applications. By decoupling routing from application runtimes, it allows developers to deploy custom container images while Webscale manages underlying auto-scaling, network topology, and security. The stack supports both standalone VPC deployments and add-on integrations into existing subnets, utilizing host-level Go Relay proxying to dynamically forward HTTP/HTTPS traffic to isolated containers. Explore [**this guide**](/hosting-platforms/hosting-v4/stacks/web-server/) to learn about network topologies, cluster metadata configuration, custom port overrides, and traffic architecture. --- # Web server URL: https://docs.webscale.com/hosting-platforms/hosting-v4/stacks/web-server/ Description: Guide for understanding and configuring a Web server stack The Web server stack is a language-agnostic container-hosting environment intended for serving web-facing containerized applications. Developers bring their own container image and seamlessly injects it into the Webscale hosting platform. A Web server stack consists of: - Webscale Application - Webscale scaling cluster - Supporting infrastructure (VPC, routing tables, security group, etc.) ## Network Topology The stack can be deployed in two modes: * **Standalone**: Automatically provisions its own complete network tier, including VPC, Internet Gateway, and public routing tables. * **Add-On**: Seamlessly creates the auto-scaling web cluster in the existing infrastructure's public subnets. When creating the web server stack, if an array of public subnets are provided, the web server will use the existing networking infrastructure and act as an add-on. See [**Configuration**](/hosting-platforms/hosting-v4/stacks/configuration/) for details. ## Variables | Variable name | Type | Description | | :--- | :--- | :--- | | `size` | `string` | *(Required)* Plan size. Must be one of "dev", "small", "medium", "large", or "xlarge". | | `region` | `string` | *(Required)* The region to deploy the stack resources. | | `public_subnets` | `list(string)` or `string` | Array of subnet IDs [primary, secondary]. May also be a reference to another stack's output. If provided, the cluster will deploy into the existing network. | | `stacker_variables` | `object` | Optional configuration variables. | | ↳ `share` | `list(string)` | A list of specific subdirectory paths within the host's file system to bind-mount into the application container's web root. Example: `["html/app/etc/env.php","html/pub/media","html/var"]`| ### Example: ``` { "type": "web-server", "environment": "/v2/environments/tu8aovkn7waj", "service": "/v2/services/2tpkjj7e0b28", "name": "PWA Frontend", "variables": { "size": "medium", "region": "us-east-1", "public_subnets": "/v2/stacks/4d4d1d4koe12/outputs/public_subnets" } } ``` ## Cluster Metadata Variables Cluster metadata is used to configure container runtime variables. The following keys dictate how the container environment is constructed: | Metadata Key | Default | Description | | :--- | :--- | :--- | | `CONTAINER_IMAGE_URI` | | *(Required)* The URI of the container image to pull and run. | | `CONTAINER_HTTP_PORT` | `3000` | The internal port your containerized application listens on. | | `CONTAINER_ENVIRONMENT` | | A space-separated list of environment variables to forward into the container environment. Any variables specified here must also be defined as keys in the cluster metadata. | --- # Essentials v4 Plan Specifications URL: https://docs.webscale.com/docs/reference/plans/essentials-v4-specifications/ Description: A reference for Essentials v4 plan specifications **Purpose:** This page lists resource and feature specifications for Webscale Essentials v4 plans (S, M, L, XL). ### **Architecture overview** * All Essentials tiers operate under a **single-server architecture**. * **Infrastructure remains constant; resource allocation scales** between S, M, L, and XL. ### **Plan comparison** The table below summarizes resource and major feature allocations across Essentials tiers. | Feature | Specification | S | M | L | XL | | ----- | ----- | :---: | :---: | :---: | :---: | | **Proxy Service** | Webscale Dataplane | Shared | Shared | Shared | Shared | | **Cloud Hosting** | Managed AWS EC2 | ✓ | ✓ | ✓ | ✓ | | **Compute** | vCPU | 8 | 16 | 16 | 32 | | **Memory** | RAM (GB) | 32 | 32 | 64 | 64 | | **Storage** | EBS (GB) | 140 | 140 | 140 | 140 | | **Backups** | Daily Backup Retention (days) | 7 | 7 | 7 | 7 | | **CDN** | Amazon CloudFront | ✓ | ✓ | ✓ | ✓ | | | Data Transfer Egress (GB) | 50 | 50 | 50 | 50 | | **Security** | Web Application Firewall | Basic | Basic | Basic | Basic | | | Origin Protection (App Shield) | Level 1 | Level 1 | Level 1 | Level 1 | | **Performance** | Dynamic Site Cache (GB) | 1 | 1 | 1 | 1 | | | Image Optimization | 20K/mo | 20K/mo | 20K/mo | 20K/mo | | **Observability** | Traffic Viewer | ✓ | ✓ | ✓ | ✓ | | | Traffic Viewer Retention | 1 Day | 1 Day | 1 Day | 1 Day | | | Monitoring & Alerts | ✓ | ✓ | ✓ | ✓ | *Notes:* * “Shared” in **Proxy Service** indicates all Essentials tiers operate on a shared Webscale dataplane. * Check your commercial terms for any overage, regional, or billing specifics not captured here. --- ### **Features included in all Essentials plans** The following capabilities are available **across all Essentials tiers** (S, M, L, XL). #### **Application delivery** Webscale operates directly in the traffic path for all Essentials plans. Includes: * Global CDN * Dynamic Site caching * Web Application Firewall * Traffic Viewer * Real-time image optimization #### **Cloud hosting & operations** All Essentials plans include: * AWS-based architecture * Commerce-tuned configurations * Infrastructure patching and updates * Monitoring and alerting * Incident response * Operational ownership by Webscale #### **Platform compatibility** Essentials supports the following commerce platforms: * Magento * Adobe Commerce * Shopware * WooCommerce --- # Standard V4 Architecture Overview URL: https://docs.webscale.com/docs/reference/plans/standard-v4-overview/ Description: A Brief Overview of the Standard V4 Architecture Webscale Standard V4 is a next-generation e-commerce hosting environment built on a **Decoupled Plane Architecture**. By utilizing a "Three-Plane" model, we separate administrative overhead and security processing from your core storefront, ensuring that your customer experience remains fast and resilient. ![](standard_v4.png) --- ## **1\. The Design Philosophy** ### **Decoupling for Performance** In traditional hosting, the "Control" of the server (backups, logging, analytics) happens on the same resources as the "Traffic." If your logs grow too fast or a backup kicks off during a sale, your site slows down. * **The Standard V4 Advantage:** We move the "Brain" of the site to a dedicated **Control Plane**. This ensures that even under heavy management tasks, your **Data Plane** (the storefront) has 100% of its resources dedicated to serving customers. ### **Daemonless Container Security** V4 utilizes **Podman** for container orchestration. This means every service from Magento to MySQL runs as an isolated, rootless process. If one container needs a restart, it doesn't affect the others, providing a higher level of security and "Self-Healing" stability. --- ## **2\. Traffic Flow & The AWS Foundation** *This section **Explains** how we utilize AWS services to deliver your site.* 1. **The Edge (AWS Route 53 & CloudFront):** Traffic is first routed via **AWS Route 53** to the **Webscale CDN (CloudFront)**. This ensures that static assets are served from the global location closest to your customer. 2. **The Perimeter (Webscale Data Plane):** Before reaching your server, requests are scrubbed by the Webscale. This prevents malicious traffic from ever impacting the performance of your site. 3. **The Core (AWS EC2 & VPC):** Your application resides within a secure **AWS VPC**. The application is hosted on a pre-defined managed cluster of autoscaling **AWS EC2** instances that use Podman containers. The optional admin cluster also resides on an **AWS EC2** instance and is independent of the application managed cluster. The storefront and its persistent services (Database, Redis, etc.) are hosted on high-performance **AWS EC2** instance, orchestrated by Podman to ensure maximum efficiency. --- ## **3\. The Standard V4 Baseline** *This **Reference** table serves as the technical source of truth for the V4 stack.* | Component | Technology | AWS Service utilized | Deployment Location | | :---- | :---- | :---- | :---- | | **DNS** | Webscale Managed | **AWS Route 53** | Global Edge | | **Edge Delivery** | Webscale CDN | **AWS CloudFront** | Global Edge | | **Security** | WAF & DDoS Protection | **Webscale Data Plane** | Perimeter Filter | | **Compute** | Proxy & App Layer | **AWS EC2** | Shared & Dedicated | | **Orchestration** | Podman | **Linux Runtime \- PHP\_FPM Caching (Edge) \- Vinyl (Varnish Caching (Data) \- Redis (Tri-Partitioned) Database \- MySQL / MariaDB Search \- Opensearch** | Daemonless Container | | **Storage** | Persistent Media | **AWS EBS / EFS** | Persistent Volume | | **Backups** | 7 day snapshot | | | | **SSH** | SSH Connect / SSH Gateway | | | --- # Standard v4 Plan Specifications URL: https://docs.webscale.com/docs/reference/plans/standard-v4-specifications/ Description: A reference for Standard v4 plan specifications **Purpose:** This page lists resource and feature specifications for Webscale Standard v4 plans (Small, Medium, Large, X-Large). --- **Architecture overview** * Standard v4 is built on a **Decoupled Plane Architecture** — a three-plane model that separates administrative overhead and security processing from the core storefront. * The **Control Plane** handles management tasks (backups, logging, analytics), freeing the **Data Plane** to dedicate 100% of its resources to serving customers. * Container orchestration uses **Podman**, so every service runs as an isolated, rootless process — providing self-healing stability without cross-service impact. * Unlike Essentials, Standard v4 uses a **split Data Server / App Cluster model** — the data server and application cluster are separate, dedicated instances that scale independently. --- **Plan comparison** The table below summarizes resource and major feature allocations across Standard v4 tiers. **Data Server** | Feature | Specification | Small | Medium | Large | X-Large | | ----- | :---: | :---: | :---: | :---: | :---: | | Proxy Service | Webscale Dataplane | Shared | Shared | Shared | Shared | | Cloud Hosting | Managed AWS EC2 | ✓ | ✓ | ✓ | ✓ | | Compute | vCPU | 8 | 16 | 16 | 32 | | Memory | RAM (GB) | 32 | 32 | 64 | 64 | | Storage | EBS (GB) | 40 / 100 | 40 / 100 | 40 / 100 | 40 / 100 | | Backups | Daily Backup Retention (days) | 7 | 15 | 15 | 15 | **App Cluster** | Feature | Specification | Small | Medium | Large | | ----- | :---: | :---: | :---: | :---: | | Compute | vCPU | 2 | 4 | 8 | | Memory | RAM (GB) | 4 | 8 | 16 | | App Cluster Min | Instances | 1 | 1 | 1 | | App Cluster Max | Instances | 4 | 4 | 4 | *Notes:* * App Cluster and Data Server resource allocations can be purchased as listed in the sizing table or modified as needed to meet requirements. * "Shared" in Proxy Service indicates all Standard v4 tiers operate on a shared Webscale dataplane. * EBS storage is listed as 40 Gb boot / 100 Gb data volumes. * Check your commercial terms for any overage, regional, or billing specifics not captured here. --- **Features included in all Standard v4 plans** The following capabilities are available across all Standard v4 tiers (Small, Medium, Large, X-Large). **Application delivery** Webscale operates directly in the traffic path for all Standard v4 plans. Includes: * Global CDN (AWS CloudFront) * Web Application Firewall configurable via Web Controls * Traffic Viewer * Image optimization * DDoS protection **Cloud hosting & operations** All Standard v4 plans include: * AWS-based architecture (EC2, EBS, VPC, Route 53\) * Dedicated data server separate from the application cluster * Autoscaling application cluster (production tiers) * Podman-based daemonless container orchestration * Commerce-tuned configurations (PHP-FPM, Varnish, Redis, OpenSearch, MySQL/MariaDB) * Infrastructure patching and updates * Monitoring and alerting * Incident response * SSH Connect / SSH Gateway access * Operational ownership by Webscale **Platform compatibility** Standard v4 supports the following commerce platforms: * Magento * Adobe Commerce * Shopware * WooCommerce --- # Pro V4 Architecture Overview URL: https://docs.webscale.com/docs/reference/plans/pro-v4-overview/ Description: A Brief Overview of the Pro V4 Architecture Webscale Pro V4 is a next-generation e-commerce hosting environment built on a **Decoupled Plane Architecture**. By utilizing a "Three-Plane" model, we separate administrative overhead and security processing from your core storefront, ensuring that your customer experience remains fast and resilient. ![](pro_v4.png) --- ## **1\. The Design Philosophy** ### **Decoupling for Performance** In traditional hosting, the "Control" of the server (backups, logging, analytics) happens on the same resources as the "Traffic." If your logs grow too fast or a backup kicks off during a sale, your site slows down. * **The Pro V4 Advantage:** We move the "Brain" of the site to a dedicated **Control Plane**. This ensures that even under heavy management tasks, your **Data Plane** (the storefront) has 100% of its resources dedicated to serving customers. ### **Daemonless Container Security** V4 utilizes **Podman** for container orchestration. This means specific services from Magento to runs as an isolated, rootless process. If one container needs a restart, it doesn't affect the others, providing a higher level of security and "Self-Healing" stability. --- ## **2\. Traffic Flow & The AWS Foundation** *This section **Explains** how we utilize AWS services to deliver your site.* 1. **The Edge (AWS Route 53 & CloudFront):** Traffic is first routed via **AWS Route 53** to the **Webscale CDN (CloudFront)**. This ensures that static assets are served from the global location closest to your customer. 2. **The Perimeter (Webscale Data Plane):** Before reaching your server, requests are scrubbed by the Webscale. This prevents malicious traffic from ever impacting the performance of your site. 3. **The Core (AWS Services):** Your application resides within a secure **AWS VPC**. The application is hosted on a pre-defined managed cluster of autoscaling **AWS EC2** instances that use Podman containers. The optional admin cluster also resides on an **AWS EC2** instance and is independent of the application managed cluster. The storefront and its persistent services (Rabbit MQ, Cron, NFS, and Valkey) are hosted on high-performance **AWS EC2** instance, orchestrated by Podman to ensure maximum efficiency. Opensearch resides on the **AWS Opensearch AWS** service . MYSQL resides on **AWS RDS Aurora** service. --- ## **3\. The Pro V4 Baseline** *This **Reference** table serves as the technical source of truth for the V4 stack.* | Component | Technology | AWS Service utilized | Deployment Location | | :---- | :---- | :---- | :---- | | **DNS** | Webscale Managed | **AWS Route 53** | Global Edge | | **Edge Delivery** | Webscale CDN | **AWS CloudFront** | Global Edge | | **Security** | WAF & DDoS Protection | **Webscale Data Plane** | Perimeter Filter | | **Compute** | Proxy & App Layer | **AWS EC2** | Shared & Dedicated | | **Orchestration** | Podman | **Linux Runtime \- PHP\_FPM Caching (Edge) \- Vinyl (Varnish Caching (Data) \- Redis (Tri-Partitioned)** | Daemonless Container | | **Search** | **Opensearch** | AWS Opensearch | Shared & Dedicated | | **Cache** | **Redis/Valkey** | AWS Elasticache | Shared & Dedicated | | **Database** | **MYSQL** | AWS RDS Aurora | Shared & Dedicated | | **Storage** | Persistent Media | **AWS EBS / EFS** | Persistent Volume | | **Backups** | 7 day snapshot | | | | **SSH** | SSH Connect / SSH Gateway | | | --- # Pro V4 HA Architecture Overview URL: https://docs.webscale.com/docs/reference/plans/pro-v4-ha-overview/ Description: A Brief Overview of the Pro V4 HA Architecture Webscale Pro V4 HA is a next-generation e-commerce hosting environment built on a **Decoupled Plane Architecture**. By utilizing a "Three-Plane" model, we separate administrative overhead and security processing from your core storefront, ensuring that your customer experience remains fast and resilient across multiple Availability Zones. ![Pro V4 HA Architecture Diagram](ha_pro_v4.png) ## 1. The Design Philosophy ### Decoupling for Performance In traditional hosting, the "Control" of the server (backups, logging, analytics) happens on the same resources as the "Traffic." If your logs grow too fast or a backup kicks off during a sale, your site slows down. * **The Pro V4 HA Advantage:** We move the "Brain" of the site to a dedicated **Control Plane**. This ensures that even under heavy management tasks, your **Data Plane** (the storefront) has 100% of its resources dedicated to serving customers. ### Daemonless Container Security V4 utilizes **Podman** for container orchestration. This means specific services from Magento to runs as an isolated, rootless process. If one container needs a restart, it doesn't affect the others, providing a higher level of security and "Self-Healing" stability. ## 2. Traffic Flow & The AWS Foundation This section *Explains* how we utilize AWS services to deliver your site. 1. **The Edge (AWS Route 53 & CloudFront):** Traffic is first routed via **AWS Route 53** to the **Webscale CDN (CloudFront)**. This ensures that static assets are served from the global location closest to your customer. 2. **The Perimeter (Webscale Data Plane):** Before reaching your server, requests are scrubbed by the Webscale. This prevents malicious traffic from ever impacting the performance of your site. 3. **The Core (AWS Services):** Your application resides within a secure **AWS VPC** that spans **two Availability Zones**. The application is hosted on a pre-defined managed cluster of autoscaling **AWS EC2** instances that use Podman containers in each Availability Zone. The storefront and its persistent services (Rabbit MQ, Cron, NFS, and Valkey) are hosted on high-performance **AWS EC2** instance, orchestrated by Podman to ensure maximum efficiency. Opensearch resides on the **AWS Opensearch AWS** service. MYSQL resides on **AWS RDS Aurora** service. All persistence layer services are replicated across both Availability Zones for high availability. ## 3. The Pro V4 HA Baseline This *Reference* table serves as the technical source of truth for the V4 HA stack. | Component | Technology | AWS Service utilized | Deployment Location | |-----------|-----------|---------------------|---------------------| | **DNS** | Webscale Managed | AWS Route 53 | Global Edge | | **Edge Delivery** | Webscale CDN | AWS CloudFront | Global Edge | | **Security** | WAF & DDoS Protection | Webscale Data Plane | Perimeter Filter | | **Compute** | Proxy & App Layer | AWS EC2 | Shared & Dedicated (Multi-AZ) | | **Orchestration** | Podman | Linux Runtime - PHP_FPM Caching (Edge) - Vinyl (Varnish Caching (Data)) - Redis (Tri-Partitioned) | Daemonless Container | | **Search** | Opensearch | AWS Opensearch | Shared & Dedicated (Multi-AZ) | | **Cache** | Redis/Valkey | AWS Elasticache | Shared & Dedicated (Multi-AZ) | | **Database** | MYSQL | AWS RDS Aurora | Shared & Dedicated (Multi-AZ) | | **Storage** | Persistent Media | AWS EBS / EFS | Persistent Volume (Multi-AZ) | | **Backups** | 7 day snapshot | | | | **SSH** | SSH Connect / SSH Gateway | | | --- # Access URL: https://docs.webscale.com/hosting-platforms/hosting-v4/access/ Description: Accessing servers in a V4 environment Whether you are a system administrator making configuration changes, an engineer actively debugging a node, or maintaining a CI/CD pipeline deploying code, the V4 platform provides secure, role-specific pathways for accessing your servers and the Webscale Control Plane. ## Interactive User Access For direct shell access to a target server, utilize either [SSH Connect](/docs/how-tos/ssh-connect/) or the [SSH Gateway](/docs/how-tos/ssh-gateway/). When you authenticate and drop into a shell, your user session is automatically assigned to the `dev` group. Membership in this group grants access to run commands to maintain the environment and to update files in the `/var/www` directory. To safely manage application files on the host, you must use the `/shadow/www` directory. This directory acts as an intelligent proxy to the actual web root (`/var/www`). By making your edits, uploads, and file manipulations within `/shadow/www`, the system ensures that the underlying ownership of all files is automatically and correctly maintained as `www-data:www-data`. Important: You must always use `/shadow/www` for file manipulations. Writing directly to `/var/www` will bypass the proxy layer and result in incorrect file ownership, which can cause application errors and permission denials at runtime. ## Automated and API Access For automated workflows, such as CI/CD pipelines deploying code, or scripts interacting with the Control Plane API, access should always be routed through a [Service User](/docs/how-tos/general/service-users/). Creating a dedicated service user allows you to: * Enforce least privilege: Service users can be strictly scoped, granting them only the exact permissions required by the automation and nothing more. * Decouple access life-cycles: Tying automation to a specific human user is a fragile operational pattern. If that employee leaves the organization or their access is deactivated, any automated systems relying on their credentials will instantly fail. Service users exist independently of human personnel, ensuring your pipelines and scripts remain continuously operational. --- # Configuration URL: https://docs.webscale.com/hosting-platforms/hosting-v3/configuration/ Description: Explanation of how V3 environments are configured. Initial configuration and setup of a V3 servers of most types are handled primarily through a program called `invoker`. Permanent servers, such as NFS servers, bastions, or other accessory servers, are maintained by request to Webscale support following their initial creation. Cluster-based servers, such as web servers, cron servers, consumer servers, or other servers based on the `web-server` image family are expected to only be configured and maintained through their initial configuration. This is due to their transient nature. ### Invoker configuration For invoker to run successfully, it needs three pieces of configuration: 1. Bootstrap sequence locator 2. Customer name 3. Environment name The primary configuration for invoker is called the "bootstrap sequence". It is a sequence of commands retrieved at server startup from an locator that usually specifies an S3 bucket. For most of the history of invoker, the only way to specify a bootstrap locator was to provide the file `/opt/webscale/invoker/etc/invoker-service-boot.cmd` with a "locator". A locator is a URL-like string specifying the location of a resource. Most bootstrap locators are of the form: s3:_region_:_customer_-_environment_-config:/bootstrap.cmd. There are multiple ways to populate the file for invoker, but the most typical way is to write it using a cloud-init shell script in an AWS launch template specified by a cluster that creates servers. Customer and environment names which allow it to log its activity to CloudWatch in most AWS-based environments. Similarly to the bootstrap sequence, these are usually written by a cloud-init script in a launch template to the file `/opt/webscale/invoker/etc/invoker-service.conf`. However, beginning in [release 2026.36](/docs/reference/images/2026.36/) of the web server image, invoker can be configured entirely from its cluster metadata, by providing values for following keys. This allows for the elimination of a cloud-init script entirely. | Key | Description | |----------------------|-----------------------------------------------------| | CONTAINER_IMAGE_URI | When a cluster is configured to refer to a container image, this key is automatically set. | | WEBSCALE_BOOTSTRAP | Invoker locator to find bootstrap sequence. For example: `s3:us-east-1:customer-env-config:/bootstrap.cmd` | | WEBSCALE_CUSTOMER | Customer name used for setting up CloudWatch logging | | WEBSCALE_ENVIRONMENT | Environment name used for setting up CloudWatch logging | | WEBSCALE_SHARE | Specifies the root of a shared file system. For example: `/var/www/shared/mysite.com` | | WEBSCALE_SHARED_DIRS | Specifies which subdirectories are shared by `shell`, relative to the `html` subdirectory. For example: `pub/media var` | --- # Getting Started URL: https://docs.webscale.com/docs/getting-started/ Description: Details on getting started with Webscale --- # Hosting V3 URL: https://docs.webscale.com/hosting-platforms/hosting-v3/ Description: Containerized application code configured in bootstrap sequences stored in Amazon S3 buckets and launched by _invoker_, included in the [web-server and nfs-server image families](/docs/reference/images/). ## Webscale Pro V3 ### Container shell helpers Webscale Pro V3 environments run your application in containers. To open a shell inside the application container from the NFS host, use the `shell` helper script: ```bash shell ``` This script opens an interactive shell inside the container with the site code mounted (`/var/www/html`) and all the shared folders (`media`, `var`, etc). --- ### Deployment helper scripts The following helper scripts are available for deployments on Webscale Pro V3 environments: - `list-images` – lists available container images (for example tags by commit or branch). - `tag-by-commit` – updates the deploy tag to point to an image built from a specific commit. - `tag-by-branch` – updates the deploy tag to point to an image built from a specific branch. - `run-deploy-and-cleanup` – runs the deployment using the current deploy tag, executes hooks, and cleans up. These scripts are used in the [Webscale Pro V3 deployment guide](/docs/how-tos/deployment/standard/standard-deploy/) and should not be modified. --- ### Managed services Webscale Pro V3 environments use managed services for supporting components. Typical services include: - Database (managed relational database) - Search (OpenSearch-compatible service) - Cache/key-value store (Valkey-compatible cache service) - Message queue (RabbitMQ-compatible service) - HTTP cache (Webscale Varnish) - HTTP relay / reverse proxy in front of the application The exact service types and locations are defined per environment and managed by Webscale. --- ### Related how-to guides - [Deploy a new release](/docs/how-tos/deployment/standard/standard-deploy/) - [Magento and Shopware commands](/docs/how-tos/deployment/standard/standard-commands/) --- # Deployments URL: https://docs.webscale.com/hosting-platforms/hosting-v4/deployments/ Description: Deploying code to a V4 stack The method of deploying code depends on the stack tier used. ### Essentials Code is deployed directly to the server in the `/shadow/www` directory. ### EKS Code is deployed as a Helm chart through a Webscale [Kubernetes cluster](/docs/how-tos/general/kubernetes-clusters/). Each deployment installs the chart in its own namespace, verifies it, and moves traffic to it. ### All others [CodeDirect](/docs/how-tos/codedirect/) is used to build and deploy a container image to a cluster. Builders can be configured to deploy code automatically on completion of a successful build, triggered externally using the [Webscale API](https://control.webscale.com/docs/api), or launched using the Webscale Control Panel. --- # Overview URL: https://docs.webscale.com/docs/overview/ Description: A brief overview of Webscale products and services --- # Commands URL: https://docs.webscale.com/hosting-platforms/hosting-v4/commands/ Description: Commands for V4 hosting platforms. --- # How-Tos URL: https://docs.webscale.com/docs/how-tos/ Description: Guides on using the Webscale Control Panel. --- # Protecting Your Site with a Captcha URL: https://docs.webscale.com/docs/how-tos/web-controls/captcha-action/ Description: Configure a captcha, using a Web Control with the Challenge User action {{% include webcontrol.md %}} A useful action to add to a web control is the **Challenge User** action. This action will present users that match the **Condition** specified with a _Google ReCaptcha_ they must solve to prove they are not a bot. A previously validated user is not presented with a challenge. An example of when to use this type of web control is if you are seeing elevated malicious or suspicious behavior on your site, or if you have a list of IPs that you already know to be malicious. {{% alert %}} {{% include dashboard-login.md %}} On the menu that appears, click **Edit**. {{% /alert %}} {{% alert color="info" title="Prerequisite" %}} Since you’re setting a Web Control, we recommend reading [Creating Web Controls](/docs/how-tos/web-controls/webcontrols_create/) before following these steps. {{% /alert %}} ### Create the Challenge User Action Click **+ Add action** to create an action for the new Web Control, which opens the Create Action dialog. To proceed, click **Select an Action**. {{< figure src="/images/web_controls/create_action.png" alt="Webscale Create Action dialog in the control panel" >}} A list of actions is now displayed. Select **Challenge User** and click the **Done** button to return to the Edit Web Control screen. Remember that you can add more than one action. {{% alert title="Note:" %}} When the specified **Condition** is met, the captcha will be presented to every user that meets the condition, and will continue to be presented until the user solves the captcha. The captcha action uses the hostname of the site the user is visiting, the user's IP address, and the useragent (browser, OS, device) the user is using. If a user matches the conditions of the web control, the web control sets an encrypted cookie containing this information and shows the user a captcha. When the captcha is successfully solved, it updates the cookie to state that the user passed the challenge, and the user will no longer have to solve a captcha. The action then behaves as if it were a **Continue** action, even if the user continues to match the condition of the **Web Control**. {{% /alert %}} When a condition is met, then all specified actions are applied to the request. You can only choose one final action. Final actions run last; the order of execution of other actions is unspecified and not necessarily in the order displayed. ## Further reading - [Captcha pages](/docs/how-tos/advanced/microsite/#captcha-pages) in [Working with Microsites](/docs/how-tos/advanced/microsite/) - [Web Controls](/docs/how-tos/web-controls/) - [How to Block Countries from Accessing Your Site](/docs/how-tos/security/block-countries/) - [Editing the Allowlist](/docs/how-tos/security/whitelist/) - [Enabling Bot IP Shield](/docs/how-tos/security/bot-shield/) --- # Configuring WMA URL: https://docs.webscale.com/docs/how-tos/webscale-monitoring-agent/configuration/ Description: How to configure the Webscale Monitoring Agent The Webscale Monitoring Agent (WMA) is a multipurpose program that can be installed on a VM host to facilitate communication with Webscale. It consists of three independent processes—metric monitoring, [log collection]( /docs/how-tos/webscale-monitoring-agent/log-collection/), and [SSH connectivity](/docs/how-tos/webscale-monitoring-agent/ssh-connect/) —which you can enable or disable in the configuration file. ## Configuration reference Configure the Webscale Monitoring Agent using the file `/etc/webscale/wma-config.json`. The Webscale control plane automatically supplies some configuration values for VMs it creates. The file is in JSON format with the following fields. | Field | Type | Description | Default | Example | |--------------------|------------------|------------------------------------------|--------------|--------------| | `access_token` | String | Authentication token for accessing the upload endpoint. | | | | `autoupdate` | String | Frequency at which WMA checks for updates. A unit suffix (e.g., 's', 'm', 'h') is required. | | `"300s"`, `"24h"` | | `debug` | Boolean | Enables verbose logging for troubleshooting. | `false` | `true` | | `log_config` | Object | Settings for managing logging streams. See table below. | | | | `resource_labels` | Array of Strings | Labels used when registering an SSH/resource host. | | `["staging"]` | | `ssh_config` | Object | Settings for SSH connectivity. See table below. | | | ### log_config Object | Field | Type | Description | Default | Example | |--------------------|---------------------|-------------------------------------------|--------------|--------------| | `disabled` | Boolean | Enables log capture when set to `false`. | `true` | `false` | | `log_streams` | Array of Objects | Array of objects, where each object defines a single logging stream. See table below.| | | #### log_streams Object | Field | Type | Description | Default | Example | |--------------------|---------------------|------------------------------------------|--------------|--------------| | `application_id` | String | _Required_. An application identifier to associate logs with that application.| | `"a1yz47n4q15s"` | | `file_patterns` | Array of Strings | _Required_. List of file path patterns of logs to collect. The pattern may contain wildcards (`*`) to match zero or more characters. | | `["/home/test/custom.log"]` | | `name` | String | _Required_. A name used to identify the log stream.| | `"my-app"` | | `filters` | Array of Strings | If configured, when any of the values are found in a log line, then the log line will be captured. If not configured, then all log lines are captured, subject to `filter_regex`. | | `["CRIT"]` | | `filter_regex` | String | A regular expression. When configured, any matching log lines are captured. If not configured, then all log lines are captured, subject to `filters`. | | `"CRIT\|EMERG\|ALERT"` | ### ssh_config | Field | Type | Description | Default | Example | |--------------------|---------------------|------------------------------------------|--------------|--------------| | `address` | String | Used when registering an SSH host. Typically, this should not be set manually.| | `"1.2.3.4"`| | `via` | String | Used when registering an SSH host. Typically, this should not be set manually.| | `"ssh-hosts/xyz"` | | `disabled` | Boolean | Enables SSH connectivity when set to `false`.| `true` | `false` | Sample configuration file: ```JSON { "autoupdate": "24h", "ssh_config": { "disabled": false, }, "log_config": { "disabled": false, "log_streams": [ { "name": "StreamName", "file_patterns": [ "/home/test/custom.log" ], "application_id": "a1yz47n4q15s" } ] } } ``` ## Metadata configuration WMA typically runs on servers managed by the Webscale Control Plane. For servers created in a Webscale Cluster, the metadata file (`/var/lib/webscale/metadata.json`) contains values that WMA uses unless they are overwritten by the local configuration file. These metadata values include: ```JSON [ { "key":"WEBSCALE_API_HOST", "value":"api.webscale.com" }, { "key":"WEBSCALE_ACCESS_TOKEN", "value":"xyz" }, { "key":"WEBSCALE_SERVER_ID", "value":"abcd" } ] ``` {{% alert title="Note:" %}} WMA must be restarted for configuration changes to take effect. WMA is restarted with: ``` sudo systemctl restart webscale-monitoring-agent ``` The WMA log can be viewed to verify the configuration was accepted using: ``` journalctl -u webscale-monitoring-agent ``` {{% /alert %}} --- # Explanation URL: https://docs.webscale.com/docs/explanation/ --- # Services URL: https://docs.webscale.com/hosting-platforms/hosting-v4/services/ Description: Services Individual services may be controlled with `sudo systemctl _command_ _service_`. --- # FAQ URL: https://docs.webscale.com/docs/faq/ Description: Frequently Asked Questions ## Solutions ### Can Webscale host my application for me? Yes, all of Webscale’s solutions come with the ability, either by default or as an add-on option, to host your application in our cloud account. Hosting your application lets you focus on managing the functional aspects of your application, rather than managing the infrastructure. Read about our [product plans here](https://www.webscale.com/plans/). ### How do Webscale solutions differ from traditional appliances like ADC or WAF? Historically, ADC (Application Delivery Controller) or WAF (Web Application Firewall) functionality was available from many industry vendors as a hardware appliance. These have since evolved into software solutions that one can deploy on virtual machines. The common theme here is that they leave the management of complex infrastructure to the customer. We deliver Webscale as a pure SaaS (Software as a Service), so you do not have to worry about procuring, deploying, or maintaining the ADC or WAF. The software is cloud-hosted and managed by Webscale through its multi-tenant architecture, delivering all the functionality needed, including auto-updates, so new functionality is immediately available without any intervention on your part. ### How can Webscale protect my application from developer errors? It is not uncommon for developer errors to bring down applications. Webscale can automatically take scheduled (time-based or event-based) backups of the entire application and validate each backup to make sure they are usable for restoration to a fully functional application. When an application goes down due to erroneous code changes, the safest recovery option is to restore from a previously validated backup. Webscale enables the administrator to choose from a list of validated backups and restore the application successfully, preventing further downtime. ### How can Webscale protect my application against cloud outages? While not very common, wide-scale cloud outages may occur. Such disasters can have a significant impact on the revenue and brand reputation of the business. Webscale has disaster recovery solutions (Cloud Mirror and Cloud Rescue) that can replicate a running application in a different cloud region or an entirely different cloud provider, ensuring there is a redundant, near real-time snapshot of the application always available during a cloud outage. During the disaster, Webscale can then failover the application to the replica location and have the application running back up with its last known available state. ## Features ### What is Webscale Shield Mode? Often, we see applications facing DDoS (distributed denial of service) attacks from bots, slowing the application down and keeping it from responding to other valid requests or bringing it down altogether. To get ahead of this problem, the admin can enable **Webscale Shield** with a single click. Webscale Shield locks all bots out of the application instantly and validates users to only allow humans. This buys the administrators time to identify the pattern causing the attack and permanently block them before disabling the Webscale Shield. ### What is App Shield? The Webscale data plane includes a WAF (web application firewall) that fronts the application. Through various control mechanisms (blacklisting, Web Controls, DDoS Shield Mode, WAF rules), Webscale can block bad traffic before it gets to the application. But, if an attacker discovers the application server IP addresses, they can bypass the Webscale WAF and directly access the application servers to attack them. To solve this security problem, the Webscale **App Shield**, when enabled, only allows web requests to the application servers coming from the Webscale data plane IPs and rejects all other requests. This ensures the only valid traffic getting through to the application comes via the Webscale data plane, and there is one place to apply all security controls to that traffic. ### What are Web Controls, and how do I use them? Web Controls are easy-to-use, customizable policies enforced on web requests accessing the application. They are used to control different aspects of web traffic – to tune and enhance performance, uptime, and security of the web application. The administrator can configure and enable multiple web controls and determine their execution order through the Webscale control panel. Some of the many use cases you can enable through web controls: - Block (or allow) user traffic from a particular geography. - Enable blue-green testing of different web application designs. - Enable performance optimizations based on specific request identifiers such as URLs. - Route application admin page requests to a separate application backend. - Optimize 3rd party content to speed up page load. See the [Web Controls How-Tos](/docs/how-tos/web-controls/) for instructions on configuring Web Controls. ### What is Dynamic Site Cache? Web pages are increasingly personalized and dynamic, and therefore are un-cacheable since they change dynamically based on whether a user is logged in. Enabling **Dynamic Site Cache** allows caching of web pages outside the application infrastructure for users who are not logged in, from within the Webscale data plane. This significantly offloads the application to focus on checkouts and cart operations and leaves generic browsing and bot activity to be handled outside the infrastructure, leading to faster page load performance and increased cost efficiency of hosting. You can enable **Dynamic Site Cache** on a per-application basis. {{% alert %}}[Contact us](mailto:support@webscalenetworks.com) to learn more about how to enable **Dynamic Site Cache**.{{% /alert %}} ### What is Bot IP Shield? How do I get it? Webscale **Bot IP Shield** addresses the challenge of identifying known bad attackers through incoming IP addresses. **Bot IP Shield** disables, in real-time, inbound communications from IPs known to be malicious, keeping customer infrastructure secure and efficient. [Webroot’s BrightCloud® IP Reputation Service](https://www.webroot.com/us/en/business/threat-intelligence/internet/ip-reputation) powers Webscale **Bot IP Shield**. **Bot IP Shield** is available as part of [Cloud Bot Manager](https://www.webscale.com/plans/webscale-product/webscale-cloud-bot-manager/) or [Enterprise Cloud Secure](https://www.webscale.com/plans/webscale-product/webscale-enterprise-cloud-secure/). {{% alert %}}[Contact us](mailto:support@webscalenetworks.com) to learn more about how to enable **Bot IP Shield** in your account.{{% /alert %}} ### What is Cloud Bot Manager? How is it offered? **Cloud Bot Manager** is Webscale’s comprehensive multi-cloud bot management solution that combats the rapidly growing threat of malicious bots while improving performance and delivering higher RoI. It includes: - Instant Attack Detection - Real-Time Bot Mitigation - Bot IP Directory - Real-Time Monitoring, Reporting and Management - Intelligent Caching **Cloud Bot Manager** can be enabled with just DNS changes to protect any application on any hosted environment. It is also available as part of [Enterprise Cloud Secure](https://www.webscale.com/plans/webscale-product/webscale-enterprise-cloud-secure/), Webscale’s enterprise security suite. Learn more on [Webscale **Cloud Bot Manager**](https://www.webscale.com/plans/webscale-product/webscale-cloud-bot-manager/). ## Pricing ### What is the pricing model for Webscale solutions? Webscale plans are priced like any SaaS, with monthly recurring fees and sometimes, a one-time setup fee. The plan that you choose depends on various factors relating to your needs. The need for Webscale hosting, the number of web applications that need to be managed by Webscale, the average number of visitors to each web application, and other considerations are all factors to consider. {{% alert %}}[Contact us](mailto:support@webscalenetworks.com) to discuss your options.{{% /alert %}} --- # Stacks URL: https://docs.webscale.com/hosting-platforms/hosting-v4/stacks/ Description: Stacks available in the V4 hosting platform. --- # How to Customize Webscale's Autoscaling URL: https://docs.webscale.com/docs/how-tos/advanced/customize-auto-scaling/ Description: How to customize the autoscaling environment in the Webscale Control Panel Webscale autoscaling has a diversity of rulesets used to scale dynamically. Webscale monitors the following metrics on each of the application servers and then uses the returned value in combination with a manually defined value over time to decide if and when to scale the cluster in/out: - CPU % Utilization - I/O Wait % - Kilobytes/second - Load Average - Memory Usage % - Requests/Second Some examples of autoscaling triggers are "Scale out when Load Average of the system has been greater than 1.25 for 1 minute", or conversely, "Scale in when Load Average of the system has been less than 0.50 for 1 minute". The conditions you can utilize are: - has been less than - has been greater than - will be less than - will be greater than Once one of these conditions is met, Webscale triggers the scale in/out. Define a minimum and maximum desired cluster size that limits these conditions. Set the minimum to what your contract defines for you, for example, `1`. The max setting to use is one that is suitable to handle any surges of legitimate traffic while still within your cloud account quota limit. Set it to a reasonable max (for example, `10`) to ensure buffer room for any traffic surges but also to keep it low enough so account expenses remain minimal in the case of, for example, unprecedented bot traffic hitting the site. Find the cluster settings in the **Account Settings** section of the Webscale control panel. ## Customize Autoscaling | | | |---|---| |{{< figure src="/images/account-settings.jpg" width="75%" alt="Account Settings" >}}| 1. Log in to the [Webscale control panel](https://control.webscale.com) and click the gear on the upper right, then select **Account Settings** from the menu.| |{{< figure src="/images/view-clusters.jpg" width="75%" alt="Clusters List" >}}| 2. Click **Clusters** from the top menu bar to view the cluster information. Click the **Edit** button to view the details for that cluster.| |{{< figure src="/images/cluster-settings.jpg" width="75%" alt="Autoscaling Configuration" >}}| 3. Make your changes to the min and max server counts for the cluster and other details, including when the cluster scales out or in. Click the **Save** button at the bottom of the screen to confirm any changes made to the cluster settings.| ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Security How-Tos](/docs/how-tos/security/) --- # How-Tos URL: https://docs.webscale.com/hosting-platforms/hosting-v4/how-tos/ Description: Guides for the V4 hosting platform. --- # Reference URL: https://docs.webscale.com/docs/reference/ Description: Reference docs for Webscale --- # API Reference URL: https://docs.webscale.com/docs/api/ Description: API Reference docs for Webscale Placeholder. This is diverted in production by the Webscale Control service. --- # Configuration URL: https://docs.webscale.com/hosting-platforms/hosting-v4/stacks/configuration/ Description: Principles of stack configuration ## Connecting to an existing stack When deploying multiple stacks within the same environment, the Webscale Control Plane acts as a central dependency resolver. Instead of referencing cloud-provider resources directly, a stack may reference outputs from another stack For example, you may wish to deploy an add-on stack into an existing network or require the database endpoint of an RDS database. To refer to these values, you can provide references to the outputs from a different stack. ### Examples ``` "data_subnets": "/v2/stacks/{stack-id}/outputs/data_subnets" "public_subnets": "/v2/stacks/<{stack-id}/outputs/public_subnets" "db_endpoint": "/v2/stacks/<{stack-id}/outputs/db_endpoint" "db_password_secret_name": "/v2/stacks/<{stack-id}/outputs/db_password_secret_name" ``` *Note: A stack that is referenced by another stack cannot be deleted until the dependency is removed.* --- # Latest Updates URL: https://docs.webscale.com/docs/latest-updates/ Description: Thirty most recent updates {{< recently-updated >}} --- # AWS Setup URL: https://docs.webscale.com/hosting-platforms/hosting-v4/aws-setup/ Description: Setup tasks for customer-owned AWS accounts In the scope of an enterprise-level plan, the Webscale Control Plane can provision and manage resources in a customer-provided AWS account. This page describes setup necessary to allow the Control Plane to access an account. It is not necessary when using a plan that includes Webscale-provided AWS accounts. ### How It Works 1. **Setup the IAM Permissions Boundary:** A customer-managed IAM policy defines the maximum permissions any role created by Webscale can possess. It explicitly denies actions that allow privilege escalation (e.g., creating IAM users, modifying policies without oversight, or creating access keys). 2. **Setup the IAM Role:** This is the cross-account role assumed by Webscale. Its policy contains an iam:PermissionsBoundary condition that permits role creation and policy attachment only if the target role has the boundary attached. The role must belong to the same AWS account that the Stack will be provisioned with. 3. **Stacks:** Provide the `permissions_boundary_arn` and the `provisioner_role_name` as variables when creating a Stack. Stack definitions attach the customer's boundary ARN to all child IAM roles. Any attempts to assume a role in the customer account without the boundary ARN reference will fail. ### CloudFormation Template The following template is a guideline for creating the IAM Permissions Boundary and IAM Role described in steps 1 and 2 above. ```yaml AWSTemplateFormatVersion: '2010-09-09' Description: "Provisions the Webscale cross-account role and strictly enforces a permissions boundary on all infrastructure deployed by Webscale." Resources: # ------------------------------------------------------------------- # The Permissions Boundary # ------------------------------------------------------------------- CustomerProvisioningBoundary: Type: AWS::IAM::ManagedPolicy Properties: ManagedPolicyName: WebscaleProvisioningBoundary Description: "Maximum allowed permissions for roles provisioned by the Webscale control plane." PolicyDocument: Version: '2012-10-17' Statement: - Sid: AllowAppAndInfrastructureServices Effect: Allow Action: - ec2:* - eks:* - ecr:* - elasticloadbalancing:* - autoscaling:* - logs:* - cloudwatch:* - secretsmanager:GetSecretValue - secretsmanager:DescribeSecret - secretsmanager:ListSecretVersionIds - secretsmanager:BatchGetSecretValue - kms:Decrypt - kms:GenerateDataKey* - kms:DescribeKey - ssm:GetParameter - pricing:GetProducts Resource: "*" - Sid: AllowKarpenterIAMReadsAndPassRole Effect: Allow Action: - iam:ListInstanceProfiles - iam:GetInstanceProfile - iam:PassRole - iam:CreateServiceLinkedRole Resource: "*" - Sid: ExplicitDenyPrivilegeEscalation Effect: Deny Action: - iam:CreateUser - iam:CreateRole - iam:CreatePolicy - iam:CreateAccessKey - iam:CreateLoginProfile - iam:PutRolePolicy - iam:PutUserPolicy - iam:AttachRolePolicy - iam:AttachUserPolicy - iam:DetachRolePolicy - iam:DeleteRolePolicy - iam:UpdateAssumeRolePolicy - iam:AddUserToGroup Resource: "*" # ------------------------------------------------------------------- # The Provisioner Role # ------------------------------------------------------------------- WebscaleCrossAccountRole: Type: AWS::IAM::Role Properties: RoleName: AccountProvisioner AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: AWS: "arn:aws:iam::725084300153:root" Action: sts:AssumeRole Policies: - PolicyName: EnforcePermissionsBoundary PolicyDocument: Version: '2012-10-17' Statement: - Sid: ReadOnlyActions Effect: Allow Action: - ec2:Describe* - iam:List* - iam:Get* - eks:Describe* - eks:List* - rds:Describe* - rds:List* - elasticache:Describe* - elasticache:List* - es:Describe* - es:List* - mq:Describe* - mq:List* - secretsmanager:Describe* - secretsmanager:Get* - secretsmanager:List* - route53:Get* - route53:List* - dlm:Get* - ecr:Describe* - ecr:Get* - ecr:List* - kms:DescribeKey - kms:ListGrants Resource: "*" - Sid: ManageInfrastructure Effect: Allow Action: - ec2:* - eks:* - rds:* - elasticache:* - es:* - mq:* - secretsmanager:* - route53:* - dlm:* - ecr:* - kms:CreateGrant - kms:RevokeGrant - kms:Decrypt - kms:GenerateDataKey - kms:GenerateDataKeyWithoutPlaintext Resource: "*" - Sid: IAMRoleCreationWithBoundary Effect: Allow Action: - iam:CreateRole Resource: !Sub "arn:aws:iam::${AWS::AccountId}:role/webscale-*" Condition: StringEquals: iam:PermissionsBoundary: !Ref CustomerProvisioningBoundary - Sid: IAMRolePolicyModificationsWithBoundary Effect: Allow Action: - iam:PutRolePolicy - iam:AttachRolePolicy - iam:DetachRolePolicy - iam:DeleteRolePolicy - iam:PutRolePermissionsBoundary Resource: !Sub "arn:aws:iam::${AWS::AccountId}:role/webscale-*" Condition: StringEquals: iam:PermissionsBoundary: !Ref CustomerProvisioningBoundary - Sid: IAMRoleLifecycle Effect: Allow Action: - iam:DeleteRole - iam:UpdateAssumeRolePolicy - iam:TagRole - iam:UntagRole Resource: !Sub "arn:aws:iam::${AWS::AccountId}:role/webscale-*" - Sid: IAMInstanceProfileManagement Effect: Allow Action: - iam:CreateInstanceProfile - iam:DeleteInstanceProfile - iam:AddRoleToInstanceProfile - iam:RemoveRoleFromInstanceProfile - iam:TagInstanceProfile - iam:UntagInstanceProfile Resource: !Sub "arn:aws:iam::${AWS::AccountId}:instance-profile/webscale-*" - Sid: IAMOIDCProviderManagement Effect: Allow Action: - iam:CreateOpenIDConnectProvider - iam:DeleteOpenIDConnectProvider - iam:TagOpenIDConnectProvider - iam:UntagOpenIDConnectProvider Resource: !Sub "arn:aws:iam::${AWS::AccountId}:oidc-provider/*" - Sid: IAMPassRoleRestricted Effect: Allow Action: iam:PassRole Resource: !Sub "arn:aws:iam::${AWS::AccountId}:role/webscale-*" - Sid: AllowServiceLinkedRoleCreation Effect: Allow Action: - iam:CreateServiceLinkedRole Resource: !Sub "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/*" Condition: StringEquals: iam:AWSServiceName: - "eks.amazonaws.com" - "eks-nodegroup.amazonaws.com" - "elasticloadbalancing.amazonaws.com" Outputs: CrossAccountRoleName: Description: "Provide this role name when creating Stacks so the provisioner can assume the role." Value: !Ref WebscaleCrossAccountRole PermissionsBoundaryArn: Description: "Provide this ARN when creating Stacks to include the boundary." Value: !Ref CustomerProvisioningBoundary ``` --- --- # Setup URL: https://docs.webscale.com/docs/how-tos/ssh-gateway/setup/ Description: How to set up your user account to use SSH Gateway Once you have set up your user account as described below, you will be able to access any host that is [registered with SSH Connect](/docs/how-tos/ssh-connect/register-hosts/). To set up your user account for SSH Gateway, two pieces of information are needed: * _An SSH username._ This name will identify you to Webscale, and must be globally unique among Webscale users. * One or more _SSH public keys_. These keys are used to verify your identity. ## Username You already have an SSH username that is automatically assigned. You can see it on [your profile page](https://control.webscale.com/profile) . {{< figure src="/images/ssh-gateway/ssh-username.png" alt="Settings panel showing SSH username" >}} You can change your SSH username on the profile page. Be aware that past usernames cannot be reused in the future, even by the same user. ## Public Keys SSH keypairs are the preferred system of securing access to servers without using account passwords. An SSH keypair consists of a public key and a private key that are generated together. The private key is never uploaded into Webscale systems, and remains with the user. The public key can be shared freely, and this is what is shared with Webscale. To generate a keypair on Mac or Linux, or anywhere the `ssh` command line tool is installed (e.g., [WSL2](https://learn.microsoft.com/en-us/windows/wsl/about)  for Windows), you can use the `ssh-keygen` tool: ``` ssh-keygen -f ~/.ssh/webscale ``` This will generate a keypair and store it in two files, `webscale` (private key) and `webscale.pub` (public key), in the `.ssh` directory of your home folder. You should now configure SSH to use this keypair when accessing SSH Gateway. Run the following command in a terminal to add the necessary config: ``` echo "Host ssh.webscale.com\n\tIdentityFile ~/.ssh/webscale" >> ~/.ssh/config ``` Next, copy the contents of `webscale.pub`. You can show it on the command line with the command: ``` cat ~/.ssh/webscale.pub ``` Now, navigate to [your profile page](https://control.webscale.com/profile) , scroll to the _SSH public keys_ section, and click the button labeled _Add SSH public key_. Paste the contents of `webscale.pub` into the field labeled _Public key_, and click _Save_. {{< figure src="/images/ssh-gateway/ssh-public-keys.png" alt="SSH public keys form" >}} You should see the key appear above the _Add SSH public key_ button. You can upload up to three SSH public keys. ## Ready Once you know your SSH username and have uploaded a public key, you are ready to connect to any host that is accessible from SSH Connect. See [Connecting to Hosts](/docs/how-tos/ssh-gateway/connecting-to-hosts/) for instructions on using SSH, SCP, SFTP, and port forwarding. --- # Connecting to Hosts URL: https://docs.webscale.com/docs/how-tos/ssh-connect/connecting-to-hosts/ Description: How to connect to registered SSH hosts Once a host is registered with Webscale, it will be accessible to access over SSH using the Webscale Control Plane as long as the following requirements are met: - Webscale Monitoring Agent (WMA) is running on the host with SSH enabled. - The host's network allows connections over port 22 from the SSH Connect middleware On the SSH Connect page, a drawer will list the hosts that have been registered and approved. Clicking a host will initiate a connection with that host and launch a terminal window. {{< figure src="/images/ssh-connect/ssh-connect-drawer.png" width="40%" alt="SSH Connect drawer" >}} Click the Edit icon to manage registered hosts. ### Accessing a host via a bastion If the host is not publicly accessible, the bastion used to access the host must be a registered SSH host as well. Users can associate SSH hosts with their corresponding bastion by selecting the registered bastion in the "Via" dropdown in the SSH host management editor. The "Via" reference allows the SSH Connect facility to connect to a host by way of a different host. {{< figure src="/images/ssh-connect/edit-via-host.png" width="85%" alt="Edit via host field" >}} --- # Log Collection URL: https://docs.webscale.com/docs/how-tos/webscale-monitoring-agent/log-collection/ Description: How to use WMA log collection The Webscale Monitoring Agent can be configured to aggregate logs in the Webscale Control Panel for easy filtering, searching, and viewing. This is done by enabling log collection in the WMA configuration file. Logs are aggregated as "Custom Logs" and can be viewed in the Webscale Control Panel. For more information, see [Configuring and Viewing Custom Logs](/docs/how-tos/advanced/custom-logs/). ## Log streams A log stream is simply a collection of logs, aggregated for easy filtering and searching ### Name A descriptive stream name will help users more easily filter and locate desired logs. ### File patterns The log stream should specify one ore more files to watch for new logs to be written to. Any file(s) that match the file pattern(s) specified will be aggregated. A wildcard (*) can be used to match multiple logs in a directory. ### Application ID Logs aggregated by WMA must be associated with a Webscale Application. To find this ID, send a GET to /v2/applications and use the 12 character alphanumeric ID in the application href for the desired application. ## Sample log config ```JSON ... "log_config": { "disabled": false, # When true log collection will be disabled. "log_streams": [ { "name": "stream_name", # A name for stream. "file_patterns": [ "/home/test/custom.log", # A specific file to capture logs from "/etc/nginx/*.log", # Will capture all files in /etc/nginx that end with '.log' ], "application_id": "wxyz1234abcd" # Application id to post logs. } ] } ... ``` --- # Connecting to Hosts URL: https://docs.webscale.com/docs/how-tos/ssh-gateway/connecting-to-hosts/ Description: How to connect to registered SSH hosts with SSH Gateway Once you have [set up an SSH username and public key](/docs/how-tos/ssh-gateway/setup/) and you have [registered hosts in SSH Connect](/docs/how-tos/ssh-connect/register-hosts/), you are ready to connect using SSH Gateway. Examples below are written for the [OpenSSH](https://en.wikipedia.org/wiki/OpenSSH)  suite of command-line tools (`ssh`, `scp`, and `sftp`). These tools are installed by default on Mac, Linux, and Windows [WSL2](https://learn.microsoft.com/en-us/windows/wsl/about) . ## Connection basics When connecting to SSH Gateway, you will use a _connection string_ that incorporates your SSH username, the name of the SSH connect host you are trying to connect to, and `ssh.webscale.com`, joined together with `@` symbols. Use the hostname shown on the SSH Connect drawer, not the DNS hostname for the server. {{< figure src="/images/ssh-gateway/ssh-connect-drawer.png" alt="SSH Connect Drawer" >}} For instance, for a user with the SSH username `joesample`, who is trying to connect to a host that is named `sampleco-cp1`, the connection string would look like: ``` joesample@sampleco-cp1@ssh.webscale.com ``` ## SSH for login and remote exec You can open a login shell to a host using SSH Gateway and the `ssh` command: ``` ssh joesample@sampleco-cp1@ssh.webscale.com ``` If you would like to execute a command on the remote server, you can append it to the `ssh` command as usual. For instance, to run `ps -aux` on the server and see its output locally, run: ``` ssh joesample@sampleco-cp1@ssh.webscale.com ps -aux ``` ## Transferring files with SCP You can transfer files to and from your local computer using the `scp` command. To copy a file called `data.json` from the server to your local machine, run: ``` scp joesample@sampleco-cp1@ssh.webscale.com:data.json . ``` To copy the file from your local directory to the remote server, run: ``` scp data.json joesample@sampleco-cp1@ssh.webscale.com: ``` ## Transferring files with SFTP The `sftp` command can be used to interactively transfer files to and from the server, using subcommands similar to the historical `ftp` program. The exact usage of `sftp` is out of scope for this document, but you can connect to a host using: ``` sftp joesample@sampleco-cp1@ssh.webscale.com ``` ## SSH for local port forwarding The `ssh` command can securely forward traffic from a local network port to a port on a remote server. This allows, for instance, connecting to a remote database using local tools. For example, a user with MySQL DB running on port 3306 on a remote server could make that traffic available on port 5000 of his local computer like this: ``` ssh -N -L 5000:localhost:3306 joesample@sampleco-cp1@ssh.webscale.com ``` And then connect to it locally, for example using the `mysql` command line tool: ``` mysql -h 127.0.0.1 -P 5000 -u -p ``` ## Conclusion SSH Gateway gives access to remote hosts using the industry standard SSH protocol. It does not require the use of a browser like SSH Connect does, and unlocks features like file transfers, port forwarding, and remote command execution. Use it for convenient access to your servers and data inside the Webscale cloud. --- # Connecting with FileZilla URL: https://docs.webscale.com/docs/how-tos/ssh-gateway/connecting-with-filezilla/ Description: How to connect FileZilla to Webscale servers via SSH Gateway This guide shows you how to configure FileZilla to access your application files through the Webscale SSH Gateway. ### **Prerequisites** * An [SSH Key pair](https://docs.webscale.com/how-tos/ssh-gateway/setup/) added to your Webscale user profile. * The [**SSH Gateway** hostname](https://docs.webscale.com/how-tos/ssh-gateway/connecting-to-hosts/) \- `ssh.webscale.com`. * Your **Application HOSTNAME** (e.g., `myapp-staging`). ### **Step 1: Configure General Connection Settings** 1. Open FileZilla and navigate to **File \> Site Manager**. 2. Click **New Site** and name it (e.g., "Webscale SSH Gateway"). 3. Set **Protocol** to `SFTP - SSH File Transfer Protocol`. 4. Set **Host** to your assigned gateway address (e.g., `ssh.webscale.com`). 5. Set **Logon Type** to `Key file`. ### **Step 2: Set the User String and Key** In the **User** field, you must use the specific gateway format: `@` **Example:** `jdoe@myapp-staging-nfs` Finally, browse to and select your **Private Key file**. ### **Step 3: Connect** Click **Connect**. If prompted about an unknown host key, verify the fingerprint and click **OK**. You should now see your remote directory tree. {{< figure src="/images/ssh-gateway/connect.png" alt="FileZilla Site Manager connection settings" >}} Here is an example of what you should see: {{< figure src="/images/ssh-gateway/result.png" alt="FileZilla connected to remote directory" >}} --- # Registering Hosts URL: https://docs.webscale.com/docs/how-tos/ssh-connect/register-hosts/ Description: How to register hosts In order to access a host through SSH Connect, the host must first be registered with Webscale in the appropriate account. This is a two step process (registration followed by approval). ## Registering SSH hosts The first of these steps can be done either through the API directly or via the Webscale Monitoring Agent (WMA) running on the host with SSH enabled. {{% alert title="Note:" %}} To allow SSH access through private networks the IP of the SSH Connector middleware is `3.217.2.82` {{% /alert %}} ### Webscale Monitoring Agent Registration When SSH is enabled on WMA, the agent will reach out directly to Webscale's API with the relevant information needed to register including name (hostname), address, and host keys. Associating the server with a via host (bastion) must be done through the Control Plane unless the via host reference is also provided in the WMA configuration. ### Registration of static servers as hosts To register a static server as an SSH host (a non-cluster server), install the Webscale Monitoring Agent on the server and configure it according to the following steps: Create a Service User: First, create a service user through the Webscale API for your account. This service user will be responsible for registering the host with Webscale, and logging SSH activity. {{% alert title="Note:" %}} Please refer to the [Service User Configuration Guide](/docs/how-tos/general/service-users/) for detailed instructions on creating a service user. {{% /alert %}} Grant Permissions: Ensure that the service user is granted root-level "Cluster Service User" permissions. Configure the WMA: When the service user is created, an access key will be provided. Take the service user's access key and configure it in the Webscale Monitoring Agent (WMA) by setting it as the `access_token` property in the WMA configuration file (/etc/webscale/wma-config.json). Add an enabled `ssh_config` to the same file. {{% alert title="Note:" %}} Please refer to the [WMA Configuration Guide](/docs/how-tos/webscale-monitoring-agent/configuration/) for detailed instructions on supplying this configuration. {{% /alert %}} Automatic Registration: After completing these steps, the WMA will register the static server host with Webscale. The host will be available for SSH access once approved. ### Registering through the API If registering through the API, please reference the appropriate documentation [here](https://control.webscale.com/docs/api). | Field | Description | | ---------------- | ------------------------ | | Name* | This is what the host will be referred to in the Control Panel. This can be changed later. WMA registration will automatically default to the hostname. | | Address* | The address used to access the host. If this is a private address, you will want to include via (below). | | Host Keys | The host keys of the host. WMA registration will fetch these automatically. | | Via | The registered host that serves as a jump through to access a privately accessible host. | {{% alert title="Note:" %}} When registering a host with a Via bastion, ensure you use the correct address for the host. If the host is in a private subnet, use its private address, which should be accessible from the bastion. {{% /alert %}} ## Approving SSH hosts Registering the host will make it available for approval in the SSH connect management table. A user with authority to PATCH /v2/ssh-hosts (included in Editor role) should then confirm the address and name of the host and click approve to make the host accessible through SSH Connect. {{< figure src="/images/ssh-connect/approve-host.png" width="75%" alt="Approve host dialogue" >}} Hosts registered by the Webscale Monitoring Agent on Webscale managed cluster servers will be automatically approved. Registered, but unapproved hosts **will not** appear in the SSH connect drawer. --- # SSH Connect URL: https://docs.webscale.com/docs/how-tos/webscale-monitoring-agent/ssh-connect/ Description: How to use enable SSH Connect through WMA The Webscale Monitoring Agent can be used to facilitate easy SSH access to authorized users directly via the Webscale Control Plane. Enabling SSH Connect within WMA will register the host with the Webscale Control Plane and allow the WMA to manage Webscale users on the host. # Registration In order to connect to a host via SSH Connect, that host must be registered with Webscale. ([See SSH Connect documentation for more details on registration](/docs/how-tos/ssh-connect/register-hosts/).) When WMA is started with ssh enabled, the WMA will attempt to register the host automatically. Upon successful registration, it will then subscribe to Webscale's Pub/Sub API to receive any user updates for the host. This allows users to be created and removed on the host as needed by the SSH Connect facility. (See [Connecting to Hosts](/docs/how-tos/ssh-connect/connecting-to-hosts/) # User management Users created by the SSH Connect facility will be created with a name that corresponds to their Webscale registered email followed by an underscore '_' and their Webscale API ID. All session activity over SSH Connect is recorded and session logs can be accessed through the Webscale Control Plane. If a user's access is revoked, the WMA will remove that user from the registered host. --- # Building images URL: https://docs.webscale.com/docs/how-tos/codedirect/build-image/ Description: How to build a container image from a source repository using CodeDirect This guide shows you how to build a container image from source code stored in a repository using **Webscale CodeDirect**. The resulting image will be pushed to your configured image registry. You will also learn how to manually trigger a build and view its logs. --- ## Prerequisites Before you begin, ensure you have: - A source repository that contains a **Dockerfile** - An image registry configured under **Providers** {{% alert title="Note:" %}} Follow the steps below to configure an AWS ECR registry: - Go to the **Providers** tab - Edit an AWS provider - Enable **Use for ECR** - Provide the registry endpoint - Specify a repository {{% /alert %}} --- ## 1. Create a new Builder 1. Go to: [control.webscale.com/builders](https://control.webscale.com/builders) 2. Click the **blue plus (+)** button to create a new Builder. You will see configuration sections for: - Build context - Image destination - Build configuration - Build triggers We will focus on the required fields in this guide. --- ## 2. Configure the build context 1. Expand the **Build context** panel and click **Connect a repository** or select an already connected repository. 2. Follow the prompts to authorize a connection to your repository. 3. After completing the connection, return to the Builder and select your repository from the dropdown. --- ## 3. Specify the image destination 1. Expand the **Image destination** panel and choose your configured **Image registry**. 2. Select the **Image repository** where the built image will be pushed. --- ## 4. Set the build configuration 1. Expand the **Build configuration** panel and provide the **relative path** to the Dockerfile in your source repository. --- ## 5. Optionally specify build triggers If you would like a build to be triggered whenever code is pushed to the repository, select "Build on commit" and specify which branches you would like to trigger a build. Otherwise, leave this section blank. --- ## 6. Save the Builder Click **Submit** to save the Builder. You now have a Builder capable of producing container images. --- ## 7. Manually trigger a build 1. In the Builders list, locate your newly created Builder. 2. Click the **play** (▶) button next to it. 3. Leave the source reference at **HEAD** and click **Submit**. This action creates a new build task. --- ## 8. Monitor the build progress 1. Watch for the **spinning arrows** icon in the top-right corner of the Control Panel. This indicates that a task is running. 2. Click the icon, then click **Zoom** to view the build logs. Look for key log entries such as: - “Cloning git repository…” — confirms the source repo is being pulled. - “Checking out specific commit: ” — shows which commit was used. - “Pushing image to …” — indicates the registry, repository, and tag for the final image(s). ✅ indicates the build was successful. ❌ indicates the build failed. --- ## Result You have successfully: - Created a CodeDirect Builder - Connected it to a source repository - Configured your output image registry - Triggered a manual build - Viewed the build logs --- # Files and template substitution URL: https://docs.webscale.com/docs/how-tos/codedirect/files-in-build-context/ Description: How to include files and use template substitution in the container build context This guide will show you how to provide files to your CodeDirect container build context. These files may include secret references to secrets securely stored with Webscale and substituted at build time. ## Prerequisites Before you begin, ensure you have: - A builder created and saved - The file you want included in your build context uploaded to [**Webscale Files**](https://docs.webscale.com/how-tos/general/files/) --- ## Add file to build context 1. Click the **Edit** icon for the Builder you would like to modify. 2. Expand the Build context panel and select the **File** archive and **Path** for the specific file you would like to include in the build context. 3. Enter a relative **mount path**. This is where the file will be mounted in the container. This must not start with a `/`. 4. If the file is a template file and you would like the value template references to be substituted at build time, check the **Template substitution** box. ## How to use template substitution If there are secure values that are not safe to store in the Webscale File directly, but need to be injected into the build context, you can utilize value templates in your file and specify that template substitution should occur during the build. This allows you to securely inject secrets into your build context. A value template can be specified using the syntax: `$()`. Inside the parens, include the relevant function call. For example, to inject a secret your file might look like this: ``` { "db": { "username": "admin", "password": "$(secret("secrets/efgh1234abcd"))" } } ``` Where `secrets/efgh1234abcd` is a reference to a secret stored with Webscale. When the build context is prepared, the contents of that secret will replace the template reference, leaving the file as follows: ``` { "db": { "username": "admin", "password": "mysecurepassword" } } ``` ### Uploading secrets to Webscale 1. To upload a secret to your Webscale account, send a POST request with a valid authorization token to `/v2/secrets`. Refer to the "Create a secret" API documentation [here](https://control.webscale.com/docs/api). 2. Record the secret href that is returned from the API. This reference is what should be used in the template file, as shown in the above example (`secrets/efgh1234abcd`). ### How to use JSON secrets Secrets may be of type "application/json" in which case, the secret reference in your template file can include the relevant key path to a specific part of your secret content. For example: ``` POST /v2/secrets { "mime_type": "application/json", "content": { "db": { "username": "admin", "password": "mysecurepassword" } } } ``` The username and password in this secret could be referenced in your template file as follows: ``` { "db": { "username": "$(secret("secrets/efgh1234abcd", "db.username"))", "password": "$(secret("secrets/efgh1234abcd", "db.password"))" } } ``` Note that the JSON key is a dot separated optional second argument provided to the secrets expression. If the second argument is omitted, the entire secrets content will be injected. --- # Builders URL: https://docs.webscale.com/docs/how-tos/codedirect/builders/ Description: A reference for creating and managing CodeDirect Builders This document describes the configuration attributes available for CodeDirect Builders. A Builder is responsible for performing builds based on the configuration provided. It defines the source context, build resources, build triggers, and target destination for building and storing a container image. ## Build context These settings define the source materials and file inputs used during the build process. #### Source repository The source repository that contains the Dockerfile from which the image will be built. #### Files A list of specific files to include in the build context. Use this to include required configuration files or assets that exist outside of the source repository but are needed in the build context at build time. [Template substitution](/docs/how-tos/codedirect/files-in-build-context/) can be used to inject secrets into these included files. ### Environment variables Key/value pairs that are included in the build context. Value templates can be used within the environment variable value to inject values using the syntax below. Keys cannot contain value templates. To indicate a value template, use the syntax: `$()`. Inside the parens, include the relevant function call. For example: ``` $(secret("secrets/efgh1234abcd")) ``` Where `secrets/efgh1234abcd` is a reference to a secret stored with Webscale. When the build context is prepared, the contents of that secret will replace the template reference. --- ## Image destination These settings determine where the final container image will be stored after a successful build. #### Image registry The image registry where the image will be pushed. This service must be pre-configured in your Providers settings before it can be selected here. #### Image repository The specific repository name within the selected registry where the image will be stored. #### Image tags A list of custom tags to apply to the image. You can define static tags (e.g., `production`) or use dynamic variables to automatically include build metadata. To use a variable, wrap the variable name in `$()`: * **`$(BRANCH)`**: The name of the git branch (e.g., `main`). * *Usage:* `branch-$(BRANCH)` * **`$(COMMIT)`**: The specific git commit short sha. * *Usage:* `build-$(COMMIT)` * **`$(DATE)`**: The date the build occurred. This variable optionally accepts a Ruby `strftime` format string inside parentheses. * *Usage:* `$(DATE(%Y%m%d))` resolves to `20250115` * *Usage:* `v1.$(DATE(%m-%d))` resolves to `v1.01-15` #### Include commit tags? * **Enabled:** Tags associated with the Git commit will be included as tags when pushed to the target repository. * **Disabled:** Tags associated with the Git commit will be ignored. --- ## Build configuration These settings control the technical execution of the build and the resources allocated to it. #### Dockerfile path The path to the Dockerfile within your source repository (relative to the root). This file contains the instructions used to create the image. #### Platform The target architecture for the image. * **linux/amd64:** Standard Intel/AMD 64-bit architecture. * **linux/arm64:** ARM-based 64-bit architecture. #### CPU The amount of CPU computing power allocated to the build runner. 1000 millicores equals 1 full CPU core. #### Memory The amount of RAM allocated to the build runner, measured in Mebibytes (MiB). --- ## Build triggers These settings define the automation rules for when a build should start. #### Included branches A list of branches that will trigger this builder. You can use wildcards (`*`) to match multiple branches (e.g., `feature/*` matches all feature branches). If no included branches are specified, all branches are included. #### Excluded branches A list of branches to ignore, even if they match the **Included branches** list. This is useful for preventing builds on specific maintenance or test branches. #### Build on commit * **Enabled:** A build starts automatically whenever code is pushed to a matching branch. * **Disabled:** Builds must be started manually. --- ## Deployment These settings concern additional actions that will be taken upon successful completion of a build. ### Target clusters To integrate your container images directly into your deployment pipeline, add one or more managed clusters to this field. When the builder successfully completes a build, these target clusters will be updated with the new container image and a new deployment using that image will be created. --- # Deploy egress proxy URL: https://docs.webscale.com/docs/how-tos/egress-proxy/deploy/ Description: This guide outlines the steps to deploy an egress proxy. ## Prerequisites Before you begin, ensure that the environment that you want to use an egress proxy in has an NFS server, and you have access to ssh to it. ## 1. Check the version of the NFS server From the command line on the NFS server, run the following cat command to check the version. If the `/etc/webscale/image` file is not exist, the NFS is running an older version. ```bash $ cat /etc/webscale/image nfs-server-2026.6 ``` If the version of the NFS server is less than 2026.6, open a support ticket to have the NFS server upgraded. ## 2. Create an origin certificate Go to the application menu for any application in the hosted the environment and choose "Origin certificate". Enter all hostnames for the sites that will be proxied. Download the key and the certificate. {{< figure src="/images/egress-proxy/origin_certificate.png" width="12%" alt="Origin certificate" >}} ## 3. Upload certificates to NFS server Using your preferred editor on the NFS server, copy the content of the downloaded certificate to the file `/etc/egress-proxy/origin.crt`. Put the key in `/etc/egress-proxy/origin.key`. ## 4. Start egress proxy service Use the following command to enable and start the egress proxy service. It will automatically start on subsequent reboots. ```bash sudo systemctl enable --now egress-proxy.service ``` ## 5. Monitor and verify logs To confirm the proxy is working or to troubleshoot connection issues, monitor the egress proxy log file. Use tail to watch requests as they arrive at the proxy: ```bash tail -f /var/log/egress-proxy.log ``` --- # Configure web servers URL: https://docs.webscale.com/docs/how-tos/egress-proxy/configure/ Description: Follow these steps to configure a web server to route its outbound traffic through the egress proxy. ## Prerequisites Before you begin, ensure you have setup an NFS server with egress-proxy. ## 1. Configure web server cluster Configure metadata that tells the system where the proxy is located and which hostnames are proxied. Using the control panel clusters editor, add the following metadata to your cluster configuration: | Key | Example Value | Description | | :--- | :--- | :--- | | **`PROXY_ADDRESS`** | `10.40.4.42` | The IP address of your NFS server. | | **`PROXY_HOSTNAMES`** | `app1.com app2.com` | A space-separated set of hostnames using the proxy. | {{< figure src="/images/egress-proxy/cluster_metadata.png" width="60%" alt="Example" >}} If your cluster is managed, adding metadata will cause automatic deployment. For an un-managed cluster, a manual deployment is necessary. ## 2. Verification After a web server is initialized, use SSH connect to open a terminal window and run a command to verify the proxy is used. Use any of the hostnames that you specified in `PROXY_HOSTNAMES`. The output of the command should show the address of the NFS server and a successful status code. ```bash $ curl -sw '%{remote_ip} %{response_code}\n' -o /dev/null https://app1.com/ 10.40.4.42 200 ``` --- # How to Contact Support URL: https://docs.webscale.com/docs/getting-started/support/ Description: A guide to contacting Webscale Support There are multiple ways to contact Webscale Support if you have queries or need help resolving an issue with Webscale products. - Normal support requests, such as information or changes to production systems, should be sent to [support@webscalenetworks.com](mailto:support@webscalenetworks.com). - Critical requests, such as issues that are impacting your users’ ability to checkout or purchase items through your site, should be sent to [critical@webscalenetworks.com](mailto:critical@webscalenetworks.com). There is also a [Support Portal](https://support.webscalenetworks.com). Log in to the Support Portal to open new tickets or manage existing tickets. ## Sign up for the Support Portal The first time you visit the Support Portal you must sign up. When you visit the portal, you see the following page where you can sign up or login: {{< figure src="/images/support-portal/signup0.png" width="75%" alt="Support portal login page" >}} To sign up for a new account, click the **Create an Account** button. Enter your personal, address and login information and then solve the captcha challenge. {{< figure src="/images/support-portal/signup1.png" width="25%" alt="Support portal personal information during signup" >}} {{< figure src="/images/support-portal/signup2.png" width="25%" alt="Support portal address information during signup" >}} {{< figure src="/images/support-portal/signup3.png" width="25%" alt="Support portal dashboard" >}} Once submitted, an account will be created and you will be redirected to the [Support Portal](https://support.webscalenetworks.com). {{< figure src="/images/support-portal/dashboard.png" width="75%" alt="Support portal login page" >}} ## Create a new ticket via the Support Portal Once logged in, open new support tickets from the **Contact Us** tab. Fill in all the mandatory details. Relevant **Subject**, **Description** and **Case Priority** should be selected for the tickets to get routed to the appropriate queue for faster response. You can also attach screenshots or log files while creating a ticket. {{< figure src="/images/support-portal/contact-us.png" width="75%" alt="Support portal 'Contact Us' form" >}} ### Setting case priority {{< figure src="/images/support-portal/case-priority.png" width="75%" alt="Support portal case priority select" >}} Choose the appropriate **Case Priority** for the ticket from the drop-down: - **1 - Critical - Business Impacting**: Issues that are impacting customers’ ability to checkout or purchase items through the site. This can also be logged by sending an email to [critical@webscalenetworks.com](mailto:critical@webscalenetworks.com). - **2 - Non-Critical**: Issues pertaining to information or any configuration changes on production/staging/development environments. - **3 - Query - Technical**: Queries related to features and functionality of the Webscale product. - **4 - Query - Non Technical**: Any non-technical queries, e.g. something related to the Support Portal or Slack. - **5 - Scheduled Activity**: Request for any scheduled task like upgrading or downgrading a service, pre-scale in/out for clusters, patching, etc. ## Updating an existing ticket Check and update existing tickets from the **My Tickets** section under the profile icon in the upper right corner. {{< figure src="/images/support-portal/update-existing-ticket.png" width="25%" alt="Update existing tickets" >}} This will show the list of all the tickets which are resolved, currently being worked on or are waiting for a response either from you or Webscale Support. {{< figure src="/images/support-portal/list-tickets.png" width="75%" alt="My tickets" >}} When a ticket is in progress, click **Ticket Reference Number** or **Subject** in the list to update the ticket or read the response from Webscale Support. {{< figure src="/images/support-portal/reply-or-close-ticket.png" width="75%" alt="Reply or close ticket" >}} ### Add a user to a ticket If another user in your organization should be sent a copy of the ticket, you can do so by adding the user. {{< figure src="/images/support-portal/add-user-to-ticket.png" width="25%" alt="Add user to ticket" >}} You can also edit the ticket properties, if needed. {{< figure src="/images/support-portal/ticket-properties.png" width="75%" alt="Ticket properties" >}} ## Resolve a ticket If your issue has been resolved, you can choose to mark the ticket as such. Once a ticket is resolved, you can choose a satisfaction rating. If the same issue recurs, the same ticket can be re-opened within 30 days from the ticket closure date. {{< figure src="/images/support-portal/resolve-ticket.png" width="75%" alt="Resolve ticket confirmation" >}} {{< figure src="/images/support-portal/resolved-ticket.png" width="75%" alt="Resolved ticket" >}} ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Frequently Asked Questions](/docs/faq/) --- # How to Complete the Onboarding Questionnaire URL: https://docs.webscale.com/docs/getting-started/onboarding/ Description: A guide to completing the onboarding questionnaire A new application needs to be integrated to the Webscale network in order to be added properly. This integration is customized to each application for the best performance. To ensure the integration is done accurately, Webscale's onboarding team must gather some information about the application. To ensure communication flows properly, some information about your organization is also needed. Webscale's onboarding team will send you a spreadsheet to gather this information. ## Contact and company info To ensure that Webscale's team can communicate with your organization, Webscale requires some contact information. {{% alert title="Note:" %}} _Some or all of the following may be required, depending upon your organization._ {{% /alert %}} #### Contact information Webscale asks for a primary contact, a technical contact, and an after hours or escalation contact. These contacts do not necessarily need to be different parties. Please supply the following information for each of these contacts: - Name - Email address - Main contact number - Cell phone number - Business or availability hours - Time zone You may also want the following user accounts created for the above contacts on Webscale's system so they can more easily contact us. Please provide the email addresses for any users you want these accounts created for. - Slack user account - Support portal account Once you have admin access to the Webscale Control Panel, you can also [invite users](/docs/how-tos/general/user-roles/) to the portal. #### Third party and system integration information Oftentimes, applications integrate with third party systems to add functionality required by your organization. If your application has these integrations, Webscale may require the following contact information for them: - Company name - Primary contact - Developer/s - Is this developer familiar with the application's code base? #### Billing contact Webscale will also need to be able to contact your organization's billing or accounting department. Please provide the following information for this contact: - Name - Phone number - Email address #### Corporate information Webscale requires the following information for legal and taxation purposes. - Complete legal name of your company/organization. - Address, including City, State, and ZIP code. - Corporate website address. - Main corporate phone number. ## Current hosting environment Webscale's onboarding team will need information about the application's current hosting environment so the team can integrate the application to the Webscale network. {{% alert title="Note:" %}} _Some or all of the following may be required, depending upon your application's configuration._ {{% /alert %}} #### Network and architecture descriptions The following information about the application's network and architecture will help the onboarding team access the application. - Current hosting company. - Is an architecture diagram available? - Whitelisting/blacklisting: are there any currently whitelisted or blacklisted addresses? If so, please provide those. - Current database type? (RDS, MySQL, etc.) - Origin IP address: the current IP address of the application. #### Current server SSH access If your team requires that Webscale copy your files to the Webscale Networks environment, then SSH access will be required. The SSH user can be one created specifically for Webscale, or it can be an existing user account. - IP Address: the IP address used for SSH connections to the application. - Username: the SSH username for Webscale to use. - Password: the SSH user's password. - Is the user `root` or does the user have `sudo` access? We recommend creating a `sudo` user. - Is a public key requested from Webscale? - If your application is firewalled and Webscale's IP address needs to be whitelisted, please add `35.165.34.92` to the whitelist so we can access it. #### Current DNS information Please share the current DNS provider's name here. ##### Complete list of domain names In addition to the above DNS information, Webscale will also need to know all the current domain names in use by the application, including: - Main site: is this using the apex domain, i.e. no subdomain or `www`? - Alternate sites - Blogs - Microsites - Development or staging sites - All others #### Staging/dev environment If you have a staging or development environment for your application, please share that information accordingly. - What domain or domains are needed for staging? - If the staging site uses a separate domain from the main site (i.e. is not a subdomain, etc.), do you have an SSL certificate for this domain? - Are there different `MAGE_RUN_CODE` or `MAGE_RUN_TYPE` settings you'd like to set? (Magento only) - Are there any SSH keys you'd like to add or remove? - What is the document root you expect on the staging environment? - Would you like to keep this document root the same or change it to something else? #### SSL certificates To ensure no interruption of the site's `https` settings, please share information about the SSL certificates in use. - What type of SSL certificates are currently in use? (Wildcard, EV, SAN, etc.) - Who is the SSL provider? ## Magento application If your application is built on Magento, Webscale will require some information about the Magento application and it's environment. #### Magento Please share the following Magento-specific details: - Magento version - Magento admin - Magento "from" email address - Magento search - Full page cache (entirepise, Lesti, Amasty, etc.) #### Email Webscale also requires information about the application's email server and environment. For example, Webscale needs to know whether you are using your own hosted email server (`localhost`), or a plugin or third party service such as SendGrid or Mailchimp. - How do you send marketing emails? - How do you send transaction or order confirmation emails? - Are emails sent directly from the data server? - Is the web server in use Apache or Nginx? - What web server modules are you using? #### PHP version What PHP version is the application currently using? #### WordPress If you have a blog or additional site using WordPress, please share the following details: - WordPress public URL. - WordPress installation path. #### CDN Will you be using Webscale's CDN provider (CloudFront)? #### External system integrations If your application integrates with external systems, please share information about those as well. - Warehouse - Inventory - ERP - CRM - Shipping - Other - Who is the payment processor? - Are there any modules that require a static IP address? - Any additional applications setup? (examples: New Relic, Elastic Search, SOLR, etc.) #### Load testing Please let the Webscale team know if you plan on doing load testing of the application. #### Code deployment method If your team uses a version control system to deploy the codebase of the application, please share that information here. For example, if your team uses Git and GitHub, please share the access information for the repository. ## Webscale, AWS, and GCP environment All of the information on these tabs will be completed by Webscale to document the details of the architecture that Webscale will provision. ## Conclusion Now that you've provided these details to the Webscale onboarding team, they will start getting your application onboarded and integrated with the Webscale Network. ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Frequently Asked Questions](/docs/faq/) --- # Webscale Go-live Process URL: https://docs.webscale.com/docs/getting-started/go-live/ Description: A brief explanation of the go-live process for your application on Webscale's network ## What to expect from the go-live process Once your application has been fully integrated into Webscale’s network and tested, it will be ready to go live. Before the final go-live process can take place, there are some checks both you and Webscale will do to ensure a smooth transition. ## Before go-live Before the site goes live, perform some testing to ensure the application works as expected. You will also work with Webscale’s team to ensure that important information and dates are agreed on to avoid any miscommunication, possible delays, or unforeseen downtime of the application. ### Pre-live checklist The pre-live checklist is a list of items that the Webscale team will complete before the go-live date. In some cases, they may require some assistance from you on certain steps in the pre-live checklist. If this is the case, the Webscale team will reach out to you to let you know. ### Testing - Test your code deployment process. Your codebase needs to be properly deployed prior to go-live. - Test that every action that every user can take on the site will work appropriately from all allowed IP addresses. This testing includes the following: - General browsing on the site (both as a customer logged in or out). - Proceed through the entire checkout process (start to finish) for all types of products. - Ensure that all product and category pages load as expected. - Every user who uses the Admin panel should test that their functionality works properly for themselves. - Developers must test their code deployment process. - Webscale will contact you via the dedicated Slack channel once the pre-live checklist is complete. ### Other important steps - You and Webscale will work out the go-live date and time. Any changes should be communicated as soon as possible. We request at least 3 business days advance notice to schedule resources for the go-live and to complete the pre-live checklist. - Between now and the go-live date, Webscale will stay in communication with you on the status of the transition. This may be done via Slack or email, or both. - To avoid excessive downtime, please lower the TTL on your DNS zone prior to go-live day. Webscale will communicate the proper DNS records to use when launching the site. - Your deployment team will want to familiarize themselves with [Webscale CLI](/docs/how-tos/advanced/webscale-cli/), Webscale’s command-line tool. ## The go-live process Within three days of the date you’ve chosen for the site to go live, Webscale will complete a dry-run of the site and perform some testing. There are also some steps you will have to take. This process includes some or all of the following tasks, depending on your application: - Is maintenance mode available on the current site? Webscale offers maintenance mode for the application once it’s on our network, and this will be set during testing. You can and should upload a custom maintenance page in your Webscale control panel. See [How to Set Maintenance Mode](/docs/how-tos/general/maintenance/#upload-a-microsite) for instructions. - Webscale will ensure there is a final sync/copy of the application’s database, media, and any NFS (network file system). This can also be done by you or your development partner. - You and Webscale both will then test the site using a temporary hostname. - At least one day prior to go-live day, lower the TTL on the DNS zone for the domain the application will use. Once the TTL change has propagated, the new host record entry can be added as it will now propagate more quickly, reducing any downtime. Make this change at the pre-arranged time. - The last step is to unset the Webscale maintenance page and then test the site using the domain instead of the temporary hostname. ## Completion Once the site has gone live, you'll receive a confirmation email from Webscale Networks. This email will contain a link you can click to schedule a meeting with the customer success team. In this meeting you can discuss how the process has gone so far and what to expect from the Webscale customer success team. The email also contains important information about [contacting support](/docs/getting-started/support/) and using the Webscale Control Panel. ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Frequently Asked Questions](/docs/faq/) --- # How to Deploy Your Code on Webscale URL: https://docs.webscale.com/docs/getting-started/deploy/ Description: Information on how to deploy your code and details about how the deployment process works. The Webscale deployment process is a modern [CI/CD](https://en.wikipedia.org/wiki/CI/CD) pipeline, with your code being managed by source control and then deployed using [Docker](https://www.docker.com/) containers. This removes the majority of downtime associated with deploying the code for a new application or website. In the past, it was necessary to set your Magento application to maintenance mode while the build processes were run, often resulting in downtimes of at least 1-2 hours. Using this modern CI/CD pipeline not only ensures little to no downtime, but also allows you to fix any problems with the site much more quickly. {{% alert title="Note:" %}} Since this deployment process is new, not all existing customer implementations are designed to use it. Customers who are on the legacy deployment method and would like to redeploy using the Docker-based deployment method outlined here should reach out to their Webscale account manager to discuss their options. {{% /alert %}} This deployment process uses Docker containers and the [AWS ECR](https://aws.amazon.com/ecr/) container registry to take all of the code compilation steps that are part of the build process and add them to a Docker deployment script, which uses the code from your source control to build an image. This Docker image build can be run on a staging server while the production site is still live. This allows your team to test and verify the new deployment without impacting your customers. Once you’ve verified that the site builds properly, you can deploy the same image to production quickly, while all of the site’s assets are simultaneously deployed, resulting in near-zero downtime. Since a new build can be done quickly with a Docker script, any problems with the production site can be quickly resolved by simply rolling back to an older Docker image stored in the container registry. {{% alert title="Note:" %}} Docker container images deployed on Webscale are deployed as `read-only`, to help ensure the stability and integrity of the production environment. Any code changes or testing should be done using a Docker image on a staging environment. Once the image has passed your testing, you can then deploy it to production, replacing the current production environment. Since this deployment process uses containers, there is little to no downtime as part of the process because the build has already been verified. {{% /alert %}} {{% alert title="Warning" color="warning" %}} These steps are a general outline that applies in most situations. Your situation may differ depending upon the configuration of your application and its implementation. If so, more specific details will be provided during the onboarding process. {{% /alert %}} ## Build process 1. Webscale will authorize OAuth access to the AWS account for your Git repository (either [GitHub](https://github.com/), [Bitbucket](https://bitbucket.org/) or [GitLab](https://gitlab.com/)). 2. Upon a push into your Git repo, `codebuild` will build a container image with your code. - This process uses the Dockerfile to create the container image (a default Dockerfile template can be provided, if required). **Note**: Future images will have a "commit ID" tag by default - this comes from the Git repository. 3. Once the container is built using the Dockerfile, the container is pushed to AWS ECR. 4. ECR runs a vulnerability scan on the container. ## Deployment process During onboarding, Webscale will grant you access to a deployment system via SSH that is specific to the environment to which you want to deploy. Run these commands in that environment (i.e., production or staging). The following procedure provides instructions for deployment for a staging environment. In the example, the commit id is "abc123" and Git branch name is "m2stage." {{% alert title="Note:" %}} You may need to upgrade your environment if you don't see any Git branch tags [*branch-branchname*]. Please let us know if this is the case. {{% /alert %}} ### To deploy in a staging environment SSH into the deployment system and run the following commands: 1. Run `list-images`. - Find the container that you want to deploy in the list. The images are sorted from oldest to newest with the oldest image at the top, so that the latest built image is at the bottom. 2. If you know your commit ID, run `tag-by-commit [commit id] staging` to tag the image as ready to deploy. -OR- If your environment supports tagging by branch, run `tag-by-branch [branch name] staging` 3. Run the deployment script: `run-deploy-and-cleanup` **Example** ``` $ list-images "sha256:250eab59befa478121d87a06adf2745b32ceb97166d7d1fc99800785feada144": [ "branch-m2dev", "commit-xyzasdf", "staging" ] "sha256:035dbb834079c8103c4193ce4c6ac1609d1c2f7fdf9556635770f83dbb4e5e30": [ "branch-m2stage", "commit-abc123", ] $ tag-by-commit abc123 staging OR $ tag-by-branch m2stage staging 2021-08-08T08:08:08 [*docker tag*] Assigning tag staging to image [commit(abc123) digest(sha256:abcxyz456)]. $ run-deploy-and-cleanup Waiting for servers to verify...complete New cluster example-env-b is live. Waiting 30 seconds before cleaning up old cluster example-env-a Deleting old servers Done ``` ## Definitions - **Docker container**: A standard unit of software that packages code and all its dependencies so the application runs quickly and reliably from one computing environment to another. - **Container image**: A lightweight, standalone, executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries and settings. - **Dockerfile**: A text document that contains all the commands a user could call on the command line to assemble an image. - **Container registry**: A collection of repositories made to store container images. - **OAuth**: An open standard for access delegation, commonly used as a way for internet users to grant websites or applications access to their information on other websites but without giving them the passwords. - **Git**: A distributed version-control system for tracking changes in any set of files, originally designed for coordinating work among programmers cooperating on source code during software development. ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Frequently Asked Questions](/docs/faq/) - [Dockerfile Reference](https://docs.docker.com/engine/reference/builder/) --- # Webscale Application Architecture URL: https://docs.webscale.com/docs/overview/architecture-overview/ Description: A Brief Overview of the Application Architecture managed by Webscale Webscale manages (and optionally, hosts) applications running on hyperscale cloud providers with its established architecture guidelines. This document provides insight into the Application architecture managed by Webscale. We deploy the code to a centralized server where it's then horizonally scaled across multiple servers based on configuration set by the customer. This collection of servers is also known as an Application Cluster. Several commands help manage this sync process and the symbolic links that allow all application servers to log to the centralized server, also called a _dataserver_. ## Definitions: #### Dataserver This is the centralized database and content server. It hosts an NFS (network file system) file share for static content and several [Redis](https://redis.io/) datastores that are memory-based fast caches. Magento cache, full page cache, and sessions use the Redis datastores. The dataserver is also the primary location for hosting the code. When you update your code, Webscale syncs it to the application server. Cron is also normally hosted here. In some architectures, the database and data server may be separated into different servers for increased efficiency. The database may also have a replica in another region/zone, mirroring the database contents to ensure business continuity. #### Application server/Web server This is the distributed, auto-scaling part of your application environment. It hosts the web server and the PHP portions. We use symbolic links inside the `/var/www/sitename` directory (also known as the _document root_) structure to point to directories hosted on the NFS (network file system) share. This way the application can share static content without having to sync huge amounts of data from the dataserver to the application server. This also allows logging directories within Magento or other applications to log code-related errors to a centralized, non-transient location. #### Webscale data plane/ADC/Proxy These are all synonyms for the Webscale platform component that “fronts” your application infrastructure. (ADC is an acronym for *application delivery controller)*. The Webscale data plane sits between your application and the internet, functioning as a reverse proxy, managing and protecting traffic accessing the application. It can do many things - load balancing, web application firewall, caching, and more. It also has a powerful DIY policy engine called **Web Controls**. A common use case that we enable through **Web Controls** is to protect your admin login pages by blocking traffic from all but the whitelisted addresses. ## Separation of responsibilities There are two distinct spheres of responsibility, although there is overlap in some areas. Webscale is responsible for infrastructure, and you, the Webscale customer, are responsible for code. Overlap comes into play when it’s related to cron jobs, Apache settings, and PHP settings on the web servers. Code is the PHP core of the site, including the interactions of code with the MySQL database. There are lots of interactions of code with infrastructure, but the Webscale staff are not PHP programmers, so we can only help up to a point. Code also includes images, documents, and other static assets. Static content usually goes on the network drive so that it doesn’t have to be synced to every web server created. Infrastructure is the “backend hardware” of the site. Yes, your site is virtualized, but all that virtual stuff is designed to be a virtual representation of some bit of hardware that could be physically manifested outside the cloud—for example, servers, disks, RAM, server software, and network. {{% alert title="Note:" %}} The overlap is extensive, but rest assured, we do the best we can to help when we have sufficient experience and knowledge of your code deployment. {{% /alert %}} ## Code deployment layout In the webscale environment, there are typically two separate disks that hold code. The first is `/var/www/www.site.net`. {{% alert title="Note:" %}} This directory is exactly what you would expect it to be. It contains all the workings and contents of the site. {{% /alert %}} The second is `var/www/shared/www.site.net`. {{% alert title="Note:" %}} This is the network shared file system. We place static content and certain log files here. Since it mounts to each web server at startup, it allows Magento or Wordpress logs to be written back to the dataserver and be easily accessible. This magic is possible because we use symbolic links from the first directory that points to the second directory. {{% /alert %}} For example, we set up `/var/www/www.site.net/var` to point to `/var/www/shared/www.site.net/var`. The symbolic link is then replicated by the sync process to the web server so that it is consistent across a cluster. We can also use this for upload directories to ensure that any upload to any web server is immediately available across the cluster. Other links include images or other large media files. We like to sync as little as possible to the web server so that it can quickly start when needed. There are a couple of Webscale specific commands that are very useful in this environment. The two most common are ACS and webscale-cli which are documented on our website on the [Webscale CLI Reference Guide](/docs/how-tos/advanced/webscale-cli/). ## Deployment best practices 1. Use the `www-upload` user for deployment. Use the command `sudo -iu www-upload` to switch to this user. 2. To fix any permission issues on the dataserver run `sudo webscale-cli deploy permissions`. 3. To fix any permission issues on the web node, run `sudo webscale-cli deploy app_permissions`. 4. To check for a sync issue and to ensure that sync is working run `acs sync && acs status -w && acs sync-status`. ## Accessing your servers As a customer, you usually would not need to access any web server, as they are transient, and we forward logs to the dataserver. We control access to the dataserver with ssh or secure shell. We strictly enforce public key authentication as passwords are too easily compromised. As such, we add any customer login to a list of users that can use `sudo` to become `www-upload`, the primary web content owner. You also need `sudo` to run the two Webscale CLI commands mentioned above. ## Webscale Control Panel A vital window into your website is the [Webscale Control Panel](https://control.webscale.com/). The Webscale Control Panel allows you to view or take action on different aspects of your application, including but not limited to: - Monitor traffic - View security policies - Analyze performance - Troubleshoot errors - Configure the Webscale services available to the application (such as setting up PHP whitelisting and blacklisting, for example) ### Tips PHP whitelisting and blacklisting is important to protect your site from common PHP hacks. You usually would blacklist all PHP scripts, and then whitelist the scripts you know are used in your site. You can and should [set up a whitelist](/docs/how-tos/security/whitelist/) for your Magento admin page, and [block all other IP addresses](/docs/how-tos/security/blacklist/). You can also use the control panel to put your site into [maintenance mode](/docs/how-tos/general/maintenance/) when you need to work on it. Please explore the [Webscale control panel](https://control.webscale.com/) to become familiar with it. ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [How to Contact Support](/docs/getting-started/support/) - [Frequently Asked Questions](/docs/faq/) --- # The Webscale Control Panel Dashboard URL: https://docs.webscale.com/docs/overview/dashboard/ Description: A Brief Overview of the Webscale Control Panel Dashboard The dashboard is the home page of the [Webscale Control Panel](https://control.webscale.com) and is displayed when you first log in. The dashboard contains links to other important areas of the control panel and includes some essential information about your Webscale account and applications. {{< figure src="/images/account-dashboard.png" alt="Webscale Control Panel Dashboard" >}} ### Main Navigation The main navigation bar contains a dropdown menu at the name of the current account - this allows you to choose from the accounts you have with Webscale if you have more than one. Next to this is the gear, which is where you will find the following links: | | | |---|---| | {{< figure src="/images/gear-menu.png" alt="Gear Menu" >}} |
  • **Account Settings**: Click here to go to the control panel page to adjust account settings.

  • **Legacy UI**: Click here to be taken to the legacy control panel.

  • **Documentation **: Click here to open the Webscale Documentation in a new window.

  • **Get support**: Click here to view information about how to contact Webscale Support.

  • **Logout**: Click here to log out of the control panel.
| {{% alert title="Note:" %}} Depending upon the access level of your user account, you may not have all of these options. {{% /alert %}} The main navigation menu also contains a timer icon and a user icon. - Click on the timer icon to show the **Task Monitor**. This shows any tasks that have run in the last 24 hours, and whether they completed or not. Click the **Zoom** button to go to the full **Task Monitor** page. - Click on the user icon to visit the user preferences page. Use the **User Editor** to make changes to the current user, and click the **Access Keys** tab to view existing API keys or create a new one. ### Page Contents Under the main navigation bar, the page has several boxes displayed. From left to right, top to bottom, these are: | | | |---|---| | **Data transfer** | Displays the data transfer used by the current account. Contains a daily total and the total for the current month. | | **Sessions** | Displays a count of user sessions for the current account. Contains a daily total and the total for the current month. | | **Page Views** | Displays the page views for the current account. Contains a daily total and the total for the current month. | | **Billing** | Displays the current amount due, the due date, and the amount and date the last payment was received. | | **Events** | Displays the most recent events reported for the account. Click the **Zoom** button to get more detailed information about these events.
On the Events page, you can also click **Search** to search the events, and click **Time** to view events for a specific time frame. Click **Dashboard** on the upper left to return. | | **Application Boxes** | The top of the application box contains the hostname of the application, as well as icons indicating the status of the application's SSL and the Webscale Shield. Mouse over either icon for more information.
Click the **Zoom** button to go to the control panel for the application. Click the 3 vertical dots to display a menu showing many of the options that are also on the application’s control panel. {{< info-mark >}}More details about this menu are [below](#application-box-actions-menu). The application boxes also display some information about your applications at a glance, including:
  • **Webscale hostname**
  • **Uptime**
  • **Scaling**, **Requests per Second**, and **Response Time** graphs showing the last 24 hours.
  • Whether the application is currently running or not.
  • Cache miss rate displayed as a percentage.
  • Servers displayed as icons - mouse over each icon to get the IP address of the server.
|
#### Application Box actions menu Click the 3 vertical dots on the upper right corner of the Application box to display the actions menu for your Application. | | | |---|---| | {{< figure src="/images/application-actions-menu.png" alt="Application Box actions menu" >}} |
  • **Diagnose**: Click here to go to the diagnose panel for the application.
    Displays diagnostic information about the application.
    **Probes** shows the current status of some application metrics.
    **Events** will display the events log page for the application.

  • **Edit**: Click here to go to a panel to edit various settings for your application.

  • **Advanced Edit**: Click here to go to the advanced edit panel for the application.

  • **Traffic Viewer**: Click here to go to the [Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/).

  • **CSP Reports**: Click here to go to the [CSP Reports](/docs/how-tos/web-controls/csp-create/#viewing-the-content-security-policy-logs) viewer.

  • **View Configuration**: Click here to view the current configuration details for this application.

  • **Flush Caches**: Click here to [flush the site and Pagespeed caches](/docs/how-tos/advanced/site-cache/).

  • **Start maintenance**: Click here to put the application into [maintenance mode](/docs/how-tos/general/maintenance/).

  • **Enable shield**: Click here to enable [shield mode](/docs/how-tos/general/shielding/).

  • **Whitelist**: Click here to view and configure the [whitelist](/docs/how-tos/security/whitelist/).

  • **Blacklist**: Click here to view and configure the [blacklist](/docs/how-tos/security/blacklist/).
| ## Further Reading - [How to Invite Users](/docs/how-tos/general/user-roles/) - [How to View Webscale Application Server Information](/docs/how-tos/advanced/appserverinfo/) - [How to Manage Web Controls](/docs/how-tos/web-controls/webcontrols_manage/) - [Webscale FAQ](/docs/faq/) --- # Basic How-To Guides URL: https://docs.webscale.com/docs/how-tos/general/ Description: Guides on using basic features through the Webscale Control Panel --- # How to Create Roles and Invite Users URL: https://docs.webscale.com/docs/how-tos/general/user-roles/ Description: How to create roles and invite users in the Webscale Control Panel After completing the Webscale onboarding process, you will have your own Webscale account. Access to this account is controlled via roles. By default, your new account includes a few important roles to help you get started: **Editor** and **Reader**. In general, editors will have access to view, create, modify and destroy resources in the account while readers will only be able to view those resources. A user's access in the account is determined by the roles to which they have accepted invitations. This guide details how to create your own custom roles and how to invite users to them. Roles can be used in two separate use cases: - [**Webscale Secure Access**](/docs/how-tos/security/secure-access/): an optional web control action used to protect parts of your applications from the general internet. - [**Webscale API role-based access**](/docs/reference/rbac/): a user's access to the Webscale API is determined by the access described by the roles to which they have accepted invitations. ### Create a role | | | |:---:|---| |{{< figure src="/images/roles-users/roles-menu.png" width="135px" alt="Roles Menu" >}} | 1. Login to the [Webscale Control Panel](https://control.webscale.com) and click the three bars in the upper left.
Select **Roles** from the menu. | | {{< figure src="/images/roles-users/roles-view.png" alt="Roles List" >}} | 2. Here you view existing roles on the [Roles](https://control.webscale.com/roles) page in the Control Panel. {{< info-mark >}}Predefined roles such as **Editor** and **Reader** cannot be deleted. | | {{< figure src="/images/roles-users/roles-access.png" alt="Access" >}} | 3. For [Webscale API role-based access](/docs/reference/rbac/) roles, clicking **APIs** lists the Webscale API access this role provides.| | {{< figure src="/images/roles-users/roles-users.png" alt="Invited users" >}} | 4. Clicking **Users** lists the users that have been invited to assume the role and whether they have accepted, declined or vacated that invitation. | {{< figure src="/images/roles-users/create-role.png" alt="New Role Creation" >}}| 5. Click **Role** in the lower left part of the page to create a new role. In the wizard that appears, you'll be walked through the steps to configure the role. || 6. Roles are fully customizable. It is recommended you set an informative name and description to ease the management of multiple roles. || 7. [Webscale API roles](/docs/reference/rbac/) roles can be configured to apply their access to the account in which the role is created or in the sub-accounts of that account, excluding the account itself. {{< info-mark >}}If your account does not have sub-accounts, select 'Current account'. | || 8. You have control over prerequisites a user must satisfy in order to assume a role to which they have accepted an invitation. These prerequisites are satisfied when the user authenticates with Webscale and include whether [**multi-factor authentication**](/docs/how-tos/security/mfa/) is required and how often they are required to re-authenticate.| | {{< figure src="/images/roles-users/roles-apis.png" alt="APIs List" >}} | 9. [Webscale API roles](/docs/reference/rbac/) roles are configured with the Webscale API access they permit and deny. The wizard allows you to target entire collections of resources (e.g. `/accounts`) or collections of sub-resources (e.g. `/accounts/{id}/invitations`). {{< info-mark >}}Additionally, you can target specific resources using the **Custom APIs** input. Once you've chosen the HTTP method, API and access, click the **+** button to add the custom API to the role configuration. API wildcards are available to you to help make specifying an API easy: for example, `/accounts/*` will match any specific account but none of its sub-resources whereas `/accounts/**` will match any specific account resource and all of its sub-resources. | {{< figure src="/images/roles-users/create-role-invite.png" alt="New Role Creation showing invite box" >}} | 10. Lastly, invite users to the role. Confirm the changes you've made, then click **Save** to save the changes. This action creates the role, and sends invitations to any users invited to the role. {{< info-mark >}}If the user invited does not exist, this action will send an email to the user with a link to sign up. Once they complete sign-up (create a password) and log in, they will be taken to the [User Profile](https://control.webscale.com/profile) and can accept the role.| ### Invite a user to an existing role | | | |:---:|---| | {{< figure src="/images/roles-users/roles-menu.png" width="135px" alt="Roles Menu" >}} | 1. Login to the [Webscale control panel](https://control.webscale.com) and click the three bars in the upper left.
Select **Roles** from the menu. | | {{< figure src="/images/roles-users/roles-users.png" alt="Invited users" >}} | 2. On this page you see existing roles. To invite a user to the role, click the **'Users'** button for the role, then click the pencil in the upper right of the expanded panel. | | {{< figure src="/images/roles-users/create-role-invite.png" alt="New Role Creation showing invite box" >}} | 3. Enter the user's email address, and click the **+** button. A comma-separated list of email addresses can be inputted at a single time. This will send invitations to all the added email addresses. | |{{< figure src="/images/roles-users/invite-user-new-role.png" alt="New Role Invitation Email" >}}| 4. The user receives an email from Webscale with a link to the [User Profile](https://control.webscale.com/profile), where they can accept the role. {{< info-mark >}}If the user invited does not exist, this action will send an email to the user with a link to sign up. Once they complete sign-up (create a password) and log in, they will be taken to the User Profile and can accept the role. | |{{< figure src="/images/roles-users/user-profile.png" alt="User Profile" >}}| 5. In the [User Profile](https://control.webscale.com/profile) the user can manage their password and their multi-factor authentication settings. The user will also see some information about their user account, such as:
  • Any existing roles and groups to which the user belongs.
  • The user's name.
  • The user's email address.
  • Webscale API access keys.
{{< info-mark >}}Users can leave a role. In such an event, they must be re-invited to the role if they wish to regain access. {{< info-mark >}}If the role the user was invited to does not permit Webscale Control Panel access, the user will only have access to their User Profile. This may be the case if you only want the role to apply to the [**Webscale Secure Access**](/docs/how-tos/security/secure-access/) web control, for example.| ## Further reading - [How to Configure Multi-factor Authentication](/docs/how-tos/security/mfa/) - [Webscale API role-based access](/docs/reference/rbac/) - [How to Use Webscale Secure Access](/docs/how-tos/security/secure-access/) - [Web Controls](/docs/how-tos/web-controls/) --- # How to Create Groups and Invite Users URL: https://docs.webscale.com/docs/how-tos/general/groups/ Description: How to create groups and invite users in the Webscale Control Panel # Overview Webscale groups consolidate multiple [roles](/docs/how-tos/general/user-roles/) so they can be managed as one entity. Generally, the encapsulated roles are expected to be related in some way or share similar responsibilities, though this is not a requirement. ## Create a group | | | |---|---| |{{< figure src="/images/groups/menu.png" width="135px" alt="Groups Menu" >}}| 1. Login to the [Webscale Control Panel](https://control.webscale.com) and click the three bars in the upper left.
Select **Groups** from the menu. | |{{< figure src="/images/groups/view.png" alt="Groups" >}}|2. Here you view existing groups on the [Groups](https://control.webscale.com/groups) page in the Control Panel. | |{{< figure src="/images/groups/roles.png" alt="Roles" >}}|3. Clicking **Roles** lists the roles encapsulated by the group. | |{{< figure src="/images/groups/users.png" alt="Users" >}}|4. Clicking **Users** lists the users invited to assume the group and whether they have accepted, declined or vacated that invitation. | |{{< figure src="/images/groups/new.png" alt="Users" >}}|5. Click **Group** in the lower left part of the page to create a new group. In the wizard that appears, you'll be walked through the steps to configure the group. | ||6. It is recommended to use an informative name and description to ease the management of multiple groups. | |{{< figure src="/images/groups/select-roles.png" alt="Select Roles" >}}|7. Select the roles the group should encapsulate. {{< info-mark >}}Via the Control Panel, only roles configured in the current account will be listed. Via the API, any role to which the user has access can be configured.| |{{< figure src="/images/groups/invite-users.png" alt="Invite users" >}}|8. Lastly, invite users to the group. Confirm the changes you've made, then click **Save** to save the changes. This action creates the group and sends invitations to any users invited to the group. {{< info-mark >}}If the user invited does not exist, this action will send an email to the user with a link to sign up. Once they complete sign-up (create a password) and log in, they will be taken to the [User Profile](https://control.webscale.com/profile) and can accept the group.| ## Invite users to an existing group | | | |:---:|---| |{{< figure src="/images/groups/menu.png" width="135px" alt="Groups Menu" >}}| 1. Login to the [Webscale Control Panel](https://control.webscale.com) and click the three bars in the upper left.
Select **Groups** from the menu. | ||2. On this page you see existing groups. To invite a user to the group, click the **Users** button for the group, then click the pencil in the upper right of the expanded panel.| | {{< figure src="/images/groups/invite-users.png" alt="Inviting a user to an existing group" >}} | 3. Enter the user's email address, and click the **+** button. A comma-separated list of email addresses can be inputted at a single time. This will send invitations to all the added email addresses. | |{{< figure src="/images/roles-users/invite-user-new-role.png" alt="New Role Invitation Email" >}}| 4. The user receives an email from Webscale with a link to the [User Profile](https://control.webscale.com/profile), where they can accept the role. {{< info-mark >}}If the user invited does not exist, this action will send an email to the user with a link to sign up. Once they complete sign-up (create a password) and log in, they will be taken to the User Profile and can accept the group. | |{{< figure src="/images/roles-users/user-profile.png" alt="User Profile" >}}| 5. In the [User Profile](https://control.webscale.com/profile) the user can manage their password and their multi-factor authentication settings. The user will also see some information about their user account, such as:
  • Any existing roles and groups to which the user belongs.
  • The user's name.
  • The user's email address.
  • Webscale API access keys.
{{< info-mark >}}Users can leave a group. In such an event, they must be re-invited to the group if they wish to regain access. {{< info-mark >}}If the role the user was invited to does not permit Webscale Control Panel access, the user will only have access to their User Profile. This may be the case if you only want the role to apply to the [**Webscale Secure Access**](/docs/how-tos/security/secure-access/) web control, for example.| --- # How to View Users and Remove Their Access URL: https://docs.webscale.com/docs/how-tos/general/users/ Description: How to view users, reset their MFA, and remove their access in the Webscale Control Panel Access to Webscale accounts are controlled via [Roles](/docs/how-tos/general/user-roles/) and [Groups](/docs/how-tos/general/groups/). For users with admin type permissions, the Users page facilitates easy viewing of the users that have a role or group defined in an account. In addition, the Users page allows easy resetting of a user's MFA, removal of all a user's access to an account, and revoking an individual invitation from a role or group. The table on the Users page displays information about each user: their email which functions as their unique identifier, their name, when they were created, and the last time they changed their password. Click on a user's row to display the roles and groups that user has been invited to as as well as when the invite was sent and accepted. On the Users page within a particular account called the **Users account**, Webscale administrators can utilize four additional features: view all users across all accounts, view users with removed access, view a user's roles and groups across all accounts, and remove a user's access from all accounts. {{< figure src="/images/users/users-page.png" width="100%" alt="Users Page">}} ## Reset a user's MFA | | | |:---:|---| |{{< figure src="/images/users/users-navlist.png" width="135px" alt="Users Navlist" >}} | 1. Login to the [Webscale Control Panel](https://control.webscale.com) and click the three bars in the upper left.




2. Open the **Access Control** accordion and then select **Users** from the menu. | | {{< figure src="/images/users/users-page.png" alt="Users Page" >}} | 3. This Users page shows users that have access to this account. | |{{< figure src="/images/users/users-more-menu.png" alt="Users More Menu" >}} | 4. Click the more menu on the far right of a user's row. |{{< figure src="/images/users/users-reset-mfa-option.png" alt="Users Reset MFA Option" >}} | 5. Click the **Reset MFA** option. {{< info-mark >}}If the user is not enrolled in MFA, the Reset MFA option will be disabled with a tooltip on hover that says "No MFA enabled".| |{{< figure src="/images/users/users-reset-mfa-modal.png" alt="Users MFA Modal" >}} | 6. Click **Reset MFA** button on the modal and observe a "MFA was reset successfully" confirmation message. {{< info-mark >}}If you do not have sufficient permissions to reset another user's MFA then a error message will be displayed.| ## Remove a user's access | | | |:---:|---| |{{< figure src="/images/users/users-navlist.png" width="135px" alt="Users Navlist" >}} | 1. Login to the [Webscale Control Panel](https://control.webscale.com) and click the three bars in the upper left.




2. Open the **Access Control** accordion and then select **Users** from the menu. | | {{< figure src="/images/users/users-page.png" alt="Users Page" >}} | 3. This Users page shows users that have access to this account. | |{{< figure src="/images/users/users-more-menu.png" alt="Users More Menu" >}} | 4. Click the more menu on the far right of a user's row. |{{< figure src="/images/users/users-remove-access-option.png" alt="Users Remove Access Option" >}} | 5. Click the **Remove All Access** option. {{< info-mark >}}If the user is yourself then the Remove All Access option will be disabled with a tooltip on hover that says "Cannot remove own access". {{< info-mark >}}If you do not have sufficient permissions to remove another user's access the option will be disabled with a tooltip on hover that says "Insufficient permissions".| |{{< figure src="/images/users/users-remove-access-modal.png" alt="Users Remove Access Modal" >}} | 6. Click the **Remove All Access to This Account** button on the modal and observe a confirmation message.| ## Revoke a user's invitation to a role or group | | | |:---:|---| |{{< figure src="/images/users/users-navlist.png" width="135px" alt="Users Navlist" >}} | 1. Login to the [Webscale Control Panel](https://control.webscale.com) and click the three bars in the upper left.




2. Open the **Access Control** accordion and then select **Users** from the menu. | | {{< figure src="/images/users/users-page.png" alt="Users Page" >}} | 3. This Users page shows users that have access to this account. | |{{< figure src="/images/users/users-details-drawer.png" alt="Users Details Drawer" >}} | 4. Click a user's row to open a user's details drawer. |{{< figure src="/images/users/users-trash-can.png" alt="Users Trash Can Icon to Revoke Invitation" >}} | 5. Click the trash can on the far right of a role or group row. |{{< figure src="/images/users/users-revoke-invitation.png" alt="Users Revoke Invitation" >}} | 6. Click the **Revoke Invitation** button on the modal and observe a confirmation message.| ## Additional features within the Users account | | | |:---:|---| |{{< figure src="/images/users/users-page-users-account-navlist.png" alt="Users Page in the Users Account with Navlist open" >}} | A set of authorized Webscale team members have access to an account that has the express purpose of managing permissions of all users across all accounts. This account is called the Users account. With the Users page within the Users account, these authorized team members gain access to **four additional features**. | {{< figure src="/images/users/users-page-users-account.png" alt="Users Page in the Users Account" >}} | The only page within the Users account is the Users page.

**Additional Feature 1:** View all users across all accounts. In contrast, in all other accounts only users who have an invitation for a role or group from that particular account can be viewed. | |{{< figure src="/images/users/users-access-removed.png" alt="Users Access Removed" >}} | **Additional Feature 2:** View all users that have had access at any point including those that have had their access removed. In contrast, in all other accounts only users that currently have access can be viewed.

Check the checkbox "Include Users Whose Access Has Been Removed". | |{{< figure src="/images/users/users-across-accounts.png" alt="Users Roles Across All Accounts" >}} | **Additional Feature 3:** View all roles and groups a particular user has across all accounts. In contrast, in all other accounts only the roles and groups defined in that particular account can be viewed.

Click a user's row to view all their roles and groups across all accounts. | |{{< figure src="/images/users/users-remove-access-all-accounts.png" alt="Users Remove Access Across All Accounts" >}} | **Additional Feature 4:** Remove all access across all accounts. In contrast, in all other accounts access can only be removed from that account.

1. Click the more menu on the far right of a user's row.

2. Click the **Remove All Access** option.

3. Click the **Remove All Access** button on the modal and observe a confirmation message. ## Further reading - [How to Configure Multi-factor Authentication](/docs/how-tos/security/mfa/) - [How to Create Roles and Invite Users](/docs/how-tos/general/user-roles/) - [How to Create Groups and Invite Users](/docs/how-tos/general/groups/) - [Webscale API role-based access](/docs/reference/rbac/) --- # Working with Labelers URL: https://docs.webscale.com/docs/how-tos/general/labelers/ Description: How to create and edit Labelers A labeler applies a label to all future logs that match the labeler’s configuration. These labels can be a powerful tool in analyzing logs. For example, you can create a labeler using a complex filter query, allowing you to simply search for that label in the traffic viewer and refine the query as needed. {{% alert title="Note:" %}} These labels differ from labels applied using Web Controls in that the labels are applied to the logs just before they are written, instead of when the request is received.{{% /alert %}} {{< figure src="/images/labelers/labelers-page.png" width="100%" alt="Labelers Page">}} ## Create a Labeler | | | |:---:|---| |{{< figure src="/images/labelers/labelers-navlist.png" width="135px" alt="Labelers Navlist" >}} | 1. Login to the [Webscale Control Panel](https://control.webscale.com) and click the three bars in the upper left.






2. Select **Labelers** from the menu. | | {{< figure src="/images/labelers/labelers-page.png" alt="Labelers Page" >}} | 3. This **Labelers** page shows the existing labelers in a table. | | {{< figure src="/images/labelers/labelers-new-button.png" alt="Labelers New Labeler Button" >}} | 4. Click the **New labeler** button. | | {{< figure src="/images/labelers/labeler-new-name-description.png" alt="Labelers New Labeler Name and Description Fields" >}} | 5. Add a **Name** and **Description** that will help explain the labeler's purpose when viewed in the labelers table.| {{< figure src="/images/labelers/labeler-new-label.png" alt="Labelers New Labeler Label Field" >}} | 6. Add the **Label** itself that will help explain the label's purpose when filtering or analyzing the labeled logs| {{< figure src="/images/labelers/labeler-new-applications.png" alt="Labelers New Labeler Application Field" >}} | 7. Choose **Select by application name** or **Select by application label** to determine the contents of the next field which, in turn, configures which applications should be labeled.
{{< info-mark >}}An application label can be created and added to an application in **Edit** application on the **General** page. | {{< figure src="/images/labelers/labeler-new-log-type-filter.png" alt="Labelers New Labeler Log Type and Filter Fields" >}} | 8. Select which **Log type** should be labeled of the available log types, and then create the **Filter** that decides which logs of that log type should be labeled.
{{< info-mark >}}The filtering functionality here is the same as the filter in Traffic Viewer. It is recommended to use Traffic Viewer to create a filter that will filter the desired logs, and then paste that filter here. | {{< figure src="/images/labelers/labeler-reset-create-buttons.png" alt="Labelers New Labeler Page" >}} | 9. Click **Create Labeler**, and observe a confirmation message. The **Reset** button clears the field values. ## Edit a Labeler | | | |:---:|---| |{{< figure src="/images/labelers/labelers-navlist.png" width="135px" alt="Labelers Navlist" >}} | 1. Login to the [Webscale Control Panel](https://control.webscale.com) and click the three bars in the upper left.




2. Select **Labelers** from the menu. | | {{< figure src="/images/labelers/labelers-page.png" alt="Labelers Page" >}} | 3. This **Labelers** page shows the existing labelers in a table. | | {{< figure src="/images/labelers/labelers-more-menu.png" alt="Labelers More Menu" >}} | 4. Click the more menu on the far right of a labelers's row. | | {{< figure src="/images/labelers/labelers-edit-option.png" alt="Labelers Edit Option in More Menu" >}} | 5. Click the **Edit Labeler** option. | | {{< figure src="/images/labelers/labelers-edit.png" alt="Labelers Edit Labeler Page" >}} | 6. Edit the Labeler, click **Update Labeler**, and observe a confirmation message. The **Reset** button will reset the labeler to the form's state when it was navigated to and therefore it is disabled when no edits have occurred.

7. Click **Back to Labelers** to navigate back to the Labelers page. | ## Further reading - [Building Traffic Viewer Filters](/docs/how-tos/traffic-viewer/filter-traffic-viewer/) - [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/) --- # Configuring General Application Settings URL: https://docs.webscale.com/docs/how-tos/general/app-general-settings/ Description: Configure general application settings through the Webscale Control Panel The **General** page enables you to modify basic settings for an application, including its name, labels, default hostname, and aliases. ## Access the General page ### To access general application settings Click the three vertical dots menu icon on the upper right corner of the application box and select **Edit**. {{< figure src="/images/access_edit_app_box.png" alt="Select edit application" >}} -or- On your application page, click the **Actions** menu icon and select **Edit**. {{< figure src="/images/access_edit_action_menu.png" alt="Select edit application" >}} The **General** page displays. {{< figure src="/images/general_page.png" alt="General page" >}} ## Change application name ### To change an application name 1. Enter a new name in the **Application name** field. 2. Click **Apply**. ## Labels A label is an alternative name for the application that Webscale uses in features, such as monitors, to designate the application. {{% alert title="Note:" %}} Label names must be in lower case and can include numerals. {{% /alert %}} ### To add a label 1. Click the **Add labels** link. 2. Enter a label name in the **Add labels** field and click **Add**.
A label displays to the left of the **Add labels** link. 3. Click **Apply**. ### To delete a label 1. Click the **x** on the label to delete. 2. Click **Apply**.
It no longer displays to the left of the **Add labels** link. ## Change application default hostname If you have more than one alias for an application, you can specify any of them as the application's default hostname. ### To change the application hostname 1. Choose another hostname in the **Default hostname** drop-down list. 2. Click **Apply**. ## Application aliases ### To add an application alias 1. Enter an alias. 2. To include the alias in the CloudFront CDN installation, select the **CDN** check box for it. Otherwise, configuring Webscale CDN will not include creating the alias in CloudFront, too. 3. Click **Add**. The alias displays in the list of application aliases. ### To delete an alias 1. Click the **x** for the alias. It no longer displays in the list. 2. Click **Apply**. ## Further reading - [Working with Monitors](/docs/how-tos/advanced/monitors/) --- # Managing Maintenance Mode URL: https://docs.webscale.com/docs/how-tos/general/maintenance/ Description: Manage maintenance mode for your application using the Webscale Control Panel Maintenance mode provides the ability to temporarily replace your application with a simple microsite in order to perform maintenance or otherwise make changes to your site. A microsite displays to inform users that the site is in maintenance mode and temporarily unavailable. Microsites are standalone websites that display for your application. A microsite package file (also known as a microsite file) contains the files for one or more microsites. There are five microsites that can display for standard usages, including maintenance mode. For more information about microsites, see [Working with Microsites](/docs/how-tos/advanced/microsite/). Maintenance Web Controls are Web Controls that run during maintenance mode. Through them, Webscale executes a set of pre-defined actions. Depending on configuration, there may be conditions that must be met before the actions can execute. There is a default maintenance Web Control that manages the microsite that displays during maintenance mode. You can optionally add, edit, and delete maintenance Web Controls. The **Maintenance web controls** page enables you to define the one-page microsites that Webscale will serve by selecting the microsite files that contain these standard microsites. It also enables you to access maintenance Web Controls. ## Topics - [Start and stop maintenance mode](#start-and-stop-maintenance-mode) - [Standard microsites](#standard-microsites) - [Access the Maintenance web controls page](#access-the-maintenance-web-controls-page) - [Default microsite file](#default-microsite-file) - [Replace associated microsite file](#replace-associated-microsite-file) - [Maintenance Web Controls](#maintenance-web-controls) - [Default maintenance Web Control](#default-maintenance-web-control) - [Edit maintenance Web Controls](#edit-maintenance-web-controls) - [Add maintenance Web Controls](#add-maintenance-web-controls) - [Delete maintenance Web Controls](#delete-maintenance-web-controls) ## Start and stop maintenance mode You can place your application in and out of maintenance mode through the Webscale Control Panel. #### To start maintenance mode 1. Click the three vertical dots menu icon on the upper-right corner of the application box and select **Start maintenance**. {{< figure src="/images/maintenance/maintenance_start_select.png" align="left" width="95%" alt="Select Start Maintenance" >}} -or- On your application page, click the **Actions** menu icon and select **Start maintenance**. {{< figure src="/images/maintenance/maintenance_actions_start.png" align="left" width="45%" alt="Select Start Maintenance" >}} 2. In the confirmation box, click **Ok**. {{< figure src="/images/start-maintenance.png" alt="Start maintenance mode" >}} 3. Click **Ok**. A maintenance mode page displays for site users. {{< figure src="/images/maintenance/default_maintenance_mode_page.png" align="left" width="50%" alt="Default maintenance page" >}} #### To stop maintenance mode 1. Click the three vertical dots menu icon on the upper right corner of the application box and select **Stop maintenance**. {{< figure src="/images/maintenance/maintenance_select_stop.png" alt="Select Stop Maintenance" >}} -or- On your application page, click the **Actions** menu icon and select **Stop maintenance**. {{< figure src="/images/maintenance/stop_maintenance_action_menu.png" alt="Select Stop Maintenance" >}} 2. In the confirmation box, click **Ok**. {{< figure src="/images/stop-maintenance.png" align="left" width="85%" alt="Stop maintenance mode" >}} 3. Click **Ok**. The maintenance mode page no longer displays. #### Automatically start and stop maintenance mode When using [Managed Deployments](/docs/how-tos/advanced/managed-deployments/), you can configure any applications associated with a cluster to automatically enter and exit maintenance mode during deployments of that cluster. Do this by checking the **Enable maintenance during deployments** checkbox during cluster setup. In the event of a deployment failure, the application(s) will remain in maintenance mode. ## Standard microsites Following are the files names and usage of the standard microsites, which are all one-page microsites. - `captcha.html`: Displays for user challenges - `index.html`: Displays in lieu of all standard microsite files except for `captcha.html` - `maintenance.html`: Displays when your application is in maintenance mode - `queued-reject.html`: Displays when Webscale rejects a deferred proxy request because the proxy request queue is full - `timeout.html`: Displays when a request times out For more information about standard microsites, see [Standard microsites](/docs/how-tos/advanced/microsite/#standard-microsites) in [Working with Microsites](/docs/how-tos/advanced/microsite/). ### General usages A maintenance Web Control designates and serves the maintenance mode microsite unless no maintenance Web Controls exist. There is also a microsite package file that is selected on the **Maintenance web controls** page and associated with it. The microsites that this file contains determine the pages that automatically display for rejected queued proxy requests and timeouts. If there is a request Web Control with the Challenge user action, it uses the captcha microsite for the file. If the microsite file does not include a `captcha.html` file, the default Webscale captcha displays. If there are no maintenance Web Controls, Webscale uses a microsite from the microsite file selected on the page as the maintenance mode page. For more information on captcha microsites, see [Captcha pages](/docs/how-tos/advanced/microsite/#captcha-pages) in [Working with Microsites](/docs/how-tos/advanced/microsite/). For more information on creating a request Web Control with the **Challenge User** action, see [Protecting Your Site with a Captcha](/docs/how-tos/web-controls/captcha-action/). ## Access the Maintenance web controls page After you access the **Maintenance web controls page**, you can work with the microsite file associated with the page and maintenance Web Controls. #### To access the Maintenance web controls page 1. Click the three vertical dots menu icon on the upper-right corner of the application box and select **Edit**. {{< figure src="/images/access_edit_app_box.png" alt="Select edit application" >}} -or- On your application page, click the **Actions** menu icon and select **Edit**. {{< figure src="/images/access_edit_action_menu.png" alt="Select edit application" >}} 2. On the sidebar menu, click **Maintenance**. The **Maintenance web controls** page displays. {{< figure src="/images/maintenance/access_maintenance_web_controls_page.png" alt="Access Maintenance web controls page" >}} ## Default microsite file Webscale provides a microsite default file that contains the standard microsite files. (Though the microsite file names are different for this default microsite file, the same microsite displays for maintenance mode, rejected queued requests, and timeouts.) Initially, the default file is selected for the **Maintenance web controls** page and default maintenance Web Control. You can replace the default microsite file with another uploaded microsite file. The microsite files for the page and maintenance Web Control can be different. ## Replace the associated microsite file You can replace the microsite file selected for the **Maintenance web controls** page, which might be the default microsite file, with a new uploaded file. The new file can contain microsites that are specific to each condition and customized for your business. For instance, the timeout microsite could include wording referencing a timeout and your branding. A microsite file might have only one HTML file. If it is named `index.html` and located at the root directory of the package file, the single file will display for both rejected queued proxy requests and timeouts. If you use it for a maintenance Web Control to serve as the maintenance mode page, or there are no maintenance Web Controls, the index file microsite will function as the maintenance mode page. #### To replace a microsite file 1. In the **Maintenance web controls** page, select the new microsite file from the **Microsite** drop-down menu. {{< figure src="/images/maintenance/maintenance_select_microsite_file.png" align="left" width="100%" alt="Select microsite file" >}} 2. To preview a microsite that the microsite file contains:
a. Click **Preview**.
b. In the preview dialog box, select the microsite from the microsite file drop-down menu.
{{< figure src="/images/maintenance/maintenance_preview_microsite.png" align="left" width="75%" alt="Preview microsite file" >}} c. Click **Close** to return to the **Maintenance web controls** page. 3. Click **Apply**. {{< figure src="/images/maintenance/maintenance_apply_new_microsite.png" align="left" width="100%" alt="Apply replacement microsite file" >}} ## Maintenance Web Controls Web Controls consist of configured rule sets that match individual request conditions. Based on the conditions, Web Controls automatically execute a set of pre-defined actions. When one or more specified conditions are met, Webscale applies all configured actions to the request. The maintenance Web Controls only operate during maintenance mode. Just as with other types of Web Controls, you can edit conditions and actions and add and delete these Web Controls. If you have more than one maintenance mode web control, they behave the same way that multiple request web controls do. This includes the order in which actions execute. The primary purpose of maintenance Web Controls is to serve the maintenance mode page during maintenance mode. For more information on creating Web Control conditions and actions, see [Creating Web Controls](/docs/how-tos/web-controls/webcontrols_create/). For information on working with more than one Web Control, see [Managing Web Controls](/docs/how-tos/web-controls/webcontrols_manage/). ### Default maintenance Web Control The default maintenance Web Control has the following pre-configured actions. - Set response header: Response header will be set to: `Pragma: no-cache` - Set response header: Response header will be set to: `Cache-Control: private, no-cache` - Serve (final): Request will be served with microsite resource `Default Microsite` with a status code of `503` specified at path `maintenance.html` {{< figure src="/images/maintenance/default_maintenance_web_control.png" align="left" width="100%"width="75%" alt="Default maintenance Web Control" >}} Until you change these settings or delete the default maintenance Web Control, whenever you put your site into maintenance mode, Webscale executes the above actions in the following way. - Sends responses with headers that instruct browsers to not cache the maintenance mode page - Displays the maintenance mode page from the specified microsite file with the HTTP 503 status code (service unavailable). As the final action, these steps will always take place after all other maintenance Web Controls actions run. For more information on HTTP request headers and status codes, see [HTTP Headers and Status Codes](/docs/reference/http-headers/). ### Edit maintenance Web Controls When you edit a maintenance Web Control, you can modify its name, descriptions, and its conditions and actions. You can also add new conditions and actions. You can choose for Webscale to display a different maintenance mode page than the default one when editing the maintenance Web Control that serves this page. #### To edit a maintenance Web Control 1. In the **Maintenance web controls** page, click the icon for the maintenance Web Control. {{< figure src="/images/maintenance/maintenance_web_control_select.png" alt="Select maintenance Web Control" >}} 2. Click the **Edit** icon. {{< figure src="/images/maintenance/maintenance_web_control_edit_icon.png" alt="Click the Edit icon" >}} 3. In the sections for configuring maintenance Web Controls that display under the **Edit maintenance web control** heading, optionally, replace the name and description of the maintenance Web Control. {{< figure src="/images/maintenance/edit_maintenance_web_controls_sections.png" alt="Edit maintenance web controls sections" >}} 4. To add a condition:
a. Select click **Add a condition**.
b. In the condition drop-down menu, select a condition. The settings for the condition display.
{{< figure src="/images/maintenance/maintenance_web_control_condition_menu.png" alt="Edit maintenance web controls sections" >}} c. Configure the condition, using your setting information.
d. Click **Done**. {{< figure src="/images/maintenance/maintenance_add_condition_done.png" alt="Add maintenance Web Control condition" >}} e. Click the **Done** button that is located to the right of the **Edit maintenance web control** heading.
{{< figure src="/images/maintenance/maintenance_add_condition_2nd_done.png" alt="Click Done" >}} f. Click **Apply**. {{< figure src="/images/maintenance/maintenance_apply_condition.png" alt="Click Apply" >}} 5. To edit a condition:
a. Click the **Edit** icon for the condition.
{{< figure src="/images/maintenance/maintenance_click_edit_condition.png" alt="Click Edit" >}} b. Modify the setting.
c. Click **Done**.
{{< figure src="/images/maintenance/maintenance_edit_condition_first_done.png" alt="Click Done" >}} d. Click the **Done** button that is located to the right of the **Edit maintenance web control** heading.
{{< figure src="/images/maintenance/maintenance_edit_condition_click_done.png" alt="Click Done" >}} e. Click **Apply**. {{< figure src="/images/maintenance/edit_maintenance_condition_apply.png" alt="Click Apply" >}} 6. To delete a condition:
a. Click the **X** icon for the condition. The condition entry no longer displays.
{{< figure src="/images/maintenance/maintenance_delete_condition_x.png" alt="Click x icon to delete" >}} b. Click the **Done** button that is located to the right of the **Edit maintenance web control** heading.
{{< figure src="/images/maintenance/maintenance_edit_condition_click_done.png" alt="Click Done" >}} c. Click **Apply**. {{< figure src="/images/maintenance/maintenance_apply_delete_condition.png" alt="Click Apply" >}} 7. To add an action:
a. Click **Add action**.
b. In the **Type** drop-down menu, select an action. The settings for the action display.
{{< figure src="/images/maintenance/maintenance_web_control_type_menu.png" alt="Select action" >}} c. Configure the action, using your setting information.
d. Click **Done**. {{< figure src="/images/maintenance/create_action_first_done.png" alt="Click Done" >}} e. Click the **Done** button that is located to the right of the **Edit maintenance web control** heading.
{{< figure src="/images/maintenance/create_maintenance_action_second_done.png" alt="Click Done" >}} f. Click **Apply**. {{< figure src="/images/maintenance/create_maintenance_action_apply.png" alt="Click Apply" >}} 8. To edit an action:
a. Click the **Edit** icon for the action.
{{< figure src="/images/maintenance/edit_maintenance_web_control_action.png" alt="Click Edit" >}} b. Modify the setting.
c. Click **Done**.
{{< figure src="/images/maintenance/edit_maintenance_action_first_done.png" alt="Click Done" >}} d. Click the **Done** button that is located to the right of the **Edit maintenance web control** heading.
{{< figure src="/images/maintenance/edit_maintenance_action_second_done.png" alt="Click Done" >}} e. Click **Apply**. {{< figure src="/images/maintenance/edit_maintenance_action_apply.png" alt="Click Done" >}} 9. To delete an action:
a. Click the **X** icon for the action. The action entry no longer displays. {{< figure src="/images/maintenance/maintenance_web_control_click_x_action.png" alt="Delete maintenance web controls action" >}} b. Click the **Done** button that is located to the right of the **Edit maintenance web control** heading.
{{< figure src="/images/maintenance/delete_maintenance_action_second_done.png" alt="Click Done" >}} c. Click **Apply**. {{< figure src="/images/maintenance/delete_maintenance_action_apply.png" alt="Click Apply" >}} 10. When you have finished editing the maintenance Web Control, click the **Done** button that is located to the right of the **Edit maintenance web control** heading. {{< figure src="/images/maintenance/edit_maintenance_web_control_done.png" alt="Click Done" >}} 11. Select the **Enabled** checkbox to enable the maintenance Web Control if it is not already enabled. 12. Click **Apply**. {{< figure src="/images/maintenance/edit_maintenance_web_control_apply.png" alt="Click Apply" >}} {{% alert title="Tip:" %}} To replace the maintenance mode page: 1. For the maintenance Web Control that serves the maintenance mode page, click the **Edit** icon. 2. Click the **Edit** icon for the **Serve** action. 3. Select a different microsite file and path. 4. If the path to the maintenance mode page is different, select the correct path. 5. Click **Done**. 6. When you have finished editing the maintenance Web Control, finalize and apply the changes. {{% /alert %}} ### Add maintenance Web Controls You might want to create a maintenance Web Control to configure a series of conditions and actions to occur in addition to preventing site usage and displaying the maintenance mode page. For instance, a new maintenance Web Control condition could provide site access for specific internal users. #### To add a maintenance Web Control 1. In the **Maintenance web controls** page, click **Add a maintenance control**. 2. Enter a name for the maintenance Web Control. 3. Optionally, enter a description. 4. To add a condition:
a. Click **Add a condition**.
b. In the condition drop-down menu, select a condition. The settings for the condition display.
c. Configure the condition, using your setting information.
d. Click **Done**. 5. To add an action:
a. Click **Add action**.
b. In the **Type** drop-down menu, select an action. The settings for the action display.
c. Configure the action, using your setting information.
d. Click **Done**. 6. When you have finished configuring the maintenance Web Control, click the **Done** button that is located to the right of the **Edit maintenance web control** heading. 7. Select the **Enabled** checkbox. 8. Click **Apply**. {{% alert title="Tip:" %}} To add a maintenance Web Control to enable internal users to access your site during maintenance mode: 1. Through the **Create address set** dialog box, create an address set with the IP addresses of the internal users. For more information on how to add an address set, see [Create address sets](/docs/how-tos/general/address-sets/#create-address-sets) in [Working with Address Sets](/docs/how-tos/general/address-sets/). 2. When creating the maintenance Web Control, add an **IP address not in set** condition and select the address set that you have created. The serve action (and other actions) will only execute for the site user if their IP address is not in the set. {{% /alert %}} ### Delete maintenance Web Controls If you delete all maintenance Web Controls, Webscale will use the `maintenance.html` file for the microsite file that is selected on the **Maintenance web controls** page. Or, if there is no `maintenance.html` file, it will use the `index.html` file. #### To delete a maintenance Web Control 1. In the **Maintenance web controls** page, click the icon for the maintenance Web Control to delete. 2. Click the **X** icon for the maintenance Web Control. 3. In the confirmation box, click **Ok**. 4. Click **Apply**. The maintenance Web Control no longer displays. ## Further reading - [Working with Files](/docs/how-tos/general/files/) - [Working with Microsites](/docs/how-tos/advanced/microsite/) - [Protecting Your Site with a Captcha](/docs/how-tos/web-controls/captcha-action/) - [Web Controls](/docs/how-tos/web-controls/) - [Creating Web Controls](/docs/how-tos/web-controls/webcontrols_create/) - [Managing Web Controls](/docs/how-tos/web-controls/webcontrols_create/) --- # Working with Address Sets URL: https://docs.webscale.com/docs/how-tos/general/address-sets/ Description: Create and edit address sets through the Webscale Control Panel An address set is a list of IP addresses that Webscale manages and uses in features like [Trusted Proxies](/docs/how-tos/advanced/trusted-proxies/), [Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/), [Web Controls](/docs/how-tos/web-controls/webcontrols_create/), and [Allowed](/docs/how-tos/security/whitelist/) and [Blocked](/docs/how-tos/security/blacklist/) lists. For instance, you must select address sets for the trusted proxies to enable and use the Trusted Proxies feature. All applications for the account can use the address sets. The **Address sets** tab of the account settings page enables you to work with address sets through the **Webscale Control Panel** page. Each address set is listed in the table as a separate entry. {{< figure src="/images/address-sets/address_sets_tab.png" align="left" width="100%" alt="Address sets tab on the account settings page">}} ## Topics - [Address set types](#address-set-types) - [Create address sets](#create-address-sets) - [Delete address sets](#delete-address-sets) - [Add IP addresses to address sets](#add-ip-addresses-to-address-sets) - [Edit or remove individual IP addresses from address sets](#edit-or-remove-individual-ip-addresses-from-address-sets) ## Address set types There are several types of address sets, which correspond to different ways of retrieving IP addresses. Following are the address set types. - **Combined**: Comprised of other address sets - **Domains**: Determines and retrieves its IP addresses via a DNS lookup of specified domains - **Dynamic**: Added with only a name and optional description (defining the *add to address set* Web Control action adds IP address, which can change over time) - **json-file**: Contains IP addresses that are populated from a JSON file fetched from a specified URL - **Manual**: Contains IP addresses that users manually add and update - **Text file**: Contains IP addresses that are populated from a text file fetched from a specified URL You cannot delete combined, domains, json-file, and text file address sets. You can view the details of one of these address sets by clicking the information icon to the right of the address set. {{% alert title="Note:" %}} For json-file address sets, you can also specify a [JMESPatch expression](https://jmespath.org/) to parse and filter the json object for addresses. Additionally, you can specify a fetch interval to configure the frequency (in seconds) of auto-updates from the URL. {{% /alert %}} {{% alert title="Note:" %}} For text file address sets, you can also specify an interval (in seconds) to configure the frequency of auto-updates from the URL. {{% /alert %}} For information on dynamic address sets, see [Using Web Controls for Rate Limiting](/docs/how-tos/advanced/rate-limiting/). ## Create address sets After you select one of the address set types, the **Create address set** dialog box adds fields specific to the type. {{< figure src="/images/address-sets/create_address_set_procedure.png" align="left" width="100%" alt="Procedural steps for creating address sets">}} ### To create an address set 1. On the **Webscale Control Panel** page, click the menu icon on the upper left of the screen. 2. On the sidebar menu, select **Address sets**. 3. On the **Address sets** tab, click **Create set**. 4. On the **Create address set** dialog box, select the address set type. 5. Enter a name and description. 6. Add information or upload files specific to the address type: - Add IP addresses or domains - Upload a json or text file

7. To change an IP address expiration date, choose another date on the slider and click **Add**. {{% alert title="Note:" %}} By default, the address set's expiration slider is set to **Never**. It will not expire unless you specify an expiration time or delete the address set. You can change the default by sliding to a pre-selected time. The expiration times are incremented by days, weeks, months, and a year from the time that you added the IP address. {{% /alert %}} 8. Click **Save**. ## Delete address sets You can delete manual address sets as well as dynamic address sets that are not in use. ### To delete an address set 1. On the **Webscale Control Panel** page, click the menu icon on the upper left of the screen. 2. Select **Address sets** on the sidebar menu. 3. Click the **X** icon at the end of the address set entry. {{< figure src="/images/address-sets/delete_address_set.png" align="left" width="100%" alt="Delete an address set">}} 4. Click **Ok** in the confirmation box. {{< figure src="/images/address-sets/delete_confirm.png" align="left" width="100%" alt="Delete confirmation box">}} ## Add IP addresses to address sets You can add IP addresses to manual address sets. ### To add an IP address 1. On the **Webscale Control Panel** page, click the menu icon on the upper left of the screen. 2. On the sidebar menu, select **Address sets**. 3. On the **Address sets** tab, click the edit icon for the manual address set. {{< figure src="/images/address-sets/select_edit_address_sets.png" align="left" width="100%" alt="Choose to edit an address set">}} 4. In the dialog box for the address set, enter an IP address, optional description, and click **Add**. {{< figure src="/images/address-sets/edit_address_set.png" align="left" width="100%" alt="Edit an address set">}} 5. Click **Apply** to add the IP address. Or, **Revert** if you do not want to add it. 6. Repeat the steps if you want to add another IP address. ## Edit or remove individual IP addresses from address sets You can edit and remove existing IP addresses for manual address sets. When you edit an IP address, you can modify its description and expiration date. ### To edit or remove an IP address 1. On the **Webscale Control Panel** page, click the menu icon on the upper left of the screen. 2. On the sidebar menu, select **Address sets**. 3. On the **Address sets** tab, click the edit icon for the address set. 4. In the dialog box for the address set, to edit an IP address set:
  1. Click the edit icon for an IP address.
  2. Modify its description and/or expiration date.
  3. Click Update.
  4. Click Apply.
          -or-         To delete an IP address, click the delete icon for the IP address. ## Further reading - [Configuring Trusted Proxies](/docs/how-tos/advanced/trusted-proxies/) - [Using Traffic Viewer](/docs/how-tos/traffic-viewer/) - [Web Controls](/docs/how-tos/web-controls/) - [Editing the Allowlist](/docs/how-tos/security/whitelist/) - [Editing the Blocklist](/docs/how-tos/security/blacklist/) - [Configuring Web Controls for Rate Limiting](/docs/how-tos/advanced/rate-limiting/) --- # Working with Files URL: https://docs.webscale.com/docs/how-tos/general/files/ Description: Work with files using the Webscale Control Panel Through the **Files** page, you can work with files. After you upload files for your account, they are available for all of the account applications. The CloudEDGE Workers and microsite features both use uploaded files. Information specific to working with handler and microsite files, including previewing files, is located in [Working with CloudEDGE Handlers and Workers](/docs/how-tos/CloudEDGE/handlers_workers/) and [Working with Microsites](/docs/how-tos/advanced/microsite/). CloudEDGE Workers enables you to easily extend your application's functionality through custom JavaScript without changing your application code. For more information about the CloudEDGE Workers feature, see [CloudEDGE Workers Overview](/docs/how-tos/CloudEDGE/workers-overview/). A microsite is a standalone website that displays for your application. ## Topics - [File requirements](#file-requirements) - [List of files](#list-of-files) - [Getting started](#getting-started) - [Access the Files page](#access-the-files-page) - [Upload files](#upload-files) - [Work with uploaded files](#work-with-uploaded-files) - [Downloading](#download-file) - [Replacing](#replace-file) - [Editing file details](#edit-file-details) - [Deleting](#delete-file) ## File requirements Files must conform to the following requirements with the exception of the maximum file size for handler and microsite files. - .zip, .tar, or .tar.gz file format - Maximum file size: 50 MB - For microsites, links to assets must be relative (pages can also contain links to external websites). {{% alert title="Note:" %}} You can also upload WAF rules, bootstrap, and Geodb files for use by legacy functionality. For WAF rules, you can use Web Controls to perform the same functions. {{% /alert %}} ## List of files On the **Files** page, each file lists in the **Files** panel with the following characteristics. - Name - Version - Creation and updated times If there is a description and label, they will also display for the file. When you select a file, the file version and contents display in the **Content** panel. When you select a file in the **Content** panel, it displays in the **Preview** panel. There is a system default file that is named "Default Microsite" unless you change its name. For more information about this file, see [Microsites files](/docs/how-tos/advanced/microsite/#standard-microsites) in [Working with Microsites](/docs/how-tos/advanced/microsite/). {{< figure src="/images/microsites/microsites_files_page_panels.jpg" align="left" width="100%" alt="Panels on the Files page" >}} ## Getting started 1. On the **Webscale Control Panel** page, [access](#access-the-files-page) the **Files** page. 2. If the file does not already display in the list of files, [upload](#upload-files) it. 3. Select a file in the files panel.
An icon panel that enables you to download, replace, change details, and delete the file displays to the right of the **Updated** column for the file. 4. After the above steps, continue with the remaining steps for the relevant operation. ## Procedures The following procedures pertain to all features that involve uploading and working with files. You can use the **Files** page to perform the following operations. ## Access the Files page #### To access the Files page 1. On the **Webscale Control Panel** page, click the menu icon on the upper left of the screen. 2. On the sidebar menu, select **Files**. {{< figure src="/images/files/select_files.png" align="left" width="95%" alt="Files sidebar option">}} ## Upload files #### To upload a file 1. On **the Webscale Control Panel** page, select **Files** on the sidebar menu. 2. In the **Files** page, click **Create file**. {{< figure src="/images/microsites/microsites_create_file.jpg" align="left" width="100%" alt="Click create file to upload" >}} 3. In the **Upload File** dialog, click **Choose File**. {{< figure src="/images/microsites/microsites_upload_file.jpg" align="left" width="65%" alt="Choose file" >}} 4. Select a file on your computer and click **Open**, or drag-and-drop it to the **File** box. 5. Optionally, enter a new name and/or label for the file. (The label only applies to this version of the file.) 6. Select the file type. 7. Optionally, enter a file description and label. 8. Click **Save**.
A new entry displays in the **Files** page list. {{% alert title="Note:" %}} If you cannot save a file, make sure that it meets the [file requirements](#file-requirements). {{% /alert %}} ## Work with uploaded files For uploaded files, you can perform the following operations. - [Downloading](#download-file) - [Replacing](#replace-file) - [Editing file details](#edit-file-details) - [Deleting](#delete-file) {{< figure src="/images/files/selected_file_icons.png" align="left" width="90%" alt="File operations icons" >}} ### Download file #### To download a file Click the **Download** icon in the icon section. ### Replace file #### To replace a file To replace the file with a new version of the same file or a different file, perform the following procedure. 1. Click the **Upload new file version** icon . 2. In the **Upload Version** dialog, click **Choose File**. 3. Optionally, enter a label for this verson of the file. 4. Click **Save**. 5. Click **Update** to use the uploaded file as your current version. 6. If you click **Cancel**, Webscale will upload the file and increment the version number but not use it as your current version. {{< figure src="/images/files/files_new_version_save.png" align="left" width="100%" alt="Save new file version" >}} {{% alert title="Note:" %}} When you upload a new file, you can upload a new version or a different file. {{% /alert %}} ### Edit file details #### To edit file details 1. Click the **Edit file** icon . In the **Edit** dialog, you can: - Change the file name - Update the currently used version of the file - Optionally, enter a new description or update an existing one. 2. Click **Save** when you are finished editing the details. {{< figure src="/images/files/files_edit_dialog.png" align="left" width="70%" alt="Edit dialog" >}} ### Delete file #### To delete a file 1. Click the **Delete file** icon . 2. Click **Ok**.
The file will no longer display in the **Files** page list. ### Preview files There are differences in previewing files for CloudEDGE Workers and microsites. For more information on previewing handler files, see [Preview handler files](/docs/how-tos/CloudEDGE/handlers_workers/#preview-handler-files) in [Working with CloudEDGE Handlers and Workers](/docs/how-tos/CloudEDGE/handlers_workers/). For more information about previewing microsites, see [Preview microsites](/docs/how-tos/advanced/microsite/#preview-microsites) in [Working with Microsites](/docs/how-tos/advanced/microsite/). ## Further reading - [CloudEDGE Workers Overview](/docs/how-tos/CloudEDGE/workers-overview/) - [Working with CloudEDGE Handlers and Workers](/docs/how-tos/CloudEDGE/handlers_workers/) - [Working with Microsites](/docs/how-tos/advanced/microsite/) --- # How to View Events URL: https://docs.webscale.com/docs/how-tos/general/events/ Description: How to view events in the Webscale Control Panel The **Events Viewer** will show recent events that have taken place for your application on the platform, and some information about those events. {{% alert title="Note:" %}} The events displayed will differ depending upon the privileges of the Control Panel [user role](/docs/how-tos/general/user-roles/). {{% /alert %}} ## View Events To view events, log in to the [Webscale Control Panel](https://control.webscale.com) and click the three bars on the upper left, then select **Events** from the menu. From here you will see a list of events on the left. To see more information about a specific event, click the event in the list. The right pane will show the information, including the following: - Event title, short description, and time stamp. - Information on the event including **Subject**, **Type**, **Severity**, **User**, and **Remote IP**. Some of this information may not be relevant, depending upon the event type. ## Search in Events You can also search the events for a particular word or string if you want to find a specific event, or display events only within a specific time window. ### Search - Click the **Search** button on the upper right. - Enter your search term, then press enter or click the magnifying glass. - If there are matches they will be highlighted on the screen, and you can click on the or buttons to cycle through the results. ### Time window - Click the **Time** button on the upper right. - Here you can enter a duration. Choose from 5 min, 1 hr, 3 hr, 6 hr, 24 hr, or custom. If you choose custom, input the start and end date and time. To set the end time to now, click the toggle **Ending Now**. - When ready, click the **Submit** button to display the results. ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Viewing Reports](/docs/how-tos/general/reports/) - [How to Enable Notifications](/docs/how-tos/general/notifications/) - [How to Contact Support](/docs/getting-started/support/) - [Frequently Asked Questions](/docs/faq/) --- # Events Logs Attributes URL: https://docs.webscale.com/docs/how-tos/general/events-logs-attributes/ Description: Detailed information about Events logs attributes The account **Events** page enables you to view events information for all account applications. The **Events** section on the **Webscale Control Panel** page displays recent events for the applications. You can also view events for a specific application through the application's **Events** page. The **Events** section on the application dashboard displays recent application events. For more information on viewing events, see [Viewing Events](/docs/how-tos/general/events/). The following table provides Events logs attribute information. You can view the name, display name, and a description for each attribute. ## Events logs attributes Name | Display Name | Description -- | -- | -- created | Created | ISO 8601-formatted date when the event occurred details | Details | Event information, which is dependent on the event type and specific to the particular event. For example, an event pertaining to deleting an address from an address set might generate an audit log that documents the address set contents before and after the deletion. message | Message | Short summary of the event remote_ip | Remote address | IP address for the user who initiated the event, if available severity | Severity | Categorizes event impact by the `Info`, `Warning`, or `Severe` status subject | Subject | References what the event affected type| Type | Characterizes event specifics, such as a system update or address set deletion user | User | User who initiated the event ## Further reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Viewing Events](/docs/how-tos/general/events/) - [Viewing Reports](/docs/how-tos/general/reports/) --- # How to Enable Notifications URL: https://docs.webscale.com/docs/how-tos/general/notifications/ Description: How to enable notifications for alerts in the Webscale Control Panel You can subscribe to alert notifications in the Webscale Control Panel. These notifications provide real-time alerts to various conditions that affect site performance. Find these alert settings in the **Alert Notifications** tab under Account Settings. ## Configure Notifications | | | |---|---| |{{< figure src="/images/account-settings.jpg" width="75%" alt="Account Settings" >}}| 1. Log in to the [Webscale Control Panel](https://control.webscale.com) and click the gear on the upper right, then select **Account Settings** from the menu.| |{{< figure src="/images/notifications/alert-notifications.jpg" width="75%" alt="Alert Notifications" >}}| 2. Click **Alert Notifications** from the top menu bar to view the cluster information.| |{{< figure src="/images/notifications/all-alerts.jpg" width="75%" alt="Susbcribe to All Alerts" >}}| 3. You have the option to subscribe to all alerts or just specific alerts. To subscribe to all alerts, enter the email address you want to receive the alerts in the email address box in the **All Alerts** section. Click the **Add Email** button, then click the **Save** button.| |{{< figure src="/images/notifications/specific-alert.jpg" width="75%" alt="Subscribe to Specific Alerts" >}}| 4. If you only want to subscribe to specific alerts, enter the email address you want to receive the alerts in the email address box in the appropriate section. For example, enter your email address in the **Application Down** section to only receive notifications for Application Down events.| |{{< figure src="/images/notifications/minimized-alerts.jpg" width="75%" alt="Minimized Alerts" >}}| 5. Any alert notifications that you haven't configured show minimized on the list. To enable these alerts, click on the alert name, then enter your email address and click the **Save** button. | |{{< figure src="/images/notifications/delete-alert.jpg" width="75%" alt="Delete Alerts" >}}| 6. To disable alert notifications, click the **Delete** button for the email address you wish to remove from notifications.
{{< info-mark >}}You should not delete any `webscalenetworks` or `victorops` email addresses for any alerts as the Webscale support team uses these.| ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/) - [How to Enable Uptime Monitoring](/docs/how-tos/general/monitoring/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Security How-Tos](/docs/how-tos/security/) --- # Viewing Reports URL: https://docs.webscale.com/docs/how-tos/general/reports/ Description: View reports in the Webscale Control Panel You can access reports on your system through the main **Reports** page, including usage and performance information. The Outbound data transfer report presents a consolidated view of the amount of outbound data transferred for your account and applications. Outbound data transfer, measured in gigabytes (GB), consists of responses from Webscale to site user requests. (The data transfer monitor uses the same information as this report. It tracks data transfer usage for all account applications. You can configure it to generate events when it detects activity that matches or exceeds conditions that you define. This monitor can send email notifications when the events occur.) If you have the optional application testing feature, you can view the results of your application load tests. For information about these tests, see [Application load tests](#application-load-tests). ## Topics - [Access the Reports page](#access-the-reports-page) - [Outbound data transfer report](#outbound-data-transfer-report) - [Frequency of updating data](#frequency-of-updating-data) - [Date range selector](#date-range-selector) - [Data transfer graph](#data-transfer-graph) - [History table](#history-table) - [Application load tests](#application-load-tests) ## Access the Reports page The Outbound data transfer report displays on the **Reports** page. If you have the optional application testing feature, you can access load test results reports through through this page. #### To access the Reports page 1. On the **Webscale Control Panel** page, click the menu icon on the upper-left of the screen. 2. On the sidebar menu, select **Reports**. {{< figure src="/images/reports/reports_access_page.png" align="left" width="100%" alt="Select Reports" >}} -or- In the **Webscale Control Page** page, click **Zoom** in the **Data transfer** section at the upper-left of the screen. {{< figure src="/images/reports/reports_click_zoom_data_transfer.png" align="left" width="100%" alt="Select Reports" >}} ## Outbound data transfer report {{< figure src="/images/reports/reports_data_transfer_callouts.png" align="left" width="100%" alt="Outbound Data Transfer Report with callouts" >}} The Outbound data transfer report on the **Reports** page presents the amount of outbound data that you have used. Based on the data range for the report, other information might display. You can use this report to identify trends and unexpected shifts regarding your outbound data usage. It consists of a graph and table. A date range selector enables you to specify the time period for the report. The Outbound data transfer report enables you to view outbound data for your account by: - Day - Cumulatively for the month - Current or last month - All available data You can also view daily and monthly amounts of data per application. Your contract might include a specified monthly amount of data for your plan. By comparing data usage during the current month against the amount of monthly outbound data for your plan, you can help prevent unexpected data transfer overage fees. For help with increasing the amount of data for your plan, contact [support](mailto:support@webscalenetworks.com). If your contract does not include monthly data, the user interface will not reference a plan amount or overages. To view this report, follow the procedure in [Access the Reports page](#access-the-reports-page). {{% alert title="Note:" %}} The **Data transfer** section of the **Webscale Control Panel** page also displays outbound data transfer for the current day and month. The daily information does not display in real-time. {{% /alert %}} {{% alert title="Important:" %}} If this report shows a different amount of outbound data included in your plan than the amount in your current contract, contact [support](mailto:support@webscalenetworks.com). {{% /alert %}} ### Frequency of updating data The data for the current day populates the report at midnight GMT on the same day. When you view this month's report, it will display the actual data for the preceding days of the month but only projected data for the current one. Webscale uses Greenwich Mean Time (GMT) to determine when it populates the report. {{% alert title="Important:" %}} For the first day of a new month, the report is empty if the current month is selected as the date range. The report displays data transfer retroactively on the second day of the month. {{% /alert %}} ### Date range selector The **Show** drop-down menu enables you to select a date range that defines the data that displays: - **This month** - measured in daily increments - **Last month** - measured in daily increments - **This month + past 12 months** - measured in monthly increments: Enables you to view data from the same month in the current and previous year (e.g., January 2021 and 2022) - **All** - measured in monthly increments: Displays all recorded report data When you first view the Outbound data transfer report, the data for the current month displays. Afterwards, the selected date range is the same as it was at the end of your previous session. {{% alert title="Note:" %}} Recorded outbound data transfer information is available for accounts starting from November 2020. Data broken down by application is available starting from March 2022. {{% /alert %}} #### To change the data range In the **Show** drop-down menu, select another date range option. {{< figure src="/images/reports/reports_data_transfer_show_menu.png" align="left" width="100%" alt="Date range selection menu" >}} The report information for the specified date range displays. ### Data transfer graph The title of the data transfer graph and type of information that displays change according to the specified date range. For the **This month** and **Last month** options, the graph is named **Cumulative data transfer**. It populates with cumulative daily data for the current or previous month. For the **This month + past 12 months** and **All** options, the graph is named **Monthly data transfer**. It measures data by the month. #### Current and previous month graph If you choose to view the data for the current or previous month, the data transfer line presents cumulative data for the month in daily increments. When you hover over a date, a tooltip shows the amount of data that you have used. If you are viewing data for the current month and the trend line is forecasting an overage, it also includes the projected cumulative overage for each day. If you are viewing past data, the tooltip includes the actual cumulative overage amounts. #### Current month graph For only the current month graph, a dotted trend line does not appear until the third day of the month. It projects date usage for the rest of the month based on prior usage for the month. If your contract stipulates a data transfer amount and the current usage or trend lines surpass the **Included in plan** horizontal line, the graph will indicate this actual or projected overage with orange shading for an overage and lighter orange shading for projected overage. In addition to cumulative current and projected data, the tooltip for the current month can include the plan data amount and dates for actual or projected overage. {{< figure src="/images/reports/reports_data_transfer_graph.png" align="left" width="100%" alt="Data transfer graph for the current month" >}} #### Graph for the other data ranges The graph that displays for the **This month + past 12 months** and **All** date range options presents outbound data by the month and not cumulatively. There is a trend line for the current month but nor for previous ones. If your plan includes data, the graph and tooltip reflect it. {{< figure src="/images/reports/report_data_transfer_graph_all.png" align="left" width="100%" alt="Data transfer graph for this month + past 12 months" >}} ### History table If you choose to view the outbound data for the current or previous month, the left section of the **History** table presents the total amount of data for each day of the month for your account. If you select the **This month + past 12 months** and **All** date range options, the left section presents the total amount of account data by month. The **History** table does not present cumulative data. The right section of the table breaks down the data by application. {{< figure src="/images/reports/reports_data_transfer_table.png" align="left" width="100%" alt="Data transfer table for this month" >}} ## Application load tests The optional application testing feature enables you to run customized load tests to measure the performance of your system. Every time that you run a test, Webscale generates a report with the test results. A reports page that is dedicated to load test results enables you to view all test results reports. You can access test reports through the main **Reports** page and **Application testing** page. For more information about the application testing feature and accessing test results reports through the **Application testing** page, see [Testing Your Application](/docs/how-tos/general/app-testing/). {{% alert title="Note:" %}} The user interface for this feature, including the **Application testing** entry on the accounts sidebar menu, only displays if this feature is enabled. {{% /alert %}} #### To view an application load test 1. In the main **Reports** page, select the **Test result** option in the **Reports** drop-down menu. {{< figure src="/images/reports/reports_page_select_test_result.png" align="left" width="65%" alt="Select Test result option" >}} 2. In the test results reports page, select a report in the right drop-down menu under **Reports**. {{< figure src="/images/reports/reports_select_test_result_report.png" align="left" width="65%" alt="Select test result report" >}} The report displays. {{< figure src="/images/application-testing/app_test_report.png" align="left" width="90%" alt="Test results report" >}} 3. To return to the main **Reports** page, you can select **Outbound data transfer** in the left drop-down menu under **Reports**. {{< figure src="/images/reports/reports_return_to_data_transfer.png" align="left" width="65%" alt="Select Data Transfer Billing option" >}} ## Further Reading - [Data transfer monitor](/docs/how-tos/advanced/monitors/#data-transfer-monitor) - [Testing Your Application](/docs/how-tos/general/app-testing/) --- # Working with Providers URL: https://docs.webscale.com/docs/how-tos/general/providers/ Description: Manage providers through the Webscale Control Panel Webscale uses external services, such as cloud providers and Docker registries, to provide functionality and implement features. To connect to an external service, you must create a provider. External services require authentication to access them. Each provider has a set of credentials to authenticate to the corresponding service. You can define providers for your account through the Webscale Control Panel. After you create a provider, you can use them in blueprints for data planes and clusters. You can also use providers to implement features such as Webscale CDN. Webscale uses blueprints to connect to and define the Webscale usage of cloud providers. Applications that are associated with a data plane are connected to the providers for their data plane. As you create blueprints, the data planes, clusters, and applications connected with the provider will display in the providers list. Webscale supports the following public cloud service providers: Amazon, Azure, Google and CloudSigma. Providers can also be used to store credentials to access Docker registries. After you create a provider, it will display in your list of providers. In addition, you can edit and delete them through the **Providers** tab on the account settings page. {{< figure src="/images/providers/providers-list.png" align="left" width="100%" alt="Providers list on the account settings page">}} ## Topics - [Create providers](#create-providers) - [Provider settings](#provider-settings) - [Amazon](#amazon) - [Azure](#azure) - [CloudSigma](#cloudsigma) - [Google](#google) - [Docker Registry](#docker-registry) - [Section](#section) - [Edit providers](#edit-providers) - [Delete providers](#delete-providers) ## Create providers When you create a Webscale provider, enter a name and select a cloud service provider type. After you select a type, the **Add Providers** dialog box adds settings specific to it. For a provider with the Amazon EC2 type, you can enable Webscale CDN and CloudEDGE Workers. The tables that follow this procedure contain descriptions of provider type settings. The provider type settings include your logins for the cloud service provider accounts. For help with determining the values for other settings, contact [support](mailto:support@webscalenetworks.com). {{< figure src="/images/providers/providers_tab.png" align="left" width="100%" alt="Annotated Providers tab on the account settings page">}} ### To create a provider 1. On the **Webscale Control Panel** page, click the menu icon on upper left of the screen. 2. On the sidebar menu, select **Providers**. 3. On the **Providers** tab, click **Add Provider**. 4. Select the provider type. The settings specific to the provider type display. 5. Enter settings information. 6. Click **Save**. ## Provider settings Following are tables that contain the settings for each provider type. ### Amazon Name | Description | Notes -- | -- | -- | Region | A geographic area that contains at least two distinct physical locations (known as “availability zones”), each of which contains clustered data centers. With the distributed data centers of the availability zones, a region provides high availability for the designated area.| Required | Access key id | Used to access your AWS account | Required | Secret access key | Used to access your AWS account | Required | Use elastic IP | Enables using static IP addresses | Optional | VPC | Virtual Private Cloud. Identifies a virtual network of shared resources allocated within an Amazon Web Services (AWS) public cloud environment | Optional | Use for CDN | Enables Webscale CDN for your provider if you also specify the AWS S3 bucket for CDN logs. After you enable CDN for the provider, you can enable this feature for all applications that use the provider. | Optional | S3 Bucket Name | Name of the AWS S3 bucket for your Webscale CDN logs | Optional. Displays if you select the **Use for CDN** checkbox. | Use for handlers | Enables handlers for your provider. After you enable handlers for the provider, you can create handlers for your account. | Optional | Use for Security Monitoring | Enables AWS GuardDuty security monitoring for your provider. | Optional | Use for Kubernetes | Creates a Kubernetes service for the provider. | Optional | Cluster Name | Name of the Amazon EKS cluster to use when creating [Kubernetes clusters](/docs/how-tos/general/kubernetes-clusters/). The provider's region must be the region of the EKS cluster. | Optional. Displays if you select the **Use for Kubernetes** checkbox. | Use for ECR | Creates an ECR docker registry service for the provider. | Optional | Docker registry endpoint | The fully qualified ECR endpoint in the format:
`aws-account-id`.dkr.ecr.`aws-region`.amazonaws.com | Required if **Use for ECR** is checked. | Repositories | A list of ECR repository names as they appear in AWS. | At least one is required if **Use for ECR** is checked. | ### Azure Name | Description | Notes -- | -- | -- | Tenant id | Unique identifier for your Azure tenant, which represents your organization in Azure Active Directory. A tenant is automatically created when your organization signs up for a Microsoft cloud service subscription. Not an organization or domain name | Required | Client id | Unique identifier for the application that is set up through the Azure Active Directory | Required | Client secret | Password exclusive to the application and authorization server | Required | Subscription | Logical container used to provision resources in Azure | Optional | ### CloudSigma Name | Description | Notes -- | -- | -- | Location | Location within a geographic area designed to provide cloud services to the area | Required | Email address | Used to access your account | Required | Password | Used to access your account | Required | Use static ip | Enables using static IP addresses with the account | Optional | VLAN| Created from one or more local area networks, a Virtual Local Area Network (VLAN) combines collections of devices into one logical network | Optional ### Google Name | Description | Notes -- | -- | -- | Project ID | Unique identifier for your project, which organizes all of your Google Cloud resources | Required Email address | Email address associated with your project | Required Private key | Private RSA key that enables generating a token to access your Google Cloud account| Required Network | Virtual Private Cloud (VPC) network that distributes traffic from Webscale | Required ### Docker Registry Name | Description | Notes -- | --| -- | Docker Registry Endpoint | The fully qualified endpoint at which the registry is accessible. | Required. | Public | If checked, indicates that credentials are not required to access the registry. | Optional | Repositories | A list of repositories accessible at the endpoint specified. | At least one is required. | Username | The username used to access the docker registry. | Required if **Public** is not checked. | Password | The password used to access the docker registry. | Required if **Public** is not checked. | {{% alert title="Note:" %}} For DockerHub, the Docker registry endpoint is `index.docker.io`. DockerHub Public repository names are often prepended with `library/`. For example: `library/nginx`. {{% /alert %}} ### Section Name | Description | Notes -- | -- | -- | Account Id | An ID referencing your Section account. | Required | API token | An API Token with access to the account provided in Account Id. | Required | Use for CDN | Enables Webscale CDN for your provider. After you enable CDN for the provider, you can enable this feature for all applications that use the provider. | Optional | Webscale Owned | Prevents unauthorized users from managing this provider. | Optional | ## Edit providers {{% alert title="Warning:" %}} A provider holds the credentials Webscale uses in your cloud account. Changing its credentials or region can break the applications and clusters that use it. Contact [support](mailto:support@webscalenetworks.com) before you change one of those fields. {{% /alert %}} ### To edit a provider 1. On the **Webscale Control Panel** page, click the menu icon on the upper left of the screen. 2. On the sidebar menu, select **Providers**. 3. On the **Providers** tab, click the **Edit** button for the provider. {{< figure src="/images/providers/providers_select_edit.png" align="left" width="100%" alt="Select Edit for a provider">}} 4. In the **Edit provider** dialog box, modify settings. 5. Click **Save**. ### Delete providers You cannot delete providers used in blueprints. To delete a provider in use, discard any blueprints that include the provider before deleting it. {{% alert title="Warning:" %}} Deleting a provider, which defines the relationship between your Webscale account and cloud service, can result in serious problems. Proceed with caution and contact [support](mailto:support@webscalenetworks.com) before deleting a provider. {{% /alert %}} ### To delete a provider 1. On the **Webscale Control Panel** page, click the menu icon on upper left of the screen. 2. On the sidebar menu, select **Providers**. 3. On the **Providers** tab, click the **Edit **button for the provider. 4. In the **Edit provider** dialog box, click **Delete**. 5. To confirm deleting the provider, click **Yes**. {{< figure src="/images/providers/providers_delete_confirm.png" align="left" width="100%" alt="Select Edit for a provider">}} ## Further reading - [Creating Clusters](/docs/how-tos/general/clusters/) --- # Creating Clusters URL: https://docs.webscale.com/docs/how-tos/general/clusters/ Description: Create clusters through the Webscale Control Panel A cluster is a collection of servers or containers that can be used to scale an application horizontally. Webscale supports both Virtual Machine (VM) based clusters as well as Amazon Elastic Kubernetes Service (EKS) clusters. In order to create a cluster, you must first add your provider via the **Providers** tab. For more information, check out [Working with Providers](/docs/how-tos/general/providers/). ### Cluster types Webscale supports two different types of clusters: VM and Kubernetes. - [VM Clusters](/docs/how-tos/general/vm-clusters/) - [Kubernetes Clusters](/docs/how-tos/general/kubernetes-clusters/) Once created, cluster configurations and their blueprints can always be edited. VM cluster deployments can be managed manually or through [Managed Deployments](/docs/how-tos/advanced/managed-deployments/). Kubernetes clusters deploy Helm charts and are always managed through Managed Deployments. ### Associate the cluster to an application Once you've added a cluster you can link it to an application for scaling. To access these settings, log in to your Webscale Dashboard and click the 3 vertical dots on the upper right corner of the box for the application you wish to view and click **Edit** from the dropdown. From here, click **Servers**. Then, choose the existing cluster from the dropdown under **Scaling Cluster**. ## Further reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Security How-Tos](/docs/how-tos/security/) --- # VM Clusters URL: https://docs.webscale.com/docs/how-tos/general/vm-clusters/ Description: Create server based Webscale clusters A Virtual Machine (VM) cluster is a server based cluster that scales horizontally in response to increasing or decreasing traffic. VM Clusters are composed of cluster servers which are created based on one or more user provided server blueprints. ## Prerequisites In order to create a VM cluster, you must first add your Provider via the **Providers** tab. For more information, check out [Working with Providers](/docs/how-tos/general/providers/). Creating a provider will automatically create the VM service necessary to create VM clusters. ## Create a VM cluster To create a cluster, click the **Clusters** tab and then click **Add cluster**. Next you will define the properties of the cluster. {{% alert title="Note:" %}} If you have additional cluster service types enabled in your provider, you may be prompted to select a cluster type. For VM clusters, select "virtual-machine". {{% /alert %}} {{< figure src="/images/add-cluster.png" width="75%" alt="Add VM Cluster Dialogue" >}} | Property | Description | | ------------------- | --------------------------------------------------------------------------------------------- | | Name | Name of the Webscale cluster. | | Min size | Minimum number of servers in the cluster at any given time. | | Max size | Maximum number of servers allowed in the cluster. | | Min increment | When scaling is necessary, increment server count by this amount at a time. | | Manual size | A specified number of servers for the cluster (overrides minimum and maximum). | | Healing delay | The amount of time a server can be unreachable before it is replaced. | | Failed server disposition | The protocol to initiate when a server has failed. | | Verify timeout | The amount of time to attempt to verify a server before initiating failure protocol. | | Servers update webhook | Webhook address to notify when a server in the cluster has changed. | | Measurement type | The method of gathering utilization metrics from each server in the cluster. | | Allocate public address | Whether or not to allocate a public address for each server in the cluster. | | Manage Deployments | See [Managed Deployments](/docs/how-tos/advanced/managed-deployments/). | | Blueprint | Server blueprints define the properties of the servers in the cluster. Input options vary based on the provider service selected. You must specify at least one blueprint to create a cluster. See [Defining your server blueprints](#defining-your-server-blueprints). | | Scale in/out when | Predefined conditions that determine when the cluster will scale. | Once you have specified the details of your cluster configuration, click **Save** to create the cluster. If you have specified a minimum size of greater than 0, your cluster will immediately begin scaling out. This can be monitored via the **Task monitor**. ## Defining your server blueprints Click "Add a blueprint" to add a server blueprint to your cluster. Multiple blueprints may be provided for VM clusters. After selecting which service you would like to use to provision the server, you will be presented with configuration options specific to that service provider. {{< figure src="/images/vm-bp.png" width="75%" alt="VM Blueprint Editor" >}} ### Metadata {{< figure src="/images/cluster-blueprint-metadata.png" width="75%" alt="Metadata" >}} For select providers, you have the option to specify key/value pairs that are made available on servers created using that blueprint. The key/value pairs provided will be mounted on every cluster server at `/var/lib/webscale/metadata.json`. The format for each entry will be: ``` {"key" : "my-key", "value" : "my-value"} ``` Note: This feature cannot be used in conjunction with bootstrapping. ### Files {{< figure src="/images/cluster-blueprint-files.png" width="75%" alt="Files" >}} For select providers, you have the option to specify files that are made available on servers created using that blueprint. Upload a file via [Webscale Files](/docs/how-tos/general/files/) as type "Microsite" and it will become available for selection in the cluster blueprint editor. In the cluster editor, select a previously uploaded file, choose the path within that compressed file, and then specify the location on the cluster server where you would like to mount the file. When the cluster scales, the specified file will be mounted at the specified location on every server created from that blueprint. Files must be uploaded to your Webscale account prior to blueprint creation via the **Files** tab. Note: This feature cannot be used in conjunction with bootstrapping. ## Further reading - [Kubernetes Clusters](/docs/how-tos/general/kubernetes-clusters/) - [Managed Deployments](/docs/how-tos/advanced/managed-deployments/) --- # Kubernetes Clusters URL: https://docs.webscale.com/docs/how-tos/general/kubernetes-clusters/ Description: Deploy Helm charts to an Amazon EKS cluster A Kubernetes cluster is a Webscale cluster that deploys a Helm chart to an Amazon Elastic Kubernetes Service (EKS) cluster. Every deployment installs your chart as a Helm release in its own namespace. Webscale verifies that its proxies can reach the release, then routes traffic to it. Because the previous release keeps running until the destroy delay expires, a rollback is immediate. Your chart controls replica counts and pod autoscaling. ## Prerequisites - **EKS cluster:** The [EKS stack](/hosting-platforms/hosting-v4/stacks/eks/) creates and manages one in your AWS account, including the security group rule for the Webscale proxies. An EKS cluster you built yourself must let the proxies reach the NodePort range `30000-32767`. Private nodes must be in the data plane's VPC or in a network joined to it, and the security group opens the range. The provider's IAM user must have cluster admin access through an EKS access entry. The EKS stack grants one to the `Webscale` IAM user and to each ARN in [`kubernetes_admins`](/hosting-platforms/hosting-v4/stacks/eks/#cluster-access). The Webscale Control Plane must reach the EKS cluster's public API endpoint, which the EKS stack configures for you. - **AWS provider:** Check **Use for Kubernetes** on the provider and enter the EKS cluster name in **Cluster Name**. The provider's region must be the region of the EKS cluster. Saving the provider creates the Kubernetes service that Kubernetes clusters deploy through. See [Working with Providers](/docs/how-tos/general/providers/). - **Managed deployments:** Kubernetes clusters are always managed. See [Managed Deployments](/docs/how-tos/advanced/managed-deployments/). - **Chart file:** Package the chart directory as a .zip, .tar, or .tar.gz with `Chart.yaml` and the `templates` directory at the root of the archive. Upload it on the **Files** page with the Helm chart file type (`helm-chart` in the API). See [Working with Files](/docs/how-tos/general/files/). ## Chart requirements Webscale installs the chart with Helm and reads one Service from it. The chart has to meet these rules. - **NodePort Service:** One Service receives the traffic. Name it in the blueprint. It needs a selector and exactly one port. Do not set `nodePort`. Two releases run side by side, and a fixed port collides. The proxies connect to the nodes on that node port directly, without a load balancer. Both `externalTrafficPolicy` values work, but leave it at `Cluster`, the default. Webscale refreshes the node list once a minute, and between refreshes a node that lost its pod still forwards traffic under `Cluster` but refuses it under `Local`. - **Namespace:** Do not set one in the chart. Each deployment installs into a new namespace whose name is the deployment's ID. The namespace starts empty, and Webscale deletes it with the deployment. Pull secrets, quotas, and network policies come from the chart. Webscale passes the values `webscale_cluster_id`, `webscale_deployment_id`, and `webscale_namespace` to the chart, and they override values of the same name. - **Cluster-scoped resources:** Two releases run side by side during a deployment and the destroy delay. The chart cannot carry CRDs, ClusterRoles, or webhooks that two copies would share. Plan node capacity for two copies. - **PodDisruptionBudget:** [Karpenter](https://karpenter.sh/) on the EKS stack evicts pods when it removes a node. A budget on the serving pods keeps enough of them running. - **Secrets:** Declare an ExternalSecret against the `aws-secretsmanager` store the EKS stack installs. See [Secrets](/hosting-platforms/hosting-v4/stacks/eks/#secrets) on the EKS stack page. ## Create a Kubernetes cluster To create a Kubernetes cluster, click the **Clusters** tab and then click **Add cluster**. Choose the Kubernetes service of your provider in the **Service** field. The editor then shows these properties. | Property | Description | | :--- | :--- | | Service | The Kubernetes service of the provider. The field locks once the Kubernetes cluster has a blueprint. | | Name | Name of the Kubernetes cluster. | | Hostnames, Labels | Optional, the same as for a VM cluster. A change to the hostnames starts a deployment. | | Min size, Max size, Manual size | A minimum size above 0 deploys the Kubernetes cluster on creation. A maximum size of 0 destroys its deployments, and the API refuses a minimum of 0 while an application routes to the Kubernetes cluster. Remove it from the application first. Raising the maximum above 0 deploys again. Replica counts come from your chart, not from these sizes. A future update will simplify these fields and remove **Scale out when**, which does not apply to a Helm release. | | Verify timeout | The time in seconds Webscale waits for the release to become ready, and then again for a proxy to reach it. Defaults to 600. | | Destroy delay, Retained configuration count, Enable maintenance mode during deployments | The managed deployment settings, the same as for a VM cluster. See [Managed Deployments](/docs/how-tos/advanced/managed-deployments/). | | Blueprint | The Helm blueprint. See [Defining the Helm blueprint](#defining-the-helm-blueprint). | Once you have specified the properties of your Kubernetes cluster, click **Save**. With a minimum size above 0, the first deployment starts at once. A Kubernetes cluster created with a minimum size of 0 deploys at the next change to its blueprint. You can monitor progress in the **Task monitor** or on the **Clusters** page. ## Defining the Helm blueprint A Kubernetes cluster has one blueprint, and it describes the Helm release. | Property | Description | | :--- | :--- | | Helm chart reference | The chart archive uploaded as a Webscale file. *Required*. | | Release name | The Helm release name. Each deployment installs its own copy of the release into its own namespace. *Required*. | | Service name | The name of the NodePort Service in the release that receives request traffic. *Required*. | | Helm chart values (YAML) | Values passed to Helm on top of the `values.yaml` in the chart. | The release does not use the metadata and files of a Helm blueprint. Pass configuration through the chart values. In the API, the blueprint looks like this: ``` "server_blueprints": [ { "name": "helm", "service": "/v2/services/abc123", "helm_chart_reference": "/v2/files/xyz789", "helm_chart_values": "", "helm_release_name": "my-release", "helm_service_name": "my-service" } ] ``` A `helm_chart_reference` names the file, and each install uses the current version of that file. To deploy a new chart, upload it as a new version of the file and make that version current. Then change the blueprint, for example its values, to start a deployment. See [Automated Deployments](/docs/how-tos/advanced/managed-deployments/#automated-deployments) for an example. ## Deployment steps A deployment starts when you save a change to the blueprint, such as new values or a different chart file, or to the Kubernetes cluster's hostnames. It also starts when you raise the maximum size from 0. Changes to the destroy delay or the retained configuration count do not deploy. 1. **Install:** Webscale runs `helm upgrade --install --wait --create-namespace` in the namespace of the deployment. The output of Helm appears in the task log as it arrives. 2. **Verify:** Webscale checks that the named Service is a NodePort Service with one port and a selector. It registers the nodes that serve the Service and tests the connection from every proxy of the applications that use the Kubernetes cluster. A Kubernetes cluster without an application skips the test. 3. **Activate:** Traffic moves to the new release. Webscale keeps the previous deployment for the destroy delay, and **Rollback** reactivates it without a Helm run. 4. **Destroy:** After the destroy delay, or on a failure or a cancel, Webscale uninstalls the release and deletes its namespace. A failed deployment never touches the release that serves traffic. Every minute, Webscale re-reads the nodes that serve the Service and sends the proxies the new addresses when they change. ## Troubleshooting The task log names the cause of a failed deployment. These are the common messages. | Message | Cause and fix | | :--- | :--- | | `Deployment my-cluster-abc12 failed. The Helm chart could not be loaded.` | The chart archive could not be read, or its file version is gone. Package the chart with `Chart.yaml` and the `templates` directory at the root of the archive, upload it again, and make that version current. | | `Waiting for my-eks-cluster to become available. Attempt 3 of 10.` | Webscale cannot reach the EKS cluster's API. After 10 attempts the deployment fails with `my-eks-cluster did not become available after 10 attempts.` Check **Cluster Name** on the provider, and that the provider's region is the EKS cluster's region. For an EKS cluster you built yourself, check that the Webscale Control Plane can reach its public API endpoint. | | `Deployment my-cluster-abc12 failed because Helm could not install release my-release.` | Helm failed before the timeout, usually because it rejected the chart. Its output is in the log above the message. | | `Deployment my-cluster-abc12 failed because release my-release did not become ready within 600 seconds.` | The pods did not become ready in time. The lines above the message name each container that did not start and its reason. | | `A helm_service_name is required to find the Service that receives traffic.` | The blueprint names no Service. Set **Service name** in the editor, or `helm_service_name` in the API. | | `Service my-service not found in namespace a1b2c3d4e5f6.` | The chart created no Service by that name in the deployment's namespace. The message repeats until the verify timeout. Set the blueprint's Service name to the Service the chart creates. | | `Service my-service is of type ClusterIP. The proxies reach a cluster by address, so it has to be a NodePort Service. Deployment my-cluster-abc12 failed.` | Change the Service type to `NodePort`. | | `The Service exposes 2 ports. Expose exactly one, so the origin port is unambiguous. Deployment my-cluster-abc12 failed.` | Keep one port on the Service. | | `The Service needs a selector to find its pods. Deployment my-cluster-abc12 failed.` | Add a selector to the Service. | | `No application uses this cluster, so there is no proxy to run the reachability test.` | Not an error. Assign the Kubernetes cluster to an application to get the test on the next deployment. | | `Waiting for a proxy to run the reachability test.` | The applications that use the Kubernetes cluster have no active proxy yet. The message repeats until the verify timeout. | | `Proxy 203.0.113.10 cannot reach 192.168.1.20:31234. The security group on the nodes has to allow the Webscale proxy addresses on the node port.` | The message repeats until the verify timeout. On the EKS stack, add the network of the proxies to `service_ingress_cidrs`, or `0.0.0.0/0` when the nodes are public. Connect the networks as well when the nodes sit in a VPC the proxies cannot reach. On an EKS cluster you built yourself, route to the proxies and open the NodePort range to their addresses. | | `Verification timed out after 600 seconds. Deployment my-cluster-abc12 failed.` | The lines above name what Webscale waited for, such as a proxy that could not reach a node or pods that did not become ready. Fix that cause, or raise **Verify timeout** when the pods only need more time. | ## Further reading - [Creating Clusters](/docs/how-tos/general/clusters/) - [VM Clusters](/docs/how-tos/general/vm-clusters/) - [Managed Deployments](/docs/how-tos/advanced/managed-deployments/) - [EKS stack](/hosting-platforms/hosting-v4/stacks/eks/) - [Working with Providers](/docs/how-tos/general/providers/) - [Working with Files](/docs/how-tos/general/files/) --- # How to Enable Application Uptime Monitoring URL: https://docs.webscale.com/docs/how-tos/general/monitoring/ Description: Enable application uptime and error rate monitoring in the Webscale Control Panel Webscale allows you to enable uptime and error rate monitoring for your application. You can either enable passive monitoring or active monitoring. {{% alert %}} {{% include dashboard-login.md %}} On the menu that appears, click **Edit**. Then, click the **Monitoring** button on the left menu. {{% /alert %}} ## Monitoring modes #### None No monitoring of client error rate or application up/down state is done. Note that all other alerts are independent of this setting. #### Passive Error rates for requests to the site are monitored and alerts are created when the ratio of errors to non-errors is over a threshold. #### Active Requests are regularly made to the application via Pingdom, and alerts are created when multiple successive requests fail. ## Set monitoring modes To set the monitoring mode you desire, click in the **Mode** dropdown to the right and choose the desired mode. Confirm your choice by clicking the **Apply** button on the notice that shows, or cancel the change by clicking **Revert**. #### Notifications When monitoring is enabled, it will send alerts based on the notification preferences set in the **Alert Notifications** page. More information on notifications can be found on [How to Enable Notifications](/docs/how-tos/general/notifications/). ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [How to Enable Notifications](/docs/how-tos/general/notifications/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Security How-Tos](/docs/how-tos/security/) --- # Testing Your Application URL: https://docs.webscale.com/docs/how-tos/general/app-testing/ Description: Test your application through the Webscale Control Panel Through the optional application testing feature, you can perform load tests for your application. The test results can help you find possible problems like performance bottlenecks. You can use this feature to test your application after making changes to it. The application testing feature provides the means to run load tests. Webscale or your developer will create customized tests to meet your needs. The test design specifies the application test paths, what to test, and test methodology. For example, you could request load tests to measure cache, full-functionality, and checkout performance. Before holding a big sale, you might run a cache test designed to understand if your CDN and site cache will serve cached content instead of sending requests to origin. While load tests can target different system components, they all measure performance using the same categories, such as request and response counts and average throughput. For more information about the types of information that load tests capture, see [Test results](#test-results). You can view test results reports through the test results page. You can access this page though the **Application testing** and **Reports** pages. For more information on viewing application test results through the **Reports** page, see [Viewing Reports](/docs/how-tos/general/reports/). ## Topics - [Getting started](#getting-started) - [Access the Application testing page](#access-the-application-testing-page) - [Upload tests](#upload-tests) - [Work with uploaded tests](#work-with-uploaded-tests) - [Download](#download-test) - [Edit](#edit-test) - [Delete](#delete-test) - [Run tests](#run-tests) - [Test results](#test-results) ## Getting started After you have purchased this feature, you or Webscale must complete the following tasks before you can run tests. 1. Your developer or Webscale creates tests, according to your specifications. 2. On the **Webscale Control Panel** page, access the **Application testing** page. 3. You or Webscale uploads the files for the tests.
When you select the uploaded files, an icon panel that enables you to download, edit details, delete, and run tests displays for each test when you select it. ## Access the Application testing page After Webscale has enabled the application testing feature, the **Application testing** sidebar menu option displays. The **Application testing** page enables you to upload and run load tests. The tests are listed in the left panel. When you select a test, details for the test display in the **Test details** section of the right panel. You can access the test results through the **Test result** section of the right pane. {{< figure src="/images/application-testing/app_test_panels.png" align="left" width="80%" alt="Application testing page" >}} #### To access the Application testing page 1. On the **Webscale Control Panel** page, click the menu icon on the upper left of the screen. 2. On the sidebar menu, select **Application testing**. {{< figure src="/images/application-testing/select_application_testing.png" align="left" width="100%" alt="Select Application testing" >}} The **Application testing** page displays. ## Upload tests Test files must be in the .zip, .tar, or .tar.gz file format. If Webscale is creating the tests, it might also upload them. #### To upload a test 1. In the left panel of the **Application testing** page, click the **Create test** link. {{< figure src="/images/application-testing/app_test_create_test_link.png" align="left" width="100%" alt="Click Create test link" >}} 2. In the **Create test** dialog box, enter a test name and, optionally, a description. 3. Click **Choose File**. 4. Select a file on your computer and click **Open**, or drag-and-drop it to the **File** box. 5. Click **Save**.
{{< figure src="/images/application-testing/app_test_create_test_dialog.png" align="left" width="79%" alt="Click Choose File" >}} The new test entry displays in the left panel of the **Application testing** page.
If another test was selected when you clicked the **Create test** link, it remains selected and the test information for it displays in the right panel. {{< figure src="/images/application-testing/app_test_new_test_selected.png" align="left" width="100%" alt="Click Choose File" >}} ## Work with uploaded tests For uploaded test files, you can perform the following operations. - [Downloading](#download-test) - [Editing](#edit-test) - [Deleting](#delete-test) - [Running](#run-tests) For information about running tests, see [Run tests](#run-tests). ### Download test #### To download a file Select the file and click the **Download test** icon for it. ### Edit test When you edit tests, you can modify the test description and replace the test by uploading a different file. You cannot modify the test name. #### To edit a test 1. Select the test and click the **Edit test** icon for it. {{< figure src="/images/application-testing/app_test_click_edit.png" align="left" width="100%" alt="Click Edit test icon" >}} 2. In the **Edit test** dialog box, to modify the test description, enter a new description or update an existing one. 3. To replace the test, click **Choose File** and upload a new file. {{< figure src="/images/application-testing/app_test_edit_dialog.png" align="left" width="80%" alt="Click Choose File" >}} 4. Click **Save** when you are finished editing the test. ### Delete test #### To delete a test 1. Select the test and click the **Delete test** icon for it. 2. Click **Ok**.
The test will no longer display in the list. ## Run tests Each time that you run a test, you can configure how it will run by specifying the test parameters. The configuration consists of the following two required settings. - **Duration**: Length of test (in seconds) - **Virtual Users**: Number of virtual users that the test uses to simulate site visitors. The number of users represents your normal customer load plus a buffer. #### To run a test 1. In the left panel of the **Application testing** page, select the test to run. 2. Click the **Run test** icon for it. {{< figure src="/images/application-testing/app_test_click_run_test_icon.png" align="left" width="100%" alt="Click Run test icon" >}} 3. In the **Run test** dialog box:
a. Enter how long the test will run in the **Duration** field.
b. Enter the number of simulated users in the **Virtual users** field. {{% alert title="Note:" %}} To use the previous configuration, enter the same parameters. {{% /alert %}} 4. Click **Run**. {{< figure src="/images/application-testing/app_test_run_test_dialog.png" align="left" width="100%" alt="Run test dialog box" >}} The **Run test** dialog box closes. The state icon in the left panel and **State** in the **Test details** section of the right panel indicate that the test is running. {{< figure src="/images/application-testing/app_test_run_test_state_change.png" align="left" width="100%" alt="Test state indicate that the test is running" >}} When the test has completed, an entry for the results displays in the **Test results** section of the right panel and the state indicates that the test is not running. {{< figure src="/images/application-testing/app_test-new_test_results_entry.png" align="left" width="100%" alt="New test results entry" >}} 5. To view the test results, click the **View report** link for the new test results report. {{< figure src="/images/application-testing/app_test_click_view_report.png" align="left" width="100%" alt="Click View report link" >}} The test results page with the report for the designated test results displays. You can also access this page through the **Reports** page and view all test results and reports through this page. ## Test results All test reports capture the following information. - Request count: Number of requests sent during test - Average throughput: Total number of requests sent during test divided by the duration of the test (in seconds) - Average TTFB (time-to-first-byte): Average interval between when a request is sent and the first byte of the response is received - Responses: Types of responses received during test. Responses are grouped by status code and request URL. Additionally, a count for each group is displayed. This data is captured at each of the following test steps as well as for the entire test. - Ramp-up - Each virtual user session {{% alert title="Note:" %}} A virtual user session fails if at least 30% of the response codes are in the 400/500 range. {{% /alert %}} {{< figure src="/images/application-testing/app_test_report.png" align="left" width="90%" alt="Test results report" >}} ## Further reading - [Viewing Reports](/docs/how-tos/general/reports/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Security How-Tos](/docs/how-tos/security/) --- # Configuring Application Shielding URL: https://docs.webscale.com/docs/how-tos/general/shielding/ Description: Configure application shielding in the Webscale Control Panel Application shielding protects application servers from unauthorized traffic. Shields are implemented by utilizing cloud provider networking capabilities, eg. firewalls in Google or security groups in AWS. More information about application shielding is available on the [Application Shielding reference page](/docs/reference/app-shield/). Configuring a shield will update inbound/ingress rules to permit http and https traffic from Webscale control and proxy servers as well as from whitelisted addresses configured for the application. Traffic from other addresses may be dropped once the shield is selected unless explicitly allowed by higher priority rules. {{% alert %}} {{% include dashboard-login.md %}} On the menu that appears, click **Edit**. Then, click the **Shielding** botton on the left menu. {{% /alert %}} ## Current shields Once you have configured an **Application Shield**, it will show here. ### Remove a shield If you want to remove a shield, click the **Remove** button, then click **OK** on the confirmation that is shown. {{% alert title="Note:" %}} This action is permanent, you will have to recreate the shield if you wish to re-add it. {{% /alert %}} ### Add a new shield To add a new shield, choose the provider from the **Select a provider** dropdown, then choose the shield type from the **Select a shield** dropdown. Once you've made your selections, click the **Add Shield** button to add the shield. ### Add whitelist IPs to the Shields Click the toggle to enable this setting and add the [IPs you've whitelisted](/docs/how-tos/security/whitelist/) to the application shield, so they won't be blocked by the shield. To disable this setting, click the toggle again. ## Further Reading - [Introducing Application Shielding](/docs/Reference/app-shield/) - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Security How-Tos](/docs/how-tos/security/) --- # Advanced How-To Guides URL: https://docs.webscale.com/docs/how-tos/advanced/ Description: Guides on using advanced features through the Webscale Control Panel --- # Webscale CLI Reference Guide URL: https://docs.webscale.com/docs/how-tos/advanced/webscale-cli/ Description: A list of Webscale CLI commands, including example outputs The `webscale-cli` command is the Swiss army knife of Webscale commands. Use it to fix permissions, restart servers, check the health of the cluster, and many other things. {{% alert title="Note:" %}} The command usage is: `sudo webscale-cli ` {{% /alert %}} Some of the most common uses of this command are to check server health, gather information about clusters, or fix permissions on the filesystem. Note that you must use `sudo` with this command, or it fails. ## Cluster Health One of the most common uses of the **Webscale CLI** is to check the overall health of the cluster. This command shows information such as MySQL queries, recent file changes, and other details about the cluster and the database. This command is `sudo webscale-cli health`. An example output is: {{< figure src="/images/webscale-cli/health.png" width="60%" alt="Webscale CLI health output" >}} To narrow your results, use the following flags: | Flag | Explanation | |----|----| |`sudo webscale-cli health --changes` | Search the local filesystem under `/var/www` without following symbolic links. | |`sudo webscale-cli health --changes --deep` | Search `/var/www` and `/var/www/shared` following symbolic links. Generally takes much longer to return data. | |`sudo webscale-cli health --changes ` | Specify the directory that you would like to see the most recently changed files in. Change `` to the actual path you want to check. | |`sudo webscale-cli health --db` | Show the top db queries, sorted from longest to shortest living. It's normal for this command to return no data when the database is not heavily loaded. | |`sudo webscale-cli health --users` | Show any users currently logged in, and what commands they are running.| |`sudo webscale-cli health --load-avg` | Show the load average for the last 2 minutes.| |`sudo webscale-cli health --acs` | Show the results from acs-status: e.g., is `lsyncd` currently syncing to the cluster?| ## Information Gathering The following subcommands of `sudo webcscale-cli` can be used to gather more information: - `sudo webcscale-cli apps servers` Return the internal IP address of servers for the applications as defined in the config file, `/etc/lagrange-credentials.yml` - `sudo webcscale-cli clusters`: Your Webscale application clusters. To see the output of the clusters command, you need to expand your terminal window to 173 columns.
{{< figure src="/images/webscale-cli/cluster.png" alt="Webscale CLI clusters output" >}} This command accepts the following flags: | Flag | Explanation | |----|----| |`--cluster-name` | Return the cluster name for each application.| |`--cluster-id` | Return the cluster id for each application.| |`--private-ips` | Return only the private IP addresses.| |`--public-ips` | Return only the public IPs.| |`--ips` | Return only the private IP addresses.| ## Restarting You can use the webscale-cli command to restart your application servers. The command is: `sudo webscale-cli restart ` Some options for ``: - `apache2` - `php5-fpm` - `php5.6-fpm` - `php7.0-fpm` - `lsyncd` - `sessions` - `magento` - `fpc` - `apache` - `php` - `sync` {{% alert title="Note:" %}} The `apache`, `apache2`, and `php` flags are used to restart the HTTP server and the PHP-FPM servers.
To use this command, you should know which version of PHP and Apache you need to restart. {{% /alert %}} ## Security This is the security subset of tools, which only includes log capture at this time. The command is: `sudo webscale-cli security` - `sudo webscale-cli security --log-capture`: SSH to every app server and run `tar /var/log/apache2/`
Example output: {{< figure src="/images/webscale-cli/log-capture.png" width="60%" alt="Webscale CLI log capture output" >}} ## Deploying There are two `deploy` subcommands. One fixes permissions on the local dataserver, and one fixes issues on application servers that may prevent automatic syncing. This subcommand of the webscale-cli command recurses through the `/var/www/web_root` and the `/var/www/shared/` directories to make sure that all the files underneath these two directories have the proper ownership and permissions. It is usually run after any deployment to make sure things are as they should be. The `deploy` subcommand accepts a path if you want to set permissions on a specific subset of files. If you have files or directories that you need to exclude from this subcommand, list them in the file `/home/www-upload/skip_files` with one file or directory per line. You may also use Unix filesystem regular expressions. - `sudo webscale-cli deploy permissions`
Example output: {{< figure src="/images/webscale-cli/permissions.png" width="60%" alt="Webscale CLI deploy permissions output" >}} - `sudo webscale-cli deploy app_permissions`
Example output: {{< figure src="/images/webscale-cli/app-permissions.png" width="60%" alt="Webscale CLI deploy app permissions output" >}} {{% alert title="Note:" %}} The command `sudo webscale-cli deploy app_permissions` does the same thing as `sudo webscale-cli deploy permissions`, but on the application/web servers that exist when you execute the command. {{% /alert %}} ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Security How-Tos](/docs/how-tos/security/) --- # Managed Deployments URL: https://docs.webscale.com/docs/how-tos/advanced/managed-deployments/ Description: Using managed cluster deployments Managed deployments allow for new cluster configurations to be deployed systematically and efficiently following the blue-green release model. Deployment configurations are grouped in the UI in reverse chronological order so users can easily see their deployment configuration history as well as the state of their current deployment. ## Enabling Managed Deployments {{% alert title="Note:" %}} Managed deployments are an optional feature that must be enabled per account through an entitlement. Contact [Webscale Support](/docs/getting-started/support/) if you do not have access to this feature and would like it. {{% /alert %}} When creating a cluster, users have the option to select a **Manage deployments** checkbox which will enable the feature for the cluster being created. All future deployments will be handled automatically when a relevant configuration change is made to the cluster. Configurations for managed clusters will display in a hierarchical view in the UI (See [below](#understanding-cluster-states).) {{< figure src="/images/add-kubernetes-cluster.png" alt="Manage deployments" >}} After enabling "Manage deployments" you will have the option to define additional properties for your cluster: **Destroy delay**: The amount of time to keep resources running after a new cluster has been successfully deployed. The keeping of resources running can save time in the case where a rollback to a previous configuration is necessary. Additional costs will be incurred due to maintaining resources in the Cloud for the duration of the destroy delay. Clusters being kept due to destroy delay will report a state of "keeping". **Retained configuration count**: The number of previous cluster configurations to store. These configurations can be viewed and redeployed by clicking "Redeploy" in the Cluster Viewer. This count includes configurations in the "retained" or "failed" state, but does not include cluster configurations in the "running" or "keeping" state. When this count is exceeded, cluster configurations will be deleted from oldest to newest until the count is no longer exceeded. **Enable maintenance mode during deployments**: When checked, any applications with the cluster assigned to them will enter maintenance mode during deployments. In the event of a deployment failure, the application(s) will remain in maintenance mode. A subsequent successful deployment will cause the application(s) to exit maintenance mode. It can also be disabled manually, see [Managing Maintenance Mode](/docs/how-tos/general/maintenance/). You can only enable or disable managed deployments during cluster creation. In order to migrate from an unmanaged cluster to a managed one, or vice versa, you must create a new cluster. ## How to execute a new deployment To execute a new deployment, simply change the configuration of your cluster. When you save that configuration, a blue-green deployment will begin. {{% alert title="Note:" %}} Changes to destroy delay or retained configuration count do not result in a new deployment but will affect any previously created cluster configurations. {{% /alert %}} In a blue-green deployment, first a new cluster will be created with the new configuration. Once those resources have been created and verified, routing for any applications assigned to that managed cluster will automatically change from the old (‘blue’) cluster to the new (‘green’) one. ### Automated Deployments To automate your deployments in a CI/CD pipeline, add Webscale API requests at the end of your build process. For example, to deploy a new image tag through the Helm chart of your Kubernetes cluster, write the new values file and execute the following `GET` and `PATCH` requests. The example relies on `jq` being available in your build environment. ``` #!/bin/bash ACCESS_KEY= CLUSTER_ID= VALUES_FILE= # Fetch existing cluster blueprint and update helm_chart_values. VALUES=$(base64 < "$VALUES_FILE" | tr -d '\n') BLUEPRINT=$( { curl -s https://api.webscale.com/v2/clusters/$CLUSTER_ID \ -H "Authorization: Bearer $ACCESS_KEY" | jq .server_blueprints | jq -c ".[0].helm_chart_values = \"$VALUES\"" } ) # Patch the cluster with the updated blueprint. curl -X PATCH "https://api.webscale.com/v2/clusters/$CLUSTER_ID" \ -H "Authorization: Bearer $ACCESS_KEY" -H "Content-Type: application/json" \ --data "{ \"server_blueprints\": $BLUEPRINT }" ``` This will only change the `helm_chart_values` value in the cluster `server_blueprints` while keeping all other cluster configuration values the same. The managed cluster deployment process will trigger on the `PATCH` with the new values. Once the new deployment is verified, the applications that use the cluster route to the new release. To change the chart itself, upload it as a new version of the Webscale file and make that version current before the `PATCH`. A VM cluster works the same way with the blueprint attribute that changed, such as the image. If there are other updates you require to make during a deployment or you are unsure how to retrieve an access key, refer to the [API documentation](/docs/api/). ### Rollback and Redeploy The old (‘blue’) cluster resources will be kept running for the duration of the destroy delay, and can easily be rolled back to by clicking “Rollback” in the UI for that cluster configuration. At the end of the destroy delay, the resources will be destroyed. You can always redeploy an older cluster configuration, just by clicking the “Redeploy” button in the UI. The only difference between this and “Rollback” is that a “Redeploy” will create a new cluster configuration and will require acquiring new resources in the Cloud. ## Understanding cluster states {{< figure src="/images/managed-cluster.png" alt="Managed cluster viewer">}} In the above screenshot, the account contains a managed cluster with five configurations in various states: - myCluster-0g2o1 was recently deployed and resources are still be created or verified. - myCluster-h389a is currently the active cluster serving traffic. It is in the "running" state. - myCluster-5571r is reporting a state of "failed". Something went wrong in creating or verifying this configuration. - myCluster-jrbl8 is in the "keeping" state. It can easily be rolled back to by clicking **Rollback**. - myCluster-novuw is in the "retaining" state. The configuration can easily be redeployed by clicking **Redeploy**. | Icon | State | Description | | - |---------------| ---------------------------------------------------------------------------------------------- | |{{< figure src="/images/circle-regular.png" alt="fa-circle-o" width="23%">}}| Creating | Cloud resources are being allocated. | |{{< figure src="/images/circle-regular.png" alt="fa-circle-o" width="23%">}}| Verifying | A cluster has been created and we are verifying that it responds to requests as expected. | |{{< figure src="/images/circle-green.png" alt="fa-circle" width="23%">}}| Running | Cluster is currently up and running. | |{{< figure src="/images/clock-regular.png" alt="fa-circle-o" width="23%">}}| Keeping | Cluster is not the active cluster, but the Cloud resources are still running. This state indicates that the cluster has been scheduled to destroy after the destroy delay expires. | |{{< figure src="/images/trash-o.png" alt="fa-trash-o" width="23%">}}| Destroying | Cloud resources are in the process of being destroyed. | |{{< figure src="/images/circle-grey.png" alt="fa-circle" width="23%">}}| Retaining | Cloud resources have been destroyed, but we are holding onto the configuration in case the user wants to view or redeploy it. | |{{< figure src="/images/circle-red.png" alt="fa-circle" width="23%">}}| Failed | Creation or verification did not succeed. | ### Deployment Lifecycle {{< figure src="/images/cluster-state-deployment.png" alt="Cluster state deployment" >}} When a new deployment is initiated, resources in the Cloud will be created. Once this is complete, verification on the new cluster will begin. When the cluster successfully responds, the cluster will move into the "running" state. Verification will attempt to retry for the duration of the verify timeout specified in the cluster configuration. If, at the end of this period, the cluster has still not responded successfully, all cluster resources will be destroyed and the cluster will either be marked as "failed" or it will reattempt creation. ### Retirement Lifecycle {{< figure src="/images/cluster-state-retirement.png" alt="Cluster state retirement" >}} After a new cluster has successfully verified, entered the "running" state, and routing has been switched to it, the previous cluster will be retired. All Cloud resources will be kept running for the duration of the destroy delay specified in the managed cluster's configuration. During this time, the cluster can be quickly reinstated as the active cluster by clicking **Rollback** in the Webscale Portal. Once the destroy delay has expired, cluster resources will be destroyed and the configuration will be marked as "retained". The number of retained configurations can be specified by the user in the cluster configuration. Note that failed configurations are also included in this count. ## Further reading - [VM Clusters](/docs/how-tos/general/vm-clusters/) - [Kubernetes Clusters](/docs/how-tos/general/kubernetes-clusters/) - [API Documentation](/docs/api/) --- # Working with Microsites URL: https://docs.webscale.com/docs/how-tos/advanced/microsite/ Description: Working with microsites using the Webscale Control Panel A microsite is a standalone website that displays for your application. A microsite package file (also known as a microsite file) contains the content files for one or more microsites. At a minimum, each microsite will consist of a single html file. Additionally, a microsite can include assets, such as images or CSS files and files for additional pages. The **Files** page enables you to upload and work with microsite package files. After you have uploaded microsite files for your account, they are available for all account applications. All types of Web Controls can serve microsites. The default maintenance Web Control for your application uses a standard microsite from the default microsite file, which contains one or more standard microsites. Webscale uses this microsite file to display a maintenance mode page and for other purposes. You can upload additional microsite package files to replace the maintenance Web Control default microsite file or for other usages. While a microsite file can contain files for several microsites, you can only specify a single microsite file for a request and response Web Control to serve. {{< figure src="/images/microsites/microsites_filespage_initial_view.jpg" align="left" width="95%" alt="Files page initial view" >}} ## Topics - [Shared procedures for working with files](#shared-procedures-for-working-with-files) - [File requirements](#file-requirements) - [Preview microsites](#preview-microsites) - [Standard microsites](#standard-microsites) - [Captcha pages](#captcha-pages) ## Shared procedures for working with files Webscale features that use uploaded files, such as microsites and CloudEDGE Workers, share the same procedures for uploading and managing files but not for previewing files. [Working with files](/docs/how-tos/general/files/) includes information and procedures for the following shared operations. - [Upload files](/docs/how-tos/general/files/#upload-files) - [Work with uploaded files](/docs/how-tos/general/files/#work-with-uploaded-files) - [Downloading](/docs/how-tos/general/files/#download-file) - [Replacing](/docs/how-tos/general/files/#replace-file) - [Editing file details](/docs/how-tos/general/files/#edit-file-details) - [Deleting](/docs/how-tos/general/files/#delete-file) ## File requirements Through the **Files** page, you can upload microsite package files. A microsite file must fulfill the following requirements. - .zip, .tar, or .tar.gz file format - Under 50 MB in size - Links to internal assets must be relative (pages can also contain links to external websites) ## Preview microsites After you have uploaded a microsite file, you can preview it. For more information on uploading files, see [Upload files](/docs/how-tos/general/files/#upload-files) in [Working with files](/docs/how-tos/general/files/). ##### To preview a microsite 1. On the **Webscale Control Panel** page, click the menu icon on the upper-left side of the screen. 2. On the sidebar menu, select **Files**. {{< figure src="/images/files/select_files.png" align="left" width="95%" alt="Files sidebar option">}} 3. In the **Files** page, select a file in the **Files** panel.
The HTML files and any assets for one or more microsites display in the **Content** panel. {{< figure src="/images/microsites/microsites_default_file_selected.jpg" align="left" width="100%" alt="Default file selected" >}} 4. In the **Content** panel, click on an HTML file.
The **Preview** panel displays a preview of the microsite. {{< figure src="/images/microsites/microsites_htmlpage_displayed.jpg" align="left" width="100%" alt="Microsite displayed" >}} {{% alert title ="Note:" %}} The preview is an approximate rendering that might not appear exactly the same as it will in production, especially if the HTML file includes JavaScript. Webscale does not support standalone JavaScript files for this feature. {{% /alert %}} 5. To return to the **Files** panel, click **Files** in the navigation path. {{% alert title="Note:" %}} You can preview other types of files in the list, such as image files. {{% /alert %}} ## Standard microsites The **Files** page contains a system default microsite package file that contains five standard microsite files. Each of these HTML files is a one-page microsite. The names for the following files correspond to when they display. - `captcha.html`: Displays for user challenges - `index.html`: Displays in lieu of all standard microsite files except for `captcha.html` - `maintenance.html`: Displays when your application is in maintenance mode - `queued-reject.html`: Displays when Webscale rejects a deferred proxy request because the proxy request queue is full - `timeout.html`: Displays when a request times out {{% alert title ="Note:" %}} For the default microsite file, all html files, except for the one for captcha, share the same microsite. {{% /alert %}} ### Standard microsite usage The **Maintenance web controls** page for your application handles the standard microsites. You can access the default maintenance Web Control through this page. A maintenance Web Control serves the microsite that displays during maintenance mode. The microsite file selected on the page determines the microsites that automatically display for user challenges, proxy request rejections, and time outs. Initially, the default microsite file is selected on the **Maintenance web controls** page. The default maintenance Web Control also uses this microsite file. You can replace the default microsite file with a new file that contains versions of the standard microsites that are customized for your business. The HTML files must have the same file names as the standard ones to display. A new microsite file might have only one HTML file. If it is named `index.html` and located at the root directory of the package file, the single file will display for proxy request rejections and timeouts but not for captchas. For more information about the maintenance mode microsite, see [Managing Maintenance Mode](/docs/how-tos/general/maintenance/). For more information on captcha, see [Captcha pages](#captcha-pages). ### Replace the default microsite file To use customized microsites, upload a microsite file with new content files. Then select the new microsite file in the **Maintenance web controls** page. For more information on uploading microsite files, see [Upload files](/docs/how-tos/general/files/#upload-files). For more information about maintenance Web Controls, see [Managing Maintenance Mode](/docs/how-tos/general/maintenance/). {{< figure src="/images/microsites/microsite_replace_file.png" align="left" width="100%" alt="Replacement microsite package file" >}} ## Captcha pages If your application has a request Web Control with the **Challenge user** action, Webscale will display a captcha whenever your application challenges a user. The request Web Control uses the `captcha.html` file for the microsite package file that is selected on the **Maintenance web controls** page. If the selected microsite file does not include a `captcha.html` file, the default Webscale captcha displays. When you replace the default system microsite file for your application, you can include a new `captcha.html` file that is customized to meet your business needs. For example, you could brand a new captcha by including your logo. {{% alert title ="Note:" %}} To have captchas function globally (including countries that do not allow the google.com domain), replace `google.com/recaptcha/` with `www.recaptcha.net` in the captcha file. {{% /alert %}} For more information on creating a request Web Control with the **Challenge User** action, see [Protecting Your Site with a Captcha](/docs/how-tos/web-controls/captcha-action/). ### Customized captcha file requirements You must use the `captcha.html` file name for customized captchas. New captchas files must include the following Webscale-specific HTML code. If the code is not included, the captcha will not display. ```
``` Webscale uses the above code to display the captcha on the page. ```
``` Webscale uses the above code to display an error message if the captcha fails. ### Replace captcha files To use a new captcha, perform the following procedure. 1. Create a microsite file that includes a new `captcha.html` file that contains the above html code. 2. Through the **Files** page, upload the new microsite file. For more information on uploading files, see [Working with Files](/docs/how-tos/general/files/). 3. In the **Maintenance web controls** page for your application, select the new microsite file from the **Microsite** drop-down menu and click **Apply**. For information on maintenance mode, including selecting a microsite file for for your application, see [Managing Maintenance Mode](/docs/how-tos/general/maintenance/). ## Further reading - [Working with Files](/docs/how-tos/general/files/) - [Upload files](/docs/how-tos/general/files/#upload-files) - [Work with uploaded files](/docs/how-tos/general/files/#work-with-uploaded-files) - [Managing Maintenance Mode](/docs/how-tos/general/maintenance/) - [Protecting Your Site with a Captcha](/docs/how-tos/web-controls/captcha-action/) --- # Configuring Trusted Proxies URL: https://docs.webscale.com/docs/how-tos/advanced/trusted-proxies/ Description: Configure Trusted Proxies in the Webscale Control Panel The Trusted Proxies feature enables you to designate proxy IP addresses for providers that you trust. You can add trusted proxies through the Webscale Control Panel. To use this feature, select address sets with provider IP addresses and choose to enable it. Trusted proxies can add the `X-Forwarded-For` header to HTTP requests that they send to your Webscale applications. When Webscale receives a message from a trusted proxy, it will use the encoded client IP address as the request address. If it receives the message from a proxy that it does not trust, it will strip the header and use the most recent peer address as the request address. ### What address sets should be trusted? If the peer address of an incoming request is contained in one of the address sets, then the `X-Forwarded-For` header is decoded so that the request is treated as coming from the rightmost address that is not contained in any of the address sets. For example, if **Trusted Proxies** is configured such that it allows 4.5.6.0/24 (that IP address is within a trusted address set) and the request originates from 4.5.6.7 with `X-Forwarded-For: 1.2.3.4, 4.5.6.3`, then the request will be treated as though it came from `1.2.3.4`. More details about the `X-Forwarded-For` header can found on the [Mozilla Developer Docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For). ### Trusted Proxies Only If **Trusted Proxies Only** is enabled, then only Pingdom, the control address, and any proxies added here can access the application. Any other traffic from the internet will be dropped. This setting can add an additional layer of security to your application if you want all traffic to only come from a proxy service such as Cloudflare. ### Trusted Proxies Header This option changes the header used for **Trusted Proxies**. The choices are: - `X-Forwarded-For` (default): The usual header for identifying the originating IP address of a client connecting to a web server through an HTTP proxy or a load balancer. - `True-Client-IP`: Services such as Cloudflare and Akamai send this header to identify the IP address of the requester. - `Custom`: Input your own custom HTTP header here. ## Add trusted proxies You can add more than one trusted proxy at a time. ### To add a trusted proxy 1. Click the three vertical dots menu icon on the upper right corner of the application box and select **Edit**. {{< figure src="/images/access_edit_app_box.png" alt="Select edit application" >}} -or- On your application page, click the **Actions** menu icon and select **Edit**. {{< figure src="/images/access_edit_action_menu.png" alt="Select edit application" >}} 2. On the sidebar menu, select **Trusted proxies**. The **Trusted proxies** page displays. 3. Click **Add an address set** and select a provider in the list. {{< figure src="/images/trusted_proxies_select_cloudfront.png" alt="Select Cloudfront" >}} {{% alert title="Note:" %}} To add more than one trusted proxy, select additional providers in the address set list. {{% /alert %}} 4. To enable the optional **Trusted proxies only** setting, click the toggle for it. 5. To, optionally, use a header other than the **HTTPS X-Forwarded-For** default, select **True-Client-IP** or **Custom** in the **Trusted proxies header** drop-down list. If you have selected **Custom**, enter the name of the header in the custom field. 6. Click **Apply**. {{< figure src="/images/trusted_proxies_select_apply.png" alt="Select Apply" >}} The provider displays as a trusted proxy. {{< figure src="/images/trusted_proxies_cloudfront.png" width="65%" alt="Cloudfront displays as a trusted proxy" >}} ### To delete a trusted trusted_proxies_select_apply 1. Click the **x** for the listed trusted proxy. The provider no longer displays in the list. 2. Click **Apply**. ## Further reading - [Working with Address Sets](/docs/how-tos/general/address-sets/) - [HTTP X-Forwarded-For Headers](/docs/Reference/http-headers/#http-x-forwarded-for-headers) - [Working with Providers](/docs/how-tos/general/providers/) --- # Logs on Webscale URL: https://docs.webscale.com/docs/how-tos/advanced/logs/ Description: A guide to how Webscale handles your application and other logs Log files are plain text files with messages written to them by a server’s operating system and other installed software. These messages help explain the current state of the system and trace any changes made to the system. For instance, error logs contain any error messages the system has encountered, while access logs contain information about when specific files or programs were accessed. #### The logs maintained by Webscale include: - Audit logs - Server access logs - Web server access and error logs - Custom logs (Magento, Wordpress, WooCommerce, etc) - MySQL logs (if applicable) - Event logs - [Content Security Policy logs](/docs/how-tos/web-controls/csp-create/#content-security-policy-logs) - Logs for all services that make up the operating system In some Webscale environments, your application will send its logs to a data server. Once these logs are sent they are retained on that data server, and this is the central log server for your entire environment. The logs available in the [Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/) are web access logs (with the exception of Custom Logs - detailed below). Web access logs capture all web requests sent by user browsers and devices to access the application, including different pages viewed in a session, add-to-cart and checkout operations. The Traffic Viewer enables visualization of access logs, and the ability to write search queries to analyze the data made available. Some event logs are also available in your Webscale Control Panel but for retention purposes, the logs accessible on the data server or pushed to CloudWatch are used. ## Custom Logs Some environments may be setup with the **Webscale Monitoring Agent (WMA)** to capture and publish text based logs such as web server access and error logs, deployment logs, etc. See [Configuring and Viewing Custom Logs](/docs/how-tos/advanced/custom-logs/) for more on how to configure logging through the WMA and then viewing the resulting logs in the Logs Viewer for easy debugging and troubleshooting. ### AWS CloudWatch In some environments, Webscale may alternatively install the [AWS CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) agent. This agent sends important logs to AWS CloudWatch, a monitoring and log aggregation service provided by AWS. Not all logs are pushed to CloudWatch, but logs such as the web server error/access logs, security event logs, and audit logs will be available through CloudWatch. If you are running Magento, Webscale can configure the Magento logs to also be sent to CloudWatch. If you are running a different application, you can work with Webscale to determine which logs must be kept for compliance purposes. ## Log Retention Log retention can be configured by account admins for both online logs (seen Traffic Viewer) and archived logs. Account level settings control retention of account events, while log retention is configurable per-application and by log type. Changing the log retention settings will effect your account billing. #### Log retention fields: - Online days - the number of days to keep logs in traffic viewer - Online space allowance (GB) - storage limit for logs kept viewable in Traffic Viewer - Archive days - number of days to keep archived logs - Archive space allowance (GB) - storage limit for archived logs ### Account Event Logs Account event log retention can be set by going to **Account settings** > **Event log retention**. To retrieve archived logs, go to **Account settings** > **Log archives**. There you can restore and download a selected range of logs that have been archived. ### Custom Logs Custom log retention can be set by going to **Application** > **Edit** > **Log retention**. To retrieve archived logs, go to **Application** > **Edit** > **Log archives**. There you can restore and download a selected range of logs that have been archived. ## FAQs: - **How long are my logs retained?** Log retention depends on the Webscale plan you are subscribed to, and any specific log retention periods you are contracted for. Typically, Cloudwatch logs and traffic viewer logs are retained for at least 30 days by Webscale. It is possible to request extended log retention for up to 1 year for audit or compliance purposes. When extended log retention is enabled, the logs may be stored in storage services (such as [S3 or Glacier](https://docs.aws.amazon.com/s3/?id=docs_gateway) on AWS). - **If I need to see or obtain copies of a specific log file, how would I go about this?** Traffic viewer logs are available to download from the Webscale control panel for administrators of the account. If you are not sure where to find the log, the best thing would be to send in a [support request](/docs/getting-started/support/#create-a-new-ticket). - **What are the paths/locations of the most common logs?** The most common system logs are located under `/var/log/` on the servers they apply to. Magento logs are in `/var/www/site/var/logs/`, and other logs created and managed by Webscale are at `/var/log/webscale/`. Any web server logs end up separated by IP Address in `/var/log/webscale/clients/`. The `var` directory should always be a symlink to the NFS shared directory so that web servers can write to the logs. ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [How to Enforce a Content Security Policy](/docs/how-tos/web-controls/csp-create/) - [Security How-Tos](/docs/how-tos/security/) --- # Configuring and Flushing the Site Cache URL: https://docs.webscale.com/docs/how-tos/advanced/site-cache/ Description: Configure and flush the site cache through the Webscale Control Panel If you have enabled the Dynamic Site Cache feature, Webscale caches static web pages and resources, such as media assets, scripts, and API responses, according to rules that define how and when your application servers cache content. If the Site Cache contains the content, Webscale directly delivers cached pages and resources to site users, bypassing your web servers. You can configure Site Cache rules so Webscale only caches content that can be served to any site user and the resources have a low Time-to-Live (TTL) value. Webscale automatically removes cookies from responses that it sends from the cache. When Webscale CDN is not enabled, Webscale passes incoming requests to your application servers. If the Site Cache contains the requested content, it returns a response to the browser. If the Site Cache does not contain the content, it forwards the request to your web servers to fulfill. When the web servers send a response, the content is cached on your application servers if the content matches a Site Cache rule. Webscale then forwards it to the site user browser. When Webscale CDN is enabled, Webscale CDN receives the requests first. If the Webscale CDN cache does not contain the content for a request, Webscale forwards the request to the proxies. For more information on CDN caching, see [Configuring CloudEDGE CDN Caching Policies](/docs/how-tos/CloudEDGE/cdn-controls/). If you have not created a Site Cache rule, Site Cache is disabled and Webscale will not cache any content. ## Work with Site Cache rules You can create, edit, delete, and change the execution order of Site Cache rules. ### Site Cache rule settings Site Cache rules consist of the following settings. The cache key properties define the cache key, which enables finding out if the requested content already exists in the Site Cache. - **Condition**: Determines if Webscale caches pages and resources. As with Web Controls, you must specify at least one condition for a Site Cache rule to execute. - **TTL (Time-To-Live)**: Specifies how long a cached page or resource is available for site users. The length of time that Webscale caches a page or resource depends on the TTL value. A high number corresponds to a longer amount of time. - Cache key properties: Used to construct a cache key for requests matching the rule. The following settings define the cache key. - **Browser**: Browser attributes for content optimization that are used to partition the cache, if enabled - **Hostname**: Hostname used to partition the cache, if enabled - **Query**: Query parameters used to partition the cache, if enabled - **Path**: Request path used to partition the cache, which cannot be disabled ## Access the Site cache page You can create Site Cache rules through the **Site cache** page. #### To access the Site cache page 1. Click the three vertical dots menu icon on the upper-right corner of the application box and select **Edit**. {{< figure src="/images/access_edit_app_box.png" alt="Select edit application" >}} -or- On your application page, click the **Actions** menu icon and select **Edit**. {{< figure src="/images/access_edit_action_menu.png" align="left" width="45%" alt="Select edit application" >}} 2. On the sidebar menu, click **Site Cache**. The **Site cache** page displays. {{< figure src="/images/site_cache/site_cache_page_displays.png" alt="Site Cache page" >}} ## Create Site Cache rules You can create multiple conditions for each rule. You can also create more than one rule. After you save the first rule, you can enable the Site Cache feature. #### To create a Site Cache rule 1. In the **Site cache** page, click **Add a rule**. {{< figure src="/images/site_cache/select_site_cache.png" alt="Click Add a rule" >}} 2. Click **Add a condition**. {{< figure src="/images/site_cache/site_cache_click_add_condition.png" alt="Click Add a condition" >}} 3. In the condition drop-down menu of the **Create condition** dialog box, select a condition. 4. Specify relevant condition settings. 5. Click **Add**, then **Done**. 6. To add more conditions, follow the above procedure for adding a condition. 7. Make sure that all cache key properties are enabled. {{< figure src="/images/site_cache/enable_cache_properties.png" alt="Enable cache key properties" >}} 8. Provide a valid cookie name if the property is enabled. {{< figure src="/images/site_cache/valid_cookie_name.png" alt="Valid cookie name" >}} 9. The tagging properties allow tagging site cache entries with a tag that can be used to invalidate the cache. If enabled, ensure that a valid header name is provided. {{< figure src="/images/site_cache/valid_header_name.png" alt="Valid header name" >}} 10. Optionally, modify the TTL setting:
Drag the slider to choose from a preset TTL value.
-or-
Click the **Custom Time** toggle, then enter the desired TTL (in seconds). 11. In the **Cache site** page, click **Save**. {{< figure src="/images/site_cache/site_cache_save_rule.png" alt="Save Site Cache rule" >}} 12. If you have not already enabled Site Cache, click the **Enable site cache** toggle to enable it. 13. Click **Apply**. {{< figure src="/images/site_cache/site_cache_enable.png" alt="Apply Site Cache rule" >}} ## Flush the Site Cache Webscale proxies will cache web content that is served from the backend application servers based on rules defined in the [Site Cache rule settings](#site-cache-rule-settings). File types that are cached can include images, javascript files, CSS files, HTML files and API responses. The images, javascript, and CSS files can also be optionally optimized by [Pagespeed](/docs/how-tos/web-controls/pagespeed/). There may be times you will want to flush the contents of the site and Pagespeed caches, for instance if a major update was made to the application or site. You can flush the entire cache or specific items in the cache from both the Webscale control panel or the API. #### Invalidate Site Cache items {{% alert title="Note:" %}} {{% include dashboard-login.md %}} On the menu that appears, click **Invalidate Cache...** {{% /alert %}} {{< figure src="/images/site-cache-invalidate.png" width="75%" alt="Invalidate Site Cache" >}} From here, you can invalidate specific items in the Site Cache, or all items in the Site Cache. Specify the items to be invalidated using the URLs of the items or the tags with which the items are cached. Use a wildcard (`*`) to invalidate all items at a specific path. If no path is specified then the entire Site Cache is invalidated. Provide the header names in the tags field with which the entries are cached and need to be invalidated. If the tags are specified along with URLs then an intersection of both will be invalidated. Click **Invalidate** to proceed, or **Cancel** if you no longer need to invalidate the cached items. #### Using the Webscale API You can use the Webscale API to purge specific items from the cache rather than the entire cache. On the [API page](/docs/api/), enter your API key in the **Enter your api_key** field. Under **Webscale APIs** locate **tasks** and click on **List Operations**. Once here, click **POST** to expand the `POST` type action. Now add the following information in the text area under the **Parameters** section. ``` { "type": "invalidate-cache", "target": "/v2/applications/", "parameters": { "urls": ["*://example.com/example.html","https://example.com.b/*.jpg"], "tags": ["tag1", "tag2"] } } ``` Make sure to replace the placeholder `` with your actual Application ID, and replace the example URLs with the actual URLs and example tags with the actual tags of the items to purge from the cache. You can also use the wildcard character (`*`) to have the action apply to multiple URLs. This is particularly useful when you want to clear certain parameters from the cache, such as all images, all web pages, and so forth. {{% alert title="Note:" %}} The URLs used here must provide the scheme, host and path. For instance, you can use `*://` to cover both the schemes `http,https`, you can provide `*` as host to target all hosts and you can provide an empty path with `/` or `/*` to cover all the paths present under the host. The tags used here must be valid header names. {{% /alert %}} If the action is successful, the API will respond with a `200` status code and will list all the URLs that have been purged from the cache. ## Further Reading - [CloudEDGE CDN Overview](/docs/how-tos/CloudEDGE/cdn-overview/) - [Configuring CloudEDGE CDN Caching Policies](/docs/how-tos/CloudEDGE/cdn-controls/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [How to Enforce a Content Security Policy](/docs/how-tos/web-controls/csp-create/) - [Security How-Tos](/docs/how-tos/security/) --- # Configuring and Viewing Custom Logs URL: https://docs.webscale.com/docs/how-tos/advanced/custom-logs/ Description: Use WMA to send logs to the Webscale Control Panel Webscale has developed a log monitoring agent called the **Webscale Monitoring Agent (WMA)** that can be configured to send application or any application related logs (referred to as **Custom Logs**) to the Webscale Traffic Viewer and the Webscale Logs Viewer for viewing, debugging, and troubleshooting. The WMA logging service can be configured through the [Cluster blueprint editor](/docs/how-tos/general/clusters/) for VM cluster deployments. The WMA will monitor specified files for write events and will send the contents of those logs to Webscale. These logs can then be filtered and viewed in the Webscale Control Panel via the Traffic Viewer and Logs Viewer. ## Logging Configuration {{< figure src="/images/cluster-logging-config.png" width="75%" alt="Logging Config" >}} When creating a Cluster blueprint, if your application is subscribed to Custom Logs, you will see a configuration prompt to select a logging application. This specifies which application your cluster belongs to. Once selected, you will be prompted to configure your log stream. A log stream is a group of log entries from a specific file path. We recommend naming your log stream something that will help you quickly identify what logs you are looking at. Then specify a file path to monitor for these logs. This must be an absolute path and cannot be a directory, but you may use a single `*` wildcard to monitor multiple log files in a single directory. For example: `/var/log/nginx/*.log` as a file path will tell the WMA to monitor for any files with a `.log` extension in the `/var/log/nginx/`directory. {{% alert title="Note:" %}} Custom Logs are an add-on feature that may not be enabled for your account or application. Please contact [Webscale Support](/docs/getting-started/support/#create-a-new-ticket) to request access to this feature. {{% /alert %}} ### Multiline Logs By default, the WMA will divide your logs into individual log records line by line. However, a multiline start regex can be specified if your log file contains multiline logs that are divided by a delimiter. This delimiter must appear at the start of the line. To capture these multiline logs, you must provide a regular expression that matches this delimiter. Often, timestamps are used to divide logs. Here are three common timestamp formats and the regular expression used to match them: ``` Sample timestamp: 1994-11-05T13:15:30Z Regular Expression: \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z Sample timestamp: 2023/06/30 19:41:45 Regular Expression: \d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2} Sample timestamp: [2023-06-30T12:07:30.743Z] Regular Expression: \[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z\] ``` ## Logs Viewer Custom Logs are viewable in the Webscale Control Panel. These Logs can be crucial for monitoring system performance, troubleshooting issues, and ensuring smooth operations. Custom Logs can be viewed in two locations: Traffic Viewer and Logs Viewer. The Traffic Viewer is a powerful tool for extracting information from logs, such as Proxy Logs, Pageview Logs, CDN Logs, or Custom Logs, and for viewing aggregate data and trends over time. ([Learn more about the Traffic Viewer](/docs/how-tos/traffic-viewer/) The Log Viewer is designed for viewing the contents of text based logs (Custom Logs). It simplifies log filtering to allow for swift and efficient debugging and log analysis. | | | |:---:|---| |{{< figure src="/images/logs-viewer/action-menu-logs-viewer-option.png" alt="Action Menu Logs Viewer Option" >}} | 1. Login to the Webscale Control Panel, locate the application for the desired Custom Logs, and open the application's action menu. If the account has an entitlement to Custom Logs the Logs Viewer option will be available. This menu is also reachable from the application's dashboard. |{{< figure src="/images/logs-viewer/traffic-viewer-logs-viewer-button.png" alt="Traffic Viewer Logs Viewer Button" >}} | 2. To reach the Logs Viewer from the Traffic Viewer, change the Log Type to Custom Logs and click the "View in logs viewer" button. |{{< figure src="/images/logs-viewer/logs-viewer-page-default.png" alt="Logs Viewer Page Default" >}} | 3. By default, the Logs Viewer page does not apply any log filters and hides the filter inputs. The default time range is the most recent 5 minutes. The timestamps on the left of the logs indicate the logs' creation time. |{{< figure src="/images/logs-viewer/logs-viewer-from-traffic-viewer.png" alt="Logs Viewer Page Traffic Viewer Passes Time and Filter" >}} | 4. If accessing the Logs Viewer via the Traffic Viewer, the time range set in the Traffic Viewer will be used in the Logs Viewer. Any Streams, Addresses, or Message filter parameters set in the Traffic Viewer will also be applied in the Logs Viewer. However, other filters like Filename or Hostname will not be applied. |{{< figure src="/images/logs-viewer/logs-viewer-range-input.png" alt="Logs Viewer Range Input" >}} | 5. To set a time range, click on the desired start date and input the start time. Then, click on the end date and input the end time. Use the "Forward to Now" button to advance the end time to the present, adjusting the start time accordingly to maintain the time range duration. |{{< figure src="/images/logs-viewer/logs-viewer-show-filters-toggle.png" alt="Logs Viewer Show Filters Toggle" >}} | 6. Activate the "Show Filters" toggle to see the three Log Viewer inputs: the Streams filter (for filtering by various log sources as set in the [Logging Configuration](#logging-configuration)), the Addresses filter (for filtering by the server's IP address that produced the logs), and the Message filter (for filtering by specific words in a log entry, but not fragments of a word). As filters are set, the count of active filters is displayed next to the "Show Filter" toggle. |{{< figure src="/images/logs-viewer/show-next-button.png" alt="Logs Viewer Show Next Button" >}} | 7. When you reach the end of a log range, you can transition to a new log set by clicking the "Show next 5 min" button. This action sets a new start time immediately after the previous end time and establishes a new end time 5 minutes later. If less than 5 minutes remain until the current time, the button will display "Show until now". ## Further reading - [Creating Clusters](/docs/how-tos/general/clusters/) - [VM Clusters](/docs/how-tos/general/vm-clusters/) - [Managed Deployments](/docs/how-tos/advanced/managed-deployments/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Traffic Viewer](/docs/how-tos/traffic-viewer/) --- # Configuring Rate Limiting URL: https://docs.webscale.com/docs/how-tos/advanced/rate-limiting/ Description: Use Web Controls to create rate limits Rate limiting enables you to control access to a page on your website, using Web Controls. For rate limiting, the configuration of Web Controls creates varying experiences for site visitors depending upon criteria that you specify. {{% include webcontrol.md %}} Web Controls define the criteria for rate limiting and actions that occur in response. At a minimum, a Web Control that manages rate limiting includes the rate limiting condition, conditions that set the threshold that trigger rate limiting, and resulting actions. Rate limiting is one way that you can combine multiple Web Controls that act according to specific request conditions. The following example is intended to teach you about rate limiting. It demonstrates one of several ways that you can use it. ## Rate limiting example This example explains one way to rate limit checkout attempts based on user behavior, using address sets and Web Controls. It also includes testing the Web Controls to make sure that they are correctly rate limiting. **Scenario**: Your application rate limits IP addresses if a site visitor attempts to make five or more requests to the checkout page within one minute. Review [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/) to understand the normal request rate for your application's checkout page and adjust the Web Controls accordingly. (Through Traffic Viewer, you can view checkout traffic for your application over an extended amount of time. This information enables you to extrapolate trends.) If you are unsure what rate you might want to choose, you can [contact Support](/docs/getting-started/support/) for assistance. ## Address sets An address set is a list of IP addresses that Webscale manages and uses in features. There are several types of address sets. For this example, a manual and dynamic address set specify the site visitors to which rating limiting applies. A dynamic address set consists of a set of IP addresses that Webscale manages and can automatically change over time. A manual address set is a set of static IP addresses that requires you to manually add and delete addresses. For information on address set types, see [Address set types ](/docs/how-tos/general/address-sets/#address-set-types) in [Working with Address Sets](/docs/how-tos/general/address-sets/). ### Address sets for the example For this example, add addresses to the manual address set that should not be rate limited, such as your web developer's IP address. The dynamic address set contains the IP addresses of potential bad actors that you want to rate limit. Before you start creating the request Web Controls for the example, create the following address sets. - Dynamic address set named "Rate Limited Addresses" - Manual address set named "Rate Limited Address Exceptions." For information on creating address sets, see [Create address sets](/docs/how-tos/general/address-sets/#create-address-sets). ## Web Controls When conditions for a request Web Control are met, Webscale applies the specified actions to the request. Webscale runs the same procedure for subsequent Web Controls in the request Web Controls list. If you want to specify a final action, you can only choose one, which runs last. You can re-order the Web Controls in the list to change the progression. The **Web controls** page enables you to create Web Controls. For more information on creating Web Controls, see [Creating Web Controls](/docs/how-tos/web-controls/webcontrols_create/). ## Create Web Controls for rate limiting After you create the address sets, you can configure the Web Controls that will use them. For this example, you will create the following two request Web Controls. They will work together in the specified order to rate limit checkout attempts. They must display together in the list of request Web Controls with the Capture Rate Limited Addresses Web Control above the Block Rate Limited Addresses Web Control. - [Capture Rate Limited Addresses](#create-a-web-control-that-captures-rate-limited-addresses): Automatically adds IP addresses to the Rate Limited Addresses address set for site visitors that exceed the rate limit of checkout attempts. - [Block Rate Limited Addresses](#create-a-request-web-control-that-blocks-rate-limited-addresses): Rate limits any IP addresses added to the Rate Limited Addresses address set. Allows the IP addresses for all other address sets, including the Rate Limited Address Exceptions address set, to access the checkout page even if they meet the rate limit. After you create the Web Controls, you will [test](#testing) them. {{% alert title="Note:" %}} The allowlist for the account is automatically excluded from any configured rate limit conditions. {{% /alert %}} ## Access request Web Controls 1. Click the three vertical dots menu icon on the upper-right corner of the application box and select **Edit**. {{< figure src="/images/access_edit_app_box.png" alt="Select Edit from application box" >}} -or- On your application page, click the **Actions** menu icon and select **Edit**. {{< figure src="/images/access_edit_action_menu.png" alt="Select Edit from Action menu" >}} 2. On the sidebar menu, select **Request web controls**. The **Request web controls** page displays. ## Create a Web Control that captures rate limited addresses When you create the Capture Rate Limited Addresses Web Control that defines rate limited checkout access, you will configure three applicable conditions and one action. If all three conditions are met, the action will execute. The first condition, URL Matches, specifies the Checkout page as the object of the threshold. The second condition, Rate limit, sets the rate limiting threshold. The third action, IP address not in the set, specifies that rate limiting applies only to IP addresses that are not in the Rate Limited Addresses address set. The action, Add address to set, adds IP addresses that meet all conditions to the Rate Limited Addresses address set of bad actors. The IP addresses that do not meet the conditions and are not in the Rate Limited Addresses set, including the IP addresses in the Rate Limited Address Exceptions address set, are permitted to exceed the rate limit threshold. ### To create a Web Control that captures rate limited addresses 1. On the **Request web controls** page, click **Add a request web control**.
The sections for configuring request Web Controls display under the **Edit request web control** heading. {{< figure src="/images/web_controls/click_add_a_request_web_control.png" alt="Click Add a request web control" >}} 2. Enter "Capture Rate Limited Addresses" as the Web Control name. Optionally, add a description. {{< figure src="/images/rate-limiting/name-rate-limit-web-control.png" alt="Name Capture Rate Limited Addresses Web Control" >}} 3. To add the first condition:
a. Click **Add a condition**.
b. In the condition drop-down menu, select **URL matches**. A section with the **HTTP/HTTPS** drop-down menu for the scheme and **Domain**, **Path**, and **Query** fields displays.
c. Select a protocol in the **HTTP/HTTPS** drop-down menu. Enter `/checkout*` as the path. Optionally, you can enter a domain and query.
If you leave the **Domain**, **Path**, and **Query** fields empty, they will default to wildcards. Since the URL matches to everything, the condition does not fulfill its function of helping identifying the object of the threshold. {{< figure src="/images/rate-limiting/rate-limit-url-matches-condition.png" alt="URL Matches condition selected and path entered">}} d. Click **Add**, then **Done**. 4. To add the second condition:
a. Click **Add a condition** under the first condition.
b. In the condition drop-down menu, select **Rate limit**.
c. Enter `5` as the threshold and `1` as the duration.
d. In the **Unit** drop-down menu, select **Minutes**.
{{< figure src="/images/rate-limiting/rate-limit-condition.png" alt="Rate limit condition with threshold">}} e. Click **Done**. 5. To add the third condition:
a. Click **Add a condition** under the second condition.
b. In the condition drop-down menu, select **IP address not in set**.
c. In the address set drop-down menu, select **Rate Limited Address Exceptions**.
d. Click **Done**. {{< figure src="/images/rate-limiting/rate-limit-ip-address-not-in-set.png" alt="Select IP address not in set condition">}} 6. To add the action:
a. Click **Add action**.
b. In the **Type** drop-down menu, select **Add address to set**.
c. In the address set drop-down menu, select the **Rate Limited Addresses**.
d. Add an expiration date. You can use the slider. Or, if you would like to set a specific time, the **Custom time** toggle will enable you to to specify the time in seconds. For this example, use one hour as the expiration date.
e. Click **Done**. {{< figure src="/images/rate-limiting/rate-limit-action-add-address.png" alt="Select Rate limited addresses action">}} 6. To the right of the **Edit request web control** heading, click **Done**. 7. Select the **Enabled** checkbox. 8. Click **Apply**. {{< figure src="/images/rate-limiting/rate-limit-web-control-apply.png" alt="Create Capture Rate Limited Addresses Web Control">}} ## Create a request Web Control that blocks rate limited addresses When you create the Web Control that blocks rate limited addresses, define two applicable conditions and one action that defines when Webscale prevents access to the checkout page. The first condition, Block Rate Limit Addresses, specifies that Webscale will apply action to IP addresses in the Rate Limited Addresses address set. The second condition, URL matches, defines that if the IP address matches the specified path, it is subject to the action. If an IP address meets the two conditions, it will be blocked from the checkout page and Webscale will serve a 403 error code. ### To create a request Web Control that blocks rate limited addresses 1. On the **Web Controls** page, click **Add a request web control**.
The sections for configuring request Web Controls display under the **Edit request web control** heading. 2. Enter "Block Rate Limit Addresses" as the Web Control name. Optionally, add a description. 3. To add the first condition:
a. Click **Add a condition**.
b. In the condition drop-down menu, select **IP address in set**.
c. In the address set drop-down menu, select **Rate Limited Addresses**.
d. Click **Done**. 4. To add the second condition:
a. Click **Add a condition** under the first condition.
b. In the condition drop-down menu, select **URL matches**. A section with the **HTTP/HTTPS** drop-down menu for the scheme and **Domain**, **Path**, and **Query** fields displays.
c. Select a protocol in the **HTTP/HTTPS** drop-down menu. Enter `/checkout*` as the path. Optionally, you can enter a domain and query.
d. Click Add, then Done. 5. To add the action:
a. Click **Add action**.
b. In the **Type** drop-down menu, select **Deny request** under **Final actions**.
c. Click **Done**. 6. To the right of the **Edit request web control** heading, click **Done**. 7. Select the **Enabled** checkbox. 8. Click **Apply**. ## Testing {{% alert title="Note" %}} To successfully test the Block Rate Limit Addresses Web Control, make sure the IP address at your current location is not in the [Rate Limited Address Exceptions](#address-sets) address set. If it is in the list, the rate limiting will not occur. {{% /alert %}} ### Test rate limit checkout attempts based on the example request Web Controls For this testing, the request will have `https://example.com/checkout.php` as the domain and `/checkout*` as the path. The following scenario will take place. You can also review [**Traffic Viewer**](/docs/how-tos/traffic-viewer/filter-traffic-viewer/) to see if the request Web Controls executed as expected. Enter `delivery_status>-1 and status_code>403` into the Traffic Viewer filter. #### To test the example request Web Controls 1. The request does not match the criteria specified for the Allow Rate Limit Exceptions Web Control. Webscale ignores the final action of `Discontinue` for this Web Control since it does not match. The Allow Rate Limit Checkout Access Web Control next processes the request. 2. The request matches the for the Allow Rate Limit Checkout Access Web Control conditions of `5` as the threshold and `1` as the duration. It runs the **Add address to set**, which adds the request IP address to the address set specified for the Web Control. The Block Rate Limit Addresses request Web Control processes the request last. 3. Since the request has https://example.com/checkout.php as the domain and `checkout` as the path, it matches the conditions for the Block Rate Limit Addresses Web Control. If the user exceeds five or more attempts to checkout, according to the action for this Web Control, a `403` error will occur and `Forbidden` will display in the web browser. ## Summary For this scenario, you used address sets and request Web Controls to rate limit the checkout page of a website. This can help reduce load on the checkout page of your application. Reducing load restricts activity to legitimate and productive activity without permanently blocking traffic that may not be harmful. Using multiple Web Controls in this manner allows for great flexibility and powerful control over your web applications. ## Further reading - [Web Controls](/docs/how-tos/web-controls/) - [Working with Address Sets](/docs/how-tos/general/address-sets/) - [Security How-Tos](/docs/how-tos/security/) - [How to Enforce a Content Security Policy](/docs/how-tos/web-controls/csp-create/) - [Building Filters in Traffic Viewer](/docs/how-tos/traffic-viewer/filter-traffic-viewer/) - [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/) - [CIDR (Classless Inter-Domain Routing) Definition](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) --- # Working with Monitors URL: https://docs.webscale.com/docs/how-tos/advanced/monitors/ Description: Create and configure monitors The monitoring feature enables Webscale to track potential problems or system changes. Monitors generate events when they detect activity that matches or exceeds conditions that you define. They can send email notifications when these events occur. For example, you can create monitors that notify you about website security violations or when the data transfer for outbound traffic exceeds a threshold. The monitor type determines the activities that monitors can track. - **data-transfer-billing**: Monitors data transfer for all account applications - **logs**: Monitors traffic logs for specified applications - **data-plane**: Monitors particular data plane attributes for changes - **signal**: Monitors changes in signals for specified accounts or applications - **application**: Monitors the configurations and resources of one or more applications in an account When adding or editing a monitor, shared and type-specific settings become visible after selecting a type. {{< figure src="/images/monitors/monitor-list.png" alt="Monitors page list" >}} ## Topics - [Shared monitor settings](#shared-monitor-settings) - [Data transfer monitor](#data-transfer-monitor) - [Logs monitor](#logs-monitor) - [Data plane monitor](#data-plane-monitor) - [Signal monitor](#signal-monitors) - [Application monitor](#application-monitors) ## Shared monitor settings All monitor types share the following settings. - **Name**: Identifies the monitor - **Description**: Provides a short description of the monitor's purpose - **Type**: Specifies monitor type - **Notify**: Enables sending notifications when events that the monitor tracks occur - **Log events**: Enables adding events that match monitor conditions to the event logs - **Manage tickets**: Enables creation of support tickets when the monitor triggers - **Message**: Enables customizing the notification message for `Notify` or `Manage tickets` actions The **Type** and **Name** settings are required. The remaining settings are optional. {{% alert title="Note:" %}} For the **Notify** setting, you can choose to send notifications to specified email address or to the Splunk On-Call third-party notification system if you have installed this product. (The former name for this system is VictorOps) {{% /alert %}} {{< figure src="/images/monitors/victor-ops-form.png" alt="Specify Splunk On-Call notification" >}} ### Notification messages {{< figure src="/images/monitors/template-editor.png" alt="Message section" >}} The **Messages** section enables you to create email notification messages. For some monitors, you can choose to create notifications that indicate potential problems. (A monitor will trigger when thresholds that you have defined are met or exceeded.) Webscale will send recovery messages when the monitor no longer detects potential threat conditions. When creating messages. You can: - Type a message in the **Edit** tab that Webscale sends for all circumstances - Define dynamic messages that change according to the situation ### Dynamic messages Dynamic messages use variables that reference specific values from your Webscale account. The available variables are visible in the **Context** tab. ### Message section In the **Message** section: - **Edit** tab: Displays a sample message that demonstrates how to use the context variables. You can modify or replace this sample message. - **Context** tab: Displays the available variables for the message - **Preview** tab: Displays a rendered version of the message - Message type option menu: Specifies if the message is an alert or recovery notification. Displays when you select the **Context** tab. When you create dynamic messages, Webscale uses [Liquid](https://shopify.github.io/liquid/) templates to reformat your message into Markdown. Liquid then reformats it from Markdown into HTML for the email message. A Liquid template also defines the message format. You can switch to another Liquid template to change the message appearance through Liquid. Liquid is an open-source template language for web applications. For more information about how to use Liquid, see the [Liquid documentation](https://liquidjs.com/tags/overview.html). #### Illustrated example {{< figure src="/images/monitors/monitors_message_summary_tab.png" alt="Monitor dynamic messages illustration" >}} The above graphic illustrates how you can compose two sentences of a message, using variables from the **Context** tab. The **Preview** tab displays how they will render. The **Alerting logs condition** option menu selection determines that the message is an alert. In the scenarios for the graphic, the boxes with the colored borders show how a variable can be used and rendered. {{% alert title="Note:" %}} Webscale automatically populates the variables in the **Context** tab with corresponding system information. For example, if the host name for a monitor application is "example.com," the application variable will include ``"default_hostname": "example.com"``. {{% /alert %}} ## Data transfer monitor The data transfer monitor is present by default and always lists on the **Monitors** page. It tracks data transfer usage for all account applications. It is the only monitor with the **data-transfer-billing** type. While you can edit this monitor, you cannot delete it. The information that the data transfer monitor collects provides the content for the Data Transfer report. ## Logs monitor You can view your site's activity in near real-time through Traffic Viewer, which uses Webscale traffic logs information. These logs document the activity for each application. You can configure monitors for each of the following logs types. - CDN - CSP (Content Security Policy) - Pageview - Proxy Through CDN and Proxy logs, you can view the activities that your site’s CDN and application generate. Pageview logs can provide insight into your user experience. CSP reports inform you of violations of your site's security policy. ## Data plane monitor The data plane monitor lets you know when changes have been made to a particular attribute of the data plane being monitored. You can use **Monitors** page to perform the following operations. - [Create data plane monitor](#create-data-plane-monitors) - [Edit data plane monitors](#edit-data-plane-monitors) - [Delete data plane monitors](#delete-data-plane-monitors) ### Data planes Data planes are sets of proxies that service all of your application traffic. They sit between your application and the internet, functioning as reverse proxies. Data planes can perform many functions, such as load balancing, protecting your application, and caching. Each application is connected to a data plane. Your account can have multiple data planes. Multiple applications can share a single data plane. ### IP addressing Data planes enable you to manage proxies. Each proxy must have a public IP address. The cloud provider for the data plane, such as AWS, Azure, or Google Cloud Platform, allocates IP addresses for new proxies. When you create or edit a data plane, you can choose the method for assigning IP addresses. One option is to use a pool of pre-allocated static IP addresses that the provider generates. When Webscale creates proxies for a data plane, it assigns IP addresses from the pool. For deleted proxies, Webscale returns the pre-allocated static IP address to the pool. It can then reassign the static IP address to new proxies. Another method is for Webscale to allocate a new public IP address when it creates the proxy. The IP address does not belong to a pre-allocated pool. When Webscale deletes a proxy, the address will be released. ### Data plane monitors and static IPs Data plane monitors track changes to a specified attribute of a data plane. The **static_ips** attribute enables the monitor to record a change to the static IP address set. Depending on the monitor configuration, the monitor can send a notification when a change occurs. For example, a monitor will trigger when static IP addresses are added to a data plane due to an increase in its maximum size. You can create monitors and choose the **static_ips** attribute for data planes that do not have the static IP addressing feature enabled. These monitors track changes to this attribute for specified data planes. If you enable this feature for an existing data plane, Webscale will add the data plane's existing IP addresses to its static IP address pool. The monitor will register the change. If you have entered an email address or VictorOps information, Webscale will then send a notification. ### Create data plane monitors You can create multiple data plane monitors. For instance, you might create a monitor for each of your data planes if you have more than one data plane. Or, you could create multiple monitors for one data plane with different recipients and messages for each monitor. The **Context** tab of the **Message** section of the **Create monitor** dialog box contains some variables that are specific to the data plane monitor. {{< figure src="/images/monitors/data-plane-static-ip-monitor-config-example.png" alt="Create data plane monitor" >}} #### To create a data plane monitor 1. On the **Webscale Control Panel** page, click the menu icon on the upper left of the screen. 2. On the sidebar menu, select **Monitors**. 3. In the **Monitors** page, click **Create monitor**. 4. In the **Create monitor** dialog box, select the **object-data-plane** monitor type. 5. Enter a monitor name. 6. Optionally, enter a description for the monitor. 7. To disable logging events that match monitor conditions, toggle the **Log events** switch to off. 8. Specify the data plane to monitor by selecting it from the **Data plane** drop-down menu. 9. Specify the attribute to monitor from the **Attribute** drop-down menu. 10. Optionally, specify the notification recipients in the **Notify** section:
To send email notifications, make sure that the **mailto** option is selected in the drop-down menu and enter one or more email addresses. Click **Add**.
-or-
To use the Splunk On-Call third-party notification system, select **victorops** and enter the api and routing keys. Click **Add**. 11. Define your message in the **Message** section. 12. Click **Save**. ### Edit data plane monitors You can edit the details for a data plane monitor. #### To edit a data plane monitor 1. On the **Monitors** page list, select the monitor. 2. Click the edit icon that displays for it. {{< figure src="/images/monitors/monitor-list-edit-hover.png" alt="Select edit icon for a data plane monitor" >}} 3. In the **Edit Monitor** dialog box, modify the monitor settings. {{< figure src="/images/monitors/edit-static-ip-monitor-form.png" alt="Edit data plane monitor dialog box" >}} 4. Click **Save**. ### Delete data plane monitors You can delete data plane monitors. If you plan to delete a data plane, you must delete any monitors for it before you can delete it. #### To delete a data plane monitor 1. On the **Monitors** page list, select the monitor. 2. Click the **Delete file** icon that displays for it. {{< figure src="/images/monitors/delete-hover.png" alt="Select delete icon for a data plane monitor" >}} 3. Click **Ok** in the confirmation box.
{{< figure src="/images/monitors/delete-confirmation-dialog.png" alt="Delete data plane monitor confirmation box" >}} ## Signal monitors Signal monitors inform you when signals for applications or accounts have been triggered or resolved. Signals are stateful representations of problems that may occur with configured infrastructure. Monitors may be configured to observe signals for accounts or applications. For example, a signal may trigger when an application is unreachable from Australia and then will resolve when that application becomes reachable again. ### Configure signal monitors Signal monitors may have **Labels** configured. Labels are how to tell the monitor to observe signals for applications with matching labels. Application labels may be configured in the [general application settings](/docs/how-tos/general/app-general-settings/#labels). {{% alert title="Note:" %}} When no labels are configured for a signal monitor, the monitor will be observing signals for your account. {{% /alert %}} In the advanced signal preferences, an **Inactivity resolution interval** may be configured. This interval represents an amount of time in seconds that must pass while all relevant matched signals are resolved before resolving the state of a signal monitor. {{< figure src="/images/monitors/signal-monitor-config-example.png" alt="Signal monitor configuration example" >}} ## Application monitors Application monitors will trigger when certain configuration or resource-specific criteria are met. At this time, the only resources considered are TLS certificates. The user can configure how many days before expiration the monitor should trigger under the **TLS certificates** section. If the monitor is configured with a **Notify** action, an email will be sent to the configured recipients once a day until the certificate is replaced. {{% alert title="Note:" %}} Application monitors run once a day. They are not automatically run when the monitor's configuration is changed. This means it may take up to a day for a new email recipient to receive their first notification. {{% /alert %}} Any number of application monitors may be configured in the account, each targeting different [labeled applications](/docs/how-tos/general/app-general-settings/#labels), with different customized configurations. {{% alert title="Note:" %}} When no labels are configured on an application monitor, all applications in the account will be monitored. {{% /alert %}} {{% alert title="Note:" %}} By default, an application monitor is automatically created when the first application of an account is created. The monitor will trigger when any certificate in the account will expire in the next 15 days. {{% /alert %}} ## Further reading - [Viewing Reports](/docs/how-tos/general/reports/) - [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/) - [Building Filters in Traffic Viewer](/docs/how-tos/traffic-viewer/filter-traffic-viewer/) - [CDN Logs Attributes](/docs/how-tos/traffic-viewer/cdn-logs-attributes/) - [CSP Reports Attributes](/docs/how-tos/traffic-viewer/csp-reports-attributes/) - [Pageview Logs Attributes](/docs/how-tos/traffic-viewer/pageview-logs-attributes/) - [Proxy Logs Attributes](/docs/how-tos/traffic-viewer/proxy-logs-attributes/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) --- # How to View Webscale Application Server Information URL: https://docs.webscale.com/docs/how-tos/advanced/appserverinfo/ Description: How to View Webscale Application Server Information in your Webscale Control Panel The [Webscale Control Panel](https://control.webscale.com) displays application server information and status. In the control panel you can find out how many servers are currently active, what are those servers' IPs, if any additional servers are being scaled, and more. ## View Application Server Information | | | |---|---| |{{< figure src="/images/appserverinfo/webscale-dashboard.jpg" width="75%" alt="Webscale control panel" >}}| From the [Webscale Control Panel's](https://control.webscale.com) main page (called the [Dashboard](/docs/overview/dashboard/), each application section shows the following:
  • Server status and uptime
  • Scaling for the last 24 hours
  • The number of servers
| |{{< figure src="/images/appserverinfo/app-zoom.jpg" width="75%" alt="Webscale Dashboard" >}}| Click the **Zoom** button to see more details for the specific application.| |{{< figure src="/images/appserverinfo/application-diagram.jpg" width="75%" alt="Webscale Dashboard" >}}| On the application page, the Application Diagram section shows the currently active servers, as well as any servers currently scaling in or out. A list of the IP address for each server is below the server icon. Hover your mouse over the server icon for additional info.| |{{< figure src="/images/appserverinfo/performance-charts.jpg" width="75%" alt="Webscale Dashboard" >}}| The Performance section shows the following for the timeframe you have selected:
  • Response time in seconds
  • Responses per second
  • Server count
  • Data transfer in megabytes
| |{{< figure src="/images/appserverinfo/events-log.jpg" width="75%" alt="Webscale Dashboard" >}}| The Events section shows a running log of all events, including scaling in and scaling out events. Click the **Zoom** button for more details and calendar options.| ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Security How-Tos](/docs/how-tos/security/) --- # Traffic Viewer How-To Guides URL: https://docs.webscale.com/docs/how-tos/traffic-viewer/ Description: Guides on using Traffic Viewer --- # Using Traffic Viewer URL: https://docs.webscale.com/docs/how-tos/traffic-viewer/traffic-viewer/ Description: Using Traffic Viewer in the Webscale Control Panel Traffic Viewer presents logs information about your application network traffic. You can drill down to specific logs based on logs type and date range. Additionally, you can filter results based on specific attribute values. The viewer for Traffic Viewer functions as the wrapper for all four types: CDN, CSP reports, Pageview, and Proxy (also known as the Traffic viewer logs type). As such, it displays views for them through a dedicated page for each logs type. After your logs search has produced results, you can view the logs in two formats: detailed and group. With the detailed format, complete information for the logs displays in the **Records** table. With the group view, only the logs that match the selected group type display. When you move from one format to the other, the logs view in the current format retains the same query criteria as the previous one. The search filter strongly influences the results. Through the filter history, you can easily duplicate previous queries. The history includes the past 20 filters that you have used during your current session. You can return to a previous search by selecting the corresponding filter and specifying other search criteria. {{< figure src="/images/traffic-viewer/traffic_viewer_overview.png" width="70%" alt="Traffic Viewer overview" >}} ### To access Traffic Viewer Click the three vertical dots menu icon on the upper right corner of the application box and select a logs type option from the **Traffic Viewer** sub-menu. {{< figure src="/images/traffic-viewer/select_app_logs_type.png" width="80%" alt="Select logs type App menu" >}} -or- On your application page, click the **Actions** menu icon and select a logs type option from the **Traffic Viewer** sub-menu. {{< figure src="/images/traffic-viewer/select_app_logs_action.png" width="35%" alt="Select logs type Action menu" >}} On the menu that appears, click any one of the options. ## Selecting a log type and metric In the Traffic Viewer, you can modify the records that are shown in the Records table using the filter bar dropdowns. Select between different log types (Proxy logs, CDN logs, CSP reports, Event logs, Pageview logs, Session logs, or Custom logs) using the **Type** dropdown. The Traffic Viewer graph can display one or more metrics associated with the chosen log type. The available metrics for the selected log type are dynamically update in the **Metric** dropdown. {{< figure src="/images/traffic-viewer/records_table_filter_bar.png" width="70%" alt="Traffic Viewer Filter Bar" >}} For graphing multiple metrics, see [Graphing metrics in Traffic Viewer](/docs/how-tos/traffic-viewer/graphing-metrics/). ## Filter builder You can create a filter that defines the logs query through the **Filter** field. Filtering is a useful way to view only the data that interests you. For example, a filter allows you to match all or part of a log, or match specific parts of logs to other logs. When you transition to another view, the last view’s filter bar stays at the state you left it in. Obtain values from the records and add them to the filter without triggering a new view. Alternatively, take values from the summary table and trigger a new view that adds that value to the filter. For more detailed instructions, see [Filter Building in the Traffic Viewer](/docs/how-tos/traffic-viewer/filter-traffic-viewer/). ## Time selection The time selection is independent of the logs views; in other words, whatever time you have selected persists from view to view. The time picker permits you to select any time range within the last month. The available time ranges within the last month are shown below. {{< figure src="/images/traffic-viewer/logs_time_selector.png" width="70%" alt="Traffic Viewer Time Selector" >}} You can also provide your own start and end times within the last month by selecting the "Custom" option. A customized start time can be provided in the "From" input field and a customized end time can be provided in the "To" input field. {{< figure src="/images/traffic-viewer/logs_time_custom_selector.png" width="70%" alt="Traffic Viewer Custom Time Selector" >}} You can compare logs in two time ranges within the last month. This can be achieved by either selecting the "Compare" option in the time picker dropdown or by selecting the "Custom" option in the dropdown followed by checking the "Compare To" box right below the "To" input field for the first time range. {{< figure src="/images/traffic-viewer/logs_time_compare_selector.png" width="70%" alt="Traffic Viewer Custom Time Selector" >}} ## Graph The graph plots data points for each log type or metric provided based on the time range selected. The x-axis represents the time period and the y-axis represents the metric. {{< figure src="/images/traffic-viewer/graph_overview.png" width="70%" alt="Traffic Viewer Graph Overview" >}} ### Metrics The metrics and their meanings are described below for the corresponding data end points. Metrics | Explanation | ----------|----------| | Bytes In Per Second | Bytes received by the Webscale proxy per second, including the HTTP request line and headers. | Bytes Out Per Second | Bytes sent out by the Webscale proxy per second, including the headers. | Requests | The total number of records for the corresponding logs type. | Requests per second | Number of records for the corresponding logs type per second. | Page Load Time | The time taken to load a page for an application when a pagespeed-based beacon was used. | Pageviews | The total number of page loads for an application. | Active Requests | The number of requests that were successfully processed. | Cluster Server Count | The number of active servers across all clusters. | Rejected Requests | The number of requests that were dropped and therefore not processed. There are two ways a request could be rejected:
  • The request was waiting to be processed for a time period that crossed the waiting threshold.
  • There were already too many requests waiting to be processed and so the new request coming in will not even be queued since the new request would cross the waiting limit and therefore be immediately dropped.
| Static Server Count | The number of active servers that are outside any cluster. | Suspended Requests | The number of requests that are waiting to be processed. If the new incoming request crosses the limit to the number of active requests that can be processed in one batch, the request will be queued. For the meanings of the metrics listed below, see [Building Filters in Traffic Viewer](/docs/how-tos/traffic-viewer/filter-traffic-viewer/). - Bytes In - Bytes Out - Internal Latency (`internal_transport_latency`) - Queue Latency - Response Time (`elapsed`) - Server Latency - Threats - Traffic TTFB (`ttfb`) - DOM Content Loaded - DOM Interactive - Pageview Elapsed - First Contentful Paint - Largest Contentful Paint - Pageview TTFB - Ready State Interactive ### Compare time ranges When comparing time ranges, the graph is updated accordingly. For the single metric, there are two graph lines with each assigned a color to differentiate their data points for their respective time periods. {{< figure src="/images/traffic-viewer/graph_compare_time.png" width="70%" alt="Traffic Viewer Graph with compare time" >}} ### Compare metrics Metrics can be compared by selecting a metric in each of the two select drop-down menus present right next to the "Graph" label below the filter input. When comparing metrics, the graph is updated accordingly. Two graph lines are plotted corresponding to the two metrics with each assigned a color to differentiate their data points. The metrics are placed on the left and right y-axes. The metric on the left y-axis corresponds to the metric selected in the first dropdown (from left to right) and the metric on the right y-axis corresponds to the metric selected in the second dropdown. {{< figure src="/images/traffic-viewer/graph_compare_metrics.png" width="70%" alt="Traffic Viewer Graph while comparing metrics" >}} ### Group graph In the [group view](#group-view), when the icon ( ) is clicked, the first five groups from the table have their data points plotted for the chosen metric and is displayed in the graph as five colored lines. You can also add a sixth group to the graph. The maximum number of groups you can view is six. {{< figure src="/images/traffic-viewer/group_graph.png" width="70%" alt="Traffic Viewer Group Graph" >}} ### Graph usability The graph offers a couple of usability features - drag and hover. #### Drag You can click and drag the graph either to the left or right. - Clicking and dragging to the left sets your time range forward. - Clicking and dragging to the right sets your time range backwards. Dragging to the left or right always maintains the same time period between start and end times. #### Hover You can either hover over a data point in the graph or over the graph legend. - Hovering over a data point displays a popover showing the values for the corresponding metrics. - The graph legend contains all the displayed metrics. It tells you what type of metric corresponds to which line on the time graph. Hovering over a legend metric point highlights the corresponding line in the graph. ##### Hovering over a data point in the graph {{< figure src="/images/traffic-viewer/graph_with_compare_hover.png" width="70%" alt="Traffic Viewer Graph with Compare Hover" >}} The popover displays the values for the corresponding metrics. The metrics are identified by the color of the graph line they're associated with. ##### Hovering over an item in the graph legend {{< figure src="/images/traffic-viewer/group_graph_legend_hover.png" width="70%" alt="Traffic Viewer Group Graph Legend Hover" >}} Hovering over an item in the legend highlights the corresponding graph line. ## Records view Use the records view to inspect records on a more detailed and individual level. Access all available information about any specific record here. {{< figure src="/images/traffic-viewer/records_view.png" width="70%" alt="Traffic Viewer records view" >}} ### Toggle visibility Click the icon ( ) positioned to the right of the **Records** label above the table to display and hide the records. ### Reference tools Click the **Reference Tools** button to view the list of address sets available in the account the application belongs to. Clicking on any address set will show you its details like its definition and its address entries. You can edit an address set provided you are an account admin and own the address set. ### Download records Click the download button to download all of the logs that fit your current log request. ### Columns selector The search results display in columns in the **Records** table. You can change the default columns of associated information by accessing the columns selector. The columns window of the selector contains all of the attributes for the relevant logs type. When you initially access the columns window, the attributes for the default collection of columns are selected. When you select different attributes, the columns for the associated information exclusively display. #### To access the columns window In the logs view, click **Columns** in the row of options to the right of the **Records** table heading. {{< figure src="/images/traffic-viewer/open_columns_window.png" width="70%" alt="Access columns menu" >}} #### CDN logs columns selector The below options are selected by default for the CDN logs viewer. {{< figure src="/images/traffic-viewer/cdn_columns_selector.png" width="70%" alt="CDN Viewer columns selector" >}} #### CSP reports columns selector The below options are selected by default for the CSP reports viewer. {{< figure src="/images/traffic-viewer/csp_reports_column_selector.png" width="70%" alt="CSP Reports Viewer columns selector" >}} #### Pageview logs columns selector The below options are selected by default for the Pageview logs viewer. {{< figure src="/images/traffic-viewer/pageviews_logs_column_selector.png" width="70%" alt="Pageviews Viewer columns selector" >}} #### Proxy logs columns selector The below options are selected by default for the Proxy logs viewer. {{< figure src="/images/traffic-viewer/traffic_viewer_column_selector.png" width="70%" alt="Traffic Viewer columns selector" >}} By default, records for only the delivery statuses of `0`, `14`, and `16` display. Whenever the **Delivery status**, **Cache Source**, or **Url Map** column is selected, records for all delivery statuses display. #### More columns selector options For all four logs types, there is a three vertical dots menu icon on the upper-right corner of the columns selection window. Click it to access options to display all columns, or only the default ones. {{< figure src="/images/traffic-viewer/records_column_selector_options.png" width="70%" alt="Columns selector options" >}} ### Group-by selector Group the logs by a selected logs attribute from the group-by drop-down menu. Select a logs attribute from this menu to trigger a drill-down and create a new group view. ### Table customization The records table offers several customization options - sorting, resizing and reordering. #### Sorting Click a column header to order logs by that logs attribute in ascending order. Then, click again to reverse the sort order. {{< figure src="/images/traffic-viewer/table_customization_sorting.png" width="70%" alt="Column sorted in ascending order" >}} #### Resizing Hover column headers to make the column selection window visible. The window will provide a darker background color and a line at the head to indicate that the column can be resized. Then, move the cursor towards the line at the end of the column header hover selection. Clicking and dragging the line will expand or shrink individual column widths. {{< figure src="/images/traffic-viewer/table_customization_resize.png" width="70%" alt="Resize a column header" >}} #### Reordering Hover column headers to make the column selection window visible. The screenshot in the [Resizing](#resizing) section above shows what the column selection window looks like. Then click and hold the mouse down to see the cursor change indicating that the column can be reordered. Then drag and drop the column header to reorder the column. {{< figure src="/images/traffic-viewer/table_customization_reorder.png" width="70%" alt="Resize a column header" >}} ### Cell options Access cell options by either right-clicking the data cell or clicking the drop-down arrow that appears on cell hover. {{< figure src="/images/traffic-viewer/cell_options.png" width="25%" alt="Context menu cell options" >}} There are several options accessible through this drop-down menu depending on the cell. These options are listed below. #### Add to filter Add a predicate to the current filter to only show records that have the cell's value for its column. #### Replace filter Overwrite the predicate on the current filter to only show records that have the cell's value for its column. #### Add to blocklist “Blacklist” [Add an IP address to the blocklist](/docs/how-tos/security/blacklist/#add-an-ip-address-from-the-traffic-viewer) from the records view. This option only shows up if the cell is an address. Clicking on this option adds the address to the address set that is being used as the application's blocklist. You get a confirmation of adding the address to the blocklist every time this option is clicked. If the address is already in the allowlist, the address once added will also be in the blocklist. Before adding it to the blocklist, you get a confirmation that you want to add the address to the blocklist when it's also in the allowlist even though the allowlist overrides the blacklisted addresses. Once confirmed, the address is added to the blocklist. If the address is already in the blocklist, you no longer see the menu option **Add to blocklist “Blacklist”**. Instead this option is replaced with the **Remove from blocklist “Blacklist”** option. Clicking this option gives you a confirmation of the removal of the address. Once confirmed, the address is removed from the blocklist. #### Add to allowlist "Allowlist" [Add an IP address to the allowlist](/docs/how-tos/security/whitelist/#add-an-ip-address-from-the-traffic-viewer) from the records view. This option only shows up if the cell is an address. Clicking on this option adds the address to the address set that is being used as the application's allowlist. You get a confirmation of adding the address to the allowlist every time this option is clicked. If the address is already in the blocklist, the address once added will also be in the allowlist. Before adding it to the allowlist, you get a confirmation that you want to add the address to the allowlist when it's also in the blocklist. Once confirmed, the address is added to the allowlist. If the address was already in the allowlist, you no longer see the menu option **Add to allowlist “Whitelist”**. Instead this option is replaced with the option **Remove from allowlist “Whitelist”**. Clicking this option gives you a confirmation of the removal of the address. Once confirmed, the address is removed from the allowlist. #### Group by ______ Drill down to a new [Group View](#group-view) with the cell value as the grouping metric. #### Show details Show the view containing all details for that record entry. A double-click on a row will also show these details. Here's an example of an access log record's details: {{< figure src="/images/traffic-viewer/record_details.png" width="70%" alt="Record details" >}} You can navigate to the next or previous record entry's details by clicking the "Next" or "Previous" buttons respectively. #### Copy ______ Copy the cell value to the clipboard. ## Group view Use the group view to get a broad analysis of logs. It provides an overview of all logs based on your selected group. {{< figure src="/images/traffic-viewer/groupshowrecords.png" width="70%" alt="Traffic Viewer group, show logs" >}} ### Back "Arrow" button Click the arrow button to navigate to the previous records view. ### Toggle visibility Click the icon ( ) positioned to the right of the "Group" label above the table to display and hide the group logs. ### Graph group button Click the icon ( ) to the right of the visibility icon to apply a grouping to the graph. By default, the data points plotted in the grouped graph reflect the first five groups in the table. ### Group drop-down menu Update the grouping metric without creating a new view by selecting the new field within the grouping drop-down menu. ### Table customization The group table offers the same [customization options](#table-customization) as those in the records view - sorting, resizing and reordering. ### Show logs Select the arrow to continue to drill down to a new "Records View" for the logs in that group. This action triggers the transition to a new records view and adds the grouping value to the filter, thus only showing the logs within that grouping item. ### Aggregate selector The group table allows you to access more grouping analysis through the **+** aggregate selector menu button. {{< figure src="/images/traffic-viewer/aggregate_column_selector.png" width="70%" alt="Group table columns selector" >}} The columns that can be added are called aggregable columns. An aggregate column can be added by the following process: - Select an operator from the "Operator" dropdown. - Select an attribute from the "Attribute" dropdown. - Click the "Add" button. - More aggregate columns can be added by following steps 1-3. - Once you have all the columns needed to be displayed, click the "Apply" button. An aggregate column can be removed from the view by the following process: - Click the icon ( ) next to the aggregate column label. - More aggregate columns can be removed from the view by clicking their respective trash icons. - Once you have all the columns needed to be removed from view, click the "Apply" button. #### Operators Aggregable columns are the numerical columns for each logs type. {{< figure src="/images/traffic-viewer/aggregate_column_selector_operators.png" width="70%" alt="Group table column operators selector" >}} The operators and their respective meanings are described below: Operator | Explanation | ----------|----------| | `Count` | The total number of requests served by the proxy for each of the groups. | `Avg` | The average numerical value is computed from all the values in the aggregable column. | `Max` | The maximum numerical value is computed from all the values in the aggregable column. | `Min` | The minimum numerical value is computed from all the values in the aggregable column. | `Sum` | The total numerical value is computed from all the values in the aggregable column. #### Attributes The aggregable attributes for each of the logs type are listed below. The CSP Report logs do not have any numerical columns and therefore have no aggregable columns. So the "+" button is absent in the group view for CSP logs. ##### CDN logs aggregable attributes These are the aggregable columns available in the group view for the CDN viewer: {{< figure src="/images/traffic-viewer/aggregate_column_selector_cdn_logs_attributes.png" width="70%" alt="Group table CDN columns selector attributes" >}} ##### Pageview logs aggregable attributes These are the aggregable columns available in the group view for the pageviews viewer: {{< figure src="/images/traffic-viewer/aggregate_column_selector_pageviews_attributes.png" width="70%" alt="Group table pageviews columns selector attributes" >}} ##### Proxy logs aggregable attributes These are the aggregable columns available in the group view for the traffic viewer: {{< figure src="/images/traffic-viewer/aggregate_column_selector_traffic_viewer_attributes.png" width="70%" alt="Group table proxy logs columns selector attributes" >}} ## Further reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Building Filters in Traffic Viewer](/docs/how-tos/traffic-viewer/filter-traffic-viewer/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Security How-Tos](/docs/how-tos/security/) - [Working with Address Sets](/docs/how-tos/general/address-sets/) --- # Graphing Metrics URL: https://docs.webscale.com/docs/how-tos/traffic-viewer/graphing-metrics/ Description: An overview of Traffic Viewer graphing capabilities The **Traffic Viewer graph** provides a visualization of your application traffic. While the **Records table** offers a granular, line-by-line view of individual log records, the graph transforms this data into aggregated metric series. By mapping these metrics over a specified time range, you can quickly identify traffic spikes, service dips, or unusual patterns that warrant further investigation. ## Traffic Viewer overview {{< figure src="/images/traffic-viewer/tv_g.svg" width="95%" alt="Traffic Viewer interface overview" >}} To graph a single metric, select your log type and metric preference from the **Type** and **Metric** dropdowns in the **Records table filter bar**. For more advanced analysis—such as overlaying multiple metrics, comparing different log types, or applying unique filters to individual series—click the **Configure icon** in the top-right corner of the graph. ## Graphing multiple metrics Clicking the **Configure icon** will expand the **Configuration panel** to allow for the selection of multiple metrics (up to 5) across log types. Each row represents a new series that will be displayed in the **Traffic Viewer graph**. In order to graph another metric, simply select it from the _“Select a metric…”_ dropdown. In the **Traffic Viewer graph**, axes will be combined when series share the same unit. Otherwise, an additional y-axis will be provided. Hovering over the data will present a popover tooltip that displays the respective data for the nearest data point. To temporarily highlight a specific series, hover over the series label along the x-axis. Clicking the **Trash icon** will remove the metric from the graph. {{< figure src="/images/traffic-viewer/configuration_panel.svg" width="50%" alt="Configure panel expanded" >}} ## Applying filters to graphed metrics When the **Configuration panel** is first expanded, the first entry is labeled “Records table”. This is a dynamic link: the metric and filters for this series are driven by your selections in the **Records Table filter bar**. Updating either of these fields in the **Records table filter bar** will affect the series metric displayed in the graph. {{< figure src="/images/traffic-viewer/records_table_filter_bar_connection.png" width="80%" alt="Records table metric" >}} To modify the other metrics graphed, click the **Settings icon** next to the desired metric in the **Configuration panel**. This will open the **Metric definition** panel which allows you to apply a filter that applies only to the selected metric. {{< figure src="/images/traffic-viewer/animation.png" width="80%" alt="Animation of metric selection" >}} ## Unlinking and linking the records table filter If you would like to search through log records without affecting the graphed metrics, you can do so by unlinking the records table from the graph. Toggle the **Line graph icon** in the Records table filter bar and the Records table will then become unlinked from the graph. The existing metric and filter will be preserved in the corresponding “Records table” metric, if it is still displayed, and the corresponding metric selector will be updated to show that it is no longer linked to the “Records table”. If the “Records table” metric has been *unlinked* from the graph (**Line graph icon** appears gray), but you would like to display a graph using the metric and filter from the **Records table filter bar**, you can toggle the **Line graph icon** and the graph will update with “Records table” displayed as a graphed metric. ## Available metrics | Source | Description | Metrics | | :---- | :---- | :---- | | Application | Core metrics representing the health and capacity of the application. | Requests, Cluster server count, Rejected requests, Static server count, Suspended requests | | CDN | Data transfer and delivery metrics from the Content Delivery Network. | Bytes in, Bytes in rate, Bytes out, Bytes out rate, Content length, Content length rate, Elapsed, Range end, Range start, Requests, Requests rate, TTFB | | Cluster | Infrastructure-level telemetry monitoring the physical or virtual resources powering your application. | CPU utilization, Disk space, Disk utilization, IO wait percent, Memory utilization, Normalized load | | CSP | Content Security Policy metrics tracking browser-reported security violations. | Reports, Reports rate | | Events | Aggregated counts of system-generated log events categorized by severity level. | All events, Info, Severe, Warning | | Pageviews | Real-user monitoring (RUM) data focusing on browser-side performance and core web vitals. | Pageviews, DOM content loaded, DOM interactive, Elapsed, First contentful paint, Largest contentful paint, Rate, Ready state interactive, TTFB | | Proxy | Detailed traffic metrics from the data plane layer, including latency breakdowns and security threats. | Bytes in, Bytes in rate, Bytes out, Bytes out rate, Elapsed, Internal latency, Queue latency, Requests, Requests rate, Server latency, Threats, TTFB | | Sessions | Aggregated user experience data tracking session duration and average load performance. | Elapsed, Page load average, Page load LCP average, Page load TTFB average, Rate | --- # Building Traffic Viewer Filters URL: https://docs.webscale.com/docs/how-tos/traffic-viewer/filter-traffic-viewer/ Description: Build Traffic Viewer filters in the Webscale Control Panel You can use the Traffic Viewer **Filter** field to create filters for the logs search query. Along with the time range and logs type option, the filter defines the query. The filter builder enables you to easily navigate records to find specific logs interactions. There are many ways to build filters; some methods depend on how you are viewing logs (records or groups view). For information on the records and groups views as well as how to use Traffic Viewer, see [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/). {{% alert title="Note:" %}} The Traffic viewer logs type option pertains to proxy logs. {{% /alert %}} {{< figure src="/images/traffic-viewer/traffic_viewer_filter_field.png" width="85%" alt="Traffic viewer logs filter field" >}} # Topics - [Access Traffic Viewer](#access-traffic-viewer) - [Basic filter functionality](#basic-filter-functionality) - [Records view filter functionality](#records-view-filter-functionality) - [Group view filter functionality](#group-view-filter-functionality) - [Logs and report attributes](#logs-and-report-attributes) - [Examples](#examples) ## Access Traffic Viewer You can access Traffic Viewer for each log type through the Webscale Control Panel. ### To access Traffic Viewer 1. Click the three vertical dots menu icon on the upper right corner of the application box and select a logs type option from the **Traffic Viewer** sub-menu. {{< figure src="/images/traffic-viewer/select_app_logs_type.png" width="80%" alt="Select logs type App menu" >}} -or- On your application page, click the **Actions** menu icon and and select a logs type option from the **Traffic Viewer** sub-menu. {{< figure src="/images/traffic-viewer/select_app_logs_action.png" width="35%" alt="Select logs type Action menu" >}} ## Basic filter functionality For all Traffic Viewer logs type pages, you can access the following basic filter functionality through the **Filter** field. - **Example query**: An example query displays in the **Filter** field as a model on how to construct your query. - **Filter log attributes**: You can see the filter log attributes available for the logs type by clicking on the info icon just above the **Filter** field. - **Filter history**: If you previously created filters, the last twenty filter queries for your current Traffic Viewer session display in the **Filter** field drop-down menu. - **Apply filter**: You can apply a filter by clicking **Apply** or pressing **Enter**. - **Filter errors**: If a query is malformed, an error appears below the **Filter** field. {{< figure src="/images/traffic-viewer/filtererror.png" width="70%" alt="Traffic Viewer filter error message example" >}} ## Records view filter functionality {{< figure src="/images/traffic-viewer/filteroptions.png" width="70%" alt="Traffic Viewer filter options" >}} The records view of query results displays all logs of the selected log type that match the specified time range and filter. All general filter functionality applies to the records view along with a few additional features that relate to individual cells within a table. You can access these features by right-clicking the cell value or clicking the drop-down arrow that appears when you hover on a cell. - **Add to filter**: Add a cell value to the filter by selecting **Add to filter** from the drop-down menu for the cell. This action appends the filter-formatted cell value and column header to your current filter. The logs view remains the same and does not trigger a new view. - **Replace filter**: Replace your current filter with the value of a cell by selecting **Replace filter** from the drop-down menu for the cell. This action applies the filter format to the cell value and header, clears the current filter, and replaces it with the reformatted cell value and header. The logs view remains the same and does not trigger a new view. ## Group view filter functionality {{< figure src="/images/traffic-viewer/groupshowrecords.png" width="70%" alt="Traffic Viewer group, show logs" >}} After you create a filter and apply it, you can choose a logs attribute from the **Groups by** drop-down menu to further refine your results. Only results that match the logs attribute for the group display. All general filter functionality also applies to the group view along with one additional feature: **Show logs**: To see all logs that apply to a group member, click the right arrow for the selection. This creates a new view with that group member value and header appended to your current filter. ## Logs and report attributes Depending on the logs type, you can use specific logs and report attributes when you create a filter. ### CDN logs Attributes For information on the logs attributes available for CDN logs filters, see [CDN logs attributes](/docs/how-tos/traffic-viewer/cdn-logs-attributes/). ### CSP reports attributes For information on the report attributes available for CSP reports filters, see [CSP reports attributes](/docs/how-tos/traffic-viewer/csp-reports-attributes/). ### Pageview logs Attributes For information on the logs attributes available for Pageview logs filters, see [Pageview logs attributes](/docs/how-tos/traffic-viewer/pageview-logs-attributes/). ### Proxy logs attributes For information on the logs attributes available for Proxy logs filters, see [Proxy logs attributes](/docs/how-tos/traffic-viewer/proxy-logs-attributes/). ## Examples To see all search results, use `delivery_status>-1` in your filter. Then, make changes to the query pattern and drill down the results to find specific types of traffic. You can include wildcards for queries with log attributes that return non-numeric values. To do so, use the **~ (tilde)** character in conjunction with wildcards. For more information on delivery status codes, see *Delivery status codes* on the [Proxy logs attributes](/docs/how-tos/traffic-viewer/proxy-logs-attributes/) page. - Find all instances of a 500 error: `delivery_status>-1 and status_code>500`. - To see all results from a specific IP address, use the `request_address` log attribute: `delivery_status>-1 and request_address=192.0.2.0` - To check a specific URL on your application, use `request_path`: `request_path="/checkout/cart/" and status_code>=500` - Sort traffic based on useragent and use the **bot** useragent to see if bot traffic is an issue: `delivery_status>-1 and useragent~*bot*` - Find all **php** requests that are not going to standard index.php location: `delivery_status>-1 and request_path~*.php* and request_path!~*index.php* and status_code>=400` - Check traffic to the Magento admin page: `delivery_status>-1 and request_path~*magento_admin_path*` - Check customer post sql requests: `delivery_status>-1 and request_method~*POST*` - Isolate traffic from a specific country: `delivery_status>-1 and country!~*US*` - Global subnet-based requests: `delivery_status>-1 and request_address in 192.0.2.0/16` ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Security How-Tos](/docs/how-tos/security/) --- # CDN Logs Attributes URL: https://docs.webscale.com/docs/how-tos/traffic-viewer/cdn-logs-attributes/ Description: Detailed information about CDN logs attributes The **Traffic Viewer** page in the Webscale Control Panel enables you to view CDN logs information for an application within a specified time period. For more information, see [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/). The following table provides CDN logs attribute information. You can view the name, display name, alias, and a description for each attribute. ## CDN logs attributes Name | Display Name | Alias | Description -- | -- | -- | -- arrival | Arrival | arrival | ISO 8601-formatted date for when the request arrived at the CDN service aws_edge_error_type | AWS edge error | aws_edge_error
aws_edge_error_type | Error that occurred while the CDN service processed the request aws_edge_result_type | AWS edge result | aws_edge_result
aws_edge_result_type | How the CDN service classified the response bytes_in | Bytes in | bytes_in | Bytes that the CDN service received, including request line and headers bytes_out | Bytes out | bytes_out | Bytes that the CDN service sent out, including response headers completed | Completed | completed | ISO 8601-formatted date when processing the request was completed content_length | Content length | content_length | Contents of the Content-Length response header edge_location | AWS edge location | aws_edge_location
edge_location | Three-letter IATA code for an airport near the edge node that received the request elapsed | Elapsed | elapsed | Interval between when the CDN service received the request and sent the complete request peer_address | Peer address | peer_address | IP address of the immediate peer connecting to the proxy. If the peer is a trusted proxy, the remote IP address of the user agent that made the request is used. range_end | Range end | range_end | End value of the Content-Range response header range_start | Range start | range_start | Start value of the Content-Range response header referrer | Referrer | referrer | Contents of the Referer request header request_address | Request address | request_address | Remote IP address of the user agent that made the request host | Request host | host
request_host | Contents of the Host request header request_id | Request ID | request_id | Unique ID for each request that the CDN service serves request_method | Request method | request_method | HTTP request method request_path | Request path | request_path | Virtual path of the request (latter portion of the request URL separated by backslashes after the main website name) request_port | Request port | request_port | Port number that received the request protocol | Request protocol | protocol
request_protocol | HTTP protocol version request_query | Request query | request_query | URL request query parameters (located in the latter sections of the request URL) content_type | Response content type | content_type
response_content_type | Contents of the Content-Type response header response_status_code | Status code | response_status_code
status_code | Response status code that indicates if a specific request has successfully completed tls_cipher | TLS cipher | tls_cipher | Encryption algorithms for transport layer security tls_protocol | TLS version | tls_version
tls_protocol | Highest version of the transport layer security protocol that the client supported time_to_first_byte | TTFB | ttfb
time_to_first_byte | Interval between when the browser sent the request and received the first byte of the response useragent | User agent | useragent
user_agent | Contents of the User-Agent request header useragent_device | User agent device | useragent_device
user_agent_device | Device type used to make the request (e.g., smartphone, desktop, etc.) useragent_name | Browser | browser
useragent_name
user_agent_name | Browser type used to make the request (e.g., Google Chrome, Safari, etc.) useragent_os | User agent OS | useragent_os
user_agent_os | Operating system type used to make the request (e.g., Android, Mac, etc.) x_forwarded_for | X-Forwarded-For | x_forwarded_for | Contents of the X-Forwarded-For request header ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Building Filters in Traffic Viewer](/docs/how-tos/traffic-viewer/filter-traffic-viewer/) - [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Security How-Tos](/docs/how-tos/security/) --- # CSP Reports Attributes URL: https://docs.webscale.com/docs/how-tos/traffic-viewer/csp-reports-attributes/ Description: Detailed information about CSP reports attributes The **Traffic Viewer** page of the Webscale Control Panel enables you to view CSP reports information for an application within a specified time period. For more information, see [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/). The following table provides CSP reports attribute information. You can view the name, display name, alias, and a description for each attribute. ## CSP reports attributes Name | Display Name | Alias | Description -- | -- | -- | -- arrival | Arrival | arrival | ISO 8601-formatted date when the request arrived at the Webscale proxy blocked_uri | Blocked URI | blocked_uri | URI of the resource that the Content Security policy blocked from loading. If the blocked URI has a different origin than the document URI, the blocked URI is truncated to contain just the scheme, host, and port. country | Country | country | Two-letter ISO 3166-1 country code for the origin of a request disposition | Disposition | disposition | "enforce" if the Content-Security-Policy response header was used. "report" if the Content-Security-Policy-Report-Only response header was used. document_uri | Document URI | document_uri | URI of the document in which the violation occurred effective_directive | Effective directive | effective_directive | Directive whose enforcement caused the violation host | Request host | host
request_host | URL of the application that was requested original_policy | Original policy | original_policy | Original policy as specified by the Content-Security-Policy response header peer_address | Peer address | peer_address | IP address of the immediate peer that reported the violation referrer | Referrer | referrer | Referrer of the document in which the violation occurred request_address | Request address | request_address | Remote IP address of the user agent that made the request script_sample | Script sample |script_sample | First 40 characters of the inline script, event handler, or style that caused the violation session_id | Session ID | session_id | ID of the Webscale session that attempted to load the resource status_code | Status code |response_status_code
status_code | Response status code that indicates the response to a specific request useragent | User agent | useragent
user_agent | Contents of the User-Agent request header violated_directive | Violated directive | violated_directive | Name of the violated policy section ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Building Filters in Traffic Viewer](/docs/how-tos/traffic-viewer/filter-traffic-viewer/) - [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Security How-Tos](/docs/how-tos/security/) --- # Pageview Logs Attributes URL: https://docs.webscale.com/docs/how-tos/traffic-viewer/pageview-logs-attributes/ Description: Detailed information about Pageview logs attributes The **Traffic Viewer** page of the Webscale Control Panel enables you to view Pageview logs information for an application within a specified time period. For more information, see [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/). The following table provides Pageview logs attribute information. You can view the name, display name, alias, and a description for each attribute. ## Pageview logs attributes Name | Display Name | Alias | Description -- | -- | -- | -- arrival | Arrival | arrival | ISO 8601-formatted date when the request arrived at the Webscale proxy completed | Completed | completed | ISO 8601-formatted date when processing the request was completed country | Country | country | Two-letter ISO 3166-1 country code for the origin of the request dom_content_loaded | DOM content loaded | dom_content_loaded | Interval between when navigation started and the page loaded the DOM dom_interactive | DOM interactive | dom_interactive | Interval between when navigation started and the page was ready for user interaction elapsed | Elapsed | elapsed | Interval between when the proxy received the request and sent out the complete response first_contentful_paint | First contentful paint | first_contentful_paint | Interval between when navigation started and the first element on the page rendered labels | Labels | labels | List of user-defined labels used to track traffic with the Add Labels web control action largest_contentful_paint | Largest contentful paint | largest_contentful_paint | Interval between when navigation started and the largest element on the page rendered load_id | Load ID | load_id | Unique ID that identified a user-initiated pageload. All resource requests shared the ID to render the page. peer_address | Peer address | peer_address | IP address of the immediate peer connecting to the proxy. If the peer is a trusted proxy, the remote IP address of the user agent that made the request is used. ready_state_interactive | Ready state interactive | ready_state_interactive | Time taken for the loading state of the browser to become interactive. It is interactive when the browser document has finished loading and has been parsed but sub-resources such as scripts, images, stylesheets and frames are still loading. request_address | Request address | request_address | Remote IP address of the user agent that made the request request_host | Request host | host
request_host | Contents of the Host request header request_path | Request path | request_path | Virtual path of the request (latter portion of the request URL separated by backslashes after the main website name) request_port | Request port | request_port | Port number that received the request request_protocol | Request protocol | protocol
request_protocol | HTTP protocol version request_query | Request query | request_query | URL request query parameters (located in the latter sections of the request URL) request_url | Request URL | request_url | String with the host, scheme, path, and query parameters for the request session_id | Session ID | session_id | Unique number that a server assigned to a specific user for a session threat | Threat | threat | "y" if the IP address was a potential attacker. "n" otherwise. time_to_first_byte | TTFB | ttfb
time_to_first_byte | Interval between when the browser sent the request and received the first byte of the response tls_cipher | TLS cipher | tls_cipher | Encryption algorithms for the transport layer security tls_version | TLS version | tls_version
tls_protocol | Highest version of the transport layer security protocol that the client supported useragent | User agent | useragent
user_agent | Contents of the User-Agent request header useragent_device | User agent device | useragent_device
user_agent_device | Device type used to make the request (e.g., smartphone, desktop, etc.) useragent_name | Browser | browser
useragent_name
user_agent_name | Browser type used to make the request (e.g., Google Chrome, Safari, etc.) useragent_os | User agent OS | useragent_os
user_agent_os | Operating system type used to make the request (e.g., Android, Mac, etc.) ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Building Filters in Traffic Viewer](/docs/how-tos/traffic-viewer/filter-traffic-viewer/) - [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Security How-Tos](/docs/how-tos/security/) --- # Proxy Logs Attributes URL: https://docs.webscale.com/docs/how-tos/traffic-viewer/proxy-logs-attributes/ Description: Detailed information about Proxy logs attributes, cache source codes, and delivery status codes The **Traffic Viewer** page of the Webscale Control Panel enables you to view Proxy logs attribute information for an application within a specified time period. For more information, see [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/). The following **Proxy logs attributes** table provides Proxy logs attribute information. You can view the name, display name, aliases, and a description for each attribute. Specific codes, presented in the **Cache source codes** and **Delivery status codes** tables, are returned for the cache_source and delivery_status proxy logs attributes. ## Topics - [Proxy logs attributes](#proxy-logs-attributes) - [Cache source codes](#cache-source-codes) - [Delivery status codes](#delivery-status-codes) ## Proxy logs attributes Name | Display Name | Aliases | Description -- | -- | -- | -- arrival | Arrival | arrival | ISO 8601-formatted date when the request arrived at the Webscale proxy bytes_in | Bytes in | bytes_in | Bytes that the Webscale proxy received, including request line and headers bytes_out | Bytes out | bytes_out | Bytes that the Webscale proxy sent to the client, including response headers cache_control | Cache control | cache_control | Contents of the Cache-Control response header cache_source | Cache source | cache_source | [Two-letter codes](#cache-source-codes) that indicate the action the source took while responding to the request completed | Completed | completed | ISO 8601-formatted date for when processing the request was completed country | Country | country | Two-letter ISO 3166-1 country code for the origin of the request delivery_status | Delivery status | delivery_status | [Numeric codes](#delivery-status-codes) that indicate the delivery status of the request. "0" for traffic proxied through to the application. When not "0," the Webscale proxy handled the request directly. elapsed | Elapsed | elapsed | Interval between when the proxy received the request and sent the complete response internal_transport_latency | Internal latency | internal_latency
internal_transport_latency | Internal proxy delay while processing the request labels | Labels | labels | List of user-defined labels used to track traffic with the Add Labels web control action load_id | Load ID | load_id | Unique ID that identified a user-initiated pageload. All resource requests shared the ID to render the page. location | Location | location | Contents of the Location response header peer_address | Peer address | peer_address | IP address of the immediate peer connecting to the proxy. If the peer is a trusted proxy, the remote IP address of the user agent that made the request is used. proxy_address | Proxy address | proxy_address | IP address of the proxy that handled the request queue_latency | Queue latency | queue_latency | Amount of time that the request spent queued on the proxy, possibly due to a slow backend range | Range | range | Contents of the Range request header referrer | Referrer | referrer | Contents of the Referer request header request_address | Request address | request_address | Remote IP address of the user agent that made the request request_asn | Request ASN | request_asn | Autonomous System Number (ASN) of `request_address` request_host | Request host | host
request_host | Contents of the Host request header request_id | Request ID | request_id | Unique ID for each request that the proxy served request_method | Request method | request_method | HTTP request method request_path | Request path | request_path | Virtual path of the request (latter portion of the request URL separated by backslashes after the main website name) request_port | Request port | request_port | Port number that received the request request_protocol | Request protocol | protocol
request_protocol | HTTP protocol version request_query | Request query | request_query | URL request query parameters (located in the latter sections of the request URL) request_url| Request URL | request_url | String with the host, scheme, path, and query parameters for the request response_content_type | Response content type | content_type
response_content_type | Contents of the Content-Type response header server_address | Server address | server_address | Application server address used to fulfill the request server_latency | Server latency | server_latency | Interval between when the server received the request and the browser received the last byte of the response session_id | Session ID | session_id | Unique ID that a server assigned to a specific user for a session status_code | Status code | response_status_code
status_code | Response status code that indicates if the specific request successfully completed threat | Threat | threat | "y" if the IP address was a potential attacker. "n" otherwise. tls_cipher | TLS cipher | tls_cipher | Encryption algorithms for transport layer security tls_version | TLS version | tls_version
tls_protocol | Highest version of the transport layer security protocol that the client supported trust | Trust | Indicator of trust for a downstream proxy ttfb | TTFB | ttfb
time_to_first_byte | Interval between when the data plane received the request and sent the first byte of the response url_map | URL map | url_map | Name of the url map used in a web control that resulted in the request being redirected useragent | User agent | useragent
user_agent | Contents of the User-Agent request header useragent_device | User agent device | useragent_device
user_agent_device | Device type used to make the request (e.g., smartphone, desktop, etc.) useragent_name | Browser | browser
useragent_name
user_agent_name | Browser type used to make the request (e.g., Google Chrome, Safari, etc.) useragent_os | User agent OS | useragent_os
user_agent_os | Operating system type used to make smartphone request (e.g., Android, Mac, etc.) webcontrols | Web controls | webcontrols | List of web controls that ran for this request | --- ## Cache source codes The two-letter cache source codes identify the actions that the cache_source log attribute indicates. Source Code | Explanation | ----------|----------| | `NE` | "Not Eligible" — Request did not match any site cache conditions and pagespeed did not cache it | | `PH` | "Pagespeed Hit" — Request was served from the cache when optimization was turned on and the resources required to render the page were present in the cache | | `PM` | "Pagespeed Miss" — Request was not served from the cache when optimization was turned on and the resources required to render the page were not present in the cache | | `PF` | "Pagespeed Fill" — Request initiated a pagespeed fill when optimization was turned on and the resources required to render the page were seen for the very first time | | `SH` | "Site Cache Hit" — Request was served from the cache when the site cache was turned on and the request matched a site cache condition which was present in the cache | | `SM` | "Site Cache Miss" — Request was not served from the cache when site cache was turned on and the request matched a site cache condition which was not present in the cache | | `SF` | "Site Cache Fill" — Request initiated a site cache fill when site cache was turned on and the request matched one of the site cache conditions for the very first time | | `VH` | "Varnish Hit" — Request was served from a Vinyl/Varnish cache | | `VM` | "Varnish Miss" — Request was served through a Vinyl/Varnish cache and is cacheable but was not in cache | | `VP` | "Varnish Pass" — Request was served through a Vinyl/Varnish cache but VCL requested to bypass cache | ___ ## Delivery status codes The delivery status codes identify how the response was generated. All non-zero values of these codes signify that the Webscale proxy server intercepted the request. Status Code | Description | ---------:|----------| | **0** | Request fulfilled by an application server | | **1** | Request rejected because the source IP address was in the blacklist | | **2** | Request rejected due to the activated WAF rule that the user uploaded | | **3** | Request rejected because it was sitting in the suspended queue for a time equal to or greater than `maximum_queue_time` | | **4** | Request rejected because the proxy could not process the request since the suspended queue was full | | **5** | Shield mode turned on. The request was presented with the captcha page. | | **6** | Shield mode turned on. The client successfully validated the captcha page. | | **7** | Shield mode turned on. The user made an unsuccessful attempt to verify the captcha. | | **8** | Shield mode turned on and the client presented an invalid token. The request was presented with the captcha page. | | **9** | Request denied by the **Deny Request** web control action | | **10** | Request redirected by the **Redirect Request** or **Redirect Using Map** web control action | | **11** | Request had a `mod_pagespeed_beacon` | | **12** | Internal request | | **13** | Request satisfied by Amazon Cloudfront | | **14** | Request is satisfied from the proxy. This includes but is not necessarily limited to:
  • `421` Misdirected errors where the SNI host does not match HTTP header host
  • `502` Bad gateway when the backend cannot be connected
  • `404` Not found when path contains escaped slashes (%2F)
  • `200` Delivering robots.txt from the CDN hostname (vhost)
  • `405` Method not allowed for TRACE method requests
  • `400` Bad request for bad URLs
  • `403` Backend certificate could not be validated
| | **15** | Request that is responsible for filling the cache in case of a miss | | **16** | Request that can be satisfied from the cache now or in the future:
  • If the page was cached, the request is satisfied from the cache
  • If the page was not cached, a fill request will be initiated to fill the cache
| | **17** | Request had a bad port number | | **18** | Request is satisfied by the microsite | | **19** | Role-based access control: User redirected to the Webscale Control Panel page to authenticate | | **20** | Role-based access control: Successful authentication. User did have the necessary role. | | **21** | Role-based access control: Unsuccessful authentication. User did not have the necessary role. | | **22** | Client-closed connection (`499` status code) This often happens when a server takes significant time to delivery a reply to a client request and the client gives up and closes their browser or presses the reload button. Because this request is already in progress, it cannot always be canceled and so it will be logged separately, and often with success. | | **23** | Request is a content security policy violation report. | | **24** | Delivery from serverless handler. | | **25** | Bad content was received in proxy header (`X-Forwarded-For`). | --- ## Further Reading - [The Webscale Control Panel Dashboard](/docs/overview/dashboard/) - [Building Filters in Traffic Viewer](/docs/how-tos/traffic-viewer/filter-traffic-viewer/) - [Using Traffic Viewer](/docs/how-tos/traffic-viewer/traffic-viewer/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) - [Security How-Tos](/docs/how-tos/security/) --- # CloudEDGE CDN Overview URL: https://docs.webscale.com/docs/how-tos/cloudedge/cdn-overview/ Description: Introduction to CloudEDGE CDN Content Delivery Networks (CDN) enhance a website’s performance and page load time by caching assets across multiple edge locations in the cloud. (The edge is the network location closest to where the user's browser connects to Webscale.) These locations are geographically distributed for a quicker delivery of static assets and cacheable API content to users from the location that is closest to them. Assets include static content, such as images, CSS, and JavaScript as well as media content like videos. When a user wants to access assets, their web browser generates an HTTP request. If the assets are cached and available, the CDN serves them directly, forgoing a request to the application servers and reducing response time. The speed of cloud provider networks and their global CDN Points of Presence (PoPs) enable quick delivery of your assets no matter where your customers are. Since assets are easily available for your application, web pages load quickly. This promotes a positive user experience and high Core Web Vitals score. ## Overview With CloudEDGE CDN (also known as Webscale CDN), the CDN provider is incorporated into the delivery path of your application. By routing all traffic through the provider, Webscale can securely manage requests and responses for the application. As with the Webscale Site Cache feature where proxies selectively cache content, Webscale CDN can set caching policies for traffic that traverses the Webscale CDN cache. If the Webscale CDN cache does not contain the requested assets or a request does not match the criteria of Webscale CDN caching policy, Webscale CDN sends it to origin for servicing. ## Benefits Webscale CDN includes the following functionality. - Advanced security - High availability - High performance The improved performance and user experience is connected to higher Core Web Vitals rankings. In conjunction with Webscale CDN, Webscale CloudEDGE workers provide a solution that enables you to run custom JavaScript code at various key points in the traffic pipeline, including before the traffic hits the application and after the application has responded. Webscale CloudEDGE is a distributed computing platform that simplifies the global delivery of web applications and services, securely executing code close to your customers at scale. This translates into responsive websites with healthy Core Web Vitals and a polished user experience. ## Further reading - [Configuring Webscale CDN Caching Policies](/docs/how-tos/CloudEDGE/cdn-controls/) - [HTTP Headers and Status Codes](/docs/Reference/http-headers/) - [Enabling Webscale CDN](/docs/how-tos/CloudEDGE/cdn-config-finalsteps/) --- # Introduction to Configuring CloudEDGE CDN URL: https://docs.webscale.com/docs/how-tos/cloudedge/cdn-configuration/ Description: Introduction to configuring CloudEDGE CDN CloudEDGE CDN (also known as Webscale CDN) offloads cachable assets from web servers to CDN providers. In addition, it provides advanced security and near real-time logging to track performance and ensure Webscale CDN is running smoothly. Configuring Webscale CDN for an application consists of the following stages. - [Fulfill pre-requisites](/docs/how-tos/CloudEDGE/cdn-config-prereqs/) - [Enable Webscale CDN](](/docs/how-tos/CloudEDGE/cdn-config-finalsteps/#enable-webscale-cdn) - [Configure accelerators](](/docs/how-tos/CloudEDGE/cdn-config-finalsteps/#configure-accelerators) - [Set up caching policies](](/docs/how-tos/CloudEDGE/cdn-config-finalsteps/#set-up-caching-policies) - [Validation](](/docs/how-tos/CloudEDGE/cdn-config-prereqs/#pre-requisite-validation) If you change your mind about enabling Webscale CDN, you can roll back the configuration. --- # Pre-requisites for Configuring CloudEDGE CDN URL: https://docs.webscale.com/docs/how-tos/cloudedge/cdn-config-prereqs/ Description: Pre-requisites for configuring CloudEDGE CDN Before enabling CloudEDGE CDN (also known as Webscale CDN) ensure that you meet the following pre-requisites in the order presented below. - [Set up DNS](#set-up-dns) - [Set up TSL](#set-up-tls) - [Consider disabling pagespeed](#consider-disabling-pagespeed) - [Create an admin subdomain](#create-an-admin-subdomain) - [Provider setup](#provider-setup) - [Pre-requisite validation](#pre-requisite-validation) {{% alert title="Note:" %}} While the Webscale Provisioning team has most likely already handled some of these tasks, verify that your system meets the pre-requisites. {{% /alert %}} ## Set up DNS 1. Create aliases for all domains under the application. For information on how to view, add, and delete application aliases, see [Application aliases](](/docs/how-tos/general/app-general-settings/#application-aliases) in [Configuring General Application Settings](/docs/how-tos/general/app-general-settings/). {{% alert title="Note:" %}} For aliases that you would like to include in your CloudFront CDN installation, select the corresponding **CDN** checkbox for each alias. For aliases exclusive to Webscale, make sure the corresponding checkboxes are cleared. {{% /alert %}} 2. Ensure that all domains under the application point toward Webscale, including top-level domains. 3. Verify that the DNS entries are correct. 4. Use the proxy hostname to create a CNAME for it. ## Set up TLS Then, either provide your own certificate, or set up TLS (Transport Layer Security) by enabling the Auto HTTPS feature for your application through the **HTTPS** page. When Auto HTTPS is enabled, Webscale automatically obtains and installs [Let's Encrypt](https://letsencrypt.org) SSL certificate for the application. For information on how to enable Auto HTTPS, see [Enable the Auto HTTPS feature](](/docs/how-tos/security/install-ssl/#enable-the-auto-https-feature) in [Installing SSL](/docs/how-tos/security/install-ssl/). {{% alert title="Note:" %}} If Let's Encrypt does not automatically obtain your certificate within a few hours, contact [support](mailto:support@webscalenetworks.com). {{% /alert %}} ## Consider disabling PageSpeed PageSpeed may interfere with desired CDN caching. Consider diabling pagespeed to avoid a disconnection between PageSpeed enabled paths, and CDN control paths. When PageSpeed is enabled for the same path as a CDN cachable path, PageSpeed will take priority and bypass the CDN Cache. To disable PageSpeed for your application, navigate to the **PageSpeed** tab and toggle the feature off. Otherwise, you can disable the PageSpeed feature conditionally using Web Controls. Web Controls enable you to configure and disable specific PageSpeed features. If you do not already have a Web Control to configure PageSpeed, create a Web Control to disable it. For information on how to create a Web Control, see [Creating Web Controls](/docs/how-tos/web-controls/webcontrols_create/). When creating or modifying a Web Control to disable PageSpeed, add or make sure that your Web Control has an action with the **Set pagespeed options** action type. In the **Do you want pagespeed to run?** drop-down menu, select **No**. {{< figure src="/images/disable_pagespeed_cdn_config.png" width="50%" alt="Disable pagespeed" >}} {{% alert title="Note:" %}} Make sure that the Web Control to disable PageSpeed is above all other Web Controls with final actions to ensure PageSpeed is disabled for every request. {{% /alert %}} ## Create an admin subdomain If requests take longer than 180 seconds to execute, they will time out. This is a CloudFront limitation. The workaround is to bypass the admin domain from CloudFront. The first step is to separate the admin domain by creating an admin subdomain. After you enable Webscale CDN, you may point the admin subdomain to an `origin-` prefixed domain `origin-xyz.cloudmaestro.net` where `xyz.cloudmaestro.net` is the cname of the application. For example, if the application is www.webscale.com and the cname is abc.cloudmaestro.net, the admin subdomain will point to origin-abc.cloudmaestro.net. Contact [support](mailto:support@webscalenetworks.com) to find out if this procedure applies to you. {{% alert title="Note:" %}} If you are accessing the admin page using a subdomain, you can use that subdomain for enabling Webscale CDN instead of creating an admin subdomain. {{% /alert %}} {{% alert title="Note:" %}} Ensure you verify the correct admin domain is configured in any Web Controls that enhance security of the admin subdomain. {{% /alert %}} ## Provider setup ### To setup a Section CDN provider Use a shared Section CDN provider. When enabling Webscale CDN, one will be available in the CDN provider dropdown. If a shared Section CDN provider is unavailable, see [Section](](/docs/how-tos/general/providers/#section) in [Creating providers](](/docs/how-tos/general/providers/#create-providers). ### To setup an Amazon Cloudfront CDN provider When you are using Webscale CDN with CloudFront for an application, your account must have a Webscale provider with the `Amazon` cloud provider type. To set up the provider so it will support Webscale CDN, perform the following procedure. - Create a S3 bucket through AWS - Create a Webscale provider for your account with the Amazon EC2 cloud provider type The S3 bucket will contain your Webscale CDN logs. When you create the provider, make sure that the provider can use Webscale CDN by selecting the **Use for CDN** checkbox in the **Add a new provider** dialog box. After you select the checkbox, you must also enter the S3 bucket name. For information on how to add a provider, see [Create providers](](/docs/how-tos/general/providers/#create-providers) in [Working with Providers](/docs/how-tos/general/providers/). For information about Amazon cloud provider type settings, see [Amazon](](/docs/how-tos/general/providers/#amazon) in [Provider settings](](/docs/how-tos/general/providers/#provider-settings). For information on how to add an AWS S3 bucket, see [Creating a Bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html). ## Pre-requisite validation After you have finished working on the pre-requisites, validate that you have followed all of the instructions correctly and fulfilled all of the pre-requisites. {{% alert title="Note:" %}} One important validation step is to make sure that your SSL certificate covers all aliases before enabling Webscale CDN, particularly if you have added new aliases after enabling Auto HTTPS. (Let's Encrypt should automatically update the certificate with any new aliases. Make sure that it does.) There is one exception. Do not create an alias for the admin sub-domain until after you have enabled Webscale CDN. After Webscale CDN is enabled, HTTP challenges will fail for any new aliases added to the list, so only DNS challenges will work for those challenges. {{% /alert %}} ## Further reading - [Introduction to Configuring Webscale CDN](/docs/how-tos/CloudEDGE/cdn-configuration/) - [Completing Webscale CDN Configuration](/docs/how-tos/CloudEDGE/cdn-config-finalsteps/) - [Configuring Trusted Proxies](/docs/how-tos/advanced/trusted-proxies/) - [Introducing HTTPS Headers and Status Codes](/docs/Reference/http-headers/) - [Installing SSL Certificates](/docs/how-tos/security/install-ssl/) - [Web Controls How-To Guides](/docs/how-tos/web-controls/) - [Working with Providers](/docs/how-tos/general/providers/) --- # CodeDirect URL: https://docs.webscale.com/docs/how-tos/codedirect/ Description: Guides on using CodeDirect --- # Deployment URL: https://docs.webscale.com/docs/how-tos/deployment/ Description: Deployment Guides --- # CloudEDGE How-To Guides URL: https://docs.webscale.com/docs/how-tos/cloudedge/ Description: Guides on using CloudEDGE products through the Webscale Control Panel --- # Completing CloudEDGE CDN Configuration URL: https://docs.webscale.com/docs/how-tos/cloudedge/cdn-config-finalsteps/ Description: Complete CDN Configuration After you fulfill the configuration pre-requisites, complete the final steps for configuring CloudEDGE CDN (also known as Webscale CDN). The final steps consist of the following tasks. - [Enable Webscale CDN](#enable-webscale-cdn) - [Bypass the CDN admin domain, if needed](#bypass-the-cdn-admin-domain) - [Set up caching policies](#set-up-caching-policies) - [Configure accelerators](#configure-accelerators) - [Validate the configuration](#validate-the-configuration) If you decide to [roll back](#rolling-back-the-configuration) Webscale CDN, doing so is a simple process. ## Enable Webscale CDN You can enable Webscale CDN through the **CDN** page for the application. The CDN delivery options determine how Webscale will use CDN. After you confirm changes to the Webscale CDN delivery, the following changes occur. - A "Configure CDN" task will be generated. You may follow the task to track the progress of a newly created CDN as it is being configured on an application. - All traffic for the application first passes through the CDN provider - When using CloudFront, the application has a Cloudfront distribution - When using Section, the application has a Section project - The CDN origin will become *origin-\.cloudmaestro.com*, which resolves to Webscale proxy addresses - All requests will reflect the application alias and not the cloudmaestro domains By default, CDN is disabled. Without CDN, PageSpeed is disabled and the CDN provider is unavailable. The other CDN delivery method is to have PageSpeed rewrite to CDN. With this legacy option, Pagespeed rewrites to CDN and uses the cloudmaestro domain to deliver content to customers. ### To enable Webscale CDN 1. Click the three vertical dots menu icon on the upper-right corner of the application box and select **Edit**. {{< figure src="/images/access_edit_app_box.png" alt="Select edit application" >}} -or- On your application page, click the **Actions** menu icon and select **Edit**. {{< figure src="/images/access_edit_action_menu.png" alt="Select edit application" >}} 2. On the sidebar menu, click **CDN**. The **CDN** page displays with the default delivery option of **Without CDN** selected. {{< figure src="/images/cdn/cdn-page.png" alt="CDN page" >}} 3. In the **Delivery** drop-down menu, select **Webscale CDN**. The **Provider** drop-down menu displays. It lists all of the providers enabled for Webscale CDN. 4. Select the CDN provider you want to use with Webscale CDN for this application. 5. Click **Apply** to enable Webscale CDN. {{< figure src="/images/cdn/cdn-apply-enable.png" alt="CDN page" >}} ## Bypass the CDN admin domain If you need to bypass the CDN admin domain to prevent requests from timing out, you can complete the bypass process after enabling Webscale CDN. Doing so points all admin traffic to *origin-\.cloudmaestro.com*, which is your Webscale hostname. There are different bypass procedures for new and existing customers. ### To bypass the CDN admin domain for new customers 1. While working on fulfilling configuration pre-requisites, create an admin sub-domain. For more information, see [Create an admin subdomain](](/docs/how-tos/CloudEDGE/cdn-config-prereqs/#create-an-admin-subdomain) in [CDN Configuration Pre-requisites](/docs/how-tos/CloudEDGE/cdn-config-prereqs/). 2. Enable Webscale CDN. 3. Through your application, add an alias for the admin sub-domain. For more information about adding an alias, see [Application aliases](](/docs/how-tos/general/app-general-settings/#application-aliases). 4. Point the admin sub-domain to *origin-\.cloudmaestro.com* using DNS. ### To bypass the CDN admin domain for existing customers 1. While fulfilling configuration pre-requisites, create an admin sub-domain. 2. Enable Webscale CDN. 3. After *origin-\.cloudmaestro.com* resolves to your proxy IP address, point your admin sub-domain to it. 4. Through your application, add an alias for the admin sub-domain. ## Configure accelerators {{% alert title="Note:" %}} CDN Accelerators are only available for Section CDN Providers. {{% /alert %}} Subscriptions for CDN accelerators may be set up to optimize edge delivery performance. [Contact Support](mailto:support@webscalenetworks.com) to enable accelerators for your application. CDN Accelerators are a game-changer for websites that demand fast, personalized content delivery. Accelerators enhance user experiences and help you stay competitive in today's fast-paced digital landscape. ### Magento Varnish Magento Varnish is a specialized CDN accelerator designed to enhance the performance and caching capabilities of your Magento e-commerce website. This accelerator is specifically tailored to work seamlessly with Magento applications, ensuring that your online store delivers fast and reliable content to your customers. The Magento Varnish accelerator is designed to work in tandem with a [Webscale varnish magento module](https://github.com/webscale-networks/magento-varnish-api) to make integration easy. ### HTML Streaming HTML Streaming is a cutting-edge CDN accelerator that offers lightning-fast response times and advanced caching techniques. This feature is designed to optimize the delivery of HTML content, making it ideal for websites where delivering dynamic, personalized, or frequently changing content quickly is essential. The HTML streaming accelerator offers Edge-Side Includes (ESI) support. ESI is a powerful tool that pairs with Webscale CDN allowing you to cache parts of your web pages separately. HTML Streaming fully supports ESI, enabling you to cache and serve specific components of your web pages independently. This means you can cache reusable elements while keeping dynamic sections up to date. HTML Streaming employs intelligent caching strategies to serve cached content when possible and fetch dynamic content when necessary. It helps reduce server load and ensures that your visitors experience fast load times for both cached and dynamic elements. ### Custom VCL Custom VCL (Varnish Configuration Language) is a powerful feature that provides users with complete control over how requests and responses are handled at the CDN's edge servers. It allows you to tailor Webscale CDN's behavior to suit your specific needs and customize the caching, routing, and processing of content. Custom VCL may be uploaded using the File browser For more information on Files, check out [working with files](/docs/how-tos/general/files/). ## Set up caching policies By default, Webscale CDN does not cache pages and resources. Every application is different, so ensure you tailor CDN controls to your specific caching needs. After enabling Webscale CDN, create necessary CDN controls to define basic caching policies. Doing so completes Webscale CDN configuration. On the **CDN** page, add necessary CDN controls to complete Webscale CDN configuration. Generally, one CDN control is configured for caching media assets, and a second for static assets. For information on Webscale CDN caching, see [Configuring CDN Caching Policies](/docs/how-tos/CloudEDGE/cdn-controls/). ### Add CDN controls for media and static assets Specify paths for caching media and static assets. When enabling Webscale CDN, create CDN controls with the following paths. Each path points to the asset location. Use wild cards when specifying paths. Save and apply the CDN controls after specifying the following settings. - Use */media/** as the path for caching media assets. - Use */static/** as the path for static assets. Enter *86400* as the default TTL for both CDN controls. TTL, an acronym for Time to Live, specifies how long (in seconds) an asset will be cached before it needs to be fetched again. ## Validate the configuration After you complete the final steps, perform a validation check to ensure that Webscale CDN delivers all assets. Using developer tools, examine a static asset. Check the asset’s X-Cache header to verify that `Hit from Cloudfront` displays for it. After you set up caching policies, Webscale CDN does not immediately start caching. The request with the static asset might initially be a miss from CloudFront. After you re-load the page, it should be a hit. ## Rolling back the configuration To roll back Webscale CDN, delete all CDN Controls on the **CDN** page. Doing so reinstates the default caching policy for Webscale CDN to not cache anything. Traffic still passes through Webscale CDN. ## Further reading - [Introduction to Configuring Webscale CDN](/docs/how-tos/CloudEDGE/cdn-configuration/) - [Pre-requisites for Configuring Webscale CDN](/docs/how-tos/CloudEDGE/cdn-config-prereqs/) - [Configuring CDN Caching Policies](/docs/how-tos/CloudEDGE/cdn-controls/) - [Configuring Application General Settings](/docs/how-tos/general/app-general-settings/) - [Working with Providers](/docs/how-tos/general/providers/) --- # Configuring CloudEDGE CDN Caching Policies URL: https://docs.webscale.com/docs/how-tos/cloudedge/cdn-controls/ Description: Configure CloudEDGE CDN caching through CDN controls After you enable CloudEDGE CDN (also known as Webscale CDN) for your application, you can use the Webscale Control Panel to configure caching policies through CDN controls. These policies define how Webscale CDN processes requests and responses, including what happens when Webscale CDN forwards requests to your application. CDN controls allow you to run custom JavaScript at key points of the traffic pipeline via the CloudEDGE Workers feature, including as traffic transits to your application and after your application generates a response. This allows for easy extension to the capability of your application without changing your deployed code. For more information about the CloudEDGE Workers feature, see [CloudEDGE Workers Overview](/docs/how-tos/CloudEDGE/workers-overview/). {{% alert title="Note:" %}} CloudEDGE Workers are only available for Amazon CDN providers. {{% /alert %}} ## Topics - [Webscale CDN caching](#webscale-cdn-caching) - [CDN controls basics](#cdn-controls-basics) - [Specify optional settings](#specify-optional-settings) - [Change order of CDN controls](#change-order-of-cdn-controls) - [CloudEDGE Workers](#cloudedge-workers) - [Work with CDN controls](#work-with-cdn-controls) - [Access CDN controls](#access-cdn-controls) - [Create CDN controls](#create-cdn-controls) - [Modify CDN controls](#modify-cdn-controls) - [Reorder CDN controls](#reorder-cdn-controls) - [Delete CDN controls](#delete-cdn-controls) ## Webscale CDN caching Webscale CDN uses your CDN provider to cache static resources from your applications. All HTTP requests and responses pass through the Webscale CDN cache even if they are not cachable. You can use CDN controls to configure caching policies for Webscale CDN. Each CDN control defines how Webscale CDN responds to a particular incoming request. When you create CDN controls, you define policies that determine how and what Webscale CDN caches. ### Caching with CDN controls With CDN controls, Webscale CDN checks the path of the request path along with its cache key to determine if the resource exists in its cache. If the CDN cache contains it with the matching cache key, Webscale CDN serves the response. (A cache key is a combination of select headers, cookies and query string values from the request.) If the Webscale CDN cache does not contain the resource, Webscale CDN forwards the request to your application to retrieve the resource. If Site Cache does not have the resource, it forwards the request to your web servers. After Site Cache or your web servers locates the resource and serves it, Webscale serves it to the user browser. Also, Webscale caches the resource and its cache key. ### Caching without CDN controls By default, there are no CDN controls for Webscale CDN. Without CDN controls, Webscale CDN does not cache assets and forwards all HTTP requests to your application. If you have enabled the Webscale Dynamic Site Cache feature for your proxies, Site Cache caches resources [according to its own caching policies](/docs/how-tos/advanced/site-cache/). It determines if the resource exists in its cache by converting the request into a cache key. If Site Cache contains the resource, Webscale serves the response from there. If Site Cache does not have the resource, Webscale forwards the request to your web servers. ## CDN controls basics The configuration of each CDN control must include a request path. When Webscale CDN receives a request, it compares the request path to the CDN control paths. It selects the first CDN control that matches according to the order in which they are configured in the Webscale Control Panel. If Webscale CDN finds a match, it uses the cache key configuration of that CDN control to generate a cache key. Webscale CDN then uses this key, along with the full path to the resource, to search in its cache. - If Webscale CDN finds the resource and it has not expired, a cache "hit" occurs and it returns the resource. - If Webscale CDN does not find the resource or it has expired, a cache "miss" occurs and it forwards the request to your application or, if applicable, to your web servers. The forwarded request only includes the headers, cookies, and query parameters that the CDN control configuration included. These may be different than the headers, cookies and query parameters used to create the cache key. Optionally, you can specify the following configuration settings. - Duration of time that a resource can be cached before it expires - How Webscale CDN generates the cache key for a request - Headers, cookies, and query parameters that Webscale CDN includes on the application request ## Specify optional settings Webscale CDN uses the cache key to access the cache. It then determines if the cache contains the appropriate resource for the request. If the cache has the resource and it has not expired, Webscale CDN serves the cached resource. CDN control settings can also determine the HTTP headers, cookies, and query parameters that Webscale CDN includes on requests that it sends to your application servers after cache misses. If the path of a request does not match the path of any CDN control, the default policy runs. It sends the request with all of its HTTP headers, cookies, and query parameters to origin. ## Change the order of CDN controls If a user creates multiple CDN controls, they display in a list in the **Controls** section of the **CDN** page by creation date (oldest to newest with the oldest at the top of the list) unless you have reordered the CDN controls in the list. When the user selects a control in the list, the control's configuration is displayed in the right pane. The configuration includes the control's path pattern; how the cache key is generated for matching requests; headers, cookies and query parameters to pass through after cache misses; and any associated CloudEDGE workers Webscale CDN compares requests to CDN controls based on their order in the list. It searches from top to bottom to find a match. ## CloudEDGE Workers Through the CloudEDGE Workers feature, CDN controls optionally allow you to augment a request that Webscale CDN forwards to origin after a cache miss or a response that origin returns to Webscale CDN. Custom JavaScript enables you to extend your application's functionality without changing your application code. The JavaScript source files include functions, each of which can process requests or responses but not both. The file that includes your JavaScript source files is known as a handler file. A handler incorporates the handler file. When configuring a CDN control, you can associate up to two handlers with the control (one for requests and the other for responses). Associating handlers with a control creates a worker that runs the JavaScript function. You can use the Webscale Image Manager feature with Webscale CDN. It automatically optimizes and processes images while maintaining image quality. Image Manager also helps embed images in your website and mobile applications to drive user engagement. ## Work with CDN Controls You can create, modify, and delete CDN controls through the **Controls** section of the **CDN** page for your application. The **Controls** section only displays after you enable Webscale CDN. For more information on how to enable Webscale CDN, see [Introduction to Configuring Webscale CDN](/docs/how-tos/CloudEDGE/cdn-configuration/) and [Completing Webscale CDN Configuration](/docs/how-tos/CloudEDGE/cdn-config-finalsteps/). ## Access CDN controls The **CDN** page for your application enables you to access CDN controls. ### To access CDN controls settings 1. Click the three vertical dots menu icon on the upper-right corner of the application box and select **Edit**. {{< figure src="/images/access_edit_app_box.png" alt="Select edit application" >}} -or- On your application page, click the **Actions** menu icon and select **Edit**. {{< figure src="/images/access_edit_action_menu.png" align="left" width="45%" alt="Select edit application" >}} 2. On the sidebar menu, click **CDN**. When you have enabled Webscale CDN, the **Controls** section displays in the **CDN** page. {{< figure src="/images/cdn/cdn_controls_section.png" alt="CDN controls section" >}} ## Create CDN controls For CDN controls, enter a path for caching assets. All other settings are optional. When you create a CDN control, you can optionally associate the CDN control with CloudEDGE request and response handlers. Doing so creates a CloudEDGE worker. For more information on CloudEDGE workers, see [Workers overview](](/docs/how-tos/CloudEDGE/handlers_workers/#workers-overview) in [Working with CloudEDGE Handlers and Workers](/docs/how-tos/CloudEDGE/handlers_workers/). #### To create a CDN control 1. On the **CDN** page, click the **Add control** link in the **Controls** section. {{< figure src="/images/cdn/cdn_control_add_control_link.png" alt="Click Add control link" >}} 2. In the **Add control** dialog box, enter the path for caching assets in the Path field. For example, to create a CDN control for media assets, enter /media/*. {{< figure src="/images/cdn/cdn_add_control_dialog_media.png" align="left" width="65%" alt="Add CDN control with media path" >}} 3. To specify the amount of time that a resource can be cached, enter a Time-to-Live (TTL) value in the **Default TTL (seconds)** field. 4. To specify cache key headers, in the **Headers** drop-down menu of the **Cache key configuration** section:
a. Select **Include specified** for an option other than the default setting of not having any headers.
{{< figure src="/images/cdn/cdn_controls_select_cache_header.png" align="left" width="70%" alt="Select Include specified header option for cache key headers" >}} b. Click the **Add headers** link.
{{< figure src="/images/cdn/cdn_controls_click_add_headers_link.png" align="left" width="65%" alt="Click Add headers link" >}} c. Click in the **Add Headers** field to open the drop-down menu:
Select a header from the drop-down list.
-or-
Enter a header.
d. Click **Add**.
{{< figure src="/images/cdn/cdn_control_add_header.png" align="left" width="65%" alt="Click Add" >}} e. To add more headers, repeat one of these procedures for each header. 5. To specify cache key cookies, in the **Cookies** drop-down menu of the **Cache key configuration** section:
a. Select **Include specified** or **Exclude specified** for an option other than having all or no cookies.
b. Click the **Add cookies** link.
c. In the **Add cookies** field, enter a cookie.
d. Click **Add**.
e. To add more cookies, repeat this procedure for each cookie. 6. To specify cache key queries, in the **Queries** drop-down menu of the **Cache key configuration** section:
a. Select **Include specified** or **Exclude specified** for an option other than having all or no queries.
b. Click the **Add queries** link.
c. In the **Queries** field, enter a query.
d. Click **Add**.
e. To add more queries, repeat this procedure for each query. 7. To specify origin request headers, in the **Headers** drop-down menu of the **Origin request configuration** section:
a. Select **Include specified** for an option other than the default setting of having no headers.
b. Click the **Add headers** link.
c. Click in the **Add headers** field to open the drop-down menu:
Select a header from the drop-down list.
-or-
Enter a header.
d. Click **Add**.
e. To add more headers, repeat this procedure for each header. 8. To specify origin request cookies, in the **Cookies** drop-down menu of the **Origin request configuration** section:
a. Select **Include specified** for an option other than having all or no cookies.
b. Click the **Add cookies** link.
c. In the **Add cookies** field, enter a cookie.
d. Click **Add**.
e. To add more cookies, repeat this procedure for each cookie. 9. To specify origin request queries, in the **Queries** drop-down menu of the **Origin request configuration** section:
a. Select **Include specified** for an option other than having all or no queries.
b. Click the **Add queries** link.
c. In the **Queries** field, enter a query.
d. Click **Add**.
e. To add more queries, repeat this procedure for each query. 10. To associate the CDN control with a request handler, select the handler in the **When processing an origin request** drop-down menu in the **CloudEDGE Workers** section. {{% alert title="Note:" %}} CloudEDGE Workers are only available for Amazon CDN providers. {{% /alert %}} 11. To associate the CDN control with a response handler, select the handler in the **When processing an origin response** drop-down menu in the **CloudEDGE Workers** section. {{< figure src="/images/handlers/cdn_control_add_handlers.png" align="left" width="65%" alt="Select handlers for a CDN control" >}} 12. Click **Save**. {{< figure src="/images/cdn/cdn_control_click_save_new.png" align="left" width="65%" alt="Click Save" >}} 13. In the **CDN** page, click **Apply**. {{< figure src="/images/cdn/cdn_control_click_apply_new_control.png" align="left" width="100%" alt="Click Apply" >}} ## Modify CDN controls You can modify a caching policy by specifying different settings for the associated CDN control. While you can change all settings, there must be a valid path for caching assets in the **Path** field. #### To modify a CDN control 1. In the **CDN** page, select a CDN control in the **Path** panel of the **Controls** section. The settings for the CDN control display in the **Control details** pane. 2. Click the **Edit control** icon for the CDN control. {{< figure src="/images/cdn/cdn_control_click_edit_icon.png" align="left" width="100%" alt="Click Edit control icon" >}} 3. In the **Edit control** dialog box, modify settings. {{< figure src="/images/cdn/cdn_control_edit_dialog.png" align="left" width="65%" alt="Edit CDN control" >}} 4. Click **Save**. 5. In the **CDN** page, click **Apply**. ## Reorder CDN controls The order of the CDN controls in the **Path** pane determines when Webscale compares requests to the CDN control. It searches from the top CDN control to the bottom to find a match. #### To reorder CDN controls 1. In the **Path** pane of the **Controls** section, click the **Reorder controls** link. {{< figure src="/images/cdn/cdn_control_click_reorder_link.png" align="left" width="100%" alt="Click Reorder controls link" >}} 2. In the **Reorder controls** dialog box, drag-and-drop CDN controls in the list to to change the order in which Webscale runs through them. {{< figure src="/images/cdn/cdn_control_reorder_controls_dialog.png" align="left" width="85%" alt="Drag-and-drop CDN control" >}} 3. Click **Save**. 4. In the **CDN** page, click **Apply**. ## Delete CDN controls After you delete a CDN control, it no longer displays in the list of CDN controls in the **Path** pane of the **Controls** section. #### To delete a CDN control 1. In the **CDN** page, select a CDN control in the **Path** panel of the **Controls** section. The settings for the CDN control display in the **Control details** panel. 2. Click the **Delete control** icon for the CDN control. {{< figure src="/images/cdn/cdn_control_click_delete_icon.png" align="left" width="100%" alt="Click Delete control icon" >}} 3. In the **CDN** page, click **Apply**. ## Further reading - [HTTP Headers and Status Codes](/docs/Reference/http-headers/) - [CloudEDGE CDN Overview](/docs/how-tos/CloudEDGE/cdn-overview/) - [Introduction to Configuring Webscale CDN](/docs/how-tos/CloudEDGE/cdn-configuration/) - [Pre-requisites for Configuring CloudEDGE CDN](/docs/how-tos/CloudEDGE/cdn-config-prereqs/) - [Enable Webscale CDN](](/docs/how-tos/CloudEDGE/cdn-config-finalsteps/#enable-webscale-cdn) - [CloudEDGE Workers Overview](/docs/how-tos/CloudEDGE/workers-overview/) - [Working with CloudEDGE Handlers and Workers](/docs/how-tos/CloudEDGE/handlers_workers/) --- # CloudEDGE Workers Overview URL: https://docs.webscale.com/docs/how-tos/cloudedge/workers-overview/ Description: Introduction to CloudEDGE Workers The Webscale CloudEDGE platform is a distributed cloud computing platform. It enables fast, personalized commerce and application content delivery to the edge. (The edge is the network location closest to where the user's browser connects to Webscale). The platform includes CloudEDGE CDN and CloudEDGE Workers, which you can manage through the Webscale Control Panel. The caching policies for your application specify how CloudEDGE CDN (also known as Webscale CDN) caches resources. They determine what resources are cached, how long they are cached, and how Webscale CDN processes requests for cache misses. The CloudEDGE Workers feature expands the functionality of Webscale CDN for your application by executing custom JavaScript code on the edge. {{% alert title="Note:" %}} CloudEDGE Workers are only available for Amazon CDN providers. {{% /alert %}} {{% alert title="Note:" %}} When Webscale CDN does not find the resource for a request, a cache “miss” occurs and it forwards the request to your application (also known as "origin"). {{% /alert %}} For information on CloudEDGE CDN and caching policies, see [CloudEDGE CDN Overview](/docs/how-tos/CloudEDGE/cdn-overview/) and [Configuring Webscale CDN Caching Policies](/docs/how-tos/CloudEDGE/cdn-controls/). For an illustration on how to use CloudEDGE Workers, see [CloudEDGE Workers Usage Example](/docs/how-tos/CloudEDGE/workers-usage-example/). ## Topics - [CloudEDGE Workers feature](#cloudedge-workers-feature) - [Procedure for working with CloudEDGE Workers](#procedure-for-working-with-cloudedge-workers) - [Upload handler files](#upload-handler-files) - [Create handlers](#create-handlers) - [Create workers](#create-workers) - [Worker execution](#worker-execution) ## CloudEDGE Workers feature You can use the CloudEDGE Workers feature to easily extend your application's functionality through custom JavaScript without changing your application code. It adds programmability and on-arrival code execution to Webscale CDN. Through CloudEDGE Workers, you can modify requests before they reach your application and responses before they reach the client. CloudEDGE Workers provides a serverless execution environment. This means developers can write custom JavaScript code once with the option to deploy to multiple cloud providers without needing to change the application code. The CloudEDGE Workers feature takes care of writing, packaging, and distribution of the code. The file that includes your JavaScript source files as a [NPM package](https://docs.npmjs.com/about-packages-and-modules) is known as a handler file. Each exported JavaScript function can process requests or responses (but not both) and must conform strictly to the handler interface. The handler file can have more than one function. A handler incorporates the handler file. When you configure a handler, you choose one function from the handler file to run. The caching policy with which the handler is associated determines when the function runs. Associating a handler with the CDN control for the policy creates a CloudEDGE worker. Currently, workers execute after cache misses. Workers can do everything from optimizing cached images to injecting security cookies. ## Procedure for working with CloudEDGE Workers You can use the following procedure to work with handlers and workers. The Webscale Control Panel enables you to manage handlers and workers. For information on creating handlers and workers, see [Working with CloudEDGE Handlers and Workers](/docs/how-tos/CloudEDGE/handlers_workers/). - [Upload handler files](#upload-handler-files) - [Create handlers](#create-handlers) - [Associate handlers with CDN controls](#associate-handlers-with-cdn-controls) ### Upload handler files Handler files adhere to the common structure used for NPM packages with some additional constraints. You can upload handler files to your account through the **Files** page. All applications for your account can then use the file for their handlers. The **Files** page enables you to view all files in the NPM package and their contents. You can also use this page to download, replace, edit, and delete handler files. For information about uploading files, see [Working with Files](/docs/how-tos/general/files/). For information about creating handler files, see [Creating Handler Files](/docs/how-tos/cloudedge/create-handler-file/). ### Create handlers When you create a handler, you configure the following settings. - Name - Description (optional) - Provider - Handler file - Function - Memory When you select the provider, you can only choose a provider that has Webscale CDN and CloudEDGE Workers enabled for it. You can only select one function for a handler. It can be either a request or response function that deploys as a request or response worker. The memory setting specifies the maximum amount of computing resources that the provider will allocate to the worker during execution. {{% alert title="Note:" %}} You can create more than one handler with the same file. If the file has multiple functions, you can choose the one that you want for the handler. {{% /alert %}} ### Create workers Caching policies specify the workers that will run. Each CDN control for a caching policy has settings that enable you to associate handlers with the control, which results in a worker. By default, CDN controls do not have handlers associated with them. You can select a request handler, response handler, or both for a control. When creating the control, you define when the worker runs. A worker with a request function executes before Webscale CDN forwards the request to origin. A worker with a response function runs in conjunction with the origin response. When you have a CDN control with two handlers, the CDN control will have a worker for each type of function. For a cache miss, the request and response workers for the CDN control will both run. ### Worker execution CDN controls determine how Webscale CDN responds to incoming requests for assets. It compares the path for each request to the request paths for your CDN controls. If Webscale CDN finds a match, it searches for the resource in its cache. When a cache “miss” occurs, Webscale CDN forwards the request to your application and the worker with a request handler runs. When your application sends a response, the response worker executes. ## Further reading - [CloudEDGE CDN Overview](/docs/how-tos/CloudEDGE/cdn-overview/) - [Configuring Webscale CDN Caching Policies](/docs/how-tos/CloudEDGE/cdn-controls/) - [Creating Handler Files](/docs/how-tos/CloudEDGE/create-handler-file/) - [Working with Files](/docs/how-tos/general/files/) - [Working with CloudEDGE Handlers and Workers](/docs/how-tos/CloudEDGE/handlers_workers/) - [CloudEDGE Workers Usage Example](/docs/how-tos/CloudEDGE/workers-usage-example/) - [HTTP Headers and Status Codes](/docs/Reference/http-headers/) --- # CloudEDGE Workers Usage Example URL: https://docs.webscale.com/docs/how-tos/cloudedge/workers-usage-example/ Description: CloudEDGE Workers Usage Example CloudEDGE Workers is a feature that expands the functionality of CloudEDGE CDN for your application by executing custom JavaScript code on the edge. It is part of the CloudEDGE distributed computing platform along with CloudEDGE CDN. Webscale CDN enhances a website’s performance and page load time by caching assets across multiple edge locations in the cloud. Webscale CDN also processes requests unrelated to caching. Since all requests pass through the Webscale CDN, CloudEDGE workers are able to execute on both cached and uncached requests. This example is a demonstration of how you could use CloudEDGE Workers to prevent SQL Injection on a vulnerable form. For information on CloudEDGE Workers and CloudEDGE CDN, see [CloudEDGE Workers Overview](/docs/how-tos/CloudEDGE/workers-overview/) and [CloudEDGE CDN Overview](/docs/how-tos/CloudEDGE/cdn-overview/). ## Scenario You have hired a consultant to evaluate your website for security vulnerabilities. They discover that one of your forms is insecure and recommend making a quick fix to immediately secure your application. The CloudEDGE Workers feature enables you to create a CloudEDGE worker that runs to sanitize origin requests (also known as cache misses) related to SQL databases. The JavaScript for the handler file employs escaping problematic characters to prevent SQL injection attacks. SQL injection attacks exploit vulnerabilities to inject malicious database statements and gain access to your application's database. ## Concepts The following concepts are relevant to this example. ### CloudEDGE CDN caching The caching policies for your application specify how CloudEDGE CDN (also known as Webscale CDN) caches resources. They determine what resources are cached, how long they are cached, and how Webscale CDN processes requests for cache misses. CloudEDGE Workers runs custom JavaScript code for cache misses. ### CDN controls CDN controls define caching policies for your application. Each CDN control includes a request path pattern for CDN cache locations. When the path for a request matches the path for a CDN control, Webscale CDN searches its cache for the request assets. ### Cache miss A cache “miss” occurs when Webscale CDN does not find the resource for a request in its cache. Webscale CDN forwards requests that are cache misses to your application (also known as "origin"). ### Handlers Handler files include your JavaScript source files. The JavaScript files contain functions, each of which can process requests or responses (but not both). Each handler is implemented in a handler file. Handlers are request or response handlers, depending on the type of function selected for the handler. ### Workers Workers run the JavaScript code. You create workers when you associate handlers with CDN controls. When a request handler is associated with the CDN control, the worker runs before Webscale CDN forwards the request. Response workers run after your application or web servers respond to a cache miss. If an origin response contains a resource that the Webscale CDN cache does not contain, Webscale CDN caches the resource and forwards the response to the user. For information on workers, see [CloudEDGE workers feature](](/docs/how-tos/CloudEDGE/workers-overview/#cloudedge-workers-feature) in [CloudEDGE Workers Overview](](/docs/how-tos/CloudEDGE/workers-overview/#cloudedge-workers-overview). For information about Webscale CDN caching and controls, see [Configuring CloudEDGE CDN Caching Policies](/docs/how-tos/CloudEDGE/cdn-controls/). ### Setup This scenario includes the following items. - **Handler file**: Named “Sanitize.” Includes a JavaScript source file with a request function that checks the body of the origin request for single quotes (`'`). If a single quote is present in the body of the HTTP request, it escapes this character, replacing it with `\'` - **Handler**: Named "Example handler." Incorporates the Sanitize handler file, which you have uploaded to the **Files** page for your account. - **CDN controls for your application**: Three CDN controls, each of which specifies a different path, displays in the following order, and runs from top to bottom. - `/media/*` - `/static/*` - `*` (Example handler is associated with this control and the TTL is 0, which means that the policy is to not cache anything) - **Worker**: Created when the Example handler is associated with the `*` CDN control ## Process 1. The user submits the form. 2. The user's browser sends a request that will perform a query on the database. 3. The request path does not match the `/media/*`; and `/static/*` request path patterns but does match the `*` path. 4. Webscale CDN does not search the cache since the policy of the final control is to not cache anything 5. Webscale CDN categorizes the request as a cache miss. 6. The JavaScript function for the worker checks the request body to find out if it contains single quotes and escapes them with `\'` if it finds this character. {{% alert title="Note:" %}} If the user's browser does not support WebP-formatted images, the worker adds the `webp-accepted` HTTP header with a value of `false` to the origin request. Webscale searches for and finds the image in a supported file format. It serves up a response with the image. {{% /alert %}} For information about creating a handler file, including JavaScript functions and the handler interface, see [Creating CloudEDGE Handler Files](/docs/how-tos/CloudEDGE/create-handler-file/). For information about file uploading and viewing handler files, see [Working with Files](/docs/how-tos/general/files/). ### JavaScript code for the example A JavaScript function for the Sanitize handler file specifies that the code will execute for origin requests. ``` /** * Should return a non-null response if the origin request should be subverted * @param {WSRequest} wRequest request object to be processed * @returns {WSRequest or WSResponse} */ exports.sanitizeInput = function (wRequest) { const reqBody = wRequest.body.data const reqQuery = wRequest.query //there is a body in the request that should be sanitized if (reqBody !== null) { var escaped = reqBody.replace("'", "\'") wRequest.body = { data: escaped, modified: true, encoding: 'text', truncated: false } return { request: wRequest } } //there is a query in the request that should be sanitized if (reqQuery !== null) { wRequest.query = encodeURIComponent(reqQuery); } return { request: wRequest }; } ``` ## Sanitize handler file Upload the Sanitize handler file through the **Files** page. After you upload the handler file, you can view a list of its files. {{< figure src="/images/handlers/handlers_select_file.png" align="left" width="95%" alt="View handler files" >}} Through the **Files** page, you can also view the contents for specific files. {{< figure src="/images/handlers/handlers_file_contents.png" align="left" width="95%" alt="View handler file contents" >}} After you have uploaded the Sanitize handler file, you can create a handler for your application that incorporates the file. ## Example handler Create the Example handler for your account, specifying its name, provider, file, function, and memory. The Example handler contains an optional description that explains that it sanitizes origin requests to prevent SQL injection attacks. For information on creating handlers and workers, see [Working with CloudEDGE Handlers and Workers](/docs/how-tos/CloudEDGE/handlers_workers/). {{< figure src="/images/handlers/handlers_example_handler.png" align="left" width="65%" alt="Example handler" >}} ## CDN control Create CDN controls for your application with the `/media/*`, `/static/*`, and `*` request paths. When you create the control with the `*` path, associate the Example handler with it. To do so, select the Example handler from the **When processing an origin request** drop-down menu in the **CloudEDGE Workers** section of the __Add control__ dialog box. {{< figure src="/images/handlers/handlers_example_cdn_control.png" align="left" width="65%" alt="Handler example" >}} ## Further reading - [CloudEDGE Workers Overview](/docs/how-tos/CloudEDGE/workers-overview/) - [Working with CloudEDGE Handlers and Workers](/docs/how-tos/CloudEDGE/handlers_workers/) - [HTTP Headers and Status Codes](/docs/Reference/http-headers/) - [CloudEDGE CDN Overview](/docs/how-tos/CloudEDGE/cdn-overview/) --- # Working with CloudEDGE Handlers and Workers URL: https://docs.webscale.com/docs/how-tos/cloudedge/handlers_workers/ Description: Configure CloudEDGE handlers and workers through the Webscale Control Panel The CloudEDGE Workers feature adds programmability and on-arrival code execution to CloudEDGE CDN (also known as Webscale CDN). It extends your application's functionality using custom JavaScript without changing your application code. When you use CloudEDGE Workers, it augments a request that Webscale CDN forwards to origin after a cache miss or a response that origin returns to Webscale CDN. The CloudEDGE Workers feature uses the following components. - Handler files that include custom JavaScript source files - Handlers that incorporate the handler files - Workers that run the JavaScript code according to CloudEDGE CDN caching policies Configuring CloudEDGE workers (also known as workers) involves the following process. - Create a handler file with one or more JavaScript source files - Configure a handler, which incorporates a handler file - Associate a handler with a CDN control, which results in a worker For more information about the CloudEDGE Workers feature, see [CloudEDGE Workers Overview](/docs/how-tos/CloudEDGE/workers-overview/). For more information about CDN caching, see [Configuring CloudEDGE CDN Caching Policies](/docs/how-tos/CloudEDGE/cdn-controls/). ## Topics - [Handler files](#handler-files) - [Uploading and other shared files procedures](#uploading-and-other-shared-files-procedures) - [File requirements](#file-requirements) - [Preview handler files](#preview-handler-files) - [Handlers overview](#handlers-overview) - [Access the Handlers page](#access-the-handlers-page) - [Create handlers](#create-handlers) - [View handler details](#view-handler-details) - [Edit handlers](#edit-handlers) - [Delete handlers](#delete-handlers) - [Workers overview](#workers-overview) - [Create workers](#create-workers) ## Handler files Each handler file is structured as a [NPM package](https://docs.npmjs.com/about-packages-and-modules). It includes your JavaScript source code and all of the third-party dependencies (also known as node modules) needed to run your code. In addition, the handler package file (also known as a handler file) must include two files specific to Webscale: `package.json` and `manifest.json`. These files must exist in the root directory of the handler file. {{< figure src="/images/handler-files/handler_file_directory_structure.png" align="left" width="95%" alt="Handler file directory structure" >}} You must upload a handler file before you can create handlers. The **Files** page enables you to upload and manage files. With one exception, the CloudEDGE Workers feature follows the same procedures for uploading and managing files as other Webscale features that use uploaded files. The procedure for previewing handler content files is specific to CloudEDGE Workers. For more information about CloudEDGE handler files, see [Creating CloudEDGE Handler Files](/docs/how-tos/CloudEDGE/create-handler-file/). ### JavaScript functions For the JavaScript source files, exported functions can process requests or responses (but not both) and must conform strictly to the handler interface. A JavaScript file can have more than one function and a mix of request and response functions. ### Uploading and other shared files procedures Webscale features that use uploaded package files, such as CloudEDGE Workers and microsites, share the same procedures for uploading and managing files. An exception is previewing content files. Working with handler and microsite files includes procedures for the following shared operations. - [Upload files](](/docs/how-tos/general/files/#upload-files) - [Work with uploaded files](](/docs/how-tos/general/files/#work-with-uploaded-files) - [Downloading](](/docs/how-tos/general/files/#download-file) - [Replacing](](/docs/how-tos/general/files/#replace-file) - [Editing file details](](/docs/how-tos/general/files/#edit-file-details) - [Deleting](](/docs/how-tos/general/files/#delete-file) For more information about uploading and managing files, see [Working with Files](/docs/how-tos/general/files/). ### File requirements Through the **Files** page, you can upload handler files. A handler file must fulfill the following requirements. - .zip, .tar, or .tar.gz file format - Under 50 MB in size - `package.json` and `manifest.json` files ## Preview handler files After you upload a handler file, you can preview its content files in the **Files** page. While previewing a handler file, you can view a list of the files that it contains, including the JavaScript, `package.json`, and `manifest.json` files and node modules, in the **Content** panel. You can also choose to view the contents of a listed file. By previewing, you can verify that the handler file contains the correct content files. If not, you can edit, replace, or delete handler files through the shared procedures for working with uploaded files. For more information, see [Work with uploaded files](](/docs/how-tos/general/files/#work-with-uploaded-files) in [Working with Files](/docs/how-tos/general/files/). {{% alert title="Note:" %}} You can add or replace content files by creating or modifying a handler with the correct content files, then uploading the handler file. {{% /alert %}} For more information about handler content files, see [Handler files](](/docs/how-tos/CloudEDGE/create-handler-file/#handler-files) in [Creating CloudEDGE Handler Files](/docs/how-tos/CloudEDGE/create-handler-file/). #### To preview handler files 1. On the **Webscale Control Panel** page, click the menu icon on the upper-left of the screen. 2. On the sidebar menu, select **Files**. The **Files** page displays. {{< figure src="/images/files/select_files.png" align="left" width="95%" alt="Files sidebar option">}} 3. In the **Files** page, select a file in the **Files** panel.
The handler files display in the **Content** panel. {{< figure src="/images/handlers/handlers_select_file.png" align="left" width="95%" alt="View handler files" >}} 3. In the **Content** panel, click on a content file.
The **Preview** panel displays a preview of the file contents. For example, if a file contains JavaScript, the code will display. {{< figure src="/images/handlers/handlers_file_contents.png" align="left" width="95%" alt="View handler file contents" >}} 4. To return to the **Files** panel, click **Files** in the navigation path. ## Handlers overview {{% alert title="Note:" %}} You must create the lambda_basic_execution role for your AWS account before creating your first handler. Contact [support](mailto:support@webscalenetworks.com) for assistance or if you have questions about creating this role. {{% /alert %}} When you create a CloudEDGE handler for your account, you select the following items for it. - Provider for which the CloudEDGE Workers feature is enabled - Uploaded handler file - Request or response JavaScript handler function The **Handlers** page enables you to perform the following procedures. After you create a handler for your account, it is available to all the applications in the account. - [Access the Handlers page](#access-the-handlers-page) - [Create handlers](#create-handlers) - [View handler details](#view-handler-details) - [Edit handlers](#edit-handlers) - [Delete handlers](#delete-handlers) ### Access the Handlers page The **Handlers** page enables you to work with handlers. #### To access the Handlers page 1. On the **Webscale Control Panel** page, click the menu icon on the upper-left of the screen. 2. On the sidebar menu, select **Handlers**. The **Handlers** page displays. {{< figure src="/images/handlers/access_handlers_page.png" align="left" width="100%" alt="Access Handlers page" >}} ### Create handlers A handler is a request or response handler based on the type of JavaScript function that you select when you create the handler. As such, Webscale will use it for either requests or responses. You can create several handlers with the same handler file. If the handler file contains multiple functions, you could create a handler for each function. Only Amazon EC2 providers that are enabled for use with CloudEDGE Workers display in the **Create handler** dialog box. For more information on configuring providers, see [Working with Providers](/docs/how-tos/general/providers/). Handler memory refers to the memory that the cloud provider allocates to a handler function when it runs it. You can modify the amount of allocated memory according to the amount of memory that a handler function needs to run. #### To create a handler 1. On the **Handlers** page, click the **Create handler** link. {{< figure src="/images/handlers/create_handlers_link.png" align="left" width="100%" alt="Click the Create handlers link" >}} 2. In the **Create handler** dialog box, enter a name and, optionally, a description. 3. Select a provider from the **Provider** drop-down menu. 4. Select a handler file from the **File** drop-down menu. 5. Select a JavaScript function from the **Function** drop-down menu. In the drop-down menu, the functions display in one of two groups: request or response functions. 6. If necessary, replace the default amount of memory in the **Memory (MB)** field. 7. Click **Save**. {{< figure src="/images/handlers/save_create_handler.png" align="left" width="100%" alt="Create new handler" >}} The handler displays in the handlers list in the **Handlers** page. ### View handler details You can view the following details for handlers. - Created: Handler creation timestamp - Updated: Timestamp for the last time that you edited the handler - Provider: Provider selected for the handler - File Name: Handler file name - Version: Version of the selected handler file that you specify - Function name: Name of the JavaScript function that the cloud provider executes - Memory: Amount of memory allocated for a handler function when a cloud provider runs it - External reference: Cloud provider-specific URL to the function that encapsulates the handler function - Associated to: When you have associated the handler to a CDN control, name of the application for the CDN control #### To view handler details On the **Handlers** page, select a handler. Detailed information for the handler displays in the **Details** pane. {{< figure src="/images/handlers/view_handler_details.png" align="left" width="100%" alt="View handler detailed information" >}} ### Edit handlers You can modify everything about a handler, including the handler file, except for its name. When you edit a handler that is associated with a CDN control, you can select a different function for the handler. However, you can only replace it with a function that has the same type (request or response) as the current selected function. To change the function type, remove the handler from the CDN control. Then, choose any function that you want, including one with a different function type. #### To edit a handler 1. On the **Handlers** page, select a handler. 2. Click the edit icon for the handler. {{< figure src="/images/handlers/select_edit_handler_link.png" align="left" width="100%" alt="Click handler edit icon" >}} 3. In the **Edit** dialog, modify the desired settings. {{< figure src="/images/handlers/edit_handler_dialog.png" align="left" width="100%" alt="Edit handler" >}} 4. Click **Save**. ### Delete handlers If a handler is associated with a CDN control, you cannot delete the handler until after you have removed it from the CDN control. #### To a delete handler 1. On the **Handlers** page, click the delete icon for a handler. {{< figure src="/images/handlers/handler_delete_icon.png" align="left" width="100%" alt="Click handler delete icon" >}} 2. Click **Ok**.
The file will no longer display in the **Handlers** page list. ## Workers overview Workers run handler functions after cache misses. To create a worker, associate a handler with a CDN control when you create or edit the control. A worker with a request function executes before Webscale CDN forwards the request to origin. A worker with a response function runs in conjunction with the origin response. CDN controls configure the Webscale CDN caching policies that determine when workers run. When configuring a CDN control, you can associate up to two handlers with the control (one for requests and the other for responses). For information about caching policies, see [Configuring CloudEDGE CDN Caching Policies](/docs/how-tos/CloudEDGE/cdn-controls/). You can configure CDN controls through the **Controls** section of the **CDN** page for your application. This section only displays after you enable Webscale CDN. For more information on Webscale CDN, see [CloudEDGE CDN Overview](/docs/how-tos/CloudEDGE/cdn-overview/). ### Create workers This procedure provides instructions for creating workers by adding handlers while creating CDN controls. #### To create a worker 1. Click the three vertical dots menu icon on the upper-right corner of the application box and select **Edit**. {{< figure src="/images/access_edit_app_box.png" alt="Select edit application" >}} -or- On your application page, click the **Actions** menu icon and select **Edit**. {{< figure src="/images/access_edit_action_menu.png" alt="Select edit application" >}} 2. On the sidebar menu, click **CDN**. The **CDN** page displays. 3. In the **Controls** section of the **CDN** page, click on the **Add control** link. {{< figure src="/images/cdn/cdn_click_add_control.png" alt="Click Add control link" >}} 4. In the **Add control** dialog box, enter a path for the CDN control. Then, except for the CloudEDGE Workers settings, configure the desired optional settings. {{< figure src="/images/cdn/cdn_add_control_dialog_settings.png" alt="Specify CDN control settings" >}} 5. In the **CloudEDGE Workers** section, select a handler in the **When processing an origin request** drop-down menu. 6. Select a handler in the **When processing an origin response** drop-down menu. {{< figure src="/images/handlers/cdn_control_add_handlers.png" alt="Select handlers for a CDN control" >}} 7. Click **Save**. ## Further reading - [CloudEDGE Workers Overview](/docs/how-tos/CloudEDGE/workers-overview/) - [Creating CloudEDGE Handler Files](/docs/how-tos/CloudEDGE/create-handler-file/) - [CloudEDGE Workers Usage Example](/docs/how-tos/CloudEDGE/workers-usage-example/) - [CloudEDGE CDN Overview](/docs/how-tos/CloudEDGE/cdn-overview/) - [Configuring CloudEDGE CDN Caching Policies](/docs/how-tos/CloudEDGE/cdn-controls/) - [Working with Files](/docs/how-tos/general/files/) --- # Creating CloudEDGE Handler Files URL: https://docs.webscale.com/docs/how-tos/cloudedge/create-handler-file/ Description: Developer instructions for creating CloudEDGE handler files CloudEDGE workers provide a way to augment your application by modifying the requests that it handles and the responses that it generates without the need to change your existing, deployed application code. Handlers run your custom JavaScript code in a serverless execution environment that is agnostic to your cloud provider. They provide a uniform development environment and deployment flexibility. Additionally, handlers can run at the CDN edge, closer to your users, which allows for improved response times. For more information about CloudEDGE Workers, see [CloudEDGE Workers Overview](/docs/how-tos/CloudEDGE/workers-overview/). {{% alert title="Note:" %}} Currently, Webscale supports Amazon EC2 (also known as Amazon Elastic Compute Cloud). {{% /alert %}} ## Topics - [Handler files](#handler-files) - [Writing handler functions](#writing-handler-functions) - [CloudEDGE handler interfaces](#cloudedge-handler-interfaces) - [Request handlers](#request-handlers) - [Response handlers](#response-handlers) - [wRequest and wResponse objects](#wrequest-and-wresponse-objects) - [wRequest object](#wrequest-object) - [wResponse object](#wresponse-object) - [AWS property mutability](#aws-property-mutability) - [Examples of handler functions](#examples-of-handler-functions) - [Testing handlers](#testing-handlers) - [Integrating the CloudEDGE handler testing framework](#integrating-the-cloudedge-handler-testing-framework) - [Enabling the CloudEDGE Workers feature](#enabling-the-cloudedge-workers-feature) ## Handler files A CloudEDGE handler is implemented in a handler file. The handler file is structured as a [NPM package](https://docs.npmjs.com/about-packages-and-modules). It includes your JavaScript source code and all of the third party-dependencies (also known as node modules) needed to run your code. You do not need to publish this package to the official NPM repository. In addition to the source code and node modules, the handler file must include two files: `package.json` and `manifest.json`. These files must exist in the same directory, which is the package’s root directory. {{< figure src="/images/handler-files/handler_file_directory_structure.png" align="left" width="95%" alt="Handler file directory structure" >}} The [`package.json`](https://docs.npmjs.com/cli/v8/configuring-npm/package-json) file describes the dependencies of the source code, the most important of which is the [`@webscale-networks/cloudedge-handlers`](https://www.npmjs.com/package/@webscale-networks/cloudedge-handlers) node module. This Webscale node module runs your handler in a serverless execution environment once it is deployed. The environment is independent of your cloud provider. The Webscale API will reject handler files that fail to include this dependency in both the `dependencies` and `bundledDependencies` sections of their `package.json` file. Additionally, the ``@webscale-networks/cloudedge-handlers`` node module must exist at ``/node_modules``. The `manifest.json` file contains metadata about the source code of your handler file. Specifically, it enumerates the handler functions contained within, where their implementations exist, and whether they process requests or responses. #### manifest.json file specification ``` [{ 'moduleName': a unique module name as a string, 'relativePath': relative path from package root directory to the handler function source file, 'functions': [{ name: function name as a string, type: one of ‘handleRequest’ or 'handleResponse', }] }] ``` #### Example of a manifest.json file The following sample code is for a single manifest.json file with two handler functions. ``` [{ 'moduleName': handlerSource, 'relativePath': “src/handler.js”, 'functions': [ { name: “addsRequestHeader”, type: “handleRequest”, }, { name: “hijacksResponseBody”, type: “handleResponse”, }, ] }] ``` ## Writing handler functions Handlers that process requests are called request handlers. Likewise, handlers that process responses are called response handlers. When creating the implementation of a handler function, it is important to decide whether it should process requests or responses as the interfaces are similar but not identical. To reiterate, a single source file can contain multiple handler functions, mixing request and response handlers. However, a single handler function cannot process both requests and responses. The function that runs depends on the handler function that an end user chooses when they create a handler through the Webscale Control Panel. For general information on working with handlers through the Webscale Control Panel, see [CloudEDGE Workers Overview](/docs/how-tos/CloudEDGE/workers-overview/). ## CloudEDGE handler interfaces Depending on what type of handler function you write, the function must accept different arguments. - Request handlers must accept a single argument, representing the client’s request. - Response handlers must accept two arguments. The first one is the client’s request and the second is the generated response. Handler functions are not forced to return a result. One example is if the function decides not to modify the `wRequest` or `wResponse` object. If the handler function does return a result, it must be an object containing a subset of the following properties: `error`, `request`, and `response`. The `error` property, if set, should be a JavaScript error. #### Request handlers Request handlers can set the following properties on their returned object. - Return a JavaScript error by setting the `error` property on the returned object. The error will be logged in the cloud provider. The cloud provider’s default error response will be returned to the client. - Return a JavaScript error and custom response by setting the `error` and `response` properties. The error will be logged in the cloud provider. The response will be returned to the client. - Return a custom response by setting the `response` property - Update the request by setting the `request` property - Return nothing #### Response handlers Response handlers can set the following properties on their returned object. - Return a JavaScript error by setting the `error` property on the returned object. The error will be logged in the cloud provider. The cloud provider’s default error response will be returned to the client. - Return a JavaScript error and custom response by setting the `error` and `response` properties - Return a custom or modified response by setting the `response` property - Return nothing Response handlers cannot return an object with the `request` property set. ## wRequest and wResponse objects If your handler function processes requests, it will be called with a `wRequest` object. If your handler function processes responses, it will be called with a `wRequest` and `wResponse` object. ### wRequest object ``` { body: { data: ..., encoding: ..., modified: ..., truncated: ..., }, headers: ..., method: ..., path: ..., peerAddress: ..., query: ..., originRequest: { headers: ..., host: ..., keepaliveTimeout: ..., path: ..., port: ..., protocol: ..., readTimeout: ..., sslProtocols: ..., }, providerSpecific: { ..., } } ``` ### wRequest object properties Property | Description -- | -- `body.data` | Content of the request body `body.encoding` | Encoding of the request body. Valid values are `text` or `base64`. `body.modified` | If your handler modifies the original request body, this property must be set to `true` `body.truncated` | Some cloud providers place limits on the size of request bodies. If a request body is larger than this limit, they might truncate the content that is available to your handler. Valid values are `true` or `false`. `headers` | HTTP request headers that the client sent. A header value can be retrieved by calling its `get` method with the header name. A header value can be set by calling its `set` method with the header name and value. Header names are case-insensitive. `method` | HTTP method of the client’s request `originRequest.headers` | HTTP request headers that will be sent to origin. A header value can be retrieved by calling its `get` method with the header name. A header value can be set by calling its `set` method with the header name and value. Header names are case-insensitive. `originRequest.host` | Hostname used on the request sent to origin `originRequest.keepaliveTimeout` | Maximum amount of time that the connection to origin will be kept alive (in seconds) `originRequest.path` | Path to use when retrieving a resource from origin `originRequest.port` | Port number on which to connect to origin `originRequest.protocol` | Connection protocol to use when connecting to origin `originRequest.readTimeouts` | Maximum amount of time to wait for a response from origin (in seconds) `originRequest.sslProtocols` | Minimum SSL/TLS protocol to use when creating an HTTPS connection with origin, as an array. If multiple protocols are specified, they are tried in order. `path` | Path from the requested URI. This property can be changed so the HTTP response returns a different resource. `peerAddress` | IP address of the client from which the request originates `providerSpecific` | Object containing any additional information included by your cloud provider `query` | Query string from the requested URI ### wResponse object ``` { body: {}, headers: ..., statusCode: ..., providerSpecific: { ..., } } ``` ### wResponse object properties Property | Description -- | -- `body` | Not all cloud providers grant access to the response body. If your cloud provider does, this property stores an object with the `data` and `encoding` properties. These properties can be updated if they exist and added if they do not. Using the `body` property, you can inspect or replace the response. The encoding of `data` must match the value of the `encoding` property. `headers` | HTTP response headers that will be sent to the client. A header value can be retrieved by calling its `get` method with the header name. A header value can be set by calling its `set` method with the header name and value. Header names are case-insensitive. `providerSpecific` | An object containing any additional information included by your cloud provider. The properties that are mutable depend on your cloud provider. `statusCode` | HTTP status code sent to the client. This property can be updated and it must be specified. ## AWS property mutability #### wRequest Immutable:
- `peerAddress`
- `method`
- Properties in `providerSpecific`
Mutable:
- All other fields #### wResponse Immutable:
- Properties in `providerSpecific`
Mutable:
- All other fields ## Examples of handler functions Following are some examples of handler functions. ### Request handlers #### Generating an error when a specific request header is set ``` exports.generatesErrorHandler = (wRequest) => { if (wRequest.headers.get('webscale-generate-error')) { return { error: Error('Operator error'), response: { body: { modified: true, data: 'Generated error', encoding: 'text', }, headers.set('content-type', 'text/html'), statusCode: 400, }, }; } }; ``` #### Modifying the request query parameters ``` exports.addQueryHandler = (wRequest) => { wRequest.query = "delay=10s"; return { request: wRequest, }; }; ``` #### Adding a request header sent to origin using an asynchronous JavaScript function ``` exports.addCustomOriginHeader = async (wRequest) => { wRequest.originRequest.headers.set( 'your-header-name', 'your-header-value', ); return new Promise((resolve, reject) => { resolve({ request: wRequest, }); }); }; ``` #### Modifying the request body sent to origin using an asynchronous JavaScript function ``` exports.changeRequestBodyHandlerAsync = async (wRequest) => { if (wRequest.method == 'POST') { wRequest.headers.set('host', 'ptsv2.com'); wRequest.originRequest.host = 'ptsv2.com'; wRequest.originRequest.protocol = 'http'; wRequest.originRequest.port = 80; wRequest.body.modified = true; wRequest.body.encoding = 'text'; wRequest.body.data = 'This is a brand new POST body.'; } return new Promise((resolve, reject) => { resolve({ request: wRequest, }); }); }; ``` ### Response handlers #### Redirecting a response to another page ``` exports.redirectToWebscale = (wRequest, wResponse) => { wResponse.statusCode = 301; wResponse.headers.set( 'location', 'https://www.webscale.com', ); return { response: wResponse, }; }; ``` #### Replacing a response completely ``` exports.helloWorldResponse = (wRequest, wResponse) => { wResponse.body.modified = true; wResponse.body.data = 'hello world'; wResponse.body.encoding = 'text'; wResponse.headers.set('content-type', 'text/html'); wResponse.headers.set('content-encoding', ''); return { response: wResponse, }; }; ``` #### Hijacking the response to return an error using an asynchronous JavaScript function ``` exports.responseError = async (wRequest, wResponse) => { wResponse.body.modified = true; wResponse.body.encoding = 'text'; wResponse.body.data = 'Resource not found'; wResponse.headers.set('content-type', 'text/html'); wResponse.headers.set('content-encoding', ''); wResponse.statusCode = 404; return new Promise((resolve, reject) => { resolve({ error: Error('Not found'), response: wResponse, }); }); }; ``` ## Testing handlers You can write unit tests for your handler using any JavaScript testing framework. Additionally, the ``@webscale-networks/cloudedge-handlers`` node module includes a testing framework that will automatically run each handler function defined in your `manifest.json` file against a collection of tests that enforce the CloudEDGE handler interfaces and specific constraints of your cloud provider. To run the CloudEDGE handler test suite, simply run the `run-execution-testing.js` node script. To integrate the test suite into your NPM build process, you can run the script on the `posttest` NPM event by updating the [scripts](https://docs.npmjs.com/cli/v8/using-npm/scripts) section of your `package.json` file. {{% alert title="Note:" %}} NPM versions 8.0.0 and higher require a `test` event as well. If you do not have tests of your own, input an empty string. {{% /alert %}} #### Integrating the CloudEDGE handler testing framework ``` “scripts”: { ... “posttest“: "node node_modules/@webscale-networks/cloudedge-handlers/run-execution-testing.js ", ... } ``` ```` should be replaced with the name of the cloud provider for the test. For AWS providers, use `aws`. To execute NPM’s testing pipeline, run `npm test` in the root directory of your package. To create mock `wRequest` and `wResponse` objects in your own unit tests, import the following mock data available to you from the CloudEDGE handler test suite. - Complete `wRequest` and `wResponse` objects are available in: ``.../node_modules/@webscale-networks/cloudedge-handlers/execution_testing/webscale/src/object.js`` - The case-insensitive HTTP header class is available in: ``.../node_modules/@webscale-networks/cloudedge-handlers/execution_testing/utils/src/headers.js`` ## Further reading - [CloudEDGE Workers Overview](/docs/how-tos/CloudEDGE/workers-overview/) - [CloudEDGE Workers Usage Example](/docs/how-tos/CloudEDGE/workers-usage-example/) --- # Egress Proxy How-To Guides URL: https://docs.webscale.com/docs/how-tos/egress-proxy/ Description: Guides to using the Webscale egress proxy. The egress proxy is an optional component within the hosting environment designed to route outbound HTTP and HTTPS traffic through a fixed, static IP address. Structurally, this proxy is deployed on the NFS server and is configured for specific hostnames via the web server cluster metadata settings. --- # Creating Web Controls URL: https://docs.webscale.com/docs/how-tos/web-controls/webcontrols_create/ Description: Create Web Controls through the Webscale Control Panel {{% include webcontrol.md %}} You can also create sequences of these rules that can accomplish much more complex behavior, such as dynamic allowlisting or rate limiting checkout attempts based on user behavior. You can create request and response Web Controls which apply rules respectively to requests or responses. Except for accessing the request and response Web Controls pages, the process for creating both are the same. While the request and response Web Controls share many conditions and actions, the available conditions and actions are not the same. ## Access the Request web controls page ### To access the Request web controls page 1. Click the three vertical dots menu icon on the upper right corner of the application box and select **Edit**. {{< figure src="/images/access_edit_app_box.png" alt="Select Edit from application box" >}} -or- On your application page, click the **Actions** menu icon and select **Edit**. {{< figure src="/images/access_edit_action_menu.png" align="left" width="50%" alt="Select Edit from Action menu" >}} 2. On the sidebar menu, select **Request web controls**. The **Request web controls** page displays. {{< figure src="/images/web_controls/select_request_web_controls_sidebar.png" alt="Select Request web controls on sidebar menu" >}} ## Access the Response web controls page #### To access the Response web controls pages 1. Click the three vertical dots menu icon on the upper right corner of the application box and select **Edit**. {{< figure src="/images/access_edit_app_box.png" alt="Select Edit from application box" >}} -or- On your application page, click the **Actions** menu icon and select **Edit**. {{< figure src="/images/access_edit_action_menu.png" align="left" width="50%" alt="Select Edit from Action menu" >}} 2. On the sidebar menu, select **Response web controls**. The **Response web controls** page displays. {{< figure src="/images/web_controls/select_response_web_controls_sidebar.png" alt="Select Web Controls on sidebar menu" >}} ## Create Web Controls You do not have to create any conditions for a request or response Web Control. If you do not create any conditions, Webscale will apply all actions to every request or response. If you have one or more conditions, the requests and responses must meet all of the conditions before the actions will execute. You must create at least one action for a Web Control. If you have more than one action, all of them run for each request or response that meets all of the conditions. For the other actions, the order in which they run is unspecified and not necessarily in the order displayed in the list of actions for the Web Control. #### To create a Web Control 1. On the **Request web controls** page, click **Add a request web control**.
{{< figure src="/images/web_controls/click_add_request_web_control.png" alt="Edit request web controls section" >}} The sections for configuring request Web Controls display under the **Edit request web control** heading. {{< figure src="/images/web_controls/request_web_controls_section.png" alt="Edit request web controls section" >}} -or- On the **Response web controls** page, click **Add a response web control**.
{{< figure src="/images/web_controls/click_add_response_web_control.png" alt="Click Add a response web control" >}} The sections for configuring response Web Controls display under the **Edit response web control** heading. {{< figure src="/images/web_controls/response_web_controls_section.png" alt="Edit request web controls section" >}} 2. Enter a name and optional description for the Web Control. 3. To add a condition:
a. Click **Add a condition**.
b. In the condition drop-down menu, select a condition.
c. Specify the condition settings.
d. Click **Done**.
4. To add other conditions, repeat the above procedure for adding a condition, choosing different conditions and entering the settings for each new condition. 5. To add an action:
a. Click **Add action**.
b. In the **Type** drop-down menu of the **Create action** section, select an action.
c. Specify the action settings.
d. Click **Done**.
6. Click **Done**. 7. To add other conditions, repeat the above procedure for adding an action, choosing different actions and entering the settings for each new actions. 8. On the right side of the **Edit request web control** header, click **Done**. 9. Click **Apply**. ## Further Reading - [How To Shield Your Online Storefront From Cyberthreats With Webscale's Web Controls](https://www.webscale.com/blog/shield-online-storefront-cyberthreats-webscale-web-controls/) - [What are Web Controls, and how do I use them?](/docs/faq/#what-are-web-controls-and-how-do-i-use-them/) - [Configuring Web Controls for Rate Limiting](/docs/how-tos/advanced/rate-limiting/) - [How to Block Countries](/docs/how-tos/security/block-countries/) - [Security How-Tos](/docs/how-tos/security/) --- # Managing Web Controls URL: https://docs.webscale.com/docs/how-tos/web-controls/webcontrols_manage/ Description: Manage Web Controls through the Webscale Control Panel {{% include webcontrol.md %}} You can also create sequences of these rules that can accomplish much more complex behavior, such as dynamic allowlisting or rate limiting checkout attempts based on user behavior. {{% alert %}} {{% include dashboard-login.md %}} On the menu that appears, click **Edit**. {{% /alert %}} ## Manage Web Controls Click **Web Controls** on the menu. {{< figure src="/images/web_controls/manage_main.png" alt="Webscale Web Controls page in the control panel" >}} Here you manage or create Web Controls. You can also change or lock the execution order of the Web Controls, enable or disable specific Web Controls, refresh the hits counter, and edit or delete Web Controls. - To create a new Web Control, click the **Add A Web Control** button. Read more: [Creating Web Controls](/docs/how-tos/web-controls/webcontrols_create/). - To set the order of the Web Controls, click the 3 vertical dots next to **Web Controls** at the top of the Web Controls list, and choose **Unlock order** from the list. Then, click on the Web Control you wish to move in the list. - To lock the order of the Web Controls, click the 3 vertical dots next to **Web Controls** at the top of the Web Controls list, and choose **Lock order** from the list. - To enable or disable a Web Control, click the checkbox labeled **Enabled** next to the Web Control you wish to modify. - To view details of a Web control, click the arrow `>` next to it. You can also click the **Expand all** checkbox to view the details of all Web Controls. - To edit or delete a Web Control once you've expanded it, click the `X` icon to delete or the pencil box icon to edit the Web Control. - To refresh the hits counter, click the refresh icon. This action resets the counter to 0, so be careful! {{% alert title="Note:" %}} The hits counter keeps track of how many times each Web Control has run in the last 5 minutes. {{% /alert %}} ## Further Reading - [How To Shield Your Online Storefront From Cyberthreats With Webscale's Web Controls](https://www.webscale.com/blog/shield-online-storefront-cyberthreats-webscale-web-controls/) - [What are Web Controls, and how do I use them?](/docs/faq/#what-are-web-controls-and-how-do-i-use-them/) - [Configuring Web Controls for Rate Limiting](/docs/how-tos/advanced/rate-limiting/) - [How to Block Countries](/docs/how-tos/security/block-countries/) - [Security How-Tos](/docs/how-tos/security/) --- # Using URL Maps to Redirect URLs URL: https://docs.webscale.com/docs/how-tos/web-controls/url-maps/ Description: Use URL maps to redirect URLs through the Webscale Control Panel The URL mapping feature enables you to redirect requests from one URL (*from*) to another URL (*to*). A comma-separated values (CSV) file specifies the from and to URLs. If desired, you can bulk import matching pairs of URLs. One example of when you might use URL mapping is when you revise your website. This can lead to orphaned URLs. When site visitors use an orphaned URL, a web page with a `404` error code displays rather than a viewable page. A URL map enables you to avoid this potential problem. Or, another reason to use this feature might be to redirect from one viewable web page to another one. {{% alert title="Note:" %}} URL maps are available to all applications for your account. Different applications can use the same URL map. {{% /alert %}} ## URL mapping Each URL map incorporates a URL map file that specifies the *from* and *to* URLs. Web Controls redirect requests in conjunction with URL maps. When the URL of a request matches a *from* URL, the Web Control sends it to the web page with the *to* URL. Through Web Controls, you can configure additional mapping criteria. The **URL maps** tab enable you to create, edit, and delete URL maps. {{< figure src="/images/url_maps/url_maps_tab.png" alt="URL maps tab" >}} ## URL map files A URL map file is a CSV file that specifies *from* and *to* pairs of URLs. The file should have two values on each line, separated by a comma to ensure that your URL map successfully redirects orphaned URLs. See the following example of a line for a URL map file. `http://www.example.com/ , http://www.example.com/` After you are done adding URLs to the file, save it with the `.csv` file extension. ## Create URL Maps When you create a URL map, enter a name and upload the URL map file. Optionally, you can add a description. Webscale parses the map file data before it creates the URL map. If the map file data is formatted incorrectly or invalid, you cannot create the URL map. ### To create a URL map 1. On the **Webscale Control Panel** page, click the menu icon on the upper left of the screen. 2. Select **URL maps** on the sidebar menu. {{< figure src="/images/url_maps/select_url_maps.png" alt="Select URL maps sidebar menu entry" >}} 3. On the **URL maps** tab, click **Create URL map**. 4. Enter a URL name and, optionally, a description. 5. Click **Choose File** to upload a URL map file. 6. Select a file on your computer and click **Open**. 7. Click **Save**.
The URL map information displays on the **URL maps** tab. {{< figure src="/images/url_maps/create-url-map.png" alt="Create URL map" >}} ## Edit URL maps When you edit a URL map, you can perform the following operations. - Hide details - Edit name and description - Upload map file - Download map file - Delete map When you select a URL map, detailed information displays for it in the **Details** section. Through the edit menu, you can hide the details or view them again if they are hidden. (You can also show hidden details by selecting the URL map.) You can also replace a URL map file by uploading a different one or downloading the existing map file. {{< figure src="/images/url_maps/url_maps_edit_menu.png" alt="URL maps edit menu" >}} ### To edit a URL map 1. On the **URL maps** tab, select the URL map that you want to edit. 2. Click the three vertical dots menu icon to the right of the **Updated** column. The edit menu displays. 2. On the edit menu: - Hide the URL map details by selecting **Hide details**. To view hidden details, select **View details**. - Edit the map name and description by selecting **Edit name and description**. - Replace the map file with a new one by selecting **Download map file** and uploading a new file. 3. For each editing operation, except for hiding and viewing details, click **Apply** to save the changes. ## Delete URL Maps You can also use the edit menu to delete URL maps. ### To delete a URL maps 1. On the **URL maps** tab, select the URL map that you want to delete. 2. Click the three vertical dots menu icon to the right of the **Updated** column. The edit menu displays. 3. On the edit menu, select **Delete map**. 4. In the confirmation box, click **Ok**. ## Web Controls Web Controls consist of configured rule sets that minimize the need to define and maintain multiple individual rules. Instead, you can create rule sets that match individual request conditions. Based on the conditions, Web Controls automatically execute a set of pre-defined actions. Web Controls also enable you to create complex sequences of actions. When one or more specified conditions are met, Webscale applies all configured actions to the request. For URL mapping, optional conditions can specify when Webscale redirects URLs. The **Redirect using map** action is mandatory and enables the Web Control to re-direct URLs. When you select this action type, you must select a HTTP status code, URL map, and if Webscale will preserve request or query parameters for the request or *from* URL. ### Settings for the Redirect using map action When you select the **Redirect using map** action type, you must configure the following settings. - HTTP status - URL map - Preserve query The **HTTP status** setting defines the HTTP status code that all redirected requests for the URL map return. The **URL map** setting specifies the URL map that the Web Control will use. If the query preserving feature is enabled through the **Preserve query** toggle, the final redirected URLs (otherwise known as the output URLs) will include request query parameters for each pair in the map. Query parameters follow the differing paths for the *from* and *to* URLs. If disabled, Webscale discards the request query parameter. ### URL mapping and query parameters The following table illustrates how URL mapping works when the **Preserve query** setting is enabled and disabled. Request URL | URL map from | URL map to | Preserve query parameter | Output URL -- | -- | -- | :--: | -- | example.com/ex?a=b | example.com/ex | example.com/ab?y=z | True | example.com/ab?y=z | example.com/ex?a=b | example.com/ex | example.com/ab | True | example.com/ab?a=b | example.com/ex?a=b | example.com/ex?a=b | example.com/ab?y=z | True | example.com/ab?y=z example.com/ex?a=b | example.com/ex?a=b | example.com/ab | True | example.com/ab example.com/ex?a=b | example.com/ex | example.com/ab?y=z | False | example.com/ab?y=z example.com/ex?a=b | example.com/ex | example.com/ab | False | example.com/ab example.com/ex?a=b | example.com/ex?a=b | example.com/ab?y=z | False | example.com/ab?y=z example.com/ex?a=b | example.com/ex?a=b | example.com/ab | False | example.com/ab ## Create Web Controls to redirect URLs The **Web controls** page enables you to create Web Controls. For more information on creating Web Controls, see [Creating Web Controls](/docs/how-tos/web-controls/webcontrols_create/). ### To create a Web Control to redirect URLs 1. Click the three vertical dots menu icon on the upper right corner of the application box and select **Edit**. {{< figure src="/images/access_edit_app_box.png" alt="Select Edit from application box" >}} -or- On your application page, click the **Actions** menu icon and select **Edit**. {{< figure src="/images/access_edit_action_menu.png" alt="Select Edit from Action menu" >}} 2. On the sidebar menu, select **Web Controls**. The **Web controls** page displays. {{< figure src="/images/web_controls/select_web_controls_sidebar.png" alt="Select Web Controls on sidebar menu" >}} 3. On the **Web controls** page, click **Add a web control**.
The sections for configuring Web Controls display under the **Edit web control** heading. 4. Enter a name and optional description for the Web Control. {{< figure src="/images/url_maps/url-maps-edit-web-controls-section.png" alt="Enter Web Controls name and description" >}} 5. Optionally, to add a condition:
a. Click **Add a condition**.
b. In the condition drop-down menu, select a condition and define the settings for the condition.
You can select additional conditions.
c. Click **Done**. 6. To add the **redirect select_url_maps** action:
a. Click **Add action**.
b. In the **Type** drop-down menu, select **Redirect using map** under **Final actions**.
The **Create action** section displays.
c. In the **HTTP status code** drop-down menu, specify a status code for responses to the *from* URLs in the URL map.
d. Select a URL map in the **URL map** drop-down menu.
e. Click the **Preserve query** toggle to enable or disable preserving queries in the mapping.
f. Click **Done**.
You can select additional actions. {{< figure src="/images/url_maps/url-maps-action-settings.png" alt="Redirect using map action settings" >}} 7. To the right of the **Edit web control** header, click **Done**. 8. Click **Apply**. ## Further Reading - [Creating Web Controls](/docs/how-tos/web-controls/webcontrols_create/) - [Managing Web Controls](/docs/how-tos/web-controls/webcontrols_manage/) - [List of HTTP status codes](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) --- # How to Set Pagespeed Options URL: https://docs.webscale.com/docs/how-tos/web-controls/pagespeed/ Description: A brief walkthrough on setting Pagespeed options in Web Controls {{% include webcontrol.md %}} A typical action to define is to set Pagespeed Options. {{% alert %}} {{% include dashboard-login.md %}} On the menu that appears, click **Edit**. {{% /alert %}} {{% alert color="info" title="Prerequisite" %}} Since you’re setting a Web Control, we recommend reading [How to Create Web Controls](/docs/how-tos/web-controls/webcontrols_create/) before following these steps. {{% /alert %}} Click **+ Add Action** to open the **Create Action** dialog. Click the **Select an action..** dropdown to open it and choose **Set Pagespeed Options** from the list. {{< figure src="/images/web_controls/create_action_pagespeed.png" alt="Webscale Create Action dialog in the control panel showing Set Pagespeed Options" >}} Choose **Yes** if you want this action to run the Pagespeed options specified below, **No** to not run the options, or **Make no decision** for the Web Control to make no changes to existing behavior. In the text area labeled **Select the filters to enable when Pagespeed runs**, choose from the list of Pagespeed options for this action to run. When finished, click the **Done** button to return to the Edit Web Control screen. You can add more than one action. Note that all actions specified are run, but there is no implied order. When a condition is met, then all specified actions are applied to the request. You can only choose one final action. Final actions run last; the order of execution of other actions is unspecified and not necessarily in the order displayed. ## Further Reading - [Pagespeed Options](/docs/reference/pagespeed_options/) - [How To Shield Your Online Storefront From Cyberthreats With Webscale's Web Controls](https://www.webscale.com/blog/shield-online-storefront-cyberthreats-webscale-web-controls/) - [What are Web Controls, and how do I use them?](/docs/faq/#what-are-web-controls-and-how-do-i-use-them/) - [How to Block Countries](/docs/how-tos/security/block-countries/) --- # Enforcing a Content Security Policy URL: https://docs.webscale.com/docs/how-tos/web-controls/csp-create/ Description: A brief walkthrough on setting Content Security Policy options in Web Controls {{% include webcontrol.md %}} A powerful Web Control action you can use is the **Content Security Policy** action. {{% alert title="Note:" %}} This is an optional feature. If you'd like to enable this feature, please [contact support](mailto:support@webscalenetworks.com). {{% /alert %}} ## Configure a Content Security Policy {{% alert %}} {{% include dashboard-login.md %}} On the menu that appears, click **Edit**. {{% /alert %}} {{% alert color="info" title="Prerequisite" %}} Since you’re setting a Web Control, we recommend reading [How to Create Web Controls](/docs/how-tos/web-controls/webcontrols_create/) before following these steps. {{% /alert %}} Click **+ Add Action** to open the **Create Action** dialog. Click the **Select an action..** dropdown to open it and choose **Content Security Policy** from the list. Then, click **Add Directive..** to see the list of available [Content Security Policy](/docs/reference/content-security-policy/) directives, and choose one from the list. {{< figure src="/images/web_controls/create_action_csp.png" alt="Webscale Create Action dialog in the control panel showing Content Security Policy" >}} {{% alert title="Note:" %}} When you click the **Enable** toggle to enable the **Report only** setting, the `Content-Security-Policy` header will be replaced with a `Content-Security-Policy-Report-Only` header. {{% /alert %}} Depending on the directive chosen, you may have to add the specific [source](/docs/reference/content-security-policy/#source) or [value](/docs/reference/content-security-policy/#sandbox-values) that applies to the directive. When finished, click the **Done** button to return to the Edit Web Control screen. You can add more than one action. Note that all actions specified are run, but there is no implied order. When a condition is met, then all specified actions are applied to the request. You can only choose one final action. Final actions run last; the order of execution of other actions is unspecified and not necessarily in the order displayed. See [Content Security Policy Directives](/docs/reference/content-security-policy/) for a list of directives and sources you can choose from. ## Content Security Policy Logs When a content security policy is violated, a log entry is created that contains information about the violation. ### Violation report parameters | Parameter | Explanation | |---------|----------| | `arrival` | Timestamp of when the report was received by the Webscale proxy | | `blocked_uri` | URI of the resource that was blocked from loading by the Content Security Policy. If the blocked URI is from a different origin than the `document-uri`, then the blocked URI is truncated to contain just the scheme, host, and port. | | `country` | Two-letter country code (ISO 3166-1) for the origin of a request | | `disposition` | “enforce” if the Content-Security-Policy response header was used. “report” if the Content-Security-Policy-Report-Only response header was used. | | `document_uri` | URI of the document in which the violation occurred | | `effective_directive` | Directive the enforcement of which caused the violation | | `host` | URL of the application that was requested | | `original_policy` | Original policy as specified by the Content-Security-Policy response header | | `peer_address` | IP address of the proxy that received the report | | `referrer` | Referrer of the document in which the violation occurred | | `request_address` | Remote IP address of the user agent that made the request | | `script_sample` | First 40 characters of the inline script, event handler, or style that caused the violation | | `session_id` | ID of the Webscale session that attempted to load the resource | | `status_code` | Response status code that indicates the response to a specific request | | `useragent` | User agent used in the request | | `violated_directive` | Name of the violated policy section | More information about the violation report syntax can be found on the [Firefox MDN web docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP#Violation_report_syntax). ### Viewing the Content Security Policy logs {{% alert %}} {{% include dashboard-login.md %}} On the menu that appears, click **CSP reports** to view the content security policy logs. {{% /alert %}} On the Traffic Viewer page for CSP reports, you can use filter queries to drill down through the reports. The filter uses CSP report attributes, which are the same as the [violation parameters](#violation-report-parameters). For more information on CSP report attributes, including aliases that you can use in filters, see [CSP Report Logs](/docs/how-tos/traffic-viewer/csp-reports-attributes/) For example, the following filter query will show you all instances of `blocked_uri` that contain the string `admin`: ``` blocked_uri ~ *admin* ``` The filter accepts wildcard characters (`*`). ### Alerting on Content Security Policy violations You can monitor the Content Security Policy logs and configure a monitor to notify you if a specific Content Security Policy you've set is violated. When logged into the Webscale Control Panel, click the (gear) icon on the upper right, and select **Account Settings** from the menu. Then click the **Monitors** tab, which takes you to the [Monitors page.](https://control.webscale.com/account/monitors) Click the **Create monitor** button to display the following: {{< figure src="/images/web_controls/create-monitor.png" alt="Create monitor box in the Webscale Control Panel" >}} Choose the following options: - **Type**: Choose `logs`. - **Name**: A name to identify the monitor with. - **Description**: A short description of the monitor or it's purpose. - **Add Label**: Click here to add an existing label that is already applied to a related system resource. - **Message**: The message sent in the notification. This field accepts [liquid templates](https://shopify.github.io/liquid/) that render to markdown. This markdown is then rendered to HTML in the message sent. The templates differ depending on the monitor context (specified by the label) chosen. - **Notify**: Where to send the notification. This field currently only accepts email addresses, but Webhooks are coming soon. {{% alert %}} The following items show once you choose `logs` from the first **Type** field. {{% /alert %}} - **Log Type**: Choose `csp-reports` here. - **Duration**: Set a duration over which to monitor violations, in seconds. - **Group By**: Divides the violations into groups on values of the attribute chosen here. Webscale then evaluates the condition for each group to determine if there are any groups that should cause a notification. - **Condition**: Choose the condition, which must be in `outlier(, )` form. - **Filter**: Similar to the [Traffic Viewer's filter](/docs/how-tos/traffic-viewer/filter-traffic-viewer/), but the parameters can only be [Content Security Policy violation parameters](#violation-report-parameters). Once configured, you will receive notifications for Content Security Policy log entries that match the above settings. ## Further Reading - [Content Security Policy (Firefox MDN web docs)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) - [Web Controls](/docs/how-tos/web-controls/) - [How to Block Countries from Accessing Your Site](/docs/how-tos/security/block-countries/) - [Content Security Policy Directives](/docs/reference/content-security-policy/) - [Logs on Webscale](/docs/how-tos/advanced/logs/) --- # Using Image Manager URL: https://docs.webscale.com/docs/how-tos/web-controls/image-manager/ Description: Configure Image Manager through the Webscale Control Panel The Webscale {{< term "image_manager" >}} product is an image processing service that uses a JavaScript library called Sharp to automatically manipulate images. The library filters change image compression, size, and format according to your specifications. {{< term "image_manager" >}} offers a one-stop, automated image optimization and management solution to dynamically optimize delivery, significantly improve page load times, and reduce spending. Improvement in the size and bandwidth usage of delivered images can result in higher Core Web Vitals scores. The main objective of {{< term "image_manager" >}} is to replace web page images with smaller optimized versions for better website performance. After Webscale support deploys {{< term "image_manager" >}}, it runs automatically, using default request Web Controls and cache settings. You can change these settings so that {{< term "image_manager" >}} processes images differently. For example, you might want users to be able to view the details of site images better. You can raise image quality by decreasing compression, which increases file size and resolution, through a Web Control filter setting. However, larger files lead to slower page load times. Through Web Controls, you can ensure the ongoing high performance, availability, and security of your websites through customized conditions and actions that Webscale applies to your website traffic. Web Controls consist of configured rule sets that minimize the need to define and maintain multiple individual rules. Instead, you can create rule sets that match individual request and response conditions. When a request meets specified conditions, Web Controls execute a set of pre-defined actions. Web Controls enable you to create complex sequences of actions that run automatically. {{% alert title="IMPORTANT:" %}} We strongly recommend that the only Web Controls settings that you modify are the ones for the image processing filters. All other conditions and actions are configured correctly for {{< term "image_manager" >}}. Do not add new conditions and actions for the Web Controls. {{% /alert %}} ## Topics - [Overview](#overview) - [AWS Lambda](#aws-lambda) - [Default Web Controls](#default-web-controls) - [Conditions](#conditions) - [Actions](#actions) - [Filters](#filters) - [Cache processed images](#cache-processed-images) - [CDN caching policies](#cdn-caching-policies) - [Site cache settings](#site-cache-settings) - [Change image processing settings](#change-image-processing-settings) - [Filters overview](#filters-overview) - [Supported filters](#supported-filters) ## Overview A browser generates a request for an image. If the request meets all of the conditions for a Web Control for {{< term "image_manager" >}}, the following process takes place. 1. The **Use alternate backends** action for an {{< term "image_manager" >}} Web Control calls the AWS API Gateway endpoint and specifies the filters and their settings.
-and-
**Set request header** and **Set response header** actions modify the request and response headers to give configuration values to {{< term "image_manager" >}}. They also provide information about if {{< term "image_manager" >}} processed the request and the Web Control for it. 2. The AWS API Gateway triggers the AWS Lambda service, which makes the Lambda run. 3. {{< term "image_manager" >}} makes a request inside the Lambda to get the original image from your backend application or Site Cache, depending on which one contains the image. 4. Webscale serves the image from the appropriate cache. 5. Through the Sharp JavaScript library, {{< term "image_manager" >}} applies the filters to the image. 6. Webscale caches the processed image and sends it to the web browser that created the request. You can change how {{< term "image_manager" >}} processes images by modifying the **Use alternate backends** action, which specifies the image filters and their settings. You might need a new Web Control to meet your organization's needs. For example, you might want {{< term "image_manager" >}} to process banner images and apply specific optimization settings. Or, you might deploy {{< term "image_manager" >}} on a locked-down staging site that only allows access based on specific IP addresses for testing. An additional Web Control could enable {{< term "image_manager" >}} Lambdas to access your backend application. To add a Web Control for {{< term "image_manager" >}}, contact [support](mailto:support@webscalenetworks.com). {{% alert title="Note:" %}} The {{< term "image_manager" >}} installation process automatically creates three default request Web Controls. They are crucial for {{< term "image_manager" >}} to run. Do not delete them. For more information on the Web Controls, see [Default Web Controls](#default-web-controls). {{% /alert %}} ## AWS Lambda AWS Lambda is a serverless, event-driven service. It enables Webscale to run code for virtually any type of application or backend service. Lambdas are simple functions that you can invoke to run your code. Each Lambda is used just once. It has code to process the events that you pass into the function or that other AWS services send to the function. For more information on AWS Lambda, see the AWS documentation for [What Is AWS Lambda?](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html). A trigger is a resource or configuration that invokes an AWS Lambda function. Triggers include AWS services that you can configure to invoke a function. ## Default Web Controls {{< figure src="/images/web_controls/image-manager/image_manager_expanded_desktop_web_control.png" align="left" width="100%" alt="Image Manager desktop Web Control with condition and actions sections called out" >}} Webscale automatically creates three request Web Controls during {{< term "image_manager" >}} installation. These standard Web Controls have default conditions, actions, and filters with specific settings. Their names correspond to each of the following user types. - Webscale Image-Manager Mobile: Mobile users - Webscale Image-Manager: Desktop users with other browsers or newer versions of the Safari browser (2014 and higher) - Webscale Image-Manager Safari: Desktop users with a version of the Safari browser that does not support WebP-formatted images (2013 and older) {{< figure src="/images/web_controls/image-manager/image_manager_web_controls_list.png" align="left" width="100%" alt="List of Image Manager Web Controls" >}} The three standard Web Controls cover the different image processing needs for each type of user. For instance, small images render faster on mobile device screens and decrease data transfer while larger ones can display better for desktop users. For requests that meet the conditions for the Webscale Image-Manager Mobile and Webscale Image-Manager Web Controls, {{< term "image_manager" >}} converts all images to the WebP (WebP) file format. However, not all versions of the Safari browser support WebP-formatted images. The Webscale Image-Manager Safari Web Control pertains to requests from versions of the Safari browser that do not support WebP-formatted images. For requests that meet the conditions for the Webscale Image-Manager Safari Web Control, {{< term "image_manager" >}} does not convert the images to the WebP file format. All images retain their file formats unless the requests are for JPEG (JPEG) or Portable Network Graphics (PNG) images. Then, {{< term "image_manager" >}} converts them to progressive JPEG or PNG images. For more information on the Progressive and other default filters, see [Filters](#filters). {{% alert title="Note:" %}} In the **Request web controls** page, the default Web Controls are grouped together and list in the order presented in the above screenshot. Keep them grouped in this order. {{% /alert %}} {{% alert title="Note:" %}} If there are CORS, blocking, PageSpeed, or general Web Controls, move the {{< term "image_manager" >}} Web Controls below them in the list of Web Controls if they are not already. {{% /alert %}} ### Conditions The following table presents the default conditions for the standard Web Controls. For more information on conditions, see [Creating Web Controls](/docs/how-tos/web-controls/webcontrols_create/). {{< figure src="/images/web_controls/image-manager/image_manager_mobile_conditions.png" align="left" width="50%" alt="Image Manager Mobile Web Control conditions" >}} {{< figure src="/images/web_controls/image-manager/image_manager_desktop_conditions.png" align="left" width="50%" alt="Image Manager Web Control desktop conditions" >}} {{< figure src="/images/web_controls/image-manager/image_manager_safari_conditions.png" align="left" width="50%" alt="Image Manager Safari Web Control conditions" >}} **Type** | **Setting details** | **Webscale Image-Manager Mobile** | **Webscale Image-Manager** | **Webscale Image-Manager Safari** -- | -- | -- | --| -- | Request header value does not match | Actions will be applied when the header `Image-Retrieved` does not match the pattern of `true` |

Yes

|

Yes

|

Yes

| User agent matches | Actions will be applied when the user-agent in the request matches one of the following patterns: `.*iPhone.*`, `.*iPod.*`, `.*Android.*` |

Yes

| | | URL matches | `*.jpg`, `*.jpeg`, `*.png`, `*.webp` as supported paths |

Yes

|

Yes

|

Yes

| URL does not match | `/*` as the path and `image-handler=off` as the query |

Yes

|

Yes

|

Yes

| Request headers match | `webp-accepted` as the name and `true` as the pattern | |

Yes

| | Request headers match | `webp-accepted` as the name and `false` as the pattern | | |

Yes

| ### Actions The following table presents the default actions for the standard Web Controls. For more information on actions, see [Creating Web Controls](/docs/how-tos/web-controls/webcontrols_create/). {{< figure src="/images/web_controls/image-manager/image_manager_mobile_actions.png" align="left" width="50%" alt="Image Manager Mobile Web Control actions" >}} {{< figure src="/images/web_controls/image-manager/image_manager_desktop_actions.png" align="left" width="50%" alt="Image Manager desktop Web Control actions" >}} {{< figure src="/images/web_controls/image-manager/image_manager_safari_actions.png" align="left" width="50%" alt="Image Manager desktop Web Control actions" >}} **Type** | **Setting detail** | **Webscale Image-Manager Mobile** | **Webscale Image-Manager** | **Webscale Image-Manager Safari** -- | -- | -- | --| -- | Set request header | Request header will be set to: `Image-Domain: origin-<`*`your application ID`*`>.cloudmaestro.com` |

Yes

|

Yes

|

Yes

| Set request header | Request header will be set to: `Image-Host: <`*`your default application hostname`*`>`|

Yes

|

Yes

|

Yes

| Set response header | Response header will be set to: `X-Webscale-ImageManager-Processed: true` |

Yes

|

Yes

|

Yes

| Set response header | Response header will be set to: `X-Webscale-ImageManager-< `*`Mobile`*`, `*`Desktop`*`, `*`Safari`*`>`: `true` |

Yes

|

Yes

|

Yes

| Use alternate backends | Route request to servers at `<`*`your AWS API Gateway endpoint`*`>` with the remote URL `<`*`the domain for your AWS API Gateway endpoint`*`>`/image/filters: `<`*`filter name and settings`*`>` followed by `<`*`filter name and settings`*`>` for any subsequent filter with a backslash after the last filter |

Yes

|

Yes

|

Yes

| ### Filters Each standard Web Control includes multiple default filters, which are presented as part of the string for the remote URL of the **Use alternate backends** action. Information for the default filters for {{< term "image_manager" >}} follows. Each entry includes the filter name, usage in parentheses, and a description. - Format (format): Specifies reformatting images to the supported WebP, JPEG, Graphics Interchange Format (GIF), or PNG file formats - No upscale (noupscale): Specifies that {{< term "image_manager" >}} will only resize images to a smaller size than the original and not enlargen them while using upscaling to maintain quality - Progressive (progressive): Specifies reformatting images to progressive JPEG and PNG file formats. Progressive images load immediately at a low resolution that progressively increases. - Quality (quality): Specifies the image quality level (on a scale of one to 100) that corresponds to the amount of compression for JPEG images. For the best quality images, which are uncompressed, the level is "100" whereas the level is "1" for minimum quality and maximum compression. For quality levels of "80" to "85," images usually decrease by 30 to 40 percent with little noticeable decrease in quality. - Resize (fit-in): Specifies resizing images to defined dimensions. {{% alert title="Note:" %}} Image sizes are in pixels. {{% /alert %}} The following table presents the default filters and their values. For more information on {{< term "image_manager" >}} filters and syntax, see [Filters overview](#filters-overview). {{< figure src="/images/web_controls/image-manager/image_manager_mobile_default_filters.png" align="left" width="50%" alt="Image Manager Mobile Web Control filters" >}} {{< figure src="/images/web_controls/image-manager/image_manager_desktop_default_filters.png" align="left" width="50%" alt="Image Manager desktop Web Control default filters" >}} {{< figure src="/images/web_controls/image-manager/image_manager_safari_default_filters.png" align="left" width="50%" alt="Image Manager Mobile Web Control default filters" >}} **Filters** | **Webscale Image-Manager Mobile** | **Webscale Image-Manager** | **Webscale Image-Manager Safari** -- | -- | -- | --| ``/filters:quality(60)/filters:progressive()/filters:format(webp)/fit-in/500x500/filters:noupscale()/`` |

Yes

| | ``/filters:quality(60)/filters:progressive()/filters:format(webp)/fit-in/1000x1000/filters:noupscale()/`` | |

Yes

| | ``/filters:quality(60)/filters:progressive()/fit-in/1000x1000/filters:noupscale()/`` | | |

Yes

| ## Cache processed images After Image Manages retrieves the images from your backend application and processes them, Webscale caches them. If Webscale CDN is enabled, a CDN control determines the CDN cache location for the processed images. If not, Site Cache settings specify the cache location. Webscale support configures caching for {{< term "image_manager" >}} images as part of deployment if you do not already have a CDN control and Site Cache rule with this location. {{% alert title="Note:" %}} Instead of the backend application, Site Cache might contain the original image. If so, Site Cache will serve it. {{% /alert %}} ### CDN caching policies If Webscale CDN is enabled, Webscale support creates a CDN control for caching JPEG, PNG, and WebP images with /media/* as the path if the CDN control does not already exist. For more information on caching policies and working with CDN controls, see [Configuring CloudEDGE CDN Caching Policies](/docs/how-tos/CloudEDGE/cdn-controls/). ### Site cache settings For your application servers, configuring {{< term "image_manager" >}} includes creating a Site Cache rule that defines caching for media images and prevents caching the origin request that retrieves the image from your backend application. For the rule, Webscale support adds the following conditions in the **Create conditions** dialog box part of deploying {{< term "image_manager" >}}. - For the **URL matches** condition, /media/* is the path for caching JPEG, PNG, and WebP images in the Path field - For the **Request headers do not match** condition, **Image-Retrieved** is the header with **true** as the pattern Ensure that the **Browser**, **Hostname**, and **Query** cache key properties are enabled. For more information on creating Site Cache rules, see [Configuring and Flushing the Site Cache](/docs/how-tos/advanced/site-cache/). ## Change image processing settings After Webscale installs {{< term "image_manager" >}}, you can change how it processes images by editing the Web Controls and modifying their filters and settings. For more information on filters, see [Filters](#filters). #### To edit filters for a Web Control 1. Access the **Request web controls** page, according to [Access the Request web controls page](/docs/how-tos/web-controls/webcontrols_create/) in [Creating Web Controls](/docs/how-tos/web-controls/webcontrols_create/). 2. In the list of Web Controls on the **Request web controls** page, click the symbol for the Web Control to edit.
{{< figure src="/images/web_controls/image-manager/image_manager_click_open_web_control.png" align="left" width="100%" alt="Click to access Web Control settings" >}} The conditions and actions for the Web Control display. 3. To the right of the conditions and actions, click the **Edit** icon for the Web Control. {{< figure src="/images/web_controls/image-manager/image_manager_click_edit_web_control.png" align="left" width="100%" alt="Click Edit icon for the Web Control" >}} 4. In the **Actions** section, click the the **Edit** icon for the **Use alternate backends** action. {{< figure src="/images/web_controls/image-manager/image_manager_click_edit_use_alternate_backends.png" align="left" width="100%" alt="Click Edit icon for the Use alternate backends action" >}} 5. Click the **Show URL mapping** link.
{{< figure src="/images/web_controls/image-manager/image_manager_click_show_url_mapping.png" align="left" width="90%" alt="Click Show URL mapping link" >}} The URL mapping settings, including the Web Control filters, display.
{{< figure src="/images/web_controls/image-manager/image_manager_url_mapping_settings.png" align="left" width="90%" alt="Url mappings settings" >}} 6. In the **Remote URL** field, modify the filters in the **images** path by performing any or all of the following operations.
- Append new filters to the filter string. Except for the Resize filter, each filter should start with `/filters:`. The filter name and one or more values follow. The filter at the end of the string ends with a backslash. - Modify filter values. For example, you can increase image compression, which will also result in lower quality, by decreasing the numeric value for the Quality filter. - Remove filters from the filter string. 9. Click **Done**. {{< figure src="/images/web_controls/image-manager/image_manager_click_done_modify_filters.png" align="left" width="90%" alt="Click Done when finishing modifying filters" >}} 10. On the right side of the **Edit request web control** header, click **Done**. {{< figure src="/images/web_controls/image-manager/image_manager_click_done_modify_web_control.png" align="left" width="90%" alt="Click Done when finishing modifying Web Control" >}} 11. Click **Apply**. {{< figure src="/images/web_controls/image-manager/image_manager_click_apply_web_control.png" align="left" width="90%" alt="Click Apply when finishws modifying Web Control" >}} ## Filters overview The **Use alternate backends** action for the Web Controls fulfills two important roles. It defines the image processing filters through the remote URL. It also identifies the route to the AWS API Gateway endpoint that triggers a Lambda for {{< term "image_manager" >}}. Each filter starts with `/filters:` except for the Resize filter. All filters uses the syntax presented in the table of [supported filters](#supported-filters). The filter name and one or more values follow. Values can be numeric, boolean, or in text, such as the names of supported file formats. For example, this action might include the Quality filter, which changes the compression and corresponding quality of JPEG images. A value of 60% of the maximum quality would be represented as: `filters:quality(60)`. When this action includes multiple filters, the filters are grouped and represented as a single string. While the filter order determines when {{< term "image_manager" >}} executes each filter, the processing order does not affect the results. The last filter in the string ends with a backslash. ### Detailed example For the Webscale Image-Manager Safari Web Control, the **Use alternate backends** action settings, which include the default filters and values, are as follows. Route request to servers at `iq3h20n8qa.execute-api.us-east-1.amazonaws.com` with the remote url `https://``iq3h20n8qa.execute-api.us-east-1.amazonaws.com/image/filters:quality(60)/filters:progressive()/fit-in/1920x1080/filters:noupscale()/` {{< figure src="/images/web_controls/image-manager/image_manager_safari_default_filters.png" align="left" width="90%" alt="Image Manager Safari Web Control default filters" >}} #### Action settings components {{< figure src="/images/web_controls/image-manager/image_manager_entire_detailed_example.png" align="left" width="85%" alt="Image Manager Safari Web Control filters detailed example" >}} - `iq3h20n8qa.execute-api.us-east-1.amazonaws.com` is the AWS API Gateway endpoint - The filters are located at the **image** subdomain of your endpoint domain - The filters are presented as such: `/filters:quality(60)``/filters:progressive()/fit-in/1000x1080`/`filters:noupscale()`/ #### Filter results The processed images will have the following characteristics that correspond to specific filters and their values. {{< figure src="/images/web_controls/image-manager/image_manager_detailed_example_filter_string.png" align="left" width="85%" alt="Image Manager Safari Web Control filters string" >}} - Quality filter, `/filters:quality(60)`: Display at 60% of the quality of the original images with a smaller file size that corresponds to the amount of compression. - Progressive filter, `filters:progressive()`: JPEG and PNG images load immediately at a low resolution that progressively increases after they are converted to progressive formats - Resize filter, `fit-in/1920x1080`: Dimensions are 1920px by 1000px - No upscale filter, `/filters:noupscale()/`: Resized if the requested dimensions are smaller than those of the original images For general information about using Thumbor filters and detailed information about each filter, see [Getting Started](https://thumbor.readthedocs.io/en/latest/getting_started.html) and [Filters](https://thumbor.readthedocs.io/en/latest/filters.html#available-filters) for the [Thumbor documentation](https://thumbor.readthedocs.io/en/latest/index.html). ### Supported filters {{< term "image_manager" >}} supports a subset of the Thumbor filters and the custom Progressive filter. The default {{< term "image_manager" >}} filters are the most commonly used filters. For more information about the default filters, see [Filters](#filters). Most often, users change filter values and not the filters. For example, the default value of the Resize filter (`fit-in`) for the {{< term "image_manager" >}} Mobile Web Control specifies resizing images to 500 pixels by 500 pixels: `/fit-in/500x500`. You would indicate that you want images that are 450 pixels by 450 pixels by changing the filter to: `/fit-in/450x450`. **Filter Name** | **Syntax** -- | -- | Color fill | `/filters:fill(color)/` Convolution | /`filters:convolution(1;2;1;2;4;2;1;2;1,3,false)/` Equalize | `/filters:equalize()/` Format (jpeg, png, gif) | `/filters:format(jpeg)/` Grayscale | `/filters:grayscale()/` No upscale | `/filters:no_upscale()/` Image format `(heic, heif, jpeg, png, raw, tiff, webp)` | /`filters:format(image_format)` Progressive | `/filters:progressive()` Proportion | `/filters:proportion(0.0-1.0)/` Quality | /`filters:quality(0-100)/` Resize | `/fit-in/800x1000/` Crop | `/10x10:100x100/` RGB | `/filters:rgb(20,-20,40)/` Resize | `/fit-in/(image_ dimensions)` Rotate | `/filters:rotate(90)/` Sharpen | `/filters:sharpen(0.0-10.0, 0.0-2.0, true/false)/` Stretch | `/filters:stretch()/` Strip Exif | `/filters:strip_exif()/` Strip ICC | `/filters:strip_icc()/` Upscale | `/filters:upscale()` Watermark | `/filters:watermark(bucket,key,x,y,alpha[,w_ratio[,h_ratio]])` ## Further Reading - [Configuring CloudEDGE CDN Caching Policies](/docs/how-tos/CloudEDGE/cdn-controls/) - [Configuring and Flushing the Site Cache](/docs/how-tos/advanced/site-cache/) - [Creating Web Controls](/docs/how-tos/web-controls/webcontrols_create/) - [Managing Web Controls](/docs/how-tos/web-controls/webcontrols_manage/) --- # How to Create a Site Splice URL: https://docs.webscale.com/docs/how-tos/web-controls/site-splice/ Description: A walkthrough on how to create a Site Splice using a Web Control {{% include webcontrol.md %}} **Site Splice** allows you to build a website from multiple sources, such as microsites, multiple backends, canned content, and more. Use the **Use Alternate Backends** Web Control action to configure **Site Splice**, and to rewrite the source URL for SEO or other purposes. Some common use cases for using Site Splice include loading assets from an Amazon S3 bucket, or using [Webscale Image Manager](/docs/how-tos/web-controls/image-manager/). **Use Alternate Backend** is a final action. Final actions always run last; the order of execution of other actions is unspecified and not necessarily in the order displayed. {{% alert %}} {{% include dashboard-login.md %}} On the menu that appears, click **Edit**. {{% /alert %}} {{% alert color="info" title="Prerequisite" %}} Since you’re setting a Web Control, we recommend reading [How to Create Web Controls](/docs/how-tos/web-controls/webcontrols_create/) before following these steps. {{% /alert %}} ### Create the Use Alternate Backend action After you've created the **Condition** for which this Web Control action applies, click **+ Add action** to create an action for the new Web Control, which opens the Create Action dialog. To proceed, click **Select an Action**. {{< figure src="/images/web_controls/create_action.png" alt="Webscale Create Action dialog in the control panel" >}} A list of actions is now displayed. Select **Use Alternate Backends** to proceed. {{< figure src="/images/web_controls/use-alternate-backends.png" width="75%" alt="Webscale Create Action dialog in the control panel, showing the **Use Alternate Backends** configuration " >}} The configuration choices listed are: - **Cluster** - If you have any clusters defined for your application and wish to apply this web control for one of them, select the cluster here. - **Servers/Hostname**- To use an IP address, select **Servers** and enter the IP. To use a hostname or domain name, select **Hostname** and enter the domain name. - **Show URL Mapping** - Click **Show URL Mapping** to set this option. URL mapping allows you to change the request URL before a request is made to a backend server. Choices are: - **Remote URL** - Used to access backend servers. This URL may omit the scheme. If the scheme is set, then that scheme will be used to access the backend server regardless of the request scheme. When a hostname is provided in the URL, then it will be used instead of the request hostname. If a path is provided, the pathname requested from the backend server will be the path formed by joining the URL path and the request path. See the table below for examples. - **Relative To** - The path in the URL space of the application at which the resources obtained from the backend server are mapped. If the request url path does not begin with **Relative To** then the results may be unpredictable. The path mapping logically happens before any mapping performed by the **Remote URL** attribute. To sum up, anything added in the **Relative To** field will be removed from the URL when making the request to the alternate backend. See the table below for examples. {{% alert title="Note:" %}} Static files are cacheable, so if you're using Site Splice to load static assets don't forget to create a [Dynamic Site Cache](/docs/how-tos/advanced/site-cache/) rule to cover those assets. Use the **Remote URL** as the URL for the cache rule to match. {{% /alert %}} #### Remote URL Setting Examples Request URL | Remote URL | Effective URL ---------|----------|--------- `https://example.com/page` | — | `https://example.com/page` `https://example.com/page` | `/prefix` | `https://example.com/prefix/page` `https://example.com/page` | `//althost.com/` | `https://althost.com/page` `https://example.com/page` | `//althost.com/prefix` | `https://althost.com/prefix/page` `https://example.com/page` | `http://althost.com/prefix` | `https://althost.com/prefix/page` #### Relative To Setting Examples Request URL | Relative to | Effective path ---------|----------|--------- `/` | — | `/` `/base` | — | `/base` `/base` | `/base` | `/` `/base/page` | `/base` | `/page` {{% alert title="Note:"%}} If you're not sure what **Remote URL** to use or how to use the **Relative To** setting, please [contact support](mailto:support@webscalenetworks.com). {{% /alert %}} ## Further Reading - [Web Controls](/docs/how-tos/web-controls/) - [How to Block Countries from Accessing Your Site](/docs/how-tos/security/block-countries/) - [How to Configure and Flush the Site Cache](/docs/how-tos/advanced/site-cache/) - [How to Use a URL Map for Redirects](/docs/how-tos/web-controls/url-maps/) --- # Web Controls How-To Guides URL: https://docs.webscale.com/docs/how-tos/web-controls/ Description: Guides on using Web Controls {{% include webcontrol.md %}} You can also create sequences of these rules that can accomplish much more complex behavior, such as dynamic whitelisting or rate-limiting checkout attempts based on user behavior. --- # Explanation URL: https://docs.webscale.com/docs/agentic-commerce-os/ai-explanation/ --- # Support URL: https://docs.webscale.com/docs/reference/support/ Description: Reference for Webscale's support packages, service tiers and response commitments. Webscale support is sold in three tiers, independently of the hosting and infrastructure product tiers. - **Tier 1 — Essentials Support.** Standard single-ticket coverage. - **Tier 2 — Proactive Support.** Expanded response and engineering. - **Tier 3 — Strategic Support.** White-glove; high-availability (HA) available. ## Priority levels Incident commitments are defined by priority: - **P0 — Urgent.** Site down. - **P1 — High.** Degraded performance. - **P2 — Normal.** Non-emergency. - **P3 — Low.** Information or minor issue. See [Support Packages & Service Matrix](/docs/reference/support/support-packages/) for the full tier-by-tier matrix, the DevOps add-on, and the definitions. --- # Software URL: https://docs.webscale.com/docs/reference/software/ Description: Reference for Webscale's software products and Platform tiers. Webscale offers two software products. - **CloudEDGE Security** is the Webscale security product for customers running their applications elsewhere. It places Webscale's security layer in front of an application hosted outside Webscale. It does not include the platform's performance and delivery features such as auto-scaling, load balancing and site caching. - **Webscale Platform Software** is the full application delivery and security platform. It is sold in four tiers (Essentials, Advanced, Premier and Ultra) and is always paired with a Webscale hosting plan. These are separate products with separate buying motions. A customer hosted outside Webscale buys CloudEDGE Security. A customer hosting with Webscale buys a hosting plan paired with one of the four Platform tiers. There is no upgrade path between CloudEDGE Security and the Platform tiers; a customer moving hosting onto Webscale transitions to a hosting and Platform pairing. For pricing, commercial terms and the specific hosting and software pairings, see [webscale.com](https://www.webscale.com/). ## How to read this reference - In the comparison tables, **Included** means the feature is included and **Not included** means it is not. Numeric values indicate the included quantity per billing period. - All metered features such as data transfer, requests, image transforms and log storage are billed on a consumption basis above the included allowances. Specific rates are published on webscale.com. - Add-ons are optional purchases available with Platform tiers and are listed at the end of the comparison matrix. See [Software Products](/docs/reference/software/software-products/) for the full product reference, comparison matrix, per-tier detail and the features glossary. --- # Image Catalog URL: https://docs.webscale.com/docs/reference/images/ Description: Base VM and container images, with architectures and variants. > All images are released simultaneously with a version number like `YYYY.nn` (e.g., `2025.33`). > Every release publishes **all** images (even if no explicit changes). Base OS/components are not fully pinned, so most releases include upstream security/bug-fix updates. Older PHP lines (7.4, 8.1) may change less often. ## VM image families | Family | Architectures | Notes | |--- |--- |---| | `nfs-server` | amd64, arm64 | Storage-oriented NFS server base. | | `web-server` | amd64, arm64 | Host for running web workloads in a container | | `web-server-v4` | arm64 | Stack-based provisioner only. Host for running web workloads in a container | | `container-host` | amd64, arm64 | Minimal host for running containers | ## Container image families | Family | Variant / Base | Architectures | Notes | |--- |--- |--- |---| | `php-fpm` | 7.4 (alpine) | amd64 | EOL and unsupported upstream | | | 8.1 (alpine) | amd64 | Pinned upstream to Alpine Linux 3.21 | | | 8.2 (alpine) | amd64 | | | | 8.3 (alpine) | amd64 | | | | 8.4 (alpine) | amd64 | | | | 8.1 (debian) | amd64, arm64 | | | | 8.2 (debian) | amd64, arm64 | | | | 8.3 (debian) | amd64, arm64 | | | | 8.4 (debian) | amd64, arm64 | | | | 8.5 (debian) | arm64 | | | `rabbitmq` | latest | arm64 | | | `varnish` | 6.0LTS | arm64 | | ## Releases - [2026.40](/docs/reference/images/2026.40/) - [2026.39](/docs/reference/images/2026.39/) - [2026.38](/docs/reference/images/2026.38/) - [2026.37](/docs/reference/images/2026.37/) - [2026.36](/docs/reference/images/2026.36/) - [2026.35](/docs/reference/images/2026.35/) - [2026.34](/docs/reference/images/2026.34/) - [2026.33](/docs/reference/images/2026.33/) - [2026.32](/docs/reference/images/2026.32/) - [2026.31](/docs/reference/images/2026.31/) - [2026.30](/docs/reference/images/2026.30/) - [2026.29](/docs/reference/images/2026.29/) - [2026.28](/docs/reference/images/2026.28/) - [2026.27](/docs/reference/images/2026.27/) - [2026.26](/docs/reference/images/2026.26/) - [2026.25](/docs/reference/images/2026.25/) - [2026.24](/docs/reference/images/2026.24/) - [2026.23](/docs/reference/images/2026.23/) - [2026.22](/docs/reference/images/2026.22/) - [2026.21](/docs/reference/images/2026.21/) - [2026.20](/docs/reference/images/2026.20/) - [2026.19](/docs/reference/images/2026.19/) - [2026.18](/docs/reference/images/2026.18/) - [2026.17](/docs/reference/images/2026.17/) - [2026.16](/docs/reference/images/2026.16/) - [2026.15](/docs/reference/images/2026.15/) - [2026.13](/docs/reference/images/2026.13/) - [2026.11](/docs/reference/images/2026.11/) - [2026.10](/docs/reference/images/2026.10/) - [2026.9](/docs/reference/images/2026.9/) - [2026.8](/docs/reference/images/2026.8/) - [2026.7](/docs/reference/images/2026.7/) - [2026.6](/docs/reference/images/2026.6/) - [2026.5](/docs/reference/images/2026.5/) - [2026.4](/docs/reference/images/2026.4/) - [2026.3](/docs/reference/images/2026.3/) - [2026.2](/docs/reference/images/2026.2/) - [2025.44](/docs/reference/images/2025.44/) - [2025.41](/docs/reference/images/2025.41/) - [2025.38](/docs/reference/images/2025.38/) - [2025.36](/docs/reference/images/2025.36/) - [2025.34](/docs/reference/images/2025.34/) - [2025.33](/docs/reference/images/2025.33/) ## Registry Obtain container images from the public ECR registry path: ``` public.ecr.aws/webscale/php-fpm ``` (Authoritative tags are visible on the ECR Public Gallery.) ## PHP image tagging convention Tags encode **PHP version**, **base OS**, optional **architecture**, and the **release** number. _php_[-_var_][-_YYYY.nn_] - _php_: `7.4`, `8.1`, `8.2`, `8.3`, `8.4` - _var_: `deb` for amd64 Debian variant; `arm64` for arm64 Debian; Alpine omits this - _YYYY.nn_: release version (e.g., `2025.33`). Omit this to get latest release **Examples** ``` public.ecr.aws/webscale/php-fpm:8.4-deb-2025.33 public.ecr.aws/webscale/php-fpm:8.3-2025.33 public.ecr.aws/webscale/php-fpm:8.3-arm64-2025.33 ``` ## How to pull Anonymous pulls work from anywhere: ```bash docker pull public.ecr.aws/webscale/php-fpm: docker pull public.ecr.aws/webscale/php-fpm:8.4-deb-2025.33 ``` ### Optional authentication (to raise limits) Authentication isn’t required to pull public images, but logging in to ECR Public can raise rate/bandwidth limits. Use the AWS CLI (always authenticate to us-east-1 for ECR Public): ``` aws ecr-public get-login-password --region us-east-1 \ | docker login --username AWS --password-stdin public.ecr.aws ``` --- # Plans URL: https://docs.webscale.com/docs/reference/plans/ Description: Webscale Plans --- # Web Controls URL: https://docs.webscale.com/docs/reference/web-controls/ Description: Web controls allow you to manage traffic by defining conditions and the specific actions to perform when those conditions are met. --- # Introducing Application Shielding URL: https://docs.webscale.com/docs/reference/app-shield/ Description: An introduction to Webscale Application Shielding ## Overview **Application Shielding** is an opt-in product feature for all Webscale customers that allows a controlled isolation of the application servers in a customer's cloud account from Internet traffic. We developed this feature in response to requests from a handful of Webscale customers who wanted to configure their application servers so that all traffic reaching their application is from the Webscale proxy servers. **Application Shielding** makes it possible to eliminate direct HTTP/HTTPS traffic to the application servers from the Internet unless they are explicitly allowed by firewall settings or whitelists. It forces all other traffic to be routed through the Webscale proxies, better insulating the application from malicious attacks. ## Background Webscale's application shielding implementation utilizes the underlying cloud provider capabilities to filter the traffic hitting the application servers. It is a fully integrated solution that assimilates the differences in cloud providers. It presents a simple, unified control to end-users that makes it easier for them to enable this extra layer of protection for their servers. While we intend the control of this feature to be simple, we expect any user attempting to enable or disable **Application Shielding** for their applications to have a basic understanding of networking and firewall concepts. This feature is currently only supported for the AWS and the Google Cloud providers, so to make use of this security feature, the application servers must be hosted in one of those two cloud provider accounts. Using _server blueprints_, the Webscale **Application Shield** leverages Google Cloud firewalls or AWS security groups, depending on the cloud provider you use. {{% alert title="Firewalls and Security Groups" %}} Firewalls in Google Cloud and security groups in AWS are fundamental networking resources in the cloud provider account that make the **Application Shielding** feature possible. Both firewalls and security groups provide a way for users to configure and control access to their application servers. {{% /alert %}} #### Application Server Blueprints Webscale orchestrates any auto-scaling of application servers as dictated by the demands placed on the application by Internet traffic. A fundamental aspect of this auto-scaling is what we refer to as _server blueprints_. Server blueprints allow a Webscale customer to specify the precise configuration used to create additional application servers when needed. Prior to the release of the **Application Shielding** feature, server blueprints allowed users to specify only the server image (operating system and software), server placement (cloud provider region/zone), and the instance type (machine capabilities). This feature release enhances these capabilities to include additional cloud provider resources in the server blueprints, including things like network/VPC, subnet for both Google Cloud and AWS, network tags (Google Cloud only), and security groups (AWS only). These new features make it possible for a user to create server blueprints with networking attributes that allow access control to any servers created by the Webscale auto-scaling solution. #### AWS Security Groups AWS security groups allow users to create a set of ingress and egress rules to control traffic to servers that are associated with the security group. Security groups determine how traffic flows to and from servers in the network and all subnets of the network. Each AWS VPC (network) is associated with a security group. For more about AWS security groups, please see the [AWS Security Group Rules Reference guide](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html). The **Application Shielding** feature manipulates the ingress rules on a user identified security group by adding/removing IP addresses or address blocks to put access rules into effect. Any rules added by the Webscale Application Shield to this security group are annotated with a specific description string: `webscale-app-shielding-`, where `n` is an integer that grows with every new rule added by the system. When **Application Shielding** is disabled, all the ingress rules with such a description are removed by the system automatically. {{% alert title="Things to note:" %}} 1. The security group that you configure for use with **Application Shielding** must already exist in the cloud provider account and the Webscale **Application Shield** must have access to modify the rules in the group. 2. It is the responsibility of the user to make sure that the security group rules actually impact traffic to the application servers. To do this, ensure that you create the server blueprints as [described above](#aws-security-groups). 3. Any rules that exist in the security group that include the description substring `webscale-app-shielding-` are subject to deletion by the Webscale product. Therefore, rules that you don't want to be edited by the Webscale **Application Shield** must not include such a description. {{% /alert %}} #### Google Cloud Firewalls Google Cloud firewalls provide the capability of allowing/restricting access to the application servers hosted in the Google Cloud account. Google Cloud firewalls are always associated with a network, and the firewall specification allows a user to specify which servers in the network are covered by the firewall rules. Accomplish this by setting a _target_ property on the firewall. One way to specify these targets is by the creation of network tags (arbitrary strings). When servers in the network are created with the same tags, the firewall rules apply to them. For more about Google Cloud Firewalls, please see the [Google Cloud Firewall rules overview](https://cloud.google.com/vpc/docs/firewalls). The **Application Shielding** feature requires that a firewall is identified and selected by the user to shield application servers running in the Google Cloud infrastructure. The user must set the priority of this designated firewall lower than any other firewalls that are applied independently of **Application Shielding**. Webscale **Application Shielding** manipulates the specific firewall identified for **Application Shielding** and updates the rules as needed. {{% alert title="Things to note:" %}} 1. For **Application Shielding** to work as expected, the user must not manually edit the firewall designated for **Application Shielding**. Any changes are liable to be overwritten by the **Application Shield**. 2. The user has the responsibility to ensure the firewall defines its targets appropriately, so the application servers to be protected are indeed covered by the rules in the firewall. {{% /alert %}} ## Further reading - [Configuring Application Shielding](/docs/how-tos/general/shielding/) - [Web Controls](/docs/how-tos/web-controls/) - [How to Block Countries from Accessing Your Site](/docs/how-tos/security/block-countries/) - [Editing the Allowlist](/docs/how-tos/security/whitelist/) - [Editing the Blocklist](/docs/how-tos/security/blacklist/) --- # Webscale Shared Responsibility Security and Operational Model URL: https://docs.webscale.com/docs/reference/shared-responsibilities/magento/ Description: A reference for Webscale Shared Responsibility Security and Operational Model The Webscale Managed Platform follows a shared responsibility model. This structure ensures that while Webscale manages the underlying infrastructure, security, and performance at the platform layer, the Merchant and their Systems Integrator (SI) retain control over the application code, custom logic, and business configurations. --- ## **1\. Executive Summary & Strategic Recommendations** **Summary:** This section outlines the overarching goal of the shared model: maximizing uptime and security by clearly defining boundaries. Webscale handles the "plumbing" (Infrastructure/PaaS), while the Merchant/SI handles the "storefront" (Application/Code). **Strategic Recommendations:** * **Patching:** Establish a 48-hour window for applying "Critical" application patches released by the software vendor (Magento/Shopware). * **Automation:** Utilize Webscale’s Predictive Auto-scaling to handle traffic surges rather than relying on manual intervention. * **Security:** Leverage Webscale CloudEdge for "Edge-side" security (WAAP) to stop threats before they hit the origin server. --- ## **2\. Security RACI** **Summary:** Security is a multi-layered approach. Webscale secures the perimeter and the operating system, while the Merchant is responsible for securing the data and the application-level access points. | Security | | | | :---- | ----- | :---: | | Task/Responsibility (from security.xlsx) | Webscale (inferred RACI) | Webscale (with Infra) | | Applying infrastructure patches | C,I | R | | Applying patches to supporting services (e.g., Nginx or MySQL) | R | R | | Defining origin WAF rules | R | R | | Defining CDN WAF rules | A | R | | Deploying platform WAF rules | R | R | | Deploying CDN WAF rules | A | R | | Fixing core bugs in cloud infrastructure code | C | N/A | | Releasing cloud infrastructure patches | C | N/A | | Scaling (compute and storage) | R | R | | Scaling (PaaS and grid) | R | R | | Ensuring access to source code | R,C | R,C (This is tied to the customer's repo) | | Installing Webscale cloud infrastructure CLI tool | I | N/A | | Adding cloud infrastructure configuration files to repository | I | N/A | | Creating a project for the merchant (onboarding UI) | R | R | | Connecting repositories to cloud infrastructure | R | R | | Configuring the source repository | R | R | | Creating a user for the release manager (onboarding UI) | R | R | | Deploying code into production | I | R,I | | Deploying code into staging | I | R,I | | Remediating cloud infrastructure PCI scans | C,I | R | | Remediating PaaS PCI scans | R | R | | Managing OS and platform secrets | R | R | | Managing cloud infrastructure encryption keys | R | R | | Scanning customized cloud infrastructure instances | R | R | | Managing support access controls (Teleport) | R | R | | Controlling merchant support and access | R | R | | Annual testing DR plan and backup and restore | R | R | | Annual testing and documentation of disaster recovery plan | R | R | ## **3\. Coding and Development** **Summary:** This section defines the ownership of the code lifecycle. Webscale provides the environment, but the integrity, quality, and security of the code residing in that environment are the responsibility of the developer. | Coding and Development | | | | :---- | ----- | :---: | | Task/Responsibility | Webscale (inferred RACI) | Webscale (with Infra) | | 1\. Publishing updates and patches to core | I | R (This only applies to Webscale systems, not the customer's Magento application) | | 2\. Availability and patching of the file system | R | R | | 3\. Publishing updates and patches to ECE-Tools | I | I | | 4\. Core Application Quality | I | R (This only applies to Webscale systems, not the customer's Magento application) | | 5\. Availability of repo.magento.com | I | C | | 6\. Availability of Cloud Git server | I | C | | 7\. Other merchant-selected Code repositories | I | C,I | | 8\. Making Cloud Docker containers available for download | R | R | | 9\. Deployment and setup of Cloud Docker (optional) | I | I | | 10\. Any other local development setup | I | I | | 11\. Ongoing quality and updating of ECE Tools | I | I | | 12\. Installing the latest ECE Tools version | I | I | | 13\. Custom Magento modules and code | I | I | | 14\. Extensions | I | I | | 15\. Custom Integrations | I | I | | 16\. Configuration of build and static content deployment | I | I | | 17\. Building and executing deployment governance process | I | I | | 18\. Deploying to Staging environment | I | C,I | | 19\. Deploying to Production environment | I | C,I | | 20\. Production rollbacks | R,I | R,I | | 21\. Synchronizing data between environments | R | R | | 22\. Installing updates and patches to ECE-Tools | I | I | | 23\. Installing updates and patches to Magento core | I | I | | 24\. Customized Magento application and associated websites | I | I | | 25\. Core Application tuning and optimization | I | I | | 26\. Custom code tuning and optimization | I | I | | 27\. Custom code | I | N/A | | 28\. Load Testing | R,I | R,I (If purchased with us or they have their own) | | 29\. Performance testing | I | R,I (If purchased with us or they have their own) | | 30\. Rotating Logs | R | R | | 31\. Custom application | I | N/A | | 32\. Availability of New Relic services | A | C,I (Customer has their own New Relic) | | 33\. Setting up New Relic Alerts | R,I | R,I (We will only set up the access keys; the customer will need to set up the alerts) | | 34\. Deploying New Relic agent on PaaS Servers | R | R | | 35\. Debugging and issue isolation | R | R | | 36\. Timely support of debugging and issue isolation process | R | R | ## **4\. Application and Service Configuration** **Summary:** While Webscale ensures the availability of services like PHP, Redis, MySQL, RabbitMQ, and OpenSearch, the specific configuration and usage of these services to meet business logic requirements are controlled by the SI. | Application and Service Configuration | | | | :---- | ----- | :---: | | Task/Responsibility | Webscale (inferred RACI) | Webscale (with Infra) | | 1\. Application configuration | R,I | R,I (Webscale \- Adding the Domain in the control panel | Settings on Magento has to be done by the customer) | | 2\. Adding domains to the application (Base URLs) | R,I | R,I (Webscale \- Adding the Domain in the control panel | Settings on Magento has to be done by the customer) | | 3\. Configuring PaaS to use supported Service versions (PHP, Redis) | R | R | | 4\. Availability of default cron jobs | R | R,C (Customers cannot add their own cron jobs) | | 5\. Ongoing quality of custom cron jobs | R | C,I (This is important as customer-provided crons can and have caused issues by not completing in time or consuming too many resources) | | 6\. Availability of RabbitMQ service | R | R | | 7\. Configuration of default RabbitMQ settings | R | R | | 8\. Ongoing quality and patching of RabbitMQ | R | R | | 9\. Submit a service request to install a compatible RabbitMQ version | A | C,R (If a customer requires it we install it.) | | 10\. Availability of PHP | R | R | | 11\. Configuration of default PHP settings | R | R | | 12\. Configuration of custom PHP settings | R | R | | 13\. Configuration of YAML file to align PHP versions | R,I | N/A | | 14\. Availability of Galera and MariaDB services | R | R (We also support MySQL) | | 15\. Ongoing maintenance of default database settings | R | R | | 16\. Ongoing maintenance of merchant data and modified settings | I | C | | 17\. Configuration of Galera and MySQL | R | R | | 18\. Ongoing quality and patching of Galera and MariaDB | R | R | | 19\. Ongoing infrastructure optimization | R | R | | 20\. Identifying and fixing slow queries | C,I | C,I (Non-service-impacting issues remain the customer's responsibility) | | 20a\. Identifying and fixing problematic queries | | R,C (Only for service-impacting issues) | | 21\. Submit a service request to install a compatible MariaDB version | A | C,R (If a customer requires it we install it.) | | 22\. Setting and maintaining merchant-specific data retention policies | I | C | | 23\. Availability and Quality of CDN | R | R | | 24\. Fastly service configuration (via Extension / API) | R,I | I | | 25\. Fastly Extension Quality | I | I | | 26\. Fastly Integration VCL Snippets Quality | R,I | I | | 27\. Page Cache optimization | R | R | | 28\. Adding domains to services, to CDN, and to infrastructure | R | R | | 29\. Custom VCL Snippets | R,I | I | | 30\. WAF & WAF Rules | A | R,C (Customer has the ability to manage as well) | | 31\. Availability of Redis service | R | R | | 32\. Configuration of default Redis settings | R | R | | 33\. Ongoing quality and patching of Redis | R | R | | 34\. Submit a service request to install a compatible Redis version | A | C,R (If a customer requires it we install it.) | | 35\. Availability of Elasticsearch | R | R | | 36\. Configuration of default Elasticsearch settings | R | R | | 37\. Submit a service request to install a compatible Elasticsearch version | A | C,R (If a customer requires it we install it.) | | 38\. Availability of SendGrid email service and its integration | R | R | | 39\. Monitor merchant’s SendGrid usage against limits | R | R | | 40\. Merchant responsible for using the service for transactional emails only | R | R | | 41\. Configuring optional third-party email services | I | I | | 42\. Availability and quality of third party services | I | I | ## **5\. Commerce Services Extensions** **Summary:** Webscale allows for best-of-breed integrations. The responsibility for selecting, integrating, and maintaining these third-party services lies with the Merchant. | Commerce Services Extensions | | | | :---- | ----- | :---- | | Task/Responsibility | Webscale (inferred RACI) | Webscale (with Infra) | | 1\. Availability of the Advanced Reporting Service | I | I (If customer has their own advanced reporting services we will work with them) | | 2\. Configuration of Advanced Reporting complies with Terms & Conditions | I | I (If customer has their own advanced reporting services we will work with them) | | 3\. Availability of Business Intelligence (MBI) services | I | I (If customer has their own advanced reporting services we will work with them) | | 4\. MBI Data Synchronization processes | I | I (If customer has their own advanced reporting services we will work with them) | | 5\. Detecting MBI synchronization issues | I | I (If customer has their own advanced reporting services we will work with them) | | 6\. Configuring MBI Data Synchronization (for various platforms) | I | I (If customer has their own advanced reporting services we will work with them) | | 7\. Availability of Product Recommendations service | I | I (If customer has their own advanced reporting services we will work with them) | ## **6\. Network Services** **Summary:** Focuses on the "Edge" of the network. Webscale manages the delivery and acceleration of content, while the Merchant manages the content itself and the domains. | Network Services | | | | :---- | :---: | ----- | | Task/Responsibility | Webscale (inferred RACI) | Webscale (with Infra) | | 1\. Availability and Quality of Image Optimization | R | R | | 2\. Configuration of Image Optimization | R | R | | 3\. SSL Dedicated Certificate \- expiration | R | R,I (If customer supplies SSL) | | 4\. Provisioning SSL Certificates | R | R,I (If customer supplies SSL) | | 5\. Purchasing and Maintaining EV/Specific SSL cert and provide to Adobe | R,I | R,I (If customer supplies SSL) | | 6\. Availability & Configuration of WAF | A | R | | 7\. Addressing WAF Rule False Positives | R | R,C (Customer Needs to validate) | | 8\. Reporting WAF Rule False Positives | I | C | | 9\. WAF Rule Tuning | R | R,C (Customer Needs to validate) | | 10\. WAF/CDN Logs | R | R,C (Customer Needs to validate) | | 11\. Proactive IP Blocking | R | R | | 12\. Bot Protection | R | R,I (If customer purchases bot manager) | | 13\. DDoS detection \- layer 3-4 | R | R | | 14\. DDoS detection \- layer 7 | A | R | | 15\. DDoS response | A | R | | 16\. Configuring and maintaining PrivateLink connections (Adobe-owned VPC) | R,I | R,I (If customer has own VPC and or Peering) | | 17\. Configuring and maintaining PrivateLink connections (Merchant-owned VPC) | R,I | R,I (If customer has own VPC and or Peering) | | 18\. Availability of SSH (Non-PrivateLink) | R | R,I (If customer has own VPC and or Peering) | | 19\. Configuration of PrivateLink Inbound to Cloud Service endpoint | R,I | R,I (If customer has own VPC and or Peering) | | 20\. Acceptance of PrivateLink Inbound to Cloud Service endpoint | R,I | R,I (If customer has own VPC and or Peering) | | 21\. Configuration of PrivateLink Inbound to Merchant’s VPC Service endpoint | R,I | R,I (If customer has own VPC and or Peering) | | 22\. Acceptance of PrivateLink Inbound to Merchant’s VPC Service endpoint | R,I | R,I (If customer has own VPC and or Peering) | | 23\. Configuration of PrivateLink integrations (endpoint to account) | R,I | R,I (If customer has own VPC and or Peering) | | 24\. Configuration of merchant-owned VPC for PrivateLink endpoint | R,I | R,I (If customer has own VPC and or Peering) | ## **7\. System and Infrastructure** **Summary:** This is the core of the Webscale value proposition. We ensure the servers are up, scaled, and backed up based on standard lifecycle policies. | System and infrastructure | | | | :---- | :---: | :---: | | Task/Responsibility | Webscale (inferred RACI) | Webscale (with Infra) | | 1\. Availability of Nginx | A | R | | 2\. Configuration of Nginx | R | R | | 3\. Ongoing quality and patching of Nginx | A | R | | 4\. Availability of Operating System | A | R | | 5\. Ongoing quality and patching of Operating System | A | R | | 6\. Availability of snapshot and backup process | A | R | | 7\. Scheduling backups for Pro Staging and Production | R | R | | 8\. Scheduling backups for Starter and Pro Integration environments | R | R | | 9\. Availability of HA / Failover | A | R | | 10\. Availability of CPU resources, data center, disk space | A | R | | 11\. Availability and execution of surge capacity or emergency upsizing | A | R | | 12\. Requesting surge capacity | C,I | C,I | | 13\. Monitoring vCPU usage against the limits | R | R | --- # Webscale Shared Responsibility Security and Operational Model - Shopware URL: https://docs.webscale.com/docs/reference/shared-responsibilites/shopware/ Description: A reference for Webscale Shared Responsibility Security and Operational Model for Shopware **Last Update: March 4, 2026** The Webscale Managed Platform for Shopware is a platform-as-a-service (PaaS) designed to support the unique architecture of Shopware 6\. This model ensures that while Webscale handles the high-performance infrastructure and Symfony-optimized environment, the Merchant and Systems Integrator (SI) manage the application logic and customer experience. --- ## **1\. Executive Summary & Strategic Recommendations** **Summary:** For Shopware merchants, the shared model focuses on the stability of the Symfony framework and the performance of the Shopware Storefront/Admin. Webscale manages the underlying stack (Linux/PHP/MySQL), while the Merchant/SI manages the Shopware core and third-party extensions. **Strategic Recommendations:** * **Version Management:** Ensure the SI proactively manages Shopware 6 "Minor" and "Patch" releases to maintain compatibility with the Webscale environment. * **Performance:** Utilize Webscale's optimized Redis configuration for Shopware’s high-frequency caching requirements. * **Extension Security:** Audit all Shopware "Apps" and "Plugins" regularly, as these are the most common vectors for application-level vulnerabilities. --- ## **2\. Security RACI (Shopware)** **Summary:** Webscale protects the "container" and the "perimeter" (WAF/DDoS), while the Merchant secures the "content" and "code" within Shopware. | Security | | | | | :---- | :---- | ----- | :---- | | Task/Responsibility | Shopware (RACI) | Webscale (inferred RACI) | Webscale (with Infra) | | Applying Shopware patches on cloud infrastructure | C | C,I | R | | Applying patches to supporting services (e.g., Nginx or MySQL.) | R | R | R | | Defining origin WAF rules | R | R | R | | Defining CDN WAF rules | A | A | R | | Deploying platform WAF rules | R | R | R | | Deploying CDN WAF rules | A | A | R | | Fixing core bugs in Shopware on cloud infrastructure code | R | C | N/A | | Releasing Shopware on cloud infrastructure patches | R | C | N/A | | Scaling (compute and storage) | R | R | R | | Scaling (PaaS and grid) | R | R | R | | Ensuring access to source code | R | R,C | R,C (This is tied to the customer's repo) | | Installing Shopware on cloud infrastructure CLI tool | R | I | N/A | | Adding Shopware on cloud infrastructure configuration files to repository | C | I | N/A | | Creating a project for the merchant (onboarding UI) | R | R | R | | Connecting repositories to Shopware on cloud infrastructure | R | R | R | | Configuring the source repository | R | R | R | | Creating a user for the release manager (onboarding UI) | R | R | R | | Deploying code into production | R | I | R,I | | Deploying code into staging | R | I | R,I | | Remediating Shopware on cloud infrastructure PCI scans | R | C,I | R | | Remediating PaaS PCI scans | R | R | R | | Managing OS and platform secrets | R | R | R | | Managing Shopware on cloud infrastructure encryption keys | R | R | R | | Scanning customized Shopware on cloud infrastructure instances | R | R | R | | Managing support access controls (Teleport) | R | R | R | | Controlling merchant support and access | R | R | R | | Annual testing and documentation of Shopware DR plan and backup and restore | R | R | R | | Annual testing and documentation of disaster recovery plan | R | R | R | --- ## **3\. Coding and Development (Symfony/Shopware)** **Summary:** Ownership of the Shopware codebase. Webscale provides the platform for deployment, but the SI is responsible for the performance and stability of custom Twig templates and Symfony controllers. | Coding and Development | | | | | :---- | :---- | ----- | :---- | | Task/Responsibility | Shopware (RACI) | Webscale (inferred RACI) | Webscale (with Infra) | | 1\. Publishing updates and patches to Shopware | RA | I | R (This only applies to Webscale systems not the customers Shopware application) | | 2\. Availability and patching of the file system | RP | R | R | | 4\. Core Shopware Application Quality | RA | I | R (This only applies to Webscale systems not the customers Shopware application) | | 6\. Availability of Shopware on Cloud Git server | RO | not responsible | not responsible | | 7\. Other merchant-selected Code repositories | R | I | C,I | | 8\. Making Cloud Docker containers available for download | R | R | R | | 9\. Deployment and setup of Cloud Docker (optional) | RA | I | I | | 10\. Any other local development setup | RO | I | I | | 13\. Custom Shopware modules and code | RE | I | I | | 14\. Extensions | RC | I | I | | 15\. Webscale Extension | CI | RA | RA | | 15\. Custom Integrations | R | I | I | | 16\. Configuration of build and static content deployment | RC | I | I | | 17\. Building and executing deployment governance process | RB | I | I | | 18\. Deploying to Staging environment | RD | I | C,I | | 19\. Deploying to Production environment | RD | I | C,I | | 20\. Production rollbacks | R | R,I | R,I | | 21\. Synchronizing data between environments | I | R | R | | 23\. Installing updates and patches to Shopware core (Major Version Upgrade) | RC | CI | CI | | 24\. Customized Shopware application and associated websites | RC | I | I | | 25\. Core Application tuning and optimization | RC | I | R? (Need to find the team that does this type of work. Currently, support does not touch code) | | 26\. Custom code tuning and optimization | RC | I | R? (Need to find the team that does this type of work. Currently, support does not touch code) | | 27\. Custom Shopware code | RL | I | N/A | | 28\. Load Testing | RT | R,I | R,I (If purchased with us or they have their own) | | 29\. Performance testing | RP | I | R,I (If purchased with us or they have their own) | | 30\. Rotating Logs | R | R | R | | 31\. Custom Shopware application | RA | I | N/A | | 32\. Availability of New Relic services | RA | A | C,I (Customer has their own New Relic) | | 33\. Setting up New Relic Alerts | RS | R,I | R,I (We will only set up the access keys; customer will need to set up the alerts) | | 34\. Deploying New Relic agent on PaaS Servers | RD | R | R | | 35\. Debugging and issue isolation | RR | R | R | | 36\. Timely support of debugging and issue isolation process | R | R | R | --- ## **4\. Application and Service Configuration** **Summary:** Webscale ensures the availability of the Shopware "sidecars" (Redis, MySQL, RabbitMQ), while the SI configures how Shopware interacts with them. | Application and Service Configuration | | | | | :---- | :---- | ----- | :---- | | Task/Responsibility | Shopware (RACI) | Webscale (inferred RACI) | Webscale (with Infra) | | 1\. Application configuration | R | R,I | R,I (Webscale \- Adding the Domain in the control panel | Settings on Shopware has to be done by the customer) | | 2\. Adding domains to the Shopware application | R | R,I | R,I (Webscale \- Adding the Domain in the control panel | Settings on Shopware has to be done by the customer) | | 3\. Configuring PaaS to use supported Service versions (PHP, Redis) | RA | R | R | | 4\. Availability of default cron jobs | R | R | R,C (Customers cannot add their own Cron Jobs) | | 5\. Ongoing quality of custom cron jobs | RA | R | C, I (This is important as customer-provided crons can and have caused issues by not completing in time or consuming too many resources) | | 6\. Availability of RabbitMQ service | R | R | R | | 7\. Configuration of default RabbitMQ settings | R | R | R | | 8\. Ongoing quality and patching of RabbitMQ | R | R | R | | 9\. Submit a service request to install a compatible RabbitMQ version | RA | A | C,R (If customer requires it we install it.) | | 10\. Availability of PHP | R | R | R | | 11\. Configuration of default PHP settings | R | R | R | | 12\. Configuration of custom PHP settings | R | R | R | | 14\. Availability of MariaDB services | R | R | R (We also support MySQL) | | 15\. Ongoing maintenance of default database settings | R | R | R | | 16\. Ongoing maintenance of merchant data and modified settings | R | I | C | | 17\. Configuration of MySQL | R | R | R | | 18\. Ongoing quality and patching of MySQL/MariaDB | R | R | R | | 19\. Ongoing infrastructure optimization | R | R | R | | 20\. Identifying and fixing slow queries | R | C,I | C,I (Non-service-impacting issues remain the customer's responsibility) | | 20 a. Identifying and fixing problematic queries | | | R,C (Only for Service impacting issues) | | 21\. Submit a service request to install a compatible MariaDB version | R | A | C,R (If customer requires it we install it.) | | 22\. Setting and maintaining merchant-specific data retention policies | RA | I | C | | 23\. Availability and Quality of CDN | R | R | R | | 24\. Fastly service configuration (via Extension / API) | R | CI | CI | | 25\. Fastly Extension Quality | R | I | I | | 26\. Fastly Integration VCL Snippets Quality | R | CI | CI | | 27\. Page Cache optimization | R | RC | RC | | 28\. Adding domains to services, to CDN, and to infrastructure | R | R | R | | 29\. Custom VCL Snippets | R | R,I | R,I | | 30\. WAF & WAF Rules | RA | A | R,C (Customer has the ability to manage as well) | | 31\. Availability of Redis service | R | R | R | | 32\. Configuration of default Redis settings | R | R | R | | 33\. Ongoing quality and patching of Redis | R | R | R | | 34\. Submit a service request to install a compatible Redis version | RA | A | C,R (If customer requires it we install it.) | | 35\. Availability of ElasticSearch | R | R | R | | 36\. Configuration of default ElasticSearch settings | R | R | R | | 37\. Submit a service request to install a compatible ElasticSearch version | RA | A | C,R (If customer requires it we install it.) | | 38\. Availability of SendGrid email service and its integration | R | R | R | | 39\. Monitor merchant’s SendGrid usage against limits | R | R | R | | 40\. Merchant responsible for using the service for transactional emails only | R | R | R | | 41\. Configuring optional third-party email services | RA | I | I | | 42\. Availability and quality of third party services | R | I | I | --- ## **5\. Shopware Services & Extensions** **Summary:** Shopware often utilizes external SaaS services. The Merchant is responsible for the commercial relationship and the integration logic for these external tools. | Commerce Services Extensions | | | | | :---- | :---- | ----- | :---- | | Task/Responsibility | Shopware (RACI) | Webscale (inferred RACI) | Webscale (with Infra) | | 1\. Availability of the Advanced Reporting Service | R | I | I (If customer has their own advanced reporting services we will work with them) | | 2\. Configuration of Advanced Reporting complies with Terms & Conditions | RA | I | I (If customer has their own advanced reporting services we will work with them) | | 3\. Availability of Shopware Business Intelligence (MBI) services | R | I | I (If customer has their own advanced reporting services we will work with them) | | 4\. MBI Data Synchronization processes | R | I | I (If customer has their own advanced reporting services we will work with them) | | 5\. Detecting MBI synchronization issues | R | I | I (If customer has their own advanced reporting services we will work with them) | | 6\. Configuring MBI Data Synchronization (for various platforms) | R | I | I (If customer has their own advanced reporting services we will work with them) | | 7\. Configuring MBI Data Synchronization to Shopware Cloud Pro | RA | I | I (If customer has their own advanced reporting services we will work with them) | | 8\. Availability of Product Recommendations service | R | I | I (If customer has their own advanced reporting services we will work with them) | --- ## **6\. Network Services** **Summary:** Managing the flow of traffic to the Shopware store. Webscale manages the acceleration and security at the edge. | Network Services | | | | | :---- | :---- | ----- | :---- | | Task/Responsibility | Shopware (RACI) | Webscale (inferred RACI) | Webscale (with Infra) | | 1\. Availability and Quality of Image Optimization | R | R | R | | 2\. Configuration of Image Optimization | R | R | R | | 3\. SSL Dedicated Certificate \- expiration | R | R | R,I (If customer supplies SSL) | | 4\. Provisioning SSL Certificates | R | R | R,I (If customer supplies SSL) | | 5\. Purchasing and Maintaining EV/Specific SSL cert and provide to Shopware | RA | R,I | R,I (If customer supplies SSL) | | 6\. Availability & Configuration of WAF | R | A | R | | 7\. Addressing WAF Rule False Positives | R | R | R,C (Customer Needs to validate) | | 8\. Reporting WAF Rule False Positives | R | I | C | | 9\. WAF Rule Tuning | NOT SUPPORTED | R | R,C (Customer Needs to validate) | | 10\. WAF/CDN Logs | R | R | R,C (Customer Needs to validate) | | 11\. Proactive IP Blocking | R | R | R | | 12\. Bot Protection | R | R | R,I (If customer purchases bot manager) | | 13\. DDOS detection \- layer 3-4 | R | R | R | | 14\. DDOS detection \- layer 7 | R | A | R | | 15\. DDOS response | R | A | R | | 16\. Configuring and maintaining PrivateLink connections (Shopware-owned VPC) | R | R,I | R,I (If customer has own VPC and or Peering) | | 17\. Configuring and maintaining PrivateLink connections (Merchant-owned VPC) | RA | R,I | R,I (If customer has own VPC and or Peering) | | 18\. Availability of SSH (Non-Private Link) | R | R | R,I (If customer has own VPC and or Peering) | | 19\. Configuration of PrivateLink Inbound to Shopware Cloud Service endpoint | R | R,I | R,I (If customer has own VPC and or Peering) | | 20\. Acceptance of PrivateLink Inbound to Shopware Cloud Service endpoint | R | R,I | R,I (If customer has own VPC and or Peering) | | 21\. Configuration of PrivateLink Inbound to Merchant’s VPC Service endpoint | R | R,I | R,I (If customer has own VPC and or Peering) | | 22\. Acceptance of PrivateLink Inbound to Merchant’s VPC Service endpoint | R | R,I | R,I (If customer has own VPC and or Peering) | | 23\. Configuration of PrivateLink integrations (endpoint to account) | R | R,I | R,I (If customer has own VPC and or Peering) | | 24\. Configuration of merchant-owned VPC for PrivateLink endpoint | R | R,I | R,I (If customer has own VPC and or Peering) | --- ## **7\. System and Infrastructure** **Summary:** The foundational layer. Webscale guarantees that the resources required to run Shopware are available, redundant, and scalable. | System and infrastructure | | | | | :---- | :---- | :---- | :---- | | Task/Responsibility | Shopware (RACI) | Webscale (inferred RACI) | Webscale (with Infra) | | 1\. Availability of Nginx | R | A | R | | 2\. Configuration of Nginx | R | R | R | | 3\. Ongoing quality and patching of Nginx | R | A | R | | 4\. Availability of Operating System | R | A | R | | 5\. Ongoing quality and patching of Operating System | R | A | R | | 6\. Availability of snapshot and backup process | R | A | R | | 7\. Scheduling backups for Pro Staging and Production | R | R | R | | 8\. Scheduling backups for Starter and Pro Integration environments | RA | R | R | | 9\. Availability of HA / Failover | R | A | R | | 10\. Availability of CPU resources, data center, disk space | R | A | R | | 11\. Availability and execution of surge capacity or emergency upsizing | R | A | R | | 12\. Requesting surge capacity | R | C,I | C,I | | 13\. Monitoring vCPU usage against the limits | R | R | R | --- # Shutdown hooks URL: https://docs.webscale.com/docs/reference/shutdown-hooks/ Description: Controlling container shutdown with custom scripts This page describes how to configure and use Webscale’s shutdown hook mechanism so your application servers can finish in-flight work cleanly before they are destroyed. The goal: when Webscale needs to terminate a server (scale in, rolling deploy, or manual destroy), your application gets a clear signal, some time to react, and the platform waits (up to a limit) before terminating the server. Scope: This applies to managed or unmanaged clusters running a `web-server` image of version 2025.44 or later. ### High-level behavior When a server is selected for termination: 1. Webscale initiates termination of the server instance through its cloud provider. 2. A systemd shutdown unit on the host runs the Webscale container shutdown handler. 3. The handler iterates over all running application containers on that host. 4. For each container: * It runs /hooks/shutdown inside the container if that file exists and is executable. * It waits for the hook to exit, subject to a time out of 10 minutes for all hooks. 5. Once all hooks have completed or timed out, the platform proceeds with normal shutdown and destroys the server. The actions performed by the shutdown hook are entirely determined by the application containers that are run on the `web-server` container host as determined by the "bootstrap" configuration. Important: > The shutdown hook is triggered when the server is actually being destroyed, > not when a deployment becomes “old” or is no longer receiving primary traffic. > Old deployments may still perform work until their destruction is requested. > If it is necessary to begin the shutdown for deployments in managed clusters > as soon as they are no longer needed, a destroy delay of 0 must used. ### What the shutdown hook is for Use the hook to: - Stop accepting new work. - Let in-flight requests complete. - Drain queues / background jobs. - Persist state that would otherwise be lost. - Emit final logs / metrics for the node. Do not use the hook to: - Keep the server alive indefinitely. - Perform long-running maintenance that should be done elsewhere. - Start new long-lived background jobs. If all hooks do not finish within 10 minutes, Webscale will continue shutdown anyway and the instance will be terminated. The cloud provider may terminate the instance sooner, so it is best for a hook to complete work within a minute or less to ensure that it is not forcibly terminated. ### Implementing a hook inside a container On each container, if `/hooks/shutdown` exists and is executable, it will be run as root. Standard output and error are written to the `container-shutdown` service unit logs. #### Minimal example A very simple shutdown hook that terminates a scheduler process and then waits for it to complete: ``` #!/bin/sh # Shutdown hook to terminate the scheduler process. The scheduler responds to # SIGTERM causing it to stop scheduling new work and only exits when all # in-flight work is done. PID="$(pidof scheduler)" if [ -n "$PID" ]; then kill $PID while kill -0 $PID; do sleep 1 done fi ``` Make shutdown.sh executable in your repository and ensure it is copied in your Dockerfile to the correct location. ``` COPY shutdown.sh /hooks/shutdown ``` ### FAQ Q: Will this hook run when the deployment is made inactive but not destroyed? A: No. It runs when the server is being terminated (scale-in, deployment expired, or manual destroy), not when a deployment just becomes non-current. Q: Can I rely on SSH / network / Docker being available during the hook? A: Yes, during the controlled shutdown window the host is still in a normal running state: Docker, networking, and SSH remain available while your hook runs. Once the hook finishes or times out, shutdown continues and these services go away. Any SSH sessions are terminated at the initiation of shutdown, however, so any diagnosis must be done on a new session. Q: Can I keep the instance alive indefinitely by never exiting the hook? A: No. The process of terminating the server with the cloud provider has already begun to terminate the server. All cloud providers will eventually power off hosts that do not shutdown promptly. Q: Can I run different shutdown behavior per container type? A: Yes. Each container image can provide its own hook implementation. Containers without the script will simply be terminated normally. --- # Ubuntu Package Security & Backporting Policy URL: https://docs.webscale.com/docs/reference/ubuntu-package-security-and-backporting-policy/ Description: This document outlines Webscale’s technical strategy for managing software packages ## **Core Strategy** Webscale utilizes **official Ubuntu-packaged software** for all core infrastructure components. While upstream developers frequently release new "mainline" versions with higher version numbers, Webscale prioritizes the stable versions maintained and vetted by Canonical (the publishers of Ubuntu). ## **The Backporting Mechanism** The primary reason for staying on a specific Ubuntu package version is the process of **backporting**. * **Definition:** Backporting is the practice of taking a specific security fix (CVE patch) from a newer version of software and applying it to an older, more stable version. * **Canonical’s Role:** Canonical’s security team monitors upstream vulnerabilities. When a vulnerability is found in a tool like Nginx, they apply the fix to the version of Nginx currently shipping with the Ubuntu LTS (Long Term Support) release. * **Result:** The version number of the package remains the same (e.g., 1.18.0), but the security posture is identical to the latest upstream version (e.g., 1.25.x). ## **Technical Comparison: Nginx Security Case Study** A common customer request is to upgrade to the latest "mainline" version of Nginx to address specific CVEs. The table below illustrates how Webscale/Ubuntu addresses these concerns: | Feature | Upstream (Mainline) | Ubuntu Package (LTS) | | :---- | :---- | :---- | | **Version Number** | Incrementing (e.g., 1.25.x) | Static (e.g., 1.18.x) | | **Security Fixes** | Included in new releases | **Backported** into existing version | | **Stability** | Variable (new features may introduce bugs) | High (only security/critical fixes applied) | | **Vetting** | Community-driven | Rigorously tested by Canonical | ### **Example: CVE-2024-1642** * **Upstream Fix:** Resolved in Nginx 1.25.2. * **Ubuntu Fix:** The security patch was backported to the version of Nginx residing in the Ubuntu official repositories. * **Stance:** A system running the Ubuntu-provided version is as secure against this vulnerability as a system running Nginx 1.25.2, but with significantly higher architectural stability. ## **Key Benefits** * **Security Validation:** Offloads the intensive task of patch validation and regression testing to Canonical. * **Consistency:** Ensures that the environment remains stable and predictable, as core library dependencies do not change unexpectedly. * **Compliance:** Official packages provide a clear audit trail for security compliance and vulnerability management. ## **Verification** To verify if a specific CVE has been addressed in an "older" Ubuntu package version, users can consult the official Ubuntu Security notices or check the package changelog locally: ```apt-get changelog \``` --- ### **Related Links** * [Ubuntu Security \- CVE Tracking](https://ubuntu.com/security/cves) * [How Ubuntu keeps your system secure, stable and current](https://ubuntu.com/engage/how-ubuntu-keeps-your-system-secure-stable-and-current) --- # Content Security Policy Directives URL: https://docs.webscale.com/docs/reference/content-security-policy/ Description: A list of the available content-security-policy directives for Web Controls The HTTP `Content-Security-Policy` response header allows web site administrators to control resources the user agent is allowed to load for a given page. With a few exceptions, policies mostly involve specifying server origins and script endpoints. This helps guard against cross-site scripting attacks ([XSS](https://developer.mozilla.org/en-US/docs/Glossary/XSS)). Webscale’s [`Set Content Security Policy` action for Web Controls](/docs/how-tos/web-controls/csp-create/) allows you to set the following directives. Click the name of each directive for more detailed information. {{% alert title="Note:" %}} Any directives not listed here are not fully supported by all browsers. Therefore, they are not available for use in Web Controls. Most of the information on this page is from [Mozilla’s Developer Docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy), visit them for more information. {{% /alert %}} ## Fetch directives Fetch directives control locations from which certain resource types may be loaded. These directives also require that you specify a [``](#source) attribute. | Option | Description :--------|---------- **Child source ([`child-src`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/child-src))** | Defines the valid sources for web workers and nested browsing contexts loaded using elements such as [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/frame) and [`