platformsh/drupal9-multisite

This template builds Drupal 9 in the multi-site configuration for Platform.sh based the "Drupal Recommended" Composer project.

dev-master 2024-04-06 01:34 UTC

This package is auto-updated.

Last update: 2024-04-06 01:34:37 UTC


README

68747470733a2f2f706c6174666f726d2e73682f6c6f676f732f726564657369676e2f506c6174666f726d73685f6c6f676f5f626c61636b2e737667

header.svg

Drupal 9 Multisite for Platform.sh

Contribute, request a feature, or check out our resources

Join our community       Documentation       Blog       Report a bug       Request a feature

Open issues    Open PRs    License   

https://raw.githubusercontent.com/platformsh/template-builder/master/templates/drupal9/.platform.template.yaml 68747470733a2f2f706c6174666f726d2e73682f696d616765732f6465706c6f792f6465706c6f792d627574746f6e2d6c672d626c75652e737667

Contents

About       Getting started       Migrate       Learn       Contribute      

About

This template builds Drupal 9 in a multisite configuration using the "Drupal Recommended" Composer project, creating three subsite installations from the same codebase.

It is pre-configured to use MariaDB and Redis for caching. The Drupal installer will skip asking for database credentials as they are already provided.

It also includes instructions and a script to help with setting up additional multisite instances, although depending on your particular needs it may require some customization.

Drupal is a flexible and extensible PHP-based CMS framework capable of hosting multiple sites on a single code base.

Features

  • PHP 8.0
  • MariaDB 10.4
  • Redis 6
  • Drush included
  • Pre-configured for multiple sites
  • Automatic TLS certificates
  • Composer-based build

Getting started

Deploy

Quickstart

The quickest way to deploy this template on Platform.sh is by clicking the button below. This will automatically create a new project and initialize the repository for you.

Deploy on Platform.sh


You can also quickly recreate this project locally with the following command:

composer create-project platformsh/drupal9-multisite -s dev

Note:

Platform.sh templates prioritize upstream release versions over our own. Despite this, we update template dependencies on a scheduled basis independent of those upstreams. Because of this, template repos do not contain releases. This may change in the future, but until then the -s dev flag is necessary to use composer create-project.

Other deployment options

For all of the other options below, clone this repository first:

git clone https://github.com/platformsh-templates/drupal9-multisite

If you're trying to deploy from GitHub, you can generate a copy of this repository first in your own namespace by clicking the Use this template button at the top of this page.

Then you can clone a copy of it locally with git clone git@github.com:YOUR_NAMESPACE/drupal9-multisite.git.

Deploy directly to Platform.sh from the command line
  1. Create a free trial:

    Register for a 30 day free trial with Platform.sh. When you have completed signup, select the Create from scratch project option. Give you project a name, and select a region where you would like it to be deployed. As for the Production environment option, make sure to match it to this repository's settings, or to what you have updated the default branch to locally.

  2. Install the Platform.sh CLI

    Linux/OSX

    curl -sS https://platform.sh/cli/installer | php

    Windows

    curl -f https://platform.sh/cli/installer -o cli-installer.php
    php cli-installer.php

    You can verify the installation by logging in (platformsh login) and listing your projects (platform project:list).

  3. Set the project remote

    Find your PROJECT_ID by running the command platform project:list

    +---------------+------------------------------------+------------------+---------------------------------+
    | ID            | Title                              | Region           | Organization                    |
    +---------------+------------------------------------+------------------+---------------------------------+
    | PROJECT_ID    | Your Project Name                  | xx-5.platform.sh | your-username                   |
    +---------------+------------------------------------+------------------+---------------------------------+

    Then from within your local copy, run the command platform project:set-remote PROJECT_ID.

  4. Push

    git push platform DEFAULT_BRANCH
Integrate with a GitHub repo and deploy pull requests
  1. Create a free trial:

    Register for a 30 day free trial with Platform.sh. When you have completed signup, select the Create from scratch project option. Give you project a name, and select a region where you would like it to be deployed. As for the Production environment option, make sure to match it to whatever you have set at https://YOUR_NAMESPACE/nextjs-drupal.

  2. Install the Platform.sh CLI

    Linux/OSX

    curl -sS https://platform.sh/cli/installer | php

    Windows

    curl -f https://platform.sh/cli/installer -o cli-installer.php
    php cli-installer.php

    You can verify the installation by logging in (platformsh login) and listing your projects (platform project:list).

  3. Setup the integration:

    Consult the GitHub integration documentation to finish connecting your repository to a project on Platform.sh. You will need to create an Access token on GitHub to do so.

Integrate with a GitLab repo and deploy merge requests
  1. Create a free trial:

    Register for a 30 day free trial with Platform.sh. When you have completed signup, select the Create from scratch project option. Give you project a name, and select a region where you would like it to be deployed. As for the Production environment option, make sure to match it to this repository's settings, or to what you have updated the default branch to locally.

  2. Install the Platform.sh CLI

    Linux/OSX

    curl -sS https://platform.sh/cli/installer | php

    Windows

    curl -f https://platform.sh/cli/installer -o cli-installer.php
    php cli-installer.php

    You can verify the installation by logging in (platformsh login) and listing your projects (platform project:list).

  3. Create the repository

    Create a new repository on GitLab, set it as a new remote for your local copy, and push to the default branch.

  4. Setup the integration:

    Consult the GitLab integration documentation to finish connecting a repository to a project on Platform.sh. You will need to create an Access token on GitLab to do so.

Integrate with a Bitbucket repo and deploy pull requests
  1. Create a free trial:

    Register for a 30 day free trial with Platform.sh. When you have completed signup, select the Create from scratch project option. Give you project a name, and select a region where you would like it to be deployed. As for the Production environment option, make sure to match it to this repository's settings, or to what you have updated the default branch to locally.

  2. Install the Platform.sh CLI

    Linux/OSX

    curl -sS https://platform.sh/cli/installer | php

    Windows

    curl -f https://platform.sh/cli/installer -o cli-installer.php
    php cli-installer.php

    You can verify the installation by logging in (platformsh login) and listing your projects (platform project:list).

  3. Create the repository

    Create a new repository on Bitbucket, set it as a new remote for your local copy, and push to the default branch.

  4. Setup the integration:

    Consult the Bitbucket integration documentation to finish connecting a repository to a project on Platform.sh. You will need to create an Access token on Bitbucket to do so.

Post-install

Each subsite installs separately. As configured, this project uses a subdomain for each subsite. For each subsite, run through the Drupal installer as normal. You will not be asked for database credentials as those are already provided.

Local development

This section provides instructions for running the drupal9-multisite template locally, connected to a live database instance on an active Platform.sh environment.

In all cases for developing with Platform.sh, it's important to develop on an isolated environment - do not connect to data on your production environment when developing locally. Each of the options below assume that you have already deployed this template to Platform.sh, as well as the following starting commands:

$ platform get PROJECT_ID
$ cd project-name
$ platform environment:branch updates
Drupal: using ddev

ddev provides an integration with Platform.sh that makes it simple to develop Drupal locally. Check the providers documentation for the most up-to-date information.

