Skip to content

Instantly share code, notes, and snippets.

@jamesward
Created August 9, 2012 16:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jamesward/3305660 to your computer and use it in GitHub Desktop.
Save jamesward/3305660 to your computer and use it in GitHub Desktop.
Den of Clojure

Heroku @ Den of Clojure


About James Ward

Java Developer since: 1997

First Programming Language: Pascal

Favorite Programming Language: x86 Assembler

Heroku Clojure Quick Start

Seven steps to the Cloud

  1. project.clj

     (defproject hello-world "0.0.1"
       :dependencies [[org.clojure/clojure "1.3.0"]
                      [ring/ring-jetty-adapter "1.0.1"]])
    
  2. src/web.clj

     (ns web
       (:use [ring.adapter.jetty :only [run-jetty]]))
     
     (defn app [req]
       {:status 200
        :headers {"Content-Type" "text/plain"}
        :body "Hello, world"})
     
     (defn -main [port]
       (run-jetty app {:port (Integer. port)}))
    
  3. Procfile

     web: lein trampoline run -m web $PORT
    
  4. Commit the files to a Git repo:

     git init
     git add Procfile project.clj src
     git commit -m init
    
  5. Create a new app on Heroku:

     heroku create
    
  6. Push the app to Heroku:

     git push heroku master
    
  7. Open the app:

     heroku open
    

Heroku Basics

So simple.

Deployment

  1. Copy git repo to Heroku:

     git push heroku master
    
  2. Heroku uses a "Buildpack" to compile code

  3. Heroku creates a "slug" file

  4. Heroku deploys "slug" onto a "dyno"

  5. Heroku starts the process

User has 0 or more Applications

Application has 1 git repository

Application has 0 or more Processes

Process is defined in a Procfile

Process named "web" can listen on one port for HTTP

Process runs on 0 or more Dynos

Dynos are isolated (LXC) and managed execution environments

Application has 0 more more external resources - Heroku Add-ons

Buildpack receives a git push and produces a "slug"

Slug contains the non-system dependencies for all Processes

Dynos are ephemeral and stateless

HTTP(s) requests are randomly routed to the "web" Dynos

$0.05 / dyno hour

750 free dyno hours per application per month

$ heroku help

Add-ons are third party cloud services for things like caching, databases, monitoring, management, etc

Noir on Heroku

Small and simple is wonderful.

  • project.clj

      (defproject hello-clojure-compojure "0.1.0-SNAPSHOT"
        :main web
        :dependencies [[org.clojure/clojure "1.4.0"]
                       [noir "1.2.1"]])
    
  • src/web.clj

      (ns web
        (:use noir.core)
        (:require [noir.server :as server]))
      
      (defpage "/" [] "hello, world")
      
      (server/start (Integer/parseInt (or (System/getenv "PORT") "8080")))
    
  • Procfile

      web: lein trampoline run
    

Heroku for Clojure

Links to help you get started.

https://devcenter.heroku.com/articles/clojure

https://devcenter.heroku.com/articles/clojure-support

https://devcenter.heroku.com/articles/clojure-web-application

https://github.com/jamesward/hello-clojure-noir

https://github.com/jamesward/hello-clojure-compojure

https://github.com/jamesward/hello-clojure-ring-jetty

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment