Upgrade to git 2.5.0 on Ubuntu


Git, kickass distributed VCS

Running an Ubuntu 12.04 on a 2008 laptop (which I should change, but didn’t find a decent replacement yet) means that sometimes I’m not getting the latest software available by default.
For example, I just figure out that my git version was 1.9.1, while the latest available, ATOW, is 2.5.0, so I have decided to upgrade.

Conveniently there is a ppa that provides the latest and the greatest version of git for Ubuntu. Enable it and you will have the latest git running on your system:

sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git

Check you have the latest

$ git --version
git version 2.5.0

Now the big question: Is upgrading really necessary? I do not really know. However being a person that creates software, I can tell you that running the most up-to-date system and software is, in most cases, a good idea.

Pandas best kept secret

Pandas by default limits the number of printing character to 80. This is good and basically suits most of the use-cases. However, sometimes, you have either very long names for your dataframe columns, or you have lots of columns, which results on having your dataframe splitted in several lines, while half of our big screen it’s not used at all. That’s quite a lot of real estate thrown away for not good reason and it makes a tad more complicated to read it.

You can live with it, and all will be fine, or you can change it!
I always knew that there was an easy way to change this and avoid to have the line being splitted on the new line. Today I’ve researched and found it, and I am sharing here to remember it!

Just import the module and bump the width to 180 (default is 80)

import pandas as pd
pd.options.display.width = 180


The result is pretty cool.

Consider this dataframe:

import pandas as pd
df = pd.DataFrame({"very_long_column_name_for_example_purposes1" : [1,2,3], "very_long_column_name_for_example_purposes2": [4,5,6], "very_long_column_name_for_example_purposes3": [1,2,3]})

You can go from this:

pandas dataframe 80 width

pandas dataframe 80 width


To this (click on it to see it in full size):

Pandas dataframe with 180 width

Pandas dataframe with 180 width

Upgrading dokku to 0.3.22: some gotchas

but than I write about it

but then I write about it

I’ve upgraded dokku to the latest master release, to make sure I was running the latest version.

The reason for the upgrade was that I wanted to install supervisord plugin, so when I have to reboot my server due to an upgrade, all my application will come back to life automatically.

After the upgrade of dokku, all my container where down, so I’ve launched the command to rebuild all of them:

dokku ps:rebuildall

Unfortunately this didn’t work as expected.

My web containers (running three apps: django/python, flask/python, wordpress/php) got deployed as expected, instead my databases did not come back to life.

The two plugins I am using to run my databases are: dokku-pg-plugin and dokku-md-plugin.

While both plugins do not offer a clear way to restart the databases containers, I think I found out a way that worked for me as a workaround. It’s different for each plugin.

For the mariadb you have to fake to re-create the database, which will use your old database container and just re-attach to it.

dokku mariadb:create <olddbname>

For the postgresql instead, you have to re-link the old database:

dokku postgresql:link <myapp> <mydb>

Each of this command should trigger an instant redeploy, and your application should be back online.

One thing to know: if you stop a command execution with a Control-C, you may leave your application in a blocked state. If you run a rebuild or any other command, you may found out saying “Error your application is locked”. To get rid of that go on your server and blow away the /home/dokku/app_name/.build.lock file.

Watch out: the name of the file and/or error could be different, I just recall from memory.

Switch private repo from github to gitlab

Hello gitlab

Hello gitlab

Github: the good part

Github is awesome for opensource software. The collaboration, the audience, and the integration offered right now (July 2015) is very good.

You want your opensource projects to be on github, because of SEO and the ability to have them found. The several features offered, like the documentation integration, the Pull Request and so forth are just too good. I have got several projects there, and you can browse them here.

Github: the expensive part

However, if you are looking to host there also your private repo, it’s when github is not any more what you are looking for.

The major problem they have is their price structure. The micro plan, is 7$ for 5 repos, and than it’s 12$ for 10. It gets expensive very quickly.

Until today I used to pay for a micro plan. However yesterday I’ve started another project, I have created a repo for it, and than I wanted to push it online in private mode. But it was my six repos. Either I was going to opensource it, or I had to increase my plan from 7$ to 12$.