In general, the steps are as follows:

  1. Install ddev.
  2. A configuration file has already been provided at .ddev/providers/platform.yaml, so you should not need to run ddev config.
  3. Retrieve an API token for your organization via the management console.
  4. Update your dedev global configuration file to use the token you've just retrieved:
    web_environment:
    - PLATFORMSH_CLI_TOKEN=abcdeyourtoken`
  5. Run ddev restart.
  6. Get your project ID with platform project:info. If you have not already connected your local repo with the project (as is the case with a source integration, by default), you can run platform project:list to locate the project ID, and platform project:set-remote PROJECT_ID to configure Platform.sh locally.
  7. Update the .ddev/providers/platform.yaml file for your current setup:
    environment_variables:
    project_id: PROJECT_ID
    environment: CURRENT_ENVIRONMENT
    application: drupal
  8. Get the current environment's data with ddev pull platform.
  9. When you have finished with your work, run ddev stop and ddev poweroff.
Drupal: using Lando

Lando supports PHP applications configured to run on Platform.sh, and pulls from the same container registry Platform.sh uses on your remote environments during your local builds through its own recipe and plugin.

  1. Install Lando.
  2. Make sure Docker is already running - Lando will attempt to start Docker for you, but it's best to have it running in the background before beginning.
  3. Start your apps and services with the command lando start.
  4. To get up-to-date data from your Platform.sh environment (services and mounts), run the command lando pull.
  5. If at any time you have updated your Platform.sh configuration files, run the command lando rebuild.
  6. When you have finished with your work, run lando stop and lando poweroff.

Note:

For many of the steps above, you may need to include the CLI flags -p PROJECT_ID and -e ENVIRONMENT_ID if you are not in the project directory or if the environment is associated with an existing pull request.

Migrate

The steps below outline the important steps for migrating your application to Platform.sh - adding the required configuration files and dependencies, for example. Not every step will be applicable to each person's migration. These steps actually assume the earliest starting point possible - that there is no code at all locally, and that this template repository will be rebuilt completely from scratch.

If you already have code you'd like to migrate, feel free to focus on the steps most relevant to your application and skip the first section.

Getting started

Assuming that your starting point is no local code, the steps below will setup a starting repository we can begin to make changes to to rebuild this template and migrate to Platform.sh. If you already have a codebase you are trying to migrate, move onto the next step - Adding and updating files - and substitute any reference to the default branch main with some other branch name.

$ mkdir drupal9-multisite && cd drupal9-multisite
$ git init
$ git remote add upstream https://github.com/drupal/recommended-project.git
$ git branch -m main
$ git fetch --all --depth=2
$ git fetch --all --tags
$ git merge --allow-unrelated-histories -X theirs 9.3.9

Adding and updating files

A small number of files need to be added to or modified in your repository at this point. Some of them explicitly configure how the application is built and deployed on Platform.sh, while others simply modify files you may already have locally, in which case you will need to replicate those changes.

Open the dropdown below to view all of the Added and Updated files you'll need to reproduce in your migration.

View files
File Purpose
psh-subsite-add.php Added:

A script has been added to simplify adding additional sites to your Drupal installation. See Adding a new subsite for more information.
web/sites/sites.php Added:

Configuration file for multi-site support and directory aliasing feature.
web/sites/default/settings.php Added:

The Drupal settings file has been updated to import and use web/sites/settings.platformsh.php. You will also need an identical file for each subsite (i.e. main, first, and second).
web/sites/default/services.yml Added:

Default services configuration. You will also need an identical file for each subsite (i.e. main, first, and second).
web/sites/default/drushrc.php Added:

Drush configuration file for a Platform.sh Drupal site. You will also need an identical file for each subsite (i.e. main, first, and second).
web/sites/settings.platformsh.php Added:

Contains Platform.sh-specific configuration, namely setting up the database connection to the MariaDB service and caching via Redis.
.environment Added:

The .environment file is a convenient place to set environment variables relevant to your applications that may be dependent on the current environment. It is sourced before the start command is run, as the first step in the deploy and post_deploy hooks, and at the beginning of each session when you SSH into an application container. It is written in dash, so be aware of the differences to bash.

It can be used to set any environment variable, including ones that depend on Platform.sh-provided variables like PLATFORM_RELATIONSHIPS and PLATFORM_ROUTES, or to modify PATH. This file should not produce output.

Here, the Composer config and PATH are updated to allow executable app dependencies from Composer to be run from the path (i.e. drush).
.gitignore Added:

A .gitignore file is not included in the upstream, so one has been added.
.lando.upstream.yml Added:

This file configures Lando as a local development option for this template. See the Platform.sh Lando plugin documentation for more information about configuration and the Local development section of this README for how to get started.
.platform.app.yaml Added:

This file is required to define the build and deploy process for all application containers on Platform.sh. Within this file, the runtime version, relationships to service containers, and writable mounts are configured. It's also in this file that it is defined what dependencies are installed, when they are installed, and that package manager will be used to do so.

Take a look at the Application documentation for more details about configuration. For more information about the sequence of events that lead from a build to deployment, see the Build and deploy timeline documentation.

This template uses Composer 2 to install dependencies using the default composer build flavor prior to the build hook. Drush tasks are run during the deploy hook, and referenced again during the defined cron job.
drush/platformsh_generate_drush_yml.php Added:

This file has been included to generate the drush yaml configuration on every deployment.
.platform/services.yaml Added:

Platform.sh provides a number of on-demand managed services that can easily be added to your projects. It's within this file that each service's version, name, resources, and additional configuration are set. See the Services documentation for more details on configuration, version and service availability.

In this template, MariaDB and Redis have been configured.
.platform/routes.yaml Added:

This file is require to deploy on Platform.sh, as it defines how requests should be handled on the platform. It's within this file that redirects and basic caching can be configured. See the Routes documentation for more configuration details.

php.ini Added:

An initial php.ini file has also beed added. The settings are a result of performance testing and best practice recommendations coming from Blackfire.io. They will initialize Drupal with a number of good baseline performance settings for production applications, and complement many of the tests specified in .blackfire.yml.
.blackfire.yml Added:

This file has been added to help you get started using Blackfire.io on your project. See the Blackfire section below for more information on how to get started.
.lando.upstream.yml Added:

This file configures Lando as a local development option for this template. See the Platform.sh Lando plugin documentation for more information about configuration and the Local development section of this README for how to get started.
.ddev/providers/platform.yaml Added:

This file configures ddev as a local development option for this template. See the Platform.sh ddev integration documentation for more information about configuration and the Local development section of this README for how to get started. Be sure to follow the instructions provided through the ddev CLI and in the comments section of that file to correctly configure ddev for your project.

Dependencies and configuration

Sometimes it is necessary to install additional dependencies to and modify the configuration of an upstream project to deploy on Platform.sh. When it is, we do our best to keep these modifications to the minimum necessary. Run the commands below to reproduce the dependencies in this template.

$ composer require platformsh/config-reader drush/drush drupal/redis
$ composer config allow-plugins.composer/installers true --no-plugins
$ composer config allow-plugins.drupal/core-composer-scaffold true --no-plugins
$ composer config allow-plugins.drupal/core-project-message true --no-plugins
$ composer config allow-plugins.cweagans/composer-patches true --no-plugins 

Deploying to Platform.sh

Your repository now has all of the code it needs in order to deploy to Platform.sh.

Deploy directly to Platform.sh from the command line
  1. Create a free trial:

    Register for a 30 day free trial with Platform.sh. When you have completed signup, select the Create from scratch project option. Give you project a name, and select a region where you would like it to be deployed. As for the Production environment option, make sure to match it to this repository's settings, or to what you have updated the default branch to locally.

  2. Install the Platform.sh CLI

    Linux/OSX

    curl -sS https://platform.sh/cli/installer | php

    Windows

    curl -f https://platform.sh/cli/installer -o cli-installer.php
    php cli-installer.php

    You can verify the installation by logging in (platformsh login) and listing your projects (platform project:list).

  3. Set the project remote

    Find your PROJECT_ID by running the command platform project:list

    +---------------+------------------------------------+------------------+---------------------------------+
    | ID            | Title                              | Region           | Organization                    |
    +---------------+------------------------------------+------------------+---------------------------------+
    | PROJECT_ID    | Your Project Name                  | xx-5.platform.sh | your-username                   |
    +---------------+------------------------------------+------------------+---------------------------------+

    Then from within your local copy, run the command platform project:set-remote PROJECT_ID.

  4. Push

    git push platform DEFAULT_BRANCH
Integrate with a GitHub repo and deploy pull requests
  1. Create a free trial:

    Register for a 30 day free trial with Platform.sh. When you have completed signup, select the Create from scratch project option. Give you project a name, and select a region where you would like it to be deployed. As for the Production environment option, make sure to match it to whatever you have set at https://YOUR_NAMESPACE/nextjs-drupal.

  2. Install the Platform.sh CLI

    Linux/OSX

    curl -sS https://platform.sh/cli/installer | php

    Windows

    curl -f https://platform.sh/cli/installer -o cli-installer.php
    php cli-installer.php

    You can verify the installation by logging in (platformsh login) and listing your projects (platform project:list).

  3. Setup the integration:

    Consult the GitHub integration documentation to finish connecting your repository to a project on Platform.sh. You will need to create an Access token on GitHub to do so.

Integrate with a GitLab repo and deploy merge requests
  1. Create a free trial:

    Register for a 30 day free trial with Platform.sh. When you have completed signup, select the Create from scratch project option. Give you project a name, and select a region where you would like it to be deployed. As for the Production environment option, make sure to match it to this repository's settings, or to what you have updated the default branch to locally.

  2. Install the Platform.sh CLI

    Linux/OSX

    curl -sS https://platform.sh/cli/installer | php

    Windows

    curl -f https://platform.sh/cli/installer -o cli-installer.php
    php cli-installer.php

    You can verify the installation by logging in (platformsh login) and listing your projects (platform project:list).

  3. Create the repository

    Create a new repository on GitLab, set it as a new remote for your local copy, and push to the default branch.

  4. Setup the integration:

    Consult the GitLab integration documentation to finish connecting a repository to a project on Platform.sh. You will need to create an Access token on GitLab to do so.

Integrate with a Bitbucket repo and deploy pull requests
  1. Create a free trial:

    Register for a 30 day free trial with Platform.sh. When you have completed signup, select the Create from scratch project option. Give you project a name, and select a region where you would like it to be deployed. As for the Production environment option, make sure to match it to this repository's settings, or to what you have updated the default branch to locally.

  2. Install the Platform.sh CLI

    Linux/OSX

    curl -sS https://platform.sh/cli/installer | php

    Windows

    curl -f https://platform.sh/cli/installer -o cli-installer.php
    php cli-installer.php

    You can verify the installation by logging in (platformsh login) and listing your projects (platform project:list).

  3. Create the repository

    Create a new repository on Bitbucket, set it as a new remote for your local copy, and push to the default branch.

  4. Setup the integration:

    Consult the Bitbucket integration documentation to finish connecting a repository to a project on Platform.sh. You will need to create an Access token on Bitbucket to do so.

Migrating your data

If you are moving an existing site to Platform.sh, then in addition to code you also need to migrate your data. That means your database and your files.

Importing the database

First, obtain a database dump from your current site and save your dump file as database.sql. Then, import the database into your Platform.sh site using the CLI:

platform sql -e main < database.sql
Importing files

You first need to download your files from your current hosting environment. The easiest way is likely with rsync, but consult your old host's documentation.

The platform mount:upload command provides a straightforward way to upload an entire directory to your site at once to a mount defined in a .platform.app.yaml file. Under the hood, it uses an SSH tunnel and rsync, so it is as efficient as possible. (There is also a platform mount:download command you can use to download files later.) Run the following from your local Git repository root (modifying the --source path if needed and setting BRANCH_NAME to the branch you are using).

A few examples are listed below, but repeat for all directories that contain data you would like to migrate.

$ platform mount:upload -e main --mount web/sites/default/files --source ./web/sites/default/files
$ platform mount:upload -e main --mount private --source ./private

Note that rsync is picky about its trailing slashes, so be sure to include those.

Next steps

With your application now deployed on Platform.sh, things get more interesting. Run the command platform environment:branch new-feature for your project, or open a trivial pull request off of your current branch.

The resulting environment is an exact copy of production. It contains identical infrastructure to what's been defined in your configuration files, and even includes data copied from your production environment in its services. On this isolated environment, you're free to make any changes to your application you need to, and really test how they will behave on production.

After that, here are a collection of additional resources you might find interesting as you continue with your migration to Platform.sh:

Learn

Troubleshooting

Accessing logs

After the environment has finished its deployment, you can investigate issues that occured on startup, deploy and post_deploy hooks, and generally at runtime using the CLI. Run the command:

platform ssh

If you are running the command outside of a local copy of the project, you will need to include the -p (project) and/or -e (environment) flags as well. Once you have connected to the container, logs are available within /var/log/ for you to investigate.

Rebuilding cache

You may run into a database error after installing Drupal on your production environment initially. To fix, SSH into the application container (platform ssh) and rebuild the cache using Drush:

drush cache-rebuild
Default hash_salt behavior

Drupal's default settings set hash_salt to an empty string:

$settings['hash_salt'] = '';

In the past, Platform.sh templates have overridden this value:

$settings['hash_salt'] = $settings['hash_salt'] ?? $platformsh->projectEntropy;

This setting was insufficient to cover some user configurations - such as those cases when an application depends on a Null value for hash_salt.

Now, the setting looks like this in settings.platformsh.php:

$settings['hash_salt'] = empty($settings['hash_salt']) ? $platformsh->projectEntropy : $settings['hash_salt'];

This change sets hash_salt to the built-in environment variable PLATFORM_PROJECT_ENTROPY value if the project contains the default settings OR Null. If your application code depends on an empty value, feel free to comment out that line, or reset again later in that file.

Feel free to visit platformsh-templates/drupal9#73 for more details on this discussion.

How Drupal multi-site works on Platform.sh

Multisite on Platform.sh can be tricky. Drupal multisite bases its logic off of the domain name of the incoming request. However, the domain name of the request is by design highly variable on Platform.sh as every environment has a unique domain. As a result, this template establishes a number of conventions and custom configuration to make multi-site work.

  • Every subsite is a subdomain off of a common domain. See routes.yaml. The domain prefix is the "subsite ID".
  • Every subsite has its own database and endpoint on a single MariaDB service instance. The endpoint name is the same as the subsite ID.
  • The sites/sites.php file includes code to build a $sites lookup list to map any incoming request, regardless of branch, to a settings directory named for the subsite ID. It iterates over all routes that point to the Drupal application and parses those routes into a domain name -> directory list, where the directory is the site ID. If you are not using a subdomain based multi-site you will likely need to modify the body of the foreach() loop.
  • The .platform.app.yaml file is essentially the same as for a single-site Drupal installation, but its relationships include every defined MariaDB endpoint. The relationship is also named for the subsite ID.
  • Every subsite ID's settings.php file is identical, and largely similar to the standard Platform.sh settings.php file. You may customize it if needed. In particular, the $platformsh_enable_redis variable should be toggled to true for each site only after the install process is completed for that site, as Drupal cannot install with the redis module active.
  • The settings.php files also include a shared sites/settings.platformsh.php file. It is largely the same as in a single-site configuration but has been modified to leverage the subsite ID for:
    • Selecting which database relationship to use
    • Including a cache prefix in Redis so that each site has its own effective cache pool.
    • Setting the files and private files directories, which are subsite ID prefixes of top-level files and private directories rather than under each site directory.
Adding a new subsite

Adding a new subsite requires the following steps. For these steps, assume we're adding a subdomain named stuff.

  1. Add a new route to routes.yaml with a new stuff domain prefix. Copying and pasting an existing route is fine.
  2. Copy the sites/default directory to sites/stuff.
  3. Edit services.yaml and add a new database and endpoint. Copying and pasting an existing entry is fine. The new relationship must be named stuff.
  4. Edit .platform.app.yaml and add a new relationship: stuff: db:stuff. (Where db is the name of the database service from services.yaml.)
  5. Commit the above changes and push.
  6. In your browser, go to the stuff.example.com domain (or equivalent on a dev environment) and run through the Drupal installer as usual. Alternatively, you can use Drush as described bellow.
  7. Edit the sites/stuff/settings.php file again and enable Redis by setting $platformsh_enable_redis to true.
  8. Commit and push that change.

Alternatively, a PHP shell script is provided that automates steps 1-4. See psh-subsite-add.php.

Using Drush in multi-site

In a Drupal multi-site setup, sites ID are defined in web/sites/sites.php. By default in this multi-site template, 2 subsites are defined in routes.yaml: first and second

Any Drush command can therefore be used on a specific subsite by using --uri=. For example:

  • drush status --uri=first
  • drush status --uri=second

Blackfire.io: creating a Continuous Observability Strategy

This template includes a starting .blackfire.yml file that can be used to enable Application Performance Monitoring, Profiling, Builds and Performance Testing on your project. Platform.sh comes with Blackfire pre-installed on application containers, and setting up requires minimal configuration.

Resources

Contact

This template is maintained by the Platform.sh Developer Relations team, and they will be notified of all issues and pull requests you open here.

  • Community: Share your question with the community, or see if it's already been asked on our Community site.
  • Slack: If you haven't done so already, you can join Platform.sh's public Slack channels and ping the @devrel_team with any questions.

About Platform.sh

This template has been specifically designed to deploy on Platform.sh.

What is Platform.sh?

Platform.sh is a unified, secure, enterprise-grade platform for building, running and scaling web applications. We’re the leader in Fleet Ops: Everything you need to manage your fleet of websites and apps is available from the start. Because infrastructure and workflows are handled from the start, apps just work, so teams can focus on what really matters: making faster changes, collaborating confidently, and scaling responsibly. Whether managing a fleet of ten or ten thousand sites and apps, Platform.sh is the Developer- preferred solution that scales right.

Our key features include:

To find out more, check out the demo below and go to our website.


The Platform.sh demo

Contribute

Help us keep top-notch templates!

Every one of our templates is open source, and they're important resources for users trying to deploy to Platform.sh for the first time or better understand the platform. They act as getting started guides, but also contain a number of helpful tips and best practices when working with certain languages and frameworks.

See something that's wrong with this template that needs to be fixed? Something in the documentation unclear or missing? Let us know!

How to contribute

Report a bug       Submit a feature request       Open a pull request      


Need help?

Ask the Platform.sh Community       Join us on Slack      


Thanks to all of our amazing contributors!


68747470733a2f2f636f6e747269622e726f636b732f696d6167653f7265706f3d706c6174666f726d73682d74656d706c617465732f64727570616c392d6d756c746973697465

Made with contrib.rocks