Starting a blog with running in docker behind haproxy

I'm currently reworking some of my infrastructure and feel the need to take notes on what I'm doing. This is going to be my technical blog where I take those notes. If I'm the only reader it still serves a purpose.

I once had a tech-blog over at posterous which just disappeared when twitter bought them. Not going to let that happen again, so this time I'm going to host it myself.

This blog is served by a ghost instance running on my wardrobe server. See

To startup this blog I did the following:

On my ReadyNAS (RAID 1) I created a new folder shared with NFS simply called "ghost" - shared only to which is my main server. This by clicketiclicking.

I want my data to live on the NAS which I consider "my safe zone" while my actual main server should be replaceable.

On my main server I first mounted it on /var/lib/ghost:

sudo mount -t nfs /var/lib/ghost

and in /etc/fstab:   /var/lib/ghost   nfs    auto  0  0

Then I started ghost as a docker container:

sudo docker run -d --name -e NODE_ENV=production -p 2368:2368 -v /var/lib/ghost:/var/lib/ghost ghost

The above means:

  • -d run in daemon mode (not foreground)
  • --name give it a name for future reference
  • -e NODE_ENV=production an environment variable that ghost uses to run in production mode
  • -p 2368:2368 map port 2386 in the host to 2368 on the container. 2368 is simply ghost's standard port.
  • -v /var/lib/ghost:/var/lib/ghost map the folder path /var/lib/ghost on the host (where I mounted my share) to the path /var/lib/ghost on the container (which is the standard place).
  • ghost is simply the name of the docker image I want to run:

In my haproxy config I added a simple backend:

   acl host_blog hdr(host) -i
   use_backend ghost if host_blog
backend ghost
    mode http
    option forwardfor
    http-request set-header X-Forwarded-Port %[dst_port]
    http-request add-header X-Forwarded-Proto https if { ssl_fc }
    option httpchk HEAD / HTTP/1.1\r\nHost:localhost
    server ghost_docker

Soft reload:

sudo service haproxy reload

I then fixed up the ghost config /var/lib/ghost/config.js:

config = {
    // ### Production
    // When running Ghost in the wild, use the production environment.
    // Configure your URL and mail settings here
    production: {
        url: '',
        mail: {
              transport: 'SMTP',
              options: {
                  service: 'Mailgun',
                  auth: {
                      user: '', // mailgun username
                      pass: 'xx'  // mailgun password
        database: {
            client: 'sqlite3',
            connection: {
                filename: path.join(process.env.GHOST_CONTENT, '/data/ghost.db')
            debug: false

        server: {
            host: '',
            port: '2368'

        paths: {
            contentPath: path.join(process.env.GHOST_CONTENT, '/')

and reloaded my ghost instance:

sudo docker reload

And then I headed here to write this up :)


Just did an update from 0.6-something to latest 0.7-something to 0.11-something. Just did a snapshot of content on nas and then:

sudo docker stop
sudo docker rm
sudo docker pull ghost
sudo docker run -d --restart unless-stopped --name -e NODE_ENV=production -p 2368:2368 -v /var/lib/ghost:/var/lib/ghost ghost  

Maybe this is helpful for someone, probably not :)

I'm mainly going to use this blog to write down my technical work on stuff that is otherwise hard to track and feel a sense of progress on.

Next up will probably be describing moving from nginx to haproxy for my proxying needs. Stay tuned!