All these repos are from personal project, that I may not develop anymore, which however I don’t want to opensource and I cannot archive either. The number of collaborators on these repo is either 0 or 1 at most. I think if they were offering unlimited private repository, with small number of collaborators I could have considered to stick with them for my private repo.

Not an option, so I had a look around.

Looking for alternative: Bitbucket or Gitlab?

The big competitor of github is of course bitbucket. Back in the days bitbucket was supporting only mercurial, but than they also integrated the support for git. So you could put your project there, and than be happy. Their pricing structure just count the number of collaborators in a project, so in my case I can have all my repos with the free account.

However, it’s a bit of time that we use at work a self-hosted gitlab , which it served me pretty well so far, and I love the slick integration with the GitlabCI.

GitLab is very similar to github, and offers similar features: once you know that Pull Request are called Merge request, you’re golden.

The cool thing is there is an hosted version, where you have as many as you want private and public repos.

At the end I decided to got for gitlab, due to the integration with the Gitlab CI, which will give me the ability to run tests for all my private repositories, given the fact I provide a runner.

Of course all my opensource repo swill stay on github, and in case I will opensource some project I will just migrate them on github.

As I said, If there was an Indie developer price point, (unlimited private repos with small number of collaborators for 7$), I was going to stay on github and be happy with that, however given the circumstances and the automatic integration with the CI, Gitlab is my choice for now.

Handpicked wordpress plugins for your self-hosted wordpress blog

A nice pic of a boat on a lake. Not really relevant with the post

A nice pic of a boat on a lake. Not really relevant with the post, but still pleasing


With the recent move from to a self hosted blog, I had the possibilities to pick some plugins that really have helped me to set-up and make the blog a tad bit more customized and close to my needs.

I’m gonna list them here, with a small description so it may be handy for someone else that is researching the subject as well

The handpicked Plugins

  • Worpress Importer This plugins lets you import your old blog in the new wordpress installation. Make sure you have `import everything` selected when you do the import, so all the images and attachments are happily downloaded and imported as well.You have to make sure you have increased the max upload file on you server, if you are importing a very big file. This is done changing you php configuration and the limit of max upload either in nginx or apache, depending what you are using. More info how to do this here.
  • Next plugin you want to get is JetPack from wordpress. This plugin has a lot of feautures that you can activate as you see fit. My favourite onese are: publicize (automatic sharing on G+, Facebook and Twitter), Moitor, that keeps an eye if your site goes offline and Photon, to serve images quicker from their CDN.
  • Spam is always a bad thing, and BruteProtect is a way to pretect yourself from it. You just activate it, and it is going to do is job.
  • Once you move to self-hosted blog, you have to manage also the backup for your site.
    A very handy plugin is UpdraftPlus – Backup/Restore, which gives you the ability to:

    1. Make automatic backup of your blog, including database, images, themes and plugins
    2. Upload you backup to a third party service, like for example DropBox
    3. Configure a schedule for your backup, with also a number of old backups you want to keep. My pick was 10 backups, with a weekly schedule.
    4. Restore your old backups with a single click.

    It’s very well designed and it works like a charm. Totally recommended

  • To make sure you write to the point, and keep your post interesting also for search engines, Worpress SEO is a good candidate. Although the title parser looks only for one keyword, so there will be always a disagreement between the plugin and a sane title, it’s extremely handy to keep sitemap up to date and automatically signal google when a new post pop up. Handy tool.
  • Due to the amount of code I tend to post, a nice way to present it, with proper highlighting it’s useful to have. For this I’ve picked Enlighter – Customizable Syntax Highlighter, which does a very good work, comes with themes to nicely integrate with the current palette of your site.
  • Last but not least, the Disqus Comment System is a nice and, according to me, superior way to enable comments on your post. It offers an import function to transfer all your old comments on the disqus system, and it’s pretty nice thing to have.

So there it is, some of the plugins I’m using on this website, which you may, or may not, find useful for your own site.



Dokku Environment variable special characters

