Thanks to visit codestin.com
Credit goes to fixed.docs.upsun.com

Platform.sh is now Upsun. Click here to learn more
Upsun Fixed User Documentation

Composable image

The Upsun Fixed composable image provides enhanced flexibility when defining your app. It allows you to install several runtimes and tools in your application container, in a “one image to rule them all” approach.

The composable image is built on Nix, which offers the following benefits:

  • You can add as many packages to your application container as you need, choosing from over 120,000 packages from the Nixpkgs collection.
  • The packages you add are built in total isolation, so you can install different versions of the same package.
  • With Nix, there are no undeclared dependencies in your source code. What works on your local machine is guaranteed to work on any other machine.

This page introduces all the settings available to configure your composable image from your .platform.app.yaml file (usually located at the root of your Git repository).
Note that multi-app projects can be set in various ways.

You can also skip directly to this comprehensive example of a composable image configuration on the “Configure apps” page. This example includes all of the top-level properties listed in the table in the next section.

Top-level properties Anchor to this heading

All application configuration takes place in a .platform.app.yaml file, with each application configured under a unique key beneath the top-level applications key.

The following table presents all of the properties available to each unique application name.

The Set in instance column defines whether the given property can be overridden within a web or workers instance. To override any part of a property, you must provide the entire property.

Name Type Required Set in instance? Description
name string Yes No A unique name for the app. Must be lowercase alphanumeric characters. Changing the name destroys data associated with the app.
type A type Yes No Defines the version of the Nix channel. Mandatory in each application that uses the composable image. Example: type: "composable:25.05".
stack runtimes and/or packages arrays Yes No Specifies Upsun Fixed-supported runtimes and extra NixPkgs packages beyond those in the type channel.
size A container size Yes Amount of resources to allocate to the app; defaults to AUTO in production environments. Examples: S, M,4XL.
relationships A dictionary of relationships Yes Connections to other services and apps.
disk integer or null Yes The size of the disk space for the app in MB. Minimum value is 128. Defaults to null, meaning no disk is available.
mounts A dictionary of mounts Yes Directories that are writable even after the app is built. If set as a local source, disk is required.
web A web instance N/A How the web application is served.
workers A worker instance N/A Alternate copies of the application to run as background processes.
timezone string No The timezone for crons to run. Format: a TZ database name. Defaults to UTC, which is the timezone used for all logs no matter the value here. See also app runtime timezones.
access An access dictionary Yes Access control for roles accessing app environments.
variables A variables dictionary Yes Variables to control the environment.
firewall A firewall dictionary Yes Outbound firewall rules for the application.
hooks A hooks dictionary No Specifies commands and/or scripts to run in the build, deploy, and post_deploy phases.
crons A cron dictionary No Scheduled tasks for the app.
source A source dictionary No Details about the app’s source code and available operations.
additional_hosts An additional hosts dictionary Yes Mappings of hostnames to IP addresses.
operations A dictionary of runtime operations No Runtime operations for the application.

type Anchor to this heading

Required for all applications that use the composable image. Defines the version of the Nix channel that application uses.

For example, to specify the Nix channel 25.05 for APP_NAME, use the following syntax:

.platform/applications.yaml
applications:
  APP_NAME:
      type: "composable:25.05"

Supported Nix channels Anchor to this heading

Upsun supports the following Nix channel versions:

  • 25.05

View the list of supported Nix runtimes in the stack section below.

stack Anchor to this heading

You must define the stack element by using distinct runtimes and packages keys, as described in the following table.

See the example stack configuration that follows this table.

Name Type Required Additional keys Description
runtimes array No extensions, disabled_extensions, and related subkeys An array of 1+ language runtimes specified as "<nixruntime@version>" or <nixruntime>.
The first declared runtime (or primary runtime) is started automatically.
See the complete list of supported runtimes below.
packages array No package, channel, additional keys to demonstrate passthrough flexibility Additional Nix tools/libraries, using the channel from type unless overridden locally by specifying the package and its channel. Format: <nixpackage>

Example: stack configuration Anchor to this heading

The config.yaml file excerpt below shows the following stack configuration:

  • Primary runtime: [email protected] with additional extensions and one disabled extension
  • Secondary runtimes: nodejs@24 and [email protected]
  • Nix packages:
    • yarn and python313Packages.yq from the channel defined in type
    • python313Packages.jupyterlab (with config) and wkhtmltopdf from the unstable channel
