The Boxfile

Whenever you synchronise the changes you made to your local repository with the freistilbox Hosting Platform by doing a git push, you trigger the freistilbox deployment process. This process updates the application code on each of your boxes. It also does everything that’s necessary to integrate your application with the hosting stack. The details of this integration are defined in a configuration file named Boxfile. It tells freistilbox how to integrate your application into the hosting environment.

Location and format

The Boxfile is in YAML format and must be located in the topmost directory of your application repository.

Because we have to adapt the Boxfile behaviour from time to time, we recommend setting the Boxfile version explicitly:

version: 2.0

Changing the format version of an existing Boxfile will probably result in a different deployment behaviour that needs to be addressed. Please refer to our detailed Boxfile documentation for the specifics.

Environment-specific files

Modern software workflows include developing and testing in multiple staging environments, and freistilbox supports these workflows. In order to do so, it has to solve the following problem: All staging websites will be deployed from the same Git repository but require different settings for the database connection, among other things. That’s why the Boxfile allows you to declare certain files in your code base as specific for a single deployment stage.

For starters, we’ll only use the “production” stage, the website instance that’s aimed at the public. And to keep things simple, we’ll declare only one file as environment-specific: the main configuration file of your application. Later, you can lean about all the details in the Boxfile documentation.

Drupal

Drupal’s configuration by default lives in sites/default/settings.php. In the Boxfile, we tell freistilbox that docroot/sites/default/settings.php is going to vary between staging environments, and that in “production”, we’d like to have the file settings.production.php (in the same directory) take its place:

env_specific_files:
  docroot/sites/default/settings.php:
    production: settings.production.php

Notice that we won’t have to repeat the full path for each environment-specific file name; freistilbox assumes that all variants live in the same directory together.

WordPress

In a similar fashion, we can make the WordPress configuration file environment-specific:

env_specific_files:
  docroot/wp-config.php:
    production: wp-config.production.php

Shared folders

The “shared” in “shared folders” means they’re shared by all the servers that deliver your website content on freistilbox. They’re not shared between different websites. That your web application runs on multiple servers at the same time is one of the most important differences between freistilbox and conventional hosting. While your code base is copied to each of these “boxes”, as we lovingly call them, asset files that are created by your application need to be stored at a central place where they’re available to all boxes. Where these asset files are located in the file system differs from CMS to CMS and from website to website. That’s why the Boxfile lets you define these locations yourself.

Let’s take this Boxfile section:

shared_folders:
  - docroot/sites/default/files

As you can tell from the path sites/default/files, this section is from a Boxfile of a Drupal installation. With this configuration, the deployment process will set up your application’s file system in such a way that everything under sites/default/files will reside on the shared file storage.

Armed with this knowledge, you should be able to guess how the shared_folders section for a WordPress application should look like…

shared_folders:
  - docroot/wp-content/uploads

The shared folders you declare in the Boxfile are created automatically by our deployment process. That’s why it’s important that your application repository does not contain these directories. You can prevent them from being added accidentally by telling Git to ignore them.

Examples

This is how a basic Boxfile for Drupal would look like. It defines one shared folder for asset files and two variants of .htaccess and application configuration, one for the “production” environment and one for “testing”:

version: 2.0
shared_folders:
  - docroot/sites/default/files
env_specific_files:
  docroot/.htaccess:
    production: .htaccess.production
    testing: .htaccess.testing
  docroot/sites/default/settings.php:
    production: settings.production.php
    testing: settings.testing.php

And this is a version for WordPress:

version: 2.0
shared_folders:
  - docroot/wp-content/uploads
env_specific_files:
  docroot/.htaccess:
    production: .htaccess.production
    testing: .htaccess.testing
  docroot/wp-config.php:
    production: wp-config.production.php
    testing: wp-config.testing.php

Next: Let’s set up the platform services your web application is going to need!