freighthop 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/Gemfile +4 -0
- data/Guardfile +5 -0
- data/LICENSE.txt +22 -0
- data/Puppetfile +8 -0
- data/Puppetfile.lock +37 -0
- data/README.md +135 -0
- data/Rakefile +9 -0
- data/Vagrantfile +62 -0
- data/bin/fh +42 -0
- data/data/common.json +5 -0
- data/freighthop.gemspec +27 -0
- data/hiera.yaml +8 -0
- data/init/bootstrap_puppet_omnibus.sh +37 -0
- data/init/symlinks_for_hiera.sh +22 -0
- data/lib/freighthop.rb +50 -0
- data/lib/freighthop/version.rb +3 -0
- data/local_modules/freighthop/files/bundler/freighthop.gemfile +3 -0
- data/local_modules/freighthop/files/puma/upstart/puma-manager.conf +31 -0
- data/local_modules/freighthop/manifests/bundler.pp +34 -0
- data/local_modules/freighthop/manifests/init.pp +55 -0
- data/local_modules/freighthop/manifests/nginx.pp +28 -0
- data/local_modules/freighthop/manifests/params.pp +11 -0
- data/local_modules/freighthop/manifests/pkgs.pp +7 -0
- data/local_modules/freighthop/manifests/postgres.pp +28 -0
- data/local_modules/freighthop/manifests/puma.pp +36 -0
- data/local_modules/freighthop/manifests/rbenv.pp +34 -0
- data/local_modules/freighthop/manifests/redis.pp +9 -0
- data/local_modules/freighthop/templates/nginx/vagrant-rails.conf.erb +89 -0
- data/local_modules/freighthop/templates/profile/custom_bundler_gemfile.sh.erb +1 -0
- data/local_modules/freighthop/templates/puma/upstart/puma.conf.erb +51 -0
- data/manifests/site.pp +1 -0
- metadata +656 -0
data/lib/freighthop.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require_relative 'freighthop/version'
|
3
|
+
|
4
|
+
unless defined? Vagrant
|
5
|
+
raise "i expect to be required from a Vagrantfile"
|
6
|
+
end
|
7
|
+
|
8
|
+
module Freighthop
|
9
|
+
class << self
|
10
|
+
def vmware?
|
11
|
+
!!(defined? HashiCorp)
|
12
|
+
end
|
13
|
+
|
14
|
+
def host_rails_root
|
15
|
+
@rails_root ||= begin
|
16
|
+
Pathname.pwd.tap do |pwd|
|
17
|
+
unless pwd.join('config', 'boot.rb').file?
|
18
|
+
raise 'run me with a rails app as PWD, using VAGRANT_CWD to refer to my directory'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def guest_rails_root
|
25
|
+
"/srv/#{app_name}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def app_name
|
29
|
+
@app_name ||= host_rails_root.basename.to_s
|
30
|
+
end
|
31
|
+
|
32
|
+
def hostname
|
33
|
+
"#{app_name}.vagrant.dev"
|
34
|
+
end
|
35
|
+
|
36
|
+
def ip_address
|
37
|
+
"10.20.1.#{app_name.getbyte(0)}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def box_url
|
41
|
+
if vmware?
|
42
|
+
'http://files.vagrantup.com/precise64_vmware.box'
|
43
|
+
else
|
44
|
+
'http://files.vagrantup.com/precise64.box'
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# /etc/init/puma-manager.conf - manage a set of Pumas
|
2
|
+
|
3
|
+
# This example config should work with Ubuntu 12.04+. It
|
4
|
+
# allows you to manage multiple Puma instances with
|
5
|
+
# Upstart, Ubuntu's native service management tool.
|
6
|
+
#
|
7
|
+
# See puma.conf for how to manage a single Puma instance.
|
8
|
+
#
|
9
|
+
# Use "stop puma-manager" to stop all Puma instances.
|
10
|
+
# Use "start puma-manager" to start all instances.
|
11
|
+
# Use "restart puma-manager" to restart all instances.
|
12
|
+
# Crazy, right?
|
13
|
+
#
|
14
|
+
|
15
|
+
description "Manages the set of puma processes"
|
16
|
+
|
17
|
+
# This starts upon bootup and stops on shutdown
|
18
|
+
start on runlevel [2345]
|
19
|
+
stop on runlevel [06]
|
20
|
+
|
21
|
+
# Set this to the number of Puma processes you want
|
22
|
+
# to run on this machine
|
23
|
+
env PUMA_CONF="/etc/puma.conf"
|
24
|
+
|
25
|
+
pre-start script
|
26
|
+
for i in `cat $PUMA_CONF`; do
|
27
|
+
app=`echo $i | cut -d , -f 1`
|
28
|
+
logger -t "puma-manager" "Starting $app"
|
29
|
+
start puma app=$app
|
30
|
+
done
|
31
|
+
end script
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class freighthop::bundler(
|
2
|
+
$ruby_version,
|
3
|
+
$app_root,
|
4
|
+
){
|
5
|
+
file { "${app_root}/.freighthop.gemfile":
|
6
|
+
ensure => 'file',
|
7
|
+
mode => '0644',
|
8
|
+
source => 'puppet:///modules/freighthop/bundler/freighthop.gemfile',
|
9
|
+
}
|
10
|
+
|
11
|
+
file { '/etc/profile.d/custom_bundler_gemfile.sh':
|
12
|
+
ensure => present,
|
13
|
+
mode => '0755',
|
14
|
+
content => template('freighthop/profile/custom_bundler_gemfile.sh.erb'),
|
15
|
+
}
|
16
|
+
|
17
|
+
exec { 'bundle install':
|
18
|
+
environment => [
|
19
|
+
'BUNDLE_GEMFILE=.freighthop.gemfile',
|
20
|
+
'RBENV_ROOT=/usr/lib/rbenv',
|
21
|
+
"RBENV_VERSION=${ruby_version}",
|
22
|
+
],
|
23
|
+
cwd => $app_root,
|
24
|
+
path => [
|
25
|
+
'/usr/lib/rbenv/shims',
|
26
|
+
'/usr/bin',
|
27
|
+
'/bin',
|
28
|
+
],
|
29
|
+
logoutput => true,
|
30
|
+
timeout => 0,
|
31
|
+
unless => 'bundle check',
|
32
|
+
require => File["${app_root}/.freighthop.gemfile"],
|
33
|
+
}
|
34
|
+
}
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class freighthop(
|
2
|
+
$databases,
|
3
|
+
$database_users,
|
4
|
+
$packages = ['git-core'],
|
5
|
+
$ruby_version = $freighthop::params::ruby_version,
|
6
|
+
$app_name = $freighthop::params::app_name,
|
7
|
+
$app_root = $freighthop::params::app_root,
|
8
|
+
$web_root = $freighthop::params::web_root,
|
9
|
+
$socket_dir = $freighthop::params::socket_dir,
|
10
|
+
$socket_path = $freighthop::params::socket_path,
|
11
|
+
$server_name = $freighthop::params::server_name,
|
12
|
+
$ssl_cert_path = $freighthop::params::ssl_cert_path,
|
13
|
+
$ssl_key_path = $freighthop::params::ssl_key_path,
|
14
|
+
) inherits freighthop::params {
|
15
|
+
file { $socket_dir:
|
16
|
+
ensure => directory,
|
17
|
+
owner => 'vagrant',
|
18
|
+
group => 'vagrant',
|
19
|
+
mode => '0755'
|
20
|
+
}
|
21
|
+
class { 'freighthop::pkgs':
|
22
|
+
packages => $packages,
|
23
|
+
}
|
24
|
+
class { 'freighthop::rbenv':
|
25
|
+
ruby_version => $ruby_version
|
26
|
+
}
|
27
|
+
class { 'freighthop::nginx':
|
28
|
+
upstream_socket_path => $socket_path,
|
29
|
+
server_name => $server_name,
|
30
|
+
web_root => $web_root,
|
31
|
+
ssl_cert_path => $ssl_cert_path,
|
32
|
+
ssl_key_path => $ssl_key_path,
|
33
|
+
}
|
34
|
+
class { 'freighthop::postgres':
|
35
|
+
databases => $databases,
|
36
|
+
database_users => $database_users,
|
37
|
+
}
|
38
|
+
class { 'freighthop::bundler':
|
39
|
+
ruby_version => $ruby_version,
|
40
|
+
app_root => $app_root,
|
41
|
+
}
|
42
|
+
class { 'freighthop::puma':
|
43
|
+
app_root => $app_root,
|
44
|
+
socket_path => $socket_path,
|
45
|
+
}
|
46
|
+
|
47
|
+
File[$socket_dir] ->
|
48
|
+
Class['freighthop::pkgs'] ->
|
49
|
+
Class['freighthop::rbenv'] ->
|
50
|
+
Class['freighthop::nginx'] ->
|
51
|
+
Class['freighthop::postgres'] ->
|
52
|
+
Class['freighthop::bundler'] ->
|
53
|
+
Class['freighthop::puma']
|
54
|
+
|
55
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class freighthop::nginx(
|
2
|
+
$upstream_socket_path,
|
3
|
+
$server_name,
|
4
|
+
$web_root,
|
5
|
+
$ssl_cert_path,
|
6
|
+
$ssl_key_path,
|
7
|
+
) {
|
8
|
+
$cert_subject = "/C=US/ST=IL/L=Chicago/O=Instructure/CN=${server_name}"
|
9
|
+
|
10
|
+
class {'::nginx':
|
11
|
+
confd_purge => true
|
12
|
+
}
|
13
|
+
|
14
|
+
exec { 'generate-self-signed-ssl-cert':
|
15
|
+
command => "openssl req -x509 -nodes -days 3650 -subj '${cert_subject}' -newkey rsa:1024 -keyout ${ssl_key_path} -out ${ssl_cert_path}",
|
16
|
+
path => ['/usr/bin'],
|
17
|
+
creates => $ssl_cert_path,
|
18
|
+
}
|
19
|
+
|
20
|
+
file { '/etc/nginx/conf.d/vagrant-rails.conf':
|
21
|
+
owner => 'root',
|
22
|
+
group => 'root',
|
23
|
+
mode => '0644',
|
24
|
+
content => template('freighthop/nginx/vagrant-rails.conf.erb'),
|
25
|
+
notify => Service['nginx'],
|
26
|
+
require => Exec['generate-self-signed-ssl-cert'],
|
27
|
+
}
|
28
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class freighthop::params {
|
2
|
+
$ruby_version = '1.9.3-p392'
|
3
|
+
$app_name = $::hostname
|
4
|
+
$app_root = "/srv/${app_name}"
|
5
|
+
$web_root = "${app_root}/public"
|
6
|
+
$socket_dir = "/var/run/${app_name}"
|
7
|
+
$socket_path = "${socket_dir}/puma.sock"
|
8
|
+
$server_name = $::fqdn
|
9
|
+
$ssl_cert_path = "/etc/ssl/certs/${app_name}.pem"
|
10
|
+
$ssl_key_path = "/etc/ssl/private/${app_name}.key"
|
11
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class freighthop::postgres(
|
2
|
+
$databases,
|
3
|
+
$database_users
|
4
|
+
) {
|
5
|
+
include postgresql::server
|
6
|
+
|
7
|
+
postgresql::pg_hba_rule { 'local-users-get-everything':
|
8
|
+
type => 'local',
|
9
|
+
database => 'all',
|
10
|
+
user => 'all',
|
11
|
+
auth_method => 'trust',
|
12
|
+
order => '0001',
|
13
|
+
}
|
14
|
+
postgresql::pg_hba_rule { 'local-host-connections-get-everything':
|
15
|
+
type => 'host',
|
16
|
+
database => 'all',
|
17
|
+
user => 'all',
|
18
|
+
address => '127.0.0.1/32',
|
19
|
+
auth_method => 'trust',
|
20
|
+
order => '0001',
|
21
|
+
}
|
22
|
+
postgresql::database { $databases: }
|
23
|
+
postgresql::database_user { $database_users:
|
24
|
+
superuser => true,
|
25
|
+
createdb => true,
|
26
|
+
createrole => true,
|
27
|
+
}
|
28
|
+
}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class freighthop::puma(
|
2
|
+
$app_root,
|
3
|
+
$socket_path,
|
4
|
+
) {
|
5
|
+
package { 'puma':
|
6
|
+
ensure => 'installed',
|
7
|
+
provider => 'gem'
|
8
|
+
}
|
9
|
+
file { '/etc/init/puma.conf':
|
10
|
+
owner => 'root',
|
11
|
+
group => 'root',
|
12
|
+
mode => '0644',
|
13
|
+
content => template('freighthop/puma/upstart/puma.conf.erb')
|
14
|
+
}
|
15
|
+
file { '/etc/puma.conf':
|
16
|
+
owner => 'root',
|
17
|
+
group => 'root',
|
18
|
+
mode => '0644',
|
19
|
+
content => "${app_root}\n"
|
20
|
+
}
|
21
|
+
file { '/etc/init/puma-manager.conf':
|
22
|
+
owner => 'root',
|
23
|
+
group => 'root',
|
24
|
+
mode => '0644',
|
25
|
+
source => 'puppet:///modules/freighthop/puma/upstart/puma-manager.conf',
|
26
|
+
require => [
|
27
|
+
File['/etc/init/puma.conf'],
|
28
|
+
File['/etc/puma.conf'],
|
29
|
+
],
|
30
|
+
notify => Service['puma-manager']
|
31
|
+
}
|
32
|
+
service { 'puma-manager':
|
33
|
+
ensure => 'running',
|
34
|
+
provider => 'upstart'
|
35
|
+
}
|
36
|
+
}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class freighthop::rbenv(
|
2
|
+
$ruby_version
|
3
|
+
) {
|
4
|
+
include apt
|
5
|
+
apt::ppa { 'ppa:gds/govuk': }
|
6
|
+
apt::ppa { 'ppa:phinze/rbenv': }
|
7
|
+
|
8
|
+
class { '::rbenv':
|
9
|
+
global_version => $ruby_version,
|
10
|
+
require => Apt::Ppa['ppa:gds/govuk'],
|
11
|
+
}
|
12
|
+
|
13
|
+
rbenv::version { $ruby_version: }
|
14
|
+
|
15
|
+
# The rbenv puppet module drops $RBENV_ROOT/version but the package from
|
16
|
+
# ppa:gds/govuk is an older version of rbenv that expects $RBENV_ROOT/global;
|
17
|
+
# this is a workaround that uses the installed CLI to fix it.
|
18
|
+
exec { 'fix-rbenv-global-version':
|
19
|
+
command => "rbenv global ${ruby_version}",
|
20
|
+
unless => "rbenv global | grep '${ruby_version}'",
|
21
|
+
environment => 'RBENV_ROOT=/usr/lib/rbenv',
|
22
|
+
require => Rbenv::Version[$ruby_version]
|
23
|
+
}
|
24
|
+
|
25
|
+
Exec {
|
26
|
+
path => [
|
27
|
+
'/usr/local/bin',
|
28
|
+
'/usr/bin',
|
29
|
+
'/usr/sbin',
|
30
|
+
'/bin',
|
31
|
+
'/sbin',
|
32
|
+
]
|
33
|
+
}
|
34
|
+
}
|
@@ -0,0 +1,89 @@
|
|
1
|
+
upstream app_server {
|
2
|
+
# fail_timeout=0 means we always retry an upstream even if it failed
|
3
|
+
# to return a good HTTP response (in case the Unicorn master nukes a
|
4
|
+
# single worker for timing out).
|
5
|
+
server unix:<%= upstream_socket_path %> fail_timeout=0;
|
6
|
+
}
|
7
|
+
|
8
|
+
server {
|
9
|
+
listen 80 default deferred; # for Linux
|
10
|
+
|
11
|
+
client_max_body_size 4G;
|
12
|
+
server_name <%= server_name %>;
|
13
|
+
|
14
|
+
keepalive_timeout 5;
|
15
|
+
|
16
|
+
# path for static files
|
17
|
+
root <%= web_root %>;
|
18
|
+
|
19
|
+
# Prefer to serve static files directly from nginx to avoid unnecessary
|
20
|
+
# data copies from the application server.
|
21
|
+
try_files $uri/index.html $uri.html $uri @app;
|
22
|
+
|
23
|
+
location @app {
|
24
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
25
|
+
|
26
|
+
# enable this if you forward HTTPS traffic to unicorn,
|
27
|
+
# this helps Rack set the proper URL scheme for doing redirects:
|
28
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
29
|
+
|
30
|
+
# pass the Host: header from the client right along so redirects
|
31
|
+
# can be set properly within the Rack application
|
32
|
+
proxy_set_header Host $http_host;
|
33
|
+
|
34
|
+
# we don't want nginx trying to do something clever with
|
35
|
+
# redirects, we set the Host: header above already.
|
36
|
+
proxy_redirect off;
|
37
|
+
|
38
|
+
proxy_pass http://app_server;
|
39
|
+
}
|
40
|
+
|
41
|
+
# Rails error pages
|
42
|
+
error_page 500 502 503 504 /500.html;
|
43
|
+
location = /500.html {
|
44
|
+
root <%= web_root %>;
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
server {
|
49
|
+
listen 443;
|
50
|
+
client_max_body_size 4G;
|
51
|
+
server_name <%= server_name %>;
|
52
|
+
|
53
|
+
keepalive_timeout 5;
|
54
|
+
|
55
|
+
# path for static files
|
56
|
+
root <%= web_root %>;
|
57
|
+
|
58
|
+
ssl on;
|
59
|
+
ssl_certificate <%= ssl_cert_path %>;
|
60
|
+
ssl_certificate_key <%= ssl_key_path %>;
|
61
|
+
|
62
|
+
# Prefer to serve static files directly from nginx to avoid unnecessary
|
63
|
+
# data copies from the application server.
|
64
|
+
try_files $uri/index.html $uri.html $uri @app;
|
65
|
+
|
66
|
+
location @app {
|
67
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
68
|
+
|
69
|
+
# enable this if you forward HTTPS traffic to unicorn,
|
70
|
+
# this helps Rack set the proper URL scheme for doing redirects:
|
71
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
72
|
+
|
73
|
+
# pass the Host: header from the client right along so redirects
|
74
|
+
# can be set properly within the Rack application
|
75
|
+
proxy_set_header Host $http_host;
|
76
|
+
|
77
|
+
# we don't want nginx trying to do something clever with
|
78
|
+
# redirects, we set the Host: header above already.
|
79
|
+
proxy_redirect off;
|
80
|
+
|
81
|
+
proxy_pass http://app_server;
|
82
|
+
}
|
83
|
+
|
84
|
+
# Rails error pages
|
85
|
+
error_page 500 502 503 504 /500.html;
|
86
|
+
location = /500.html {
|
87
|
+
root <%= web_root %>;
|
88
|
+
}
|
89
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
export BUNDLE_GEMFILE=.freighthop.gemfile
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# /etc/init/puma.conf - Puma config
|
2
|
+
|
3
|
+
# This example config should work with Ubuntu 12.04+. It
|
4
|
+
# allows you to manage multiple Puma instances with
|
5
|
+
# Upstart, Ubuntu's native service management tool.
|
6
|
+
#
|
7
|
+
# See workers.conf for how to manage all Puma instances at once.
|
8
|
+
#
|
9
|
+
# Save this config as /etc/init/puma.conf then manage puma with:
|
10
|
+
# sudo start puma app=PATH_TO_APP
|
11
|
+
# sudo stop puma app=PATH_TO_APP
|
12
|
+
# sudo status puma app=PATH_TO_APP
|
13
|
+
#
|
14
|
+
# or use the service command:
|
15
|
+
# sudo service puma {start,stop,restart,status}
|
16
|
+
#
|
17
|
+
|
18
|
+
description "Puma Background Worker"
|
19
|
+
|
20
|
+
# no "start on", we don't want to automatically start
|
21
|
+
stop on (stopping puma-manager or runlevel [06])
|
22
|
+
|
23
|
+
# change apps to match your deployment user if you want to use this as a less privileged user (recommended!)
|
24
|
+
# setuid vagrant
|
25
|
+
# setgid vagrant
|
26
|
+
|
27
|
+
respawn
|
28
|
+
respawn limit 3 30
|
29
|
+
|
30
|
+
instance ${app}
|
31
|
+
|
32
|
+
script
|
33
|
+
# this script runs in /bin/sh by default
|
34
|
+
# respawn as bash so we can source in rbenv/rvm
|
35
|
+
# quoted heredoc to tell /bin/sh not to interpret
|
36
|
+
# variables
|
37
|
+
exec /bin/bash <<'EOT'
|
38
|
+
# set HOME to the setuid user's home, there doesn't seem to be a better, portable way
|
39
|
+
export HOME="$(eval echo ~$(id -un))"
|
40
|
+
|
41
|
+
cd $app
|
42
|
+
|
43
|
+
source /etc/profile.d/rbenv.sh
|
44
|
+
|
45
|
+
source /etc/profile.d/custom_bundler_gemfile.sh
|
46
|
+
|
47
|
+
logger -t puma "Starting server: $app"
|
48
|
+
|
49
|
+
exec bundle exec puma -b unix://<%= socket_path %>
|
50
|
+
EOT
|
51
|
+
end script
|