.platform.app.yaml
applications: 
  APP_NAME:
    type: "composable:25.05"
    stack:
      runtimes:
        - "[email protected]":
            extensions: 
              - apcu
              - pdo_sqlite
              - facedetect
              - sodium
              - xsl
              - name: blackfire   # [email protected] extension
                configuration:    # extension subkeys
                    server_id: SERVER_ID
                    server_token: SERVER_TOKEN
            disabled_extensions:
              - gd
        - "nodejs@24"
        - "[email protected]"
      packages:
        - yarn                      # Package manager
        - python313Packages.yq      # Python package 
        - package: python313Packages.jupyterlab   # Python package with optional Nix configuration
          channel: unstable
          configuration:
            withMathjax: false      # Disable MathJax support
            withMimeExtensions: true
        - package: wkhtmltopdf      # Conversion tool
          channel: unstable

Working with multiple runtimes: primary runtime Anchor to this heading

If you add multiple runtimes to your application container, the first declared runtime becomes the primary runtime. The primary runtime is the one that is automatically started.

To start other declared runtimes (or secondary runtimes), you need to start them manually by using web commands. To find out which start command to use, go to the Languages section and visit the documentation page dedicated to your runtime.

Containers that define multiple runtimes typically require some resource sizing adjustments. For details, see the Resources section of this topic.

See the stack configuration example above, which declares multiple runtimes.

PHP as a primary runtime Anchor to this heading

If a PHP runtime is the first declared (or primary) runtime in the app:

  • The PHP-FPM service starts automatically.

  • You can configure the PHP-FPMP service by using request_terminate_timeout and sizing_hints keys in the app’s stack.runtimes key.

    The stack configuration example above declares PHP as a primary runtime but does not show these additional keys.

For the complete list of PHP extension keys and PHP-FPM sizing hints, see Modify your PHP runtime when using the composable image section in the “PHP” topic.

Related resource: When php-fpm runs out of workers: a 502 error field guide (Dev Center article)

Upsun-supported Nix runtimes Anchor to this heading

For some runtimes (such as Clojure), you can specify only a major version.
For other runtimes (such as Elixir), you can specify a major or a major.minor version. Security and other patches are applied automatically.

Language Nix package Supported version(s)
Clojure clojure 1
Elixir elixir 1.18
1.15
1.14
Go golang 1.22
1.21
Java java 22
21
Javascript/Bun bun 1
JavaScript/Node.js nodejs 24
22
20
18
Perl perl 5
PHP php 8.4
8.3
8.2
8.1
Python python 3.13
3.12
3.11
3.10
3.9
2.7
Ruby ruby 3.4
3.3
3.2
3.1

PHP extensions and Python packages Anchor to this heading

To discover which PHP extensions and Python packages are available for these runtimes:

  1. Go to the NixOS search.
  2. Enter a runtime and click Search.
  3. In the Package sets side bar, select the right set of extensions/packages for your runtime version.
    You can choose the desired extensions/packages from the filtered results.

Screenshot of the Nix package sets selection for PHP@8.3

  1. Add extensions to stack.runtimes.extensions and packages to stack.packages as described in the stack section above.

Resources (CPU, memory, disk space) Anchor to this heading

By default, Upsun Fixed assigns a container profile and container size to each application and service on the first deployment of a project.

The container profile defines and enforces a specific CPU-to-memory ratio. The default container profile for an app or service in a composable image is HIGH_CPU.

To change the container size, which is a vertical‑scaling action, you must change your plan size. When you redeploy, the container runs with the CPU‑to‑memory ratio defined by its profile, so it enforces the size you specified.

If you define multiple runtimes in an application’s .applications.<app_name>.stack.runtimes key, you must change your plan size to Medium (M) or larger.

Downsize a disk Anchor to this heading

You can reduce the target disk size of an app. Keep in mind:

  • Backups created before the downsize are incompatible and cannot be used; you must create new backups.
  • The downsize will fail if the disk contains more data than the target size.

Combine single-runtime and composable images Anchor to this heading

In a multiple application context, you can use a mix of single-runtime images and composable images.

The following sample configuration includes two applications:

  • frontend – uses a single-runtime image
  • backend – uses a composable image
    In this app, PHP is the primary runtime and is started automatically (PHP-FPM also starts automatically when PHP is the primary runtime). For details, see the PHP as a primary runtime section in this topic.
.platform.app.yaml
applications:
  frontend:
    # this app uses the single-runtime image with a specific node.js runtime
    type: 'nodejs:24' 
  backend:
    # this app uses the composable image and specifies two runtimes
    type: "composable:8.4" 
    stack:
      runtimes:
        - "[email protected]":
            extensions:
              - apcu
              - sodium
              - xsl
              - pdo_sqlite
        - "[email protected]"
      packages:
        - "python313Packages.yq" # python package specific