Epilis version 1 at a glance

Implementation of version 1 and how Epilis is running.

By Kostas Koutsogiannopoulos


Epilis version 1 implementation was made as an example of what's content wants to inspire.

The basic principles was:

  • Simplicity
  • Automation
  • Maintainability
  • Freedom
  • Beauty

...and all of these at lowest cost possible.

The result is more like a hosting platform for an unlimited number of web sites managed by their owners.


We relied on the excellent djangoCMS software writen in python/django framework and was easy for us to support and maintain. Users (using djangoCMS) can easily create their content from a clear interface that is functional not only from a pc but from portable devices too. The CMS is using custom "plugins" to pin every kind of content inside an available CMS "page". So we wrote our django applications in a "model - view - template" architecture using django ORM for the model, simple python for the views and minimum inherited templates for the content rendering. All this is basicaly a djangoCMS plugin that we can use and re-use inside a djangoCMS page. The environment is open source and has a number of ready to use plugins supported by a large community. It also supports multilingual content.


We used ubuntu 14.04 LTS for the operating system running as instance on Amazon's cloud. We tried to to use only the necessary of Amazon's services in order to be as portable as possible. The basic package installation and configuration was done manually:

  • python 3.4 virtual environment [django 1.8 - djangoCMS 3.2 - celery - uwsgi]
  • postgre sql
  • redis (for celery's message broker)
  • nginx
  • elasticsearch

The following repeatable operations was witten as ansible scripts:

  • Add a new site (we are describing this below)
  • Renew letsencrypt certificates
  • Application checkout from server to local development environment
  • Updated version deployment to the server (with all the dependencies)
  • Database backup

The most interesting from the above is of course how we add automaticaly a new virtual host. The script is following the tasks:

  • amazon's dns configuration (Route 53)
  • nginx configuration (add a virtual host)
  • django configuration (,
  • djangoCMS configuration (add a new site)
  • new templates upload with all the static files (optional)

After all these we have our new web site in a matter of seconds leaving us with some optional steps -for example- user management, certificate generation if we want https, elasticsearch index creation etc.

There is also an ansible script for development purpose that is using Amazon's api to create a public test environent following the tasks:

  • Create an image from the production server
  • Launch a new instance with the image just created
  • Create the necessary Amazon security groups
  • Configure the application to play in the new instance (hostname, etc.)

Served content

We gave special attention to optimize the content is served to client's browser. In production, all the content (html, javascript, css) is compressed/minified on the fly. Every page's source contains a single js file, a single css file and the html code is minified to truncate comments and spaces. As a result, our score in google insights is over 90% for all pages. Furthermore the html code served is compliant with World Wide Web Consortium, without any errors or warnings. platform design

We did not make any compromises regarding to what our designer considered beautiful. However we ended up with only three html templates all in twitter's bootstrap 3 framework for responsiveness:

  • Base template (contains Navigation bar, social section and footer)
  • Homepage template (inheriting base template)
  • Secondary page (inheriting base template)

All other artistic creations were done with the CMS application so we stayed minimal in this area too (there will be a post dedicated to graphical design soon).

View epilis's profile on LinkedIn Visit us on facebook X epilis rss feed: Latest articles