Cactus is a simple but powerful static website generator using the Django template system. Cactus also makes it easy to develop and deploy your site to S3 directly.
Cactus is based on the idea that most dynamicity on websites these days can be done using Javascript and external services while the actual site can stay static. Still, it's nice to use a well known system like Django to generate your site so you can use the template system and other goodies. The static output allows for very fast and easy hosting, especially combined with a cdn like Amazon Cloudfront. More discussion about this at hacker news
Alternatives to Cactus are Hyde and Jekyll but I wanted to build something simpler our in-house designers at Sofa could use more easily.
http://docs.enstore.com/ - Enstore documentation website
First install Cactus with the following one liner
curl -L https://raw.github.com/koenbok/Cactus/master/install.sh | sh
If you saw no errors, you can now generate a new project like this
cactus.py ~/www.mysite.com create
The path should now contain a basic project layout that you can start editing. To generate your site from source run:
cactus.py ~/www.mysite.com build
This will render your site to [path]/build. But you can also fire up a small webserver that continuously previews your site while building. This should automatically open your browser and preview the site. You can stop the server with control-c.
cactus.py ~/www.mysite.com serve
Once you are ready to deploy your site to S3 you can run the following. You will need your Amazon access keys. If you don't have one yet read how to get one here and here You will also have to come up with an available bucket name for S3.
cactus.py ~/www.mysite.com deploy
Voila. Your Django generated website hosted on S3 generated by Cactus!
You can install Cactus using this one liner in the terminal. It will download cactus.py, move it to your /usr/local/bin path, make it executable and install the python dependencies.
curl -L https://github.com/koenbok/Cactus/raw/master/install.sh | sh
You can create a new project by generating a new project stucture like this. Make sure the destination folder does not exist yet.
cactus [path] create
If you did not see any errors, the path you pointed to should now look like this.
- build Generated site (upload this to your host)
- pages Your actual site pages
- index.html
- sitemap.xml
- robots.txt
- error.html A default 404 page
- templates Holds your django templates
- base.html
- static Directory with static assets
- images
- css
- js
- extras
- hooks.py Optional hooks to extend building, deploying
- render.py Allows for custom page contexts and modification at render time
- templatetags.py Holds custom django template tags
After generating your site you can start building by adding pages to contents, which can rely on templates. So for example if you want a page /articles/2010/my-article.html
you would create the file with directories in your pages folder. Then you can edit the file and use django's template features.
When you build your site it will generate a static version in the build folder that you can upload to any host. Basically it will render each page from your pages folder, copy it over to the build folder and add all the static assets to it so it becomes a self contained website. You can build your site like this:
cactus [path] build
Your rendered website can now be found in the [path]/build folder. Cactus can also run a small webserver to preview your site and update it when you make any changes. This is really handy when developing. You can run it like this:
cactus [path] serve
Cactus makes it easy to relatively link to pages and static assets inside your project by using the standard context variables STATIC_URL and ROOT_URL. For example if you are at page /blog/2011/Jan/my-article.html
and would like to link to /contact.html
you would write the following:
<a href={{ ROOT_URL }}/contact.html>Contact</a>
Optionally you can add variables to the context per page, by modifying the context function in render.py
TODO
Cactus can deploy your website directly to S3, all you need are your Amazon credentials and a bucket name. Cactus remembers these in a configuration file name config.json to make future deploys painless. The secret key is stored securely in the Keychain or similar services on other OSs.
cactus [path] deploy
After deploying you can visit the website directly. You can find a deploy log at [site url]/versions.txt. When you add a CloudFront CDN, Cactus also will automatically expire all changed files at the edge locations. This may take up to 15 minutes.
Cactus will auto generate a robots.txt and sitemap.xml file for you based on your pages. This will help bots to index your pages for Google and Bing for example.
Before deploying you could compress your Javascript and CSS using for example Google Closure and CSSMin for even more performant sites.