1
0
Fork 0

Initial commit

This commit is contained in:
Andrew Tomaka 2016-03-08 18:12:31 -05:00
commit 91ba3d70de
31 changed files with 947 additions and 0 deletions

3
.bowerrc Normal file
View File

@ -0,0 +1,3 @@
{
"directory": "bower_components"
}

10
.editorconfig Normal file
View File

@ -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

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
node_modules
bower_components
dist
*.log
.sass-cache
/index.html

19
.jshintrc Normal file
View File

@ -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
}

10
.yo-rc.json Normal file
View File

@ -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"
}
}

163
Gruntfile.coffee Normal file
View File

@ -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'
]

8
bower.json Normal file
View File

@ -0,0 +1,8 @@
{
"name": "deploy-your-rails-app",
"version": "0.0.0",
"dependencies": {
"reveal.js": "~3.2.0",
"highlightjs": "~9.0.0"
}
}

53
css/source/theme.scss Normal file
View File

@ -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";
// ---------------------------------------------

286
css/theme.css Normal file
View File

@ -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); }

44
js/loadhtmlslides.js Normal file
View File

@ -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 = '<section data-state="alert">ERROR: The attempt to fetch ' + url + ' failed with the HTTP status ' + xhr.status + '. Check your browser\'s JavaScript console for more details.</p></section>';
}
}
};
xhr.onreadystatechange = cb;
xhr.open('GET', url, false);
try {
xhr.send();
} catch (e) {
alert('Failed to get file' + url + '.' + e);
}
}
}
};
querySlidingHtml();
})();

29
package.json Normal file
View File

@ -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"
}
}

1
resources/.gitkeep Normal file
View File

@ -0,0 +1 @@
Used to store static assets

View File

@ -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'.

View File

@ -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'.

View File

@ -0,0 +1 @@
# Getting Started

7
slides/how-this-works.md Normal file
View File

@ -0,0 +1,7 @@
## How this Works?
* git hook
* `post-receive` hook
* script that completes tasks
note:

6
slides/index.md Normal file
View File

@ -0,0 +1,6 @@
# Deploy Your Rails App
Or Replacing Heroku
<small>Andrew Tomaka / [@atomaka](https://twitter.com/atomaka)</small>

21
slides/install-ruby.md Normal file
View File

@ -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:

3
slides/let-s-deploy.md Normal file
View File

@ -0,0 +1,3 @@
# Let&#39;s Deploy
note:

18
slides/list.json Normal file
View File

@ -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"
]

View File

@ -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:

View File

@ -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:

View File

@ -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'.

View File

@ -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:

View File

@ -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'.

View File

@ -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

View File

@ -0,0 +1 @@
# Special Sauce

View File

@ -0,0 +1,3 @@
## What Chris Says
> "Nothing sweeter than git push production master"

9
slides/what-is-heroku.md Normal file
View File

@ -0,0 +1,9 @@
## What is Heroku
A service for deploying applications
* `heroku login`
* `heroku create`
* `git push heroku master`
note:

88
templates/_index.html Normal file
View File

@ -0,0 +1,88 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Deploy Your Rails App</title>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
<link rel="stylesheet" href="bower_components/reveal.js/css/reveal.css">
<link rel="stylesheet" href="css/theme.css" id="theme">
<link rel="stylesheet" href="bower_components/reveal.js/css/theme/solarized.css" id="theme">
<!-- For syntax highlighting -->
<link rel="stylesheet" href="bower_components/highlightjs/styles/zenburn.css">
<!-- Printing and PDF exports -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? 'bower_components/reveal.js/css/print/pdf.css' : 'bower_components/reveal.js/css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
<!--[if lt IE 9]>
<script src="bower_components/reveal.js/lib/js/html5shiv.js"></script>
<![endif]-->
</head>
<body>
<div class="reveal">
<div class="slides">
<% _.forEach(slides, function(slide) { %>
<% if (!_.isArray(slide)) { %>
<%= section(slide) %>
<% } %>
<% if (_.isArray(slide)) { %>
<section>
<% _.forEach(slide, function(verticalslide) { %>
<%= section(verticalslide) %>
<% }); %>
</section>
<% } %>
<% }); %>
</div>
</div>
<script src="bower_components/reveal.js/lib/js/head.min.js"></script>
<script src="bower_components/reveal.js/js/reveal.js"></script>
<script>
// Full list of configuration options available at:
// https://github.com/hakimel/reveal.js#configuration
Reveal.initialize({
controls: false,
progress: true,
history: true,
center: true,
transition: 'slide', // none/fade/slide/convex/concave/zoom
// Optional reveal.js plugins
dependencies: [
{ src: 'bower_components/reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: 'bower_components/reveal.js/plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'bower_components/reveal.js/plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'bower_components/reveal.js/plugin/highlight/highlight.js', async: true, condition: function() { return !!document.querySelector( '[data-html]' ) || !!document.querySelector( 'pre code' ) || !!document.querySelector( '[data-markdown]' ); }, callback: function() { hljs.initHighlightingOnLoad(); } },
{ src: 'bower_components/reveal.js/plugin/zoom-js/zoom.js', async: true },
{ src: 'bower_components/reveal.js/plugin/notes/notes.js', async: true },
{ src: 'js/loadhtmlslides.js', condition: function() { return !!document.querySelector( '[data-html]' ); } }
]
});
</script>
</body>
</html>

5
templates/_section.html Normal file
View File

@ -0,0 +1,5 @@
<% if (!_.isString(slide) && !_.isArray(slide) && _.isObject(slide)) { %>
<section <%= _.map(slide.attr, function (val, attr) {return attr + '="' + val + '"'}).join(' ')%> <% if (_.isString(slide.filename)) { %>data-<% if (slide.filename.indexOf('.html') !== -1) { %>html<% } else { %>markdown<% }%>="slides/<%= slide.filename %>"<% } %>></section>
<% } %><% if (_.isString(slide)) { %>
<section data-<% if (slide.indexOf('.html') !== -1) { %>html<% } else { %>markdown<% }%>="slides/<%= slide %>"></section>
<% } %>