commit 91ba3d70de8b2b62efcdac57f231bfe3b1778c81
Author: Andrew Tomaka
Date: Tue Mar 8 18:12:31 2016 -0500
Initial commit
diff --git a/.bowerrc b/.bowerrc
new file mode 100644
index 0000000..69fad35
--- /dev/null
+++ b/.bowerrc
@@ -0,0 +1,3 @@
+{
+ "directory": "bower_components"
+}
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..0ea0cc4
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,10 @@
+# http://editorconfig.org
+root = true
+
+[*]
+indent_style = space
+indent_size = 4
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8622f4f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+node_modules
+bower_components
+dist
+*.log
+.sass-cache
+/index.html
diff --git a/.jshintrc b/.jshintrc
new file mode 100644
index 0000000..855a9ef
--- /dev/null
+++ b/.jshintrc
@@ -0,0 +1,19 @@
+{
+ "esnext": true,
+ "bitwise": true,
+ "camelcase": true,
+ "curly": true,
+ "eqeqeq": true,
+ "immed": true,
+ "indent": 4,
+ "latedef": true,
+ "newcap": true,
+ "noarg": true,
+ "quotmark": "single",
+ "undef": true,
+ "unused": true,
+ "strict": true,
+ "trailing": true,
+ "smarttabs": true,
+ "white": true
+}
diff --git a/.yo-rc.json b/.yo-rc.json
new file mode 100644
index 0000000..34fa301
--- /dev/null
+++ b/.yo-rc.json
@@ -0,0 +1,10 @@
+{
+ "generator-reveal": {
+ "presentationTitle": "Deploy Your Rails App",
+ "packageVersion": "0.0.0",
+ "useSass": true,
+ "deployToGithubPages": true,
+ "githubUsername": "atomaka",
+ "githubRepository": "deploying-rails-app"
+ }
+}
\ No newline at end of file
diff --git a/Gruntfile.coffee b/Gruntfile.coffee
new file mode 100644
index 0000000..9eccc1f
--- /dev/null
+++ b/Gruntfile.coffee
@@ -0,0 +1,163 @@
+# Generated on 2016-03-08 using generator-reveal 0.5.8
+module.exports = (grunt) ->
+
+ grunt.initConfig
+ pkg: grunt.file.readJSON 'package.json'
+
+ watch:
+
+ livereload:
+ options:
+ livereload: true
+ files: [
+ 'index.html'
+ 'slides/{,*/}*.{md,html}'
+ 'js/*.js'
+ 'css/*.css'
+ 'resources/**'
+ ]
+
+ index:
+ files: [
+ 'templates/_index.html'
+ 'templates/_section.html'
+ 'slides/list.json'
+ ]
+ tasks: ['buildIndex']
+
+ coffeelint:
+ files: ['Gruntfile.coffee']
+ tasks: ['coffeelint']
+
+ jshint:
+ files: ['js/*.js']
+ tasks: ['jshint']
+
+ sass:
+ files: ['css/source/theme.scss']
+ tasks: ['sass']
+
+ sass:
+
+ theme:
+ files:
+ 'css/theme.css': 'css/source/theme.scss'
+
+ connect:
+
+ livereload:
+ options:
+ port: 9000
+ # Change hostname to '0.0.0.0' to access
+ # the server from outside.
+ hostname: 'localhost'
+ base: '.'
+ open: true
+ livereload: true
+
+ coffeelint:
+
+ options:
+ indentation:
+ value: 4
+ max_line_length:
+ level: 'ignore'
+
+ all: ['Gruntfile.coffee']
+
+ jshint:
+
+ options:
+ jshintrc: '.jshintrc'
+
+ all: ['js/*.js']
+
+ copy:
+
+ dist:
+ files: [{
+ expand: true
+ src: [
+ 'slides/**'
+ 'bower_components/**'
+ 'js/**'
+ 'css/*.css'
+ 'resources/**'
+ ]
+ dest: 'dist/'
+ },{
+ expand: true
+ src: ['index.html']
+ dest: 'dist/'
+ filter: 'isFile'
+ }]
+
+
+ buildcontrol:
+
+ options:
+ dir: 'dist'
+ commit: true
+ push: true
+ message: 'Built from %sourceCommit% on branch %sourceBranch%'
+ pages:
+ options:
+ remote: '<%= pkg.repository.url %>'
+ branch: 'gh-pages'
+
+
+
+ # Load all grunt tasks.
+ require('load-grunt-tasks')(grunt)
+
+ grunt.registerTask 'buildIndex',
+ 'Build index.html from templates/_index.html and slides/list.json.',
+ ->
+ indexTemplate = grunt.file.read 'templates/_index.html'
+ sectionTemplate = grunt.file.read 'templates/_section.html'
+ slides = grunt.file.readJSON 'slides/list.json'
+
+ html = grunt.template.process indexTemplate, data:
+ slides:
+ slides
+ section: (slide) ->
+ grunt.template.process sectionTemplate, data:
+ slide:
+ slide
+ grunt.file.write 'index.html', html
+
+ grunt.registerTask 'test',
+ '*Lint* javascript and coffee files.', [
+ 'coffeelint'
+ 'jshint'
+ ]
+
+ grunt.registerTask 'serve',
+ 'Run presentation locally and start watch process (living document).', [
+ 'buildIndex'
+ 'sass'
+ 'connect:livereload'
+ 'watch'
+ ]
+
+ grunt.registerTask 'dist',
+ 'Save presentation files to *dist* directory.', [
+ 'test'
+ 'sass'
+ 'buildIndex'
+ 'copy'
+ ]
+
+
+ grunt.registerTask 'deploy',
+ 'Deploy to Github Pages', [
+ 'dist'
+ 'buildcontrol'
+ ]
+
+
+ # Define default task.
+ grunt.registerTask 'default', [
+ 'test'
+ 'serve'
+ ]
diff --git a/bower.json b/bower.json
new file mode 100644
index 0000000..d25c175
--- /dev/null
+++ b/bower.json
@@ -0,0 +1,8 @@
+{
+ "name": "deploy-your-rails-app",
+ "version": "0.0.0",
+ "dependencies": {
+ "reveal.js": "~3.2.0",
+ "highlightjs": "~9.0.0"
+ }
+}
diff --git a/css/source/theme.scss b/css/source/theme.scss
new file mode 100644
index 0000000..7c4a1ac
--- /dev/null
+++ b/css/source/theme.scss
@@ -0,0 +1,53 @@
+/**
+ * Black theme for reveal.js. This is the opposite of the 'white' theme.
+ *
+ * Copyright (C) 2015 Hakim El Hattab, http://hakim.se
+ */
+
+ // This file has been copied over from
+ // ../../bower_components/reveal.js/css/theme/source/black.scss
+
+ // See ../../bower_components/reveal.js/css/theme/README.md
+ // for further explanations on how to create a custom reveal.js theme.
+
+// Default mixins and settings -----------------
+@import "../../bower_components/reveal.js/css/theme/template/mixins";
+@import "../../bower_components/reveal.js/css/theme/template/settings";
+// ---------------------------------------------
+
+
+// Include theme-specific fonts
+@import url(../bower_components/reveal.js/lib/font/source-sans-pro/source-sans-pro.css);
+
+
+// Override theme settings (see ../../bower_components/reveal.js/css/theme/template/settings.scss)
+$backgroundColor: #222;
+
+$mainColor: #fff;
+$headingColor: #fff;
+
+$mainFontSize: 38px;
+$mainFont: 'Source Sans Pro', Helvetica, sans-serif;
+$headingFont: 'Source Sans Pro', Helvetica, sans-serif;
+$headingTextShadow: none;
+$headingLetterSpacing: normal;
+$headingTextTransform: uppercase;
+$headingFontWeight: 600;
+$linkColor: #42affa;
+$linkColorHover: lighten( $linkColor, 15% );
+$selectionBackgroundColor: lighten( $linkColor, 25% );
+
+$heading1Size: 2.5em;
+$heading2Size: 1.6em;
+$heading3Size: 1.3em;
+$heading4Size: 1.0em;
+
+section.has-light-background {
+ &, h1, h2, h3, h4, h5, h6 {
+ color: #222;
+ }
+}
+
+// Theme template ------------------------------
+@import "../../bower_components/reveal.js/css/theme/template/theme";
+// ---------------------------------------------
diff --git a/css/theme.css b/css/theme.css
new file mode 100644
index 0000000..e4220c6
--- /dev/null
+++ b/css/theme.css
@@ -0,0 +1,286 @@
+/**
+ * Black theme for reveal.js. This is the opposite of the 'white' theme.
+ *
+ * Copyright (C) 2015 Hakim El Hattab, http://hakim.se
+ */
+@import url(../bower_components/reveal.js/lib/font/source-sans-pro/source-sans-pro.css);
+section.has-light-background, section.has-light-background h1, section.has-light-background h2, section.has-light-background h3, section.has-light-background h4, section.has-light-background h5, section.has-light-background h6 {
+ color: #222; }
+
+/*********************************************
+ * GLOBAL STYLES
+ *********************************************/
+body {
+ background: #222;
+ background-color: #222; }
+
+.reveal {
+ font-family: "Source Sans Pro", Helvetica, sans-serif;
+ font-size: 38px;
+ font-weight: normal;
+ color: #fff; }
+
+::selection {
+ color: #fff;
+ background: #bee4fd;
+ text-shadow: none; }
+
+.reveal .slides > section,
+.reveal .slides > section > section {
+ line-height: 1.3;
+ font-weight: inherit; }
+
+/*********************************************
+ * HEADERS
+ *********************************************/
+.reveal h1,
+.reveal h2,
+.reveal h3,
+.reveal h4,
+.reveal h5,
+.reveal h6 {
+ margin: 0 0 20px 0;
+ color: #fff;
+ font-family: "Source Sans Pro", Helvetica, sans-serif;
+ font-weight: 600;
+ line-height: 1.2;
+ letter-spacing: normal;
+ text-transform: uppercase;
+ text-shadow: none;
+ word-wrap: break-word; }
+
+.reveal h1 {
+ font-size: 2.5em; }
+
+.reveal h2 {
+ font-size: 1.6em; }
+
+.reveal h3 {
+ font-size: 1.3em; }
+
+.reveal h4 {
+ font-size: 1em; }
+
+.reveal h1 {
+ text-shadow: none; }
+
+/*********************************************
+ * OTHER
+ *********************************************/
+.reveal p {
+ margin: 20px 0;
+ line-height: 1.3; }
+
+/* Ensure certain elements are never larger than the slide itself */
+.reveal img,
+.reveal video,
+.reveal iframe {
+ max-width: 95%;
+ max-height: 95%; }
+
+.reveal strong,
+.reveal b {
+ font-weight: bold; }
+
+.reveal em {
+ font-style: italic; }
+
+.reveal ol,
+.reveal dl,
+.reveal ul {
+ display: inline-block;
+ text-align: left;
+ margin: 0 0 0 1em; }
+
+.reveal ol {
+ list-style-type: decimal; }
+
+.reveal ul {
+ list-style-type: disc; }
+
+.reveal ul ul {
+ list-style-type: square; }
+
+.reveal ul ul ul {
+ list-style-type: circle; }
+
+.reveal ul ul,
+.reveal ul ol,
+.reveal ol ol,
+.reveal ol ul {
+ display: block;
+ margin-left: 40px; }
+
+.reveal dt {
+ font-weight: bold; }
+
+.reveal dd {
+ margin-left: 40px; }
+
+.reveal q,
+.reveal blockquote {
+ quotes: none; }
+
+.reveal blockquote {
+ display: block;
+ position: relative;
+ width: 70%;
+ margin: 20px auto;
+ padding: 5px;
+ font-style: italic;
+ background: rgba(255, 255, 255, 0.05);
+ box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); }
+
+.reveal blockquote p:first-child,
+.reveal blockquote p:last-child {
+ display: inline-block; }
+
+.reveal q {
+ font-style: italic; }
+
+.reveal pre {
+ display: block;
+ position: relative;
+ width: 90%;
+ margin: 20px auto;
+ text-align: left;
+ font-size: 0.55em;
+ font-family: monospace;
+ line-height: 1.2em;
+ word-wrap: break-word;
+ box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
+
+.reveal code {
+ font-family: monospace; }
+
+.reveal pre code {
+ display: block;
+ padding: 5px;
+ overflow: auto;
+ max-height: 400px;
+ word-wrap: normal; }
+
+.reveal table {
+ margin: auto;
+ border-collapse: collapse;
+ border-spacing: 0; }
+
+.reveal table th {
+ font-weight: bold; }
+
+.reveal table th,
+.reveal table td {
+ text-align: left;
+ padding: 0.2em 0.5em 0.2em 0.5em;
+ border-bottom: 1px solid; }
+
+.reveal table th[align="center"],
+.reveal table td[align="center"] {
+ text-align: center; }
+
+.reveal table th[align="right"],
+.reveal table td[align="right"] {
+ text-align: right; }
+
+.reveal table tr:last-child td {
+ border-bottom: none; }
+
+.reveal sup {
+ vertical-align: super; }
+
+.reveal sub {
+ vertical-align: sub; }
+
+.reveal small {
+ display: inline-block;
+ font-size: 0.6em;
+ line-height: 1.2em;
+ vertical-align: top; }
+
+.reveal small * {
+ vertical-align: top; }
+
+/*********************************************
+ * LINKS
+ *********************************************/
+.reveal a {
+ color: #42affa;
+ text-decoration: none;
+ -webkit-transition: color .15s ease;
+ -moz-transition: color .15s ease;
+ transition: color .15s ease; }
+
+.reveal a:hover {
+ color: #8dcffc;
+ text-shadow: none;
+ border: none; }
+
+.reveal .roll span:after {
+ color: #fff;
+ background: #068de9; }
+
+/*********************************************
+ * IMAGES
+ *********************************************/
+.reveal section img {
+ margin: 15px 0px;
+ background: rgba(255, 255, 255, 0.12);
+ border: 4px solid #fff;
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
+
+.reveal section img.plain {
+ border: 0;
+ box-shadow: none; }
+
+.reveal a img {
+ -webkit-transition: all .15s linear;
+ -moz-transition: all .15s linear;
+ transition: all .15s linear; }
+
+.reveal a:hover img {
+ background: rgba(255, 255, 255, 0.2);
+ border-color: #42affa;
+ box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
+
+/*********************************************
+ * NAVIGATION CONTROLS
+ *********************************************/
+.reveal .controls .navigate-left,
+.reveal .controls .navigate-left.enabled {
+ border-right-color: #42affa; }
+
+.reveal .controls .navigate-right,
+.reveal .controls .navigate-right.enabled {
+ border-left-color: #42affa; }
+
+.reveal .controls .navigate-up,
+.reveal .controls .navigate-up.enabled {
+ border-bottom-color: #42affa; }
+
+.reveal .controls .navigate-down,
+.reveal .controls .navigate-down.enabled {
+ border-top-color: #42affa; }
+
+.reveal .controls .navigate-left.enabled:hover {
+ border-right-color: #8dcffc; }
+
+.reveal .controls .navigate-right.enabled:hover {
+ border-left-color: #8dcffc; }
+
+.reveal .controls .navigate-up.enabled:hover {
+ border-bottom-color: #8dcffc; }
+
+.reveal .controls .navigate-down.enabled:hover {
+ border-top-color: #8dcffc; }
+
+/*********************************************
+ * PROGRESS BAR
+ *********************************************/
+.reveal .progress {
+ background: rgba(0, 0, 0, 0.2); }
+
+.reveal .progress span {
+ background: #42affa;
+ -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
+ -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
+ transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
diff --git a/js/loadhtmlslides.js b/js/loadhtmlslides.js
new file mode 100644
index 0000000..aad46f3
--- /dev/null
+++ b/js/loadhtmlslides.js
@@ -0,0 +1,44 @@
+// Modified from markdown.js from Hakim to handle external html files
+(function () {
+ /*jslint loopfunc: true, browser: true*/
+ /*globals alert*/
+ 'use strict';
+
+ var querySlidingHtml = function () {
+ var sections = document.querySelectorAll('[data-html]'),
+ section, j, jlen;
+
+ for (j = 0, jlen = sections.length; j < jlen; j++) {
+ section = sections[j];
+
+ if (section.getAttribute('data-html').length) {
+
+ var xhr = new XMLHttpRequest(),
+ url = section.getAttribute('data-html'),
+ cb = function () {
+ if (xhr.readyState === 4) {
+ if (
+ (xhr.status >= 200 && xhr.status < 300) ||
+ xhr.status === 0 // file protocol yields status code 0 (useful for local debug, mobile applications etc.)
+ ) {
+ section.innerHTML = xhr.responseText;
+ } else {
+ section.outerHTML = 'ERROR: The attempt to fetch ' + url + ' failed with the HTTP status ' + xhr.status + '. Check your browser\'s JavaScript console for more details.
';
+ }
+ }
+ };
+
+ xhr.onreadystatechange = cb;
+
+ xhr.open('GET', url, false);
+ try {
+ xhr.send();
+ } catch (e) {
+ alert('Failed to get file' + url + '.' + e);
+ }
+ }
+ }
+ };
+
+ querySlidingHtml();
+})();
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..21a3e94
--- /dev/null
+++ b/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "deploy-your-rails-app",
+ "version": "0.0.0",
+ "private": true,
+ "devDependencies": {
+ "grunt": "^0.4.5",
+ "grunt-sass": "^1.1.0",
+ "grunt-contrib-connect": "^0.10.1",
+ "grunt-contrib-watch": "^0.6.1",
+ "grunt-contrib-copy": "^0.8.0",
+ "grunt-contrib-jshint": "^0.11.2",
+ "load-grunt-tasks": "^3.2.0",
+ "grunt-build-control": "^0.5.0",
+ "grunt-coffeelint": "0.0.13",
+ "coffeelint": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0",
+ "npm": ">=1.3.7"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git@github.com:atomaka/deploying-rails-app.git"
+
+ },
+ "scripts": {
+ "test": "grunt test"
+ }
+}
diff --git a/resources/.gitkeep b/resources/.gitkeep
new file mode 100644
index 0000000..dcfea5d
--- /dev/null
+++ b/resources/.gitkeep
@@ -0,0 +1 @@
+Used to store static assets
\ No newline at end of file
diff --git a/slides/build-a-rails-app.md b/slides/build-a-rails-app.md
new file mode 100644
index 0000000..5c3516e
--- /dev/null
+++ b/slides/build-a-rails-app.md
@@ -0,0 +1,12 @@
+## Begin a Rails App
+
+```
+gem install rails && rbenv rehash
+rails new jokes && cd jokes
+bundle exec rails generate scaffold Joke joke:string punchline:string
+bundle exec rake db:migrate
+```
+
+note:
+ Put your speaker notes here.
+ You can see them pressing 's'.
diff --git a/slides/create-the-droplet.md b/slides/create-the-droplet.md
new file mode 100644
index 0000000..22eec3d
--- /dev/null
+++ b/slides/create-the-droplet.md
@@ -0,0 +1,14 @@
+## Create the Droplet
+
+* Visit https://www.digitalocean.com
+* "Log In"
+* "Create Droplet"
+ * Ubuntu 14.04.4 x64
+ * $5/mo
+ * New York 3
+ * Add your SSH key
+ * Choose a hostname
+
+note:
+ Put your speaker notes here.
+ You can see them pressing 's'.
diff --git a/slides/getting-started.md b/slides/getting-started.md
new file mode 100644
index 0000000..95f176a
--- /dev/null
+++ b/slides/getting-started.md
@@ -0,0 +1 @@
+# Getting Started
diff --git a/slides/how-this-works.md b/slides/how-this-works.md
new file mode 100644
index 0000000..18a850e
--- /dev/null
+++ b/slides/how-this-works.md
@@ -0,0 +1,7 @@
+## How this Works?
+
+* git hook
+ * `post-receive` hook
+* script that completes tasks
+
+note:
diff --git a/slides/index.md b/slides/index.md
new file mode 100644
index 0000000..e81003d
--- /dev/null
+++ b/slides/index.md
@@ -0,0 +1,6 @@
+
+# Deploy Your Rails App
+
+Or Replacing Heroku
+
+Andrew Tomaka / [@atomaka](https://twitter.com/atomaka)
diff --git a/slides/install-ruby.md b/slides/install-ruby.md
new file mode 100644
index 0000000..35d90cd
--- /dev/null
+++ b/slides/install-ruby.md
@@ -0,0 +1,21 @@
+## Install Ruby
+
+* `sudo su - app`
+* Install rbenv
+
+```
+git clone https://github.com/rbenv/rbenv.git ~/.rbenv
+git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
+echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
+source ~/.bash_profile
+```
+
+* Install and use Ruby
+
+```
+rbenv install 2.3.0
+rbenv global 2.3.0
+gem install bundler
+```
+
+note:
diff --git a/slides/let-s-deploy.md b/slides/let-s-deploy.md
new file mode 100644
index 0000000..e777fb0
--- /dev/null
+++ b/slides/let-s-deploy.md
@@ -0,0 +1,3 @@
+# Let's Deploy
+
+note:
diff --git a/slides/list.json b/slides/list.json
new file mode 100644
index 0000000..65fd12c
--- /dev/null
+++ b/slides/list.json
@@ -0,0 +1,18 @@
+[
+ "index.md",
+ "what-is-heroku.md",
+ "what-chris-says.md",
+ "how-this-works.md",
+ "getting-started.md",
+ "build-a-rails-app.md",
+ "quick-configuration-updates.md",
+ "create-the-droplet.md",
+ "prepare-our-server.md",
+ "install-ruby.md",
+ "let-s-deploy.md",
+ "setup-a-middleware.md",
+ "setup-a-middleware-for-server.md",
+ "run-a-web-server.md",
+ "time-for-the-special-sauce.md",
+ "setup-git-remote.md"
+]
\ No newline at end of file
diff --git a/slides/prepare-our-server.md b/slides/prepare-our-server.md
new file mode 100644
index 0000000..907d7e3
--- /dev/null
+++ b/slides/prepare-our-server.md
@@ -0,0 +1,20 @@
+## Prepare Our Server
+
+* `ssh root@XXX.XXX.XXX.XXX`
+* Install packages
+
+```
+apt-get update
+apt-get install git-core curl zlib1g-dev build-essential libssl-dev
+libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev
+libcurl4-openssl-dev python-software-properties libffi-dev
+```
+
+* Create user
+
+```
+useradd -m app
+chsh app -s /bin/bash
+```
+
+note:
diff --git a/slides/quick-configuration-updates.md b/slides/quick-configuration-updates.md
new file mode 100644
index 0000000..df07299
--- /dev/null
+++ b/slides/quick-configuration-updates.md
@@ -0,0 +1,18 @@
+## Quick Configuration Updates
+
+* `config/routes`
+
+```
+Rails.application.routes.draw do
+ resources :jokes
+ root to: 'jokes#index'
+end
+```
+
+* `Gemfile`
+
+```
+gem 'therubyracer', platforms: :ruby
+```
+
+note:
diff --git a/slides/run-a-web-server.md b/slides/run-a-web-server.md
new file mode 100644
index 0000000..7dad417
--- /dev/null
+++ b/slides/run-a-web-server.md
@@ -0,0 +1,14 @@
+## Run a Web Server
+
+* Install nginx
+
+```
+apt-get install nginx
+```
+
+* Configure nginx
+ * default from [https://goo.gl/f36vHg](https://goo.gl/f36vHg)
+
+note:
+ Put your speaker notes here.
+ You can see them pressing 's'.
diff --git a/slides/setup-a-middleware-for-server.md b/slides/setup-a-middleware-for-server.md
new file mode 100644
index 0000000..4b28a0c
--- /dev/null
+++ b/slides/setup-a-middleware-for-server.md
@@ -0,0 +1,35 @@
+## Setup a Middleware for Server
+
+* Retrieve suggested Puma configuration
+
+```
+wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma-manager.conf
+wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma.conf
+```
+
+* Update puma.conf
+
+```
+setuid app
+setgid app
+```
+
+* Add configuration to bash execution
+
+```
+export SECRET_KEY_BASE="YOUR_SECRET_KEY_HERE"
+```
+
+* Deploy startup files
+
+```
+sudo cp puma.conf puma-manager.conf /etc/init
+```
+
+* Configure Puma (/etc/puma.conf)
+
+```
+/home/app/jokes
+```
+
+note:
diff --git a/slides/setup-a-middleware.md b/slides/setup-a-middleware.md
new file mode 100644
index 0000000..1f75b5e
--- /dev/null
+++ b/slides/setup-a-middleware.md
@@ -0,0 +1,17 @@
+## Setup a Middleware for App
+
+* Update the Gemfile
+
+```
+group :production do
+ gem 'puma'
+end
+```
+
+* Configure Puma
+ * config/puma.rb from [https://goo.gl/f36vHg](https://goo.gl/f36vHg)
+
+
+note:
+ Put your speaker notes here.
+ You can see them pressing 's'.
diff --git a/slides/setup-git-remote.md b/slides/setup-git-remote.md
new file mode 100644
index 0000000..e4a6b09
--- /dev/null
+++ b/slides/setup-git-remote.md
@@ -0,0 +1,23 @@
+## Setup git Remote
+
+* Setup the Repostiory
+
+```
+sudo su - app && cd
+mkdir ~/jokes-production && cd ~/jokes-production
+git init --bare
+```
+
+* Add the Hook! (~/jokes-production/hooks/post-receive)
+ * post-receive from [https://goo.gl/f36vHg](https://goo.gl/f36vHg)
+ * chmod +x hooks/post-receive
+
+* Setup sudo
+
+```
+sudo sh -c 'echo "app ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/90-app'
+```
+
+note:
+- What github does when you create a new repository
+- Probably should restrict sudo
diff --git a/slides/time-for-the-special-sauce.md b/slides/time-for-the-special-sauce.md
new file mode 100644
index 0000000..ddfd697
--- /dev/null
+++ b/slides/time-for-the-special-sauce.md
@@ -0,0 +1 @@
+# Special Sauce
diff --git a/slides/what-chris-says.md b/slides/what-chris-says.md
new file mode 100644
index 0000000..e729631
--- /dev/null
+++ b/slides/what-chris-says.md
@@ -0,0 +1,3 @@
+## What Chris Says
+
+> "Nothing sweeter than git push production master"
diff --git a/slides/what-is-heroku.md b/slides/what-is-heroku.md
new file mode 100644
index 0000000..ceed1fc
--- /dev/null
+++ b/slides/what-is-heroku.md
@@ -0,0 +1,9 @@
+## What is Heroku
+
+A service for deploying applications
+
+* `heroku login`
+* `heroku create`
+* `git push heroku master`
+
+note:
diff --git a/templates/_index.html b/templates/_index.html
new file mode 100644
index 0000000..4b561cd
--- /dev/null
+++ b/templates/_index.html
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+ Deploy Your Rails App
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <% _.forEach(slides, function(slide) { %>
+ <% if (!_.isArray(slide)) { %>
+ <%= section(slide) %>
+ <% } %>
+ <% if (_.isArray(slide)) { %>
+
+ <% _.forEach(slide, function(verticalslide) { %>
+ <%= section(verticalslide) %>
+ <% }); %>
+
+ <% } %>
+ <% }); %>
+
+
+
+
+
+
+
+
+
+
diff --git a/templates/_section.html b/templates/_section.html
new file mode 100644
index 0000000..78cb3d4
--- /dev/null
+++ b/templates/_section.html
@@ -0,0 +1,5 @@
+<% if (!_.isString(slide) && !_.isArray(slide) && _.isObject(slide)) { %>
+ <% if (_.isString(slide.filename)) { %>data-<% if (slide.filename.indexOf('.html') !== -1) { %>html<% } else { %>markdown<% }%>="slides/<%= slide.filename %>"<% } %>>
+<% } %><% if (_.isString(slide)) { %>
+ html<% } else { %>markdown<% }%>="slides/<%= slide %>">
+<% } %>