Platform.sh User Documentation

Git commit

Try for 30 days
Flexible, version-controlled infrastructure provisioning and development-to-production workflows
Activate your trial

Once you have your project initialized, it’s time to add the basics to get it deployed.

In your repository, create a file to hold your app configuration:

touch .platform.app.yaml

This file holds all the configuration for the container where your app lives. By keeping the configuration in this file, you ensure it remains the same across all environments, from development to production.

Start by adding basic properties for your app, such as its name and language. You can adjust the file to fit your code, such as the start command to start your app, or desires, such as changing the name.

.platform.app.yaml
# The name of the app. Must be unique within a project.
name: app

# The type of the application to build
type: 'php:8.0'

# Indicate to use Composer 2 (leave out if you want Composer 1)
# See how without Composer: https://docs.platform.sh/guides/wordpress/vanilla.html
dependencies:
    php:
        composer/composer: '^2'

# The size of the persistent disk of the application (in MB)
disk: 2048

# Your app's configuration when it's exposed to the web.
web:
    locations:
        "/":
            # The public directory of the app, relative to its root.
            root: "web"
            # The front-controller script to send non-static requests to.
            passthru: "/index.php"
.platform.app.yaml
# The name of the app. Must be unique within a project.
name: app

# The type of the application to build
type: 'php:8.0'

# Indicate to use Composer 2 (leave out if you want Composer 1)
# See how without Composer: https://docs.platform.sh/guides/wordpress/vanilla.html
dependencies:
    php:
        composer/composer: '^2'

# The size of the persistent disk of the application (in MB)
disk: 2048

# Your app's configuration when it's exposed to the web.
web:
    # Set the upstream property to create a socket to listen to
    upstream:
        socket_family: tcp
        protocol: http

    # Set the specific command to start your app
    # using the provided port
    commands:
        start: php path/to/start/command --port=$PORT

    locations:
        "/":
            # Send all requests through to the app
            allow: false
            passthru: true
            scripts: false
.platform.app.yaml
# The name of the app. Must be unique within a project.
name: app

# The type of the application to build
type: 'python:3.10'

# The size of the persistent disk of the application (in MB)
disk: 1024

# Your app's configuration when it's exposed to the web.
web:
    commands:
        start: python app.py

You may need to adapt the start command to fit your app.

.platform.app.yaml
# The name of the app. Must be unique within a project.
name: app

# The type of the application to build
type: 'python:3.10'

# The build-time dependencies of the app.
dependencies:
    python3:
       pipenv: "2022.6.7"

# The size of the persistent disk of the application (in MB)
disk: 1024

# Your app's configuration when it's exposed to the web.
web:
    upstream:
        # Ensure your app listens on the right socket
        socket_family: unix
    commands:
        # The exact command varies based on the server you use

        # 1) ASGI: daphne
        start: "pipenv run daphne app.asgi:application"
        # 2) ASGI: uvicorn
        start: "pipenv run gunicorn -k uvicorn.workers.UvicornWorker -w 4 -b unix:$SOCKET app.wsgi:application"
        # 3) ASGI: hypercorn
        start: "pipenv run hypercorn app.asgi:application"
        # 4) WSGI: gunicorn
        start: "pipenv run gunicorn -w 4 -b unix:$SOCKET app.wsgi:application"
.platform.app.yaml
# The name of the app. Must be unique within a project.
name: app

# The type of the application to build
type: 'python:3.10'

# Set properties for poetry
variables:
    env:
        POETRY_VERSION: '1.1.14'
        POETRY_VIRTUALENVS_IN_PROJECT: true
        POETRY_VIRTUALENVS_CREATE: false

# The size of the persistent disk of the application (in MB)
disk: 1024

web:
    upstream:
        # Ensure your app listens on the right socket
        socket_family: unix
    commands:
        # The exact command varies based on the server you use

        # 1) ASGI: daphne
        start: "poetry run daphne app.asgi:application"
        # 2) ASGI: uvicorn
        start: "poetry run gunicorn -k uvicorn.workers.UvicornWorker -w 4 -b unix:$SOCKET app.wsgi:application"
        # 3) ASGI: hypercorn
        start: "poetry run hypercorn app.asgi:application"
        # 4) WSGI: gunicorn
        start: "poetry run gunicorn -w 4 -b unix:$SOCKET app.wsgi:application"