Note to self: with dokku special bash character in environment variable do not get parsed properly, and they break everything. Do not use them.

For example:

# this will fail

# this won't

The amount of randomness involved is smaller. Most likely upgrading to 0.3.18 could fix this.

It took me 2 hours to figure this out and my push to my dokku server where denied.

Clean up old kernels

Do you want to save 15 Gb of space?

I have an old laptop from 2008, which is running ubuntu. Everytime a new kernel is released, this gets installed, however the older kernels and their image do remain available and they do not get automatically uninstalled. I guess this is a security feature, however if the installation is done only once, and years and years of new kernels are stacked, the space taken may start to be excessive and also big enough that reclaim it is a good idea.

Starting point

As you can see from below, my / partition was quite full

mattions@triton:~$ df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/sda1                 46G   43G  1.3G  98% /
udev                     2.0G  4.0K  2.0G   1% /dev
tmpfs                    396M  1.1M  395M   1% /run
none                     5.0M  8.0K  5.0M   1% /run/lock
none                     2.0G  260K  2.0G   1% /run/shm
cgroup                   2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/sda6                176G  166G  1.7G 100% /home
/home/mattions/.Private  176G  166G  1.7G 100% /home/mattions

The images stored in the boot partition were also taking quite a bit of space:

mattions@triton:~$ du /boot -sh
2.3G /boot

Purge the old kernels

To purge the old kernels, you can either do it by hand via ubuntu software center, or by synaptic, or use a script to do it for you. After a bit of googling, I’ve discovered the following script, aptly named purge-old-kernels, which I have also uploaded as a gist on git, just not to loose. Feel free to download it and use it if you want

When I ran the script, this is the list of the kernels that will be eliminated in my case (yours maybe will differ):

mattions@triton:~$ sudo bash Desktop/ Reading package lists... Done Building dependency tree Reading state information... Done The following packages were automatically installed and are no longer required: linux-headers-3.13.0-32 linux-headers-3.13.0-34 linux-headers-3.13.0-35 linux-headers-3.13.0-43 linux-headers-3.13.0-39 linux-headers-3.13.0-46 linux-headers-3.13.0-49 linux-headers-3.11.0-17 linux-headers-3.11.0-18 Use 'apt-get autoremove' to remove them. The following packages will be REMOVED linux-generic-lts-saucy* linux-headers-3.11.0-17-generic* linux-headers-3.11.0-18-generic* linux-headers-3.11.0-19-generic* linux-headers-3.11.0-20-generic* linux-headers-3.11.0-22-generic* linux-headers-3.11.0-23-generic* linux-headers-3.11.0-24-generic* linux-headers-3.11.0-26-generic* linux-headers-3.13.0-32-generic* linux-headers-3.13.0-33-generic* linux-headers-3.13.0-34-generic* linux-headers-3.13.0-35-generic* linux-headers-3.13.0-36-generic* linux-headers-3.13.0-37-generic* linux-headers-3.13.0-39-generic* linux-headers-3.13.0-43-generic* linux-headers-3.13.0-44-generic* linux-headers-3.13.0-45-generic* linux-headers-3.13.0-46-generic* linux-headers-3.13.0-48-generic* linux-headers-3.13.0-49-generic* linux-headers-3.13.0-51-generic* linux-headers-3.13.0-52-generic* linux-headers-3.2.0-23-generic* linux-headers-3.2.0-24-generic* linux-headers-3.2.0-25-generic* linux-headers-3.2.0-26-generic* linux-headers-3.2.0-27-generic* linux-headers-3.2.0-29-generic* linux-headers-3.2.0-30-generic* linux-headers-3.2.0-31-generic* linux-headers-3.2.0-32-generic* linux-headers-3.2.0-33-generic* linux-headers-3.2.0-34-generic* linux-headers-3.2.0-35-generic* linux-headers-3.2.0-36-generic* linux-headers-3.2.0-37-generic* linux-headers-3.2.0-38-generic* linux-headers-3.2.0-39-generic* linux-headers-3.2.0-40-generic* linux-headers-3.2.0-41-generic* linux-headers-3.2.0-43-generic* linux-headers-3.2.0-44-generic* linux-headers-3.2.0-45-generic* linux-headers-3.2.0-48-generic* linux-headers-3.2.0-49-generic* linux-headers-3.2.0-51-generic* linux-headers-3.2.0-52-generic* linux-headers-3.2.0-53-generic* linux-headers-3.2.0-54-generic* linux-headers-3.2.0-55-generic* linux-headers-3.2.0-56-generic* linux-headers-3.2.0-57-generic* linux-headers-3.2.0-58-generic* linux-headers-3.2.0-59-generic* linux-headers-3.2.0-60-generic* linux-headers-3.2.0-61-generic* linux-headers-3.2.0-63-generic* linux-headers-3.2.0-64-generic* linux-headers-3.2.0-65-generic* linux-headers-3.2.0-67-generic* linux-headers-3.2.0-68-generic* linux-headers-3.2.0-69-generic* linux-headers-3.2.0-70-generic* linux-headers-3.2.0-74-generic* linux-headers-3.2.0-75-generic* linux-headers-3.2.0-76-generic* linux-headers-3.2.0-77-generic* linux-headers-3.2.0-79-generic* linux-headers-3.2.0-80-generic* linux-headers-3.2.0-82-generic* linux-headers-3.2.0-83-generic* linux-headers-3.8.0-36-generic* linux-headers-generic-lts-saucy* linux-image-3.11.0-17-generic* linux-image-3.11.0-18-generic* linux-image-3.11.0-19-generic* linux-image-3.11.0-20-generic* linux-image-3.11.0-22-generic* linux-image-3.11.0-23-generic* linux-image-3.11.0-24-generic* linux-image-3.11.0-26-generic* linux-image-3.13.0-32-generic* linux-image-3.13.0-33-generic* linux-image-3.13.0-34-generic* linux-image-3.13.0-35-generic* linux-image-3.13.0-36-generic* linux-image-3.13.0-37-generic* linux-image-3.13.0-39-generic* linux-image-3.13.0-43-generic* linux-image-3.13.0-44-generic* linux-image-3.13.0-45-generic* linux-image-3.13.0-46-generic* linux-image-3.13.0-48-generic* linux-image-3.13.0-49-generic* linux-image-3.13.0-51-generic* linux-image-3.13.0-52-generic* linux-image-3.2.0-23-generic* linux-image-3.2.0-24-generic* linux-image-3.2.0-25-generic* linux-image-3.2.0-26-generic* linux-image-3.2.0-27-generic* linux-image-3.2.0-29-generic* linux-image-3.2.0-30-generic* linux-image-3.2.0-31-generic* linux-image-3.2.0-32-generic* linux-image-3.2.0-33-generic* linux-image-3.2.0-34-generic* linux-image-3.2.0-35-generic* linux-image-3.2.0-36-generic* linux-image-3.2.0-37-generic* linux-image-3.2.0-38-generic* linux-image-3.2.0-39-generic* linux-image-3.2.0-40-generic* linux-image-3.2.0-41-generic* linux-image-3.2.0-43-generic* linux-image-3.2.0-44-generic* linux-image-3.2.0-45-generic* linux-image-3.2.0-48-generic* linux-image-3.2.0-49-generic* linux-image-3.2.0-51-generic* linux-image-3.2.0-52-generic* linux-image-3.2.0-53-generic* linux-image-3.2.0-54-generic* linux-image-3.2.0-55-generic* linux-image-3.2.0-56-generic* linux-image-3.2.0-57-generic* linux-image-3.2.0-58-generic* linux-image-3.2.0-59-generic* linux-image-3.2.0-60-generic* linux-image-3.2.0-61-generic* linux-image-3.2.0-63-generic* linux-image-3.2.0-64-generic* linux-image-3.2.0-65-generic* linux-image-3.2.0-67-generic* linux-image-3.2.0-68-generic* linux-image-3.2.0-69-generic* linux-image-3.2.0-70-generic* linux-image-3.2.0-74-generic* linux-image-3.2.0-75-generic* linux-image-3.2.0-76-generic* linux-image-3.2.0-77-generic* linux-image-3.2.0-79-generic* linux-image-3.2.0-80-generic* linux-image-3.2.0-82-generic* linux-image-3.2.0-83-generic* linux-image-3.8.0-36-generic* linux-image-generic-lts-saucy* 0 to upgrade, 0 to newly install, 149 to remove and 1 not to upgrade. After this operation, 13.0 GB disk space will be freed. Do you want to continue [Y/n]?


After I’ve choosen yes, it took quite a bit but at the end it was worth it

mattions@triton:~$ df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/sda1                 46G   28G   17G  63% /
udev                     2.0G  4.0K  2.0G   1% /dev
tmpfs                    396M  1.1M  395M   1% /run
none                     5.0M  8.0K  5.0M   1% /run/lock
none                     2.0G   37M  1.9G   2% /run/shm
cgroup                   2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/sda6                176G  166G  1.7G 100% /home
/home/mattions/.Private  176G  166G  1.7G 100% /home/mattions

And the Boot partition is just 70 Mb:

mattions@triton:~$ du /boot -sh
70M /boot

So from 45 Gb to 25 GB, and the boot partition itself from 2.3 Gb to 70 Mb.

Pretty good I think.

Google Chromecast review


Google Chromecast is a nice hdmi dongle which you can connect to the tv and use it to stream all kinds of things from your phone, tablet and computer.

It is now from December that I have one, and I can say I am very pleased with it.

How does it work

The setup is pretty straightforward: you just need to connect to the tv, follows the screen instructions, and you are off to the races!

The dongle is controlled from your phone, and there are several apps that do interface with it directly, from example Netflix and Youtube.

The interesting bit is that your phone is controlling the dongle, like a remote control, however is not a screen share. Therefore you can use the phone at the same time you are streaming to the tv. This is a massive battery saver and gives you the ability to read the odd email if you need to, without interrupting the streaming.

Using google-chrome, and installing an extension for google chromecast, you have also the possibility to share any tab on the tv directly, which is very handy if you are looking at an embedded video.

Last but not least it is possible to share pictures and videos on the tv, a feature I used in a bunch of occasions.


I honestly think it’s a good value for money, and if you are watching youtube or netflix and you want an easy way to move it to the tv, the  Google Chromecast is what you want.


Hosting wordpress with dokku on digital ocean


In this post I’ll describe how to host a wordpress blog on digital ocean and using dokku to deploy it.

As I have described in my last post my blog was hosted since few days ago on but there were two things that always annoyed me: the fact that I couldn’t use disqus for the comments and the annoying thing that wordpress was showing ads with me getting no money from it. My choices were either to pay money to get rid of them, or leave them be. (I was already paying for 13.00$ a year to have the blog at my custom domain.)

The other factor that made me change my mind about self-hosting, was that heroku is changing the free dyno in a not so free anymore dyno.

So there is only one decent response to this situation, explained in clear text by the image below:


let's dokku all the things

let’s dokku all the things

Dokku and co.

So you may think… what is dokku, what is heroku, what is a dyno, why on earth I ended up here?

Quick background information: Heroku is a platform that makes deployment very easy, and so far was the way to go solution to set up a small website. If your webproject is structured in a proper way (follows the buildpack spec) you can deploy with a simple git push.

This is extremely cool for people who do not want to install a webserver, or just activate some module on some obscure config file. Basically you can have the site up and running in no time. On top of this dokku uses docker as technology to run the instantiation of the website, which means it will be run in an isolated and lightweight way, without interfering with other apps running on the same host (a part of sharing resources). And you can scale up memory and CPU at least at will. So if you end up on hacker news or reddit, you could just bump it up and sustain more traffic. This is at least the theory.

Right now I’m working on a website, based on django which I’ve already deployed on heroku, but which I will transport on dokku, and I’ve taken the opportunity to host wordpress on my VPS as well, still using dokku. If you do not have a Virtual Private Server, I suggest to get one from Digital Ocean, ’cause they are pretty sweet.

How to get wordpress going on dokku

