title: How to sneak in a static CMS
---
pub_date: 2019-09-24
---
author: Nico Schottelius
---
twitter_handle: NicoSchottelius
---
abstract:
Let's see how easy it is [to sneak in a static
CMS](https://ungleich.ch/en-us/cms/blog/2019/09/24/sneaking-in-a-static-cms/)
into an existing
dynamic CMS.
---
body:

## Introduction

To put you in the right mood for reading this article, I ask you
take some assumptions for reading this article:

Assume you are the CEO of a small IPv6, Linux and FOSS company. Assume
that some years ago you made the decision to use
[Django CMS Blog](https://github.com/nephila/djangocms-blog) for the
blog to support non-technical staff to post blog articles.

Also, for the sake of completeness, assume that you are still running
your own [private blog](https://www.nico.schottelius.org) with
[ikiwiki](http://ikiwiki.info).

## Motivation

I believe that before changing anything
([especially in IT](https://en.wikipedia.org/wiki/Not_invented_here)),
you should have a good reason for changing. So what could be
the reason for sneaking in a static CMS? The answer is relatively
easy:

* Reducing latency
* Reducing latency
* Reducing the inhibition threshold for writing blog articles

Let's have a look at each of the points in detail,
[before letting us convince
ourselves...](https://en.wikipedia.org/wiki/Not_invented_here).

### Reducing latency

One of the biggest problems for me is to wait for an web application
to *save* something. With Django CMS Blog, you have the standard
**write - save - publish flow**. So when I want to see the result, I
have to wait seconds. Depending on my distance to our blog this might
take 1 second (Europe) or about 5 seconds (South Korea). While this
does not sound like much, it **feels** very long.

While google apps (which we don't use for our blog)
like google drive (which has other issues as well)
take a different approach in *autosaving*, this also blocks if you
have a weak network link.

While it is just a few seconds, it is a huge difference between just
being able to write in [emacs](https://www.gnu.org/software/emacs/)
(yes I was converted from vim) versus writing in a browser, waiting
for the website to return.

### Reducing latency

While editing with "high" latency is a problem of the writer, latency
while loading the result is a metric that directly affects the readers
*feeling* about a website. If it takes too long to a website, you,
dear reader, are about to leave this website very fast. Even if I
write the greatest and best content, you won't like it.

So by switching to a static CMS, the dynamic processing time is
removed and pages can load as fast as the round trip time (RTT)
between the web server and you.


### Reducing the inhibition threshold for writing blog articles

Let's come to the third and maybe most important point: reducing the
inhibition threshold for writing blog articles. Let's put some
background into this: we are a small, Swiss based hosting company
loving open source. However, the emphasises is on **small**.

So we cannot (nor do we want to ) afford huge marketing / adwork / paid
advertisements. But our strategy is to **do good and talk about it**.

However if the barrier for writing and publishing is high, we won't
write much about the things we do. And I think with a static CMS,
geeks (like me) are having a much easier time to actually write a blog
entry.

## How to do it

Now let's have a look on how to sneak in a static CMS into an existing
company website. [ungleich.ch](https://ungleich.ch) is powered
by our [Django CMS](https://www.django-cms.org)
based CMS (full [source code is
online](https://code.ungleich.ch/ungleich-public/dynamicweb/)).

The Django instance is running behind nginx, which allows us to proxy
different parts of the website to different backends and to serve
static assets directly from the filesystem.

On the other hand we have a static web server named
*staticweb.ungleich.ch* that hosts various static pages.

The existing URLs of ungleich.ch should all stay as they are without
any conflict. For this reason the new static cms is placed at
**/u/**. The static pages are generated on a client machine and are
uploaded using the following Makefile snippet:

```
BUILDDIR=../ungleich-staticcms-build
DESTINATION=ungleichstatic@staticweb.ungleich.ch:/home/services/www/ungleichstatic/staticcms.ungleich.ch/www/

all: publish

publish: build permissions
	rsync -av $(BUILDDIR)/ $(DESTINATION)

permissions: build
	find $(BUILDDIR) -type f -exec chmod 0644 {} \;
	find $(BUILDDIR) -type d -exec chmod 0755 {} \;

build:
	lektor build -O $(BUILDDIR)
```

The last step to sneak in the CMS was to modify the nginx
configuration of ungleich.ch with the following snippet:

```
    location /u/ {
        proxy_pass https://staticcms.ungleich.ch;
    }
```

## What's next?

As you can see in this post, the design does not fully (*cough*) fit
the regular design of ungleich.ch. However Lektor uses jinja2, which
is very similar to what we already use in the
[existing dynamicweb
project](https://code.ungleich.ch/ungleich-public/dynamicweb/).

If you want to join the discussion about this, I invite you to our
open chat on [chat.ungleich.ch](https://chat.ungleich.ch).

And next in this blog: how to use it ;-)