.platform.app.yaml
# The name of the app. Must be unique within a project.
name: app

# The type of the application to build
type: 'nodejs:16'

# The size of the persistent disk of the application (in MB)
disk: 512

# Your app's configuration when it's exposed to the web.
web:
    commands:
        start: NODE_ENV=production npm run start
.platform.app.yaml
# The name of the app. Must be unique within a project.
name: app

# The type of the application to build
type: 'nodejs:16'

# Turn off the default use of npm
build:
    flavor: none

# The size of the persistent disk of the application (in MB)
disk: 512

# Your app's configuration when it's exposed to the web.
web:
    commands:
        start: NODE_ENV=production yarn start
.platform.app.yaml
# The name of the app. Must be unique within a project.
name: app

# The type of the application to build
type: 'nodejs:16'

# Turn off the default use of npm
build:
    flavor: none

# Include yarn as a global dependency
dependencies:
    nodejs:
        yarn: "1.22.19"

# The size of the persistent disk of the application (in MB)
disk: 512

# Your app's configuration when it's exposed to the web.
web:
    commands:
        start: NODE_ENV=production yarn start

This assumes you start your app with a start script in your package.json. You may need to adapt the start command to fit your app.

.platform.app.yaml
# The name of the app. Must be unique within a project.
name: app

# The type of the application to build
type: 'golang:1.18'

# The size of the persistent disk of the application (in MB)
disk: 512

# Your app's configuration when it's exposed to the web.
web:
    commands:
        # This should match the output of your build command
        start: ./bin/app

You may need to adapt the start command to fit your app.

.platform.app.yaml
# The name of the app. Must be unique within a project.
name: app

# The type of the application to build
type: 'java:14'

# The size of the persistent disk of the application (in MB)
disk: 512

# Your app's configuration when it's exposed to the web.
web:
    commands:
        start: java -jar $JAVA_OPTS target/app.jar --server.port=$PORT
.platform.app.yaml
# The name of the app. Must be unique within a project.
name: app

# The type of the application to build
type: 'java:14'

# The size of the persistent disk of the application (in MB)
disk: 512

# Your app's configuration when it's exposed to the web.
web:
    commands:
        # Adapt the `app.jar` to what's in `build.gradle`
        start: java -jar $JAVA_OPTS build/libs/app.jar --server.port=$PORT

You may need to adapt the start command to fit your app.

To build your app, you may also need to add commands to go through the build process. These are included in what’s known as the build hook.

Add something similar to the following to the end of the file you just added:

.platform.app.yaml
hooks:
    build: pipenv install --system --deploy
.platform.app.yaml
hooks:
    build: |
        # Fail the build if any part fails
        set -e
        # Install poetry
        export PIP_USER=false
        curl -sSL https://install.python-poetry.org | python3 - --version $POETRY_VERSION
        export PIP_USER=true
        # Install dependencies
        poetry install        

(This assumes you have your build process as part of a build script in your package.json)

.platform.app.yaml
hooks:
    build: npm run build
.platform.app.yaml
hooks:
    build: |
        # Fail the build if any part fails
        set -e
        corepack yarn install
        corepack yarn build        
.platform.app.yaml
hooks:
    build: |
        # Fail the build if any part fails
        set -e
        yarn --frozen-lockfile
        yarn build        
.platform.app.yaml
hooks:
    # Make sure the output matches your start command
    build:  go build -o bin/app
.platform.app.yaml
hooks:
    build: mvn clean package

Assuming you’ve committed Gradle to your repository.

.platform.app.yaml
hooks:
    build: ./gradlew clean build --no-daemon

Commit your changes (to save your changes):

git add .
git commit -m "Add Platform.sh files"

Push your changes (to share your changes with everyone with access to your project/repository):

platform push

You can now see your built app at the returned URL.

Your app is built and served at the returned URL, but it doesn’t yet have all the services it needs to work.

You could define more complicated routes, but the default is enough for basic apps. Now branch your environment to see how data works in Platform.sh and then add services.

Is this page helpful?