Responsive staging server based on Dokku post


In order to speed up a build process we have to automate. But this requires from us a devops knowledge and experience which we often don’t have. What would it be if we could do that much simpler than it is expected? In the article I will show you how to setup your app on the dokku which is installed on the server. I’m not able to cover the whole topic, so feel free to update this instructions as needed or ask using comments.


What is dokku?

Docker powered mini-Heroku. The smallest PaaS implementation you've ever seen. Sponsored by our friends at Deis.

More info:

So… Dokku is a service which runs your app for you using docker and linux containers.

How does it work?

In order to run your app on the dokku/heroku you have to customize configuration. Please read the instructions below. It’s so simple!

Getting started

This example is based on PHP project using symfony2 app. Of course you can run any other frameworks and technologies.

Step 1

Visit a heroku page with PHP instructions: There you can find an instruction how to configure the environment. I’ll guide you through this process.

By default dokku is choosing a buildpack based on your project structure e.g. if composer.json file exists, then PHP is chosen.

In some cases it can cause problem if your project is written in PHP but uses NodeJS. How to resolve this issue? You have to choose buildpack from official list:

Step 2 - choose buildpack

In our case it’s a PHP buildpack (buildpack is kind of automated build process manager), If you want to use PHP with NodeJS (like bower, npm etc.), you have to use multi-buildpack. In order to configure that, you have to create .env file with the following content:


An extra configuration for advanced app using two technologies like php, nodejs once

Or if you want to use PHP with nodejs (bower etc.) then .env should look like


and an extra file with buildpacks order .buildpacks

Remember that the last buildpack is responsible for publishing.

Step 3 - configure vhost, webserver

In order to choose between nginx/apache server you have to create Procfile file in root directory with the following content


web: vendor/bin/heroku-php-apache2 web/


web: bin/heroku-php-nginx -C nginx_app.conf web/

and sample nginx_app.conf:

location / {
    # try to serve file directly, fallback to rewrite
    try_files $uri @rewriteapp;

location @rewriteapp {
    # rewrite all to app.php, you can replace app.php with index.php
    rewrite ^(.*)$ /app.php/$1 last;

Step 4 - updatating composer.json

The last thing which you have to configure is composer.json First of all, you should know which PHP extensions you need. More info here:

First, add to a require section following dependencies:

"php": ">=5.6.*",
"ext-mbstring": "*",
"ext-intl": "*",
"ext-apcu": "*",
"ext-gd": "*"

These extensions enable:

  • mbstring,
  • intl,
  • apcu and
  • GD

After adding extensions we have to update post-install-cmd, and post-update-cmd tasks. Replace the post-install-cmd and post-update-cmd sections by:


If you want to run some custom scripts after install/update, you should add compile section under a scripts section e.g.

"php app/console doctrine:schema:update --force --env=prod",
"php app/console doctrine:fixture:load --env=prod --no-debug",
"rm -rf app/cache/prod/*"

The last section which should be configured is extra. We will configure what should happen during the build process e.g. env mapping, etc.

It should look like that:

"extra": {
    "symfony-app-dir": "app",
    "symfony-web-dir": "web",
    "symfony-assets-install": "relative",
    "incenteev-parameters": {
      "file": "app/config/parameters.yml",
      "env-map": {
        "database_host": "DB_HOST",
        "database_user": "DB_USER",
        "database_password": "DB_PASS",
        "database_name": "DB_NAME",
        "database_port": "DB_PORT"
    "branch-alias": {
      "dev-master": "2.7"
    "heroku": {
      "php-config": [

Step 5 - how to publish the app

Before you start, you should configure ssh for staging server. You can find SSH key in the /etc dir under app root

ssh apps:create "demo-app"
ssh mysql:delete "demo-app"
ssh mysql:create "demo-app"
ssh mysql:link "demo-app"
git remote add staging 
git push --force staging master

Categories: devops, php

Tags: docker, dokku, heroku, cloud, php, staging