When Hugo Meets OpenShift

Learn how to run Hugo on OpenShift DIY Cartridge

ta-ching chen

3 minute read

Hexo is good, but generating speed

I used Hexo, which is written in Node.js, to generate static web files and used OpenShift Node.js cartridge to host the files. It took almost 10 sec to generate for just 5 posts. On the contrary, Hugo, written in Go, generates all static files within 1 sec. That’s 10x fast than Hexo! In the following paragraph, we’ll go through the steps to create our own OpenShift DIY cartridge and run Hugo on it!


Create An OpenShift Cartridge

  • OpenShift does not provide the cartridge for running binary, we have to create our own cartridge by OpenShift DIY .
  • Cartridge name MUST NOT contain any pattern that matches “hugo”, I’ll explain it later.
$ rhc app-create <cartridge name> diy


  • Once the cartridge is created, it will automatically clone git repo from OpenShift.
$ git rm *
$ git commit -m "Remove DIY stuff"

Download hugo binary

We need to download Hugo binary that runs on OpenShift.

$ wget https://github.com/spf13/hugo/releases/download/v0.16/hugo_0.16_linux-64bit.tgz
$ tar -zxvf hugo_0.16_linux-64bit.tgz hugo
$ rm -rf hugo_0.16_linux-64bit.tgz
$ mkdir bin/ && mv hugo bin/

Create Hugo Site

hugo new site .
echo "/public" > .gitignore
git add *
git commit -m "Adding hugo site"

OpenShift Cartridge * Script

  • .openshift/action_hooks/build
rm -rf $OPENSHIFT_REPO_DIR/public
  • .openshift/action_hooks/start

Don’t forget to modify --baseURL="http://my-base-url/" to domain name you want

# The logic to start up your application should be put in this
# script. The application will work only if it binds to
nohup $OPENSHIFT_REPO_DIR/bin/hugo \
    --bind=$OPENSHIFT_DIY_IP \
    --port=$OPENSHIFT_DIY_PORT \
    --source=$OPENSHIFT_REPO_DIR \
    --destination=$OPENSHIFT_REPO_DIR/public \
    --watch=false \
    --appendPort=false \
    --disableLiveReload=true \
    --baseURL="http://my-base-url/" \
    server |& /usr/bin/logshifter -tag diy &
  • .openshift/action_hooks/stop

We use ps -ef | grep hugo to get pid of hugo and kill it and then start the deployment process.


# The logic to stop your application should be put in this script.
if [ -z "$(ps -ef | grep hugo | grep -v grep)" ]
    client_result "Application is already stopped"
    kill `ps -ef | grep hugo | grep -v grep | awk '{ print $2 }'` > /dev/null 2>&1

When we deploy new web files, OpenShift dispatches the stop script to stop cartridge first.

# OpenShift log when we command git push
$ git push
Writing objects: 100% (5/5), 455 bytes | 0 bytes/s, done.
Total 5 (delta 3), reused 0 (delta 0)
remote: Stopping DIY cartridge
remote: Building git ref 'master', commit b17eca3
remote: Preparing build for deployment
remote: Deployment id is e3f3adf0
remote: Activating deployment
remote: Starting DIY cartridge

If cartridge naming with pattern of hugo, the process that is redeploying the application will also be killed. The only way to solve it is to create a new cartridge again.

  • Apply 755 permission
$ chmod 755 .openshift/action_hooks/*
$ git add .openshift/action_hooks/*
$ git commit -m "updating action_hooks"

Deploy Hugo to OpenShift!

  • Make sure that every step is doing right before you deploy it
$ git push


Thanks to the post on sub-pop, that’s really help me a lot!


comments powered by Disqus