The important things you must know to host wordpress on dokku:

  • You need to create a database
  • You need to bump up the upload file size on your nginx configuration and php (to import your old blog, if you have one)
  • You need to make sure nginx accepts big post request to have JetPack working

To get Jetpack plugin fully working, you have also to tell php is running on port 80, otherwise he will get confused. You can do that editing your wp-config.php as shown below.

Ok so this are the steps, put together following several guides on the internet: mikai, ahmautom and shincoding. Note: at the time of writing the previous links are a bit outdated and I have made some modifications. So here it is how to host a wordpress blog on dokku updated to May 2015.

So these are the steps I’ve followed to get this blog going.

  1. Get the WordPress repo
  2. Setup the repo for heroku-php-buildpack
  3. Deploy check (no db connection)
  4. Add Database and volumes for plugins
  5. Follow the installation creating a new user
  6. Profit

Step 1: Get the WordPress repo

git clone blog
cd blog
git checkout -b production # Create a custom production branch for our modification

Step 2: Setup WordPress to be served ad heroku-php application

You need to create a composer.json. At the moment mine looks like this:


"require": {
"php": "~5.6.0",
"ext-mbstring" : "*"

"scripts": {
"post-install-cmd": [
"chmod -R 777 wp-content"

I’m not sure about the scripts part, however it works, so I’ve left it in.

Create a Procfile with the following content:

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

And add to the repo a nginx_app.conf file with:

# Custom nginx configuration #

# WordPress permalinks
location / {
index index.php index.html;
try_files $uri $uri/ /index.php?$args;


# Everything below here is optional, but recommended

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Deny access to any files with a .php extension in the uploads directory
# Works in sub-directory installs and also in multisite network
location ~* /(?:uploads|files)/.*.php$ {
deny all;

client_max_body_size 100M;

#jetpack connection
fastcgi_buffers 8 32k;
fastcgi_buffer_size 64k;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;

# enable gzip compression
gzip on;
# Minimum file size in bytes (really small files aren’t worth compressing)
gzip_min_length 1000;
# Compression level, 1-9
gzip_comp_level 2;
gzip_buffers 4 32k;
gzip_types text/plain application/javascript text/xml text/css image/svg+xml;
# Insert `Vary: Accept-Encoding` header, as specified in HTTP1.1 protocol
gzip_vary on;
# end gzip configuration

# Set time to expire for headers on assets
location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;

# Sitemap url, for WordPress SEO plugin
#rewrite ^/sitemap_index.xml$ /index.php?sitemap=1 last;
#rewrite ^/([^/]+?)-sitemap([0-9]+)?.xml$ /index.php?sitemap=$1&amp;sitemap_n=$2 last;

Copy the wp-config.php.sample into wp-config.php and make sure you change all the variables into env-variables:

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', getenv('DB_NAME'));
/** MySQL database username */
define('DB_USER', getenv('DB_USER'));
/** MySQL database password */
/** MySQL hostname */
define('DB_HOST', getenv('DB_HOST') . ":" . getenv('DB_PORT'));
/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');
/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

/** Server settings for Jetpack */

* Authentication Unique Keys and Salts.
* Change these to different unique phrases!
* You can generate these using the {@link secret-key service}
* You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
* @since 2.6.0
define('AUTH_KEY', getenv('AUTH_KEY'));
define('SECURE_AUTH_KEY', getenv('SECURE_AUTH_KEY'));
define('LOGGED_IN_KEY', getenv('LOGGED_IN_KEY'));
define('NONCE_KEY', getenv('NONCE_KEY'));
define('AUTH_SALT', getenv('AUTH_SALT'));
define('LOGGED_IN_SALT', getenv('LOGGED_IN_SALT'));
define('NONCE_SALT', getenv('NONCE_SALT'));

Commit everything.

Let’s create the application on the server:

git remote add dokku dokku@:blog

and deploy it:

git dokku@ push production:master

This will create the application and do the first commit. If you have a domain pointing to the server where you have installed dokku, you can change you server ip with your domain ip.

If all is good you supposed to have an “Error establish connection to the database” when you try to reach the url where wordpress has been deployed.

Let’s set the salt for wordpress. Go to this URL and copy the values and set them as environment values (Do this from the server side, ’cause special character are not properly escaped when pushed on version 0.3.17 of dokku) similar to this:

dokku config:set blog AUTH_KEY='io2@kc=yepxhw+YN}Ufcl&gt;|~Fes-`k-wzOH$JP23Wv{ivhzQj#9lco7VTGxnI6|r'
dokku config:set blog SECURE_AUTH_KEY=';=.]GhJdUCjZWo-&amp;cu&gt;9-rc{8Jxk7m0h+WXcK[K7BJ$0#/.@}k~E7AK!n;:b:9+4'
dokku config:set blog LOGGED_IN_KEY='}ZwMhvKCN-.]#(?^Vm&gt;_,Lk!c90kZYzpEf7r+cw^v0nk6.mCV2eNVm]dw9.{5._u'
dokku config:set blog NONCE_KEY='Ei%OgQF)ecp:tIbW+eXx-[f^^JU,2 :)48eCPY/~rlMC=Wzt-j)ue`cJ}K&amp;9b5k0'
dokku config:set blog AUTH_SALT=txKp#s~0xI#|cFfIE)9/A/q WkIQQR;$pv,Z/|eBo..~K_[{a@l~+{I5o6&lt;~k!u'
dokku config:set blog SECURE_AUTH_SALT='V-|j%!_5,gF&lt;2JoY(^&amp;GriNM9400%[rzs
dokku config:set blog NONCE_SALT=':`)%I[j^&amp;~Ysi5bja(B

We will set the database value in the same way, but first we need to create it.

Let’s go to the next step.

Install database and volumes

Docker runs on a temporal file system and therefore all the modification made will go away when the container will be shutdown, which means at the next deployment.

The plugin for the database is the following.:

To install them, login in on your server and than

cd /var/lib/dokku/plugins

# Maria db
git clone --recursive mariadb
cd mariadb/dockerfiles
git checkout master
dokku plugins-install

You may have to run the dokku plugins-install with sudo privileges.

Create the database, give it the same name of your application, so it will automatically link.

$ ssh dokku@YOUR-SERVER mariadb:create blog

-----> MariaDB container created: mariadb/foo

User: 'root'
Password: 'RDSBYlUrOYMtndKb'
Database: 'db'
Public port: 49187

It’s necessary to have volumes connected, so the data in this volume will persist among different deployments. In particular we will make three compartments: one for the plugin we are going to install, one for the themes and one for the uploads.

Latest version of dokku (0.3.17) at the time of writing offers the ability to pass docker options, and therefore map an host directory to a container. I found out that it does not work from the client side, so you may need to run this from the server side.

dokku docker-options:add blog run "-v /opt/blog/wp-content/plugins:/app/wp-content/plugins"

dokku docker-options:add blog run "-v /opt/blog/wp-content/themes:/app/wp-content/themes"

dokku docker-options:add blog run "-v /opt/blog/wp-content/uploads:/app/wp-content/uploads"


You have to do the same operation also for the deploy stage:

dokku docker-options:add blog deploy "-v /opt/blog/wp-content/plugins:/app/wp-content/plugins" dokku docker-options:add blog deploy "-v /opt/blog/wp-content/themes:/app/wp-content/themes" dokku docker-options:add blog deploy "-v /opt/blog/wp-content/uploads:/app/wp-content/uploads"

Thanks to yazinsai for pointing it out in the comments.

Ok, now we are pretty much done!

You new a new redeploy to make sure the volumes are picked up.

ssh dokku@YOUR-SERVER ps:rebuild blog

Another Edit

If you get stuck with thumbnails not working and problems with editing your theme locally,
have a look at the comment from Suisse, that maybe can point you in the right directions.


Go to the url where your blog is now hosted and follow the wordpress installation to have it up and running automatically, with permalinks and everything else working!

© 2019 Train of Thoughts

Theme by Anders NorénUp ↑

By continuing to use the site (scrolling or clicking counts), you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.