freighthop 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/.gitignore
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Paul Hinze
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Puppetfile
ADDED
data/Puppetfile.lock
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
FORGE
|
2
|
+
remote: http://forge.puppetlabs.com
|
3
|
+
specs:
|
4
|
+
gdsoperations/rbenv (1.0.1)
|
5
|
+
puppetlabs/apt (1.2.0)
|
6
|
+
puppetlabs/stdlib (>= 2.2.1)
|
7
|
+
puppetlabs/firewall (0.4.2)
|
8
|
+
puppetlabs/postgresql (2.5.0)
|
9
|
+
puppetlabs/apt (< 2.0.0, >= 1.1.0)
|
10
|
+
puppetlabs/firewall (>= 0.0.4)
|
11
|
+
puppetlabs/stdlib (< 5.0.0, >= 3.2.0)
|
12
|
+
ripienaar/concat (>= 0.2.0)
|
13
|
+
puppetlabs/stdlib (4.1.0)
|
14
|
+
ripienaar/concat (0.2.0)
|
15
|
+
|
16
|
+
GIT
|
17
|
+
remote: https://github.com/jfryman/puppet-nginx
|
18
|
+
ref: master
|
19
|
+
sha: 30d62246b222ee91856843e20fda303fea996dcd
|
20
|
+
specs:
|
21
|
+
nginx (0.0.5)
|
22
|
+
puppetlabs/apt (>= 1.0.0)
|
23
|
+
puppetlabs/stdlib (>= 0.1.6)
|
24
|
+
|
25
|
+
PATH
|
26
|
+
remote: local_modules/freighthop
|
27
|
+
specs:
|
28
|
+
freighthop (0.0.1)
|
29
|
+
|
30
|
+
DEPENDENCIES
|
31
|
+
freighthop (>= 0)
|
32
|
+
gdsoperations/rbenv (>= 0)
|
33
|
+
nginx (>= 0)
|
34
|
+
puppetlabs/apt (>= 0)
|
35
|
+
puppetlabs/postgresql (>= 0)
|
36
|
+
puppetlabs/stdlib (>= 0)
|
37
|
+
|
data/README.md
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
# Freighthop: Vagrant on Rails
|
2
|
+
|
3
|
+
|
4
|
+
Don't you hate how your dev machine inevitably becomes the superset of all the dependencies of every project you ever worked on? Nobody wants to live in a war zone of data stores fighting for resources.
|
5
|
+
|
6
|
+
Vagrant is suppose to help us with this. Package everything in virtual machines, and your life will be amazing! That's the idea at least; but the actual mechanics of getting to that promised land are not all that clear.
|
7
|
+
|
8
|
+
## What is Freighthop?
|
9
|
+
|
10
|
+
Freighthop is based around this simple goal:
|
11
|
+
|
12
|
+
> When I download a rails project, I want to run a single command that spins me up a VM serving that project.
|
13
|
+
|
14
|
+
With a few commands from the project root of any Rack-compatible app, Freighthop can spin up a VM that serves that project at `projectname.vagrant.dev`. Freighthop takes care of the bundle install, the server configuration, and the database, and it provides a helper executable that allows you to interact with the VM.
|
15
|
+
|
16
|
+
----
|
17
|
+
|
18
|
+
## !! Alpha Work in Progress !!
|
19
|
+
|
20
|
+
**WARNING**: This is a young project; lots of stuff will change as the project evolves.
|
21
|
+
|
22
|
+
----
|
23
|
+
|
24
|
+
|
25
|
+
## Try it out
|
26
|
+
|
27
|
+
This is a little involved at the moment (cuz alpha). Should simplify as the project evolves.
|
28
|
+
|
29
|
+
### Get the prerequisites
|
30
|
+
|
31
|
+
* Vagrant 1.3.1
|
32
|
+
* VMWare Fusion (for now; will support VirtualBox soon)
|
33
|
+
* Vagrant Plugins (install with `vagrant plugin install $pluginname`):
|
34
|
+
* landrush (for DNS)
|
35
|
+
* note you'll need to run `vagrant landrush install` to finish this installation procedure
|
36
|
+
* vagrant-cachier (for apt caching; will eventually be optional)
|
37
|
+
* vagrant-vmware-fusion (for now)
|
38
|
+
|
39
|
+
|
40
|
+
### Clone the project
|
41
|
+
|
42
|
+
```
|
43
|
+
git clone https://github.com/phinze/freighthop
|
44
|
+
```
|
45
|
+
|
46
|
+
### Gems and puppet modules
|
47
|
+
|
48
|
+
```
|
49
|
+
bundle install
|
50
|
+
librarian-puppet install
|
51
|
+
```
|
52
|
+
|
53
|
+
### Get the executable on your $PATH
|
54
|
+
|
55
|
+
This is a hacky symlink for now; eventually we'll wrap the project up in a distributable package that will do this for you.
|
56
|
+
|
57
|
+
```
|
58
|
+
cd freighthop
|
59
|
+
ln -s bin/fh /usr/local/bin/fh
|
60
|
+
```
|
61
|
+
|
62
|
+
### Create config
|
63
|
+
|
64
|
+
A Freighthop-enabled project just needs to include a `.freighthop.json` something like this:
|
65
|
+
|
66
|
+
```json
|
67
|
+
{
|
68
|
+
"freighthop::ruby_version": "2.0.0-p247",
|
69
|
+
"freighthop::databases": [
|
70
|
+
"myproject_development",
|
71
|
+
"myproject_test"
|
72
|
+
],
|
73
|
+
"freighthop::database_users": [
|
74
|
+
"myproject"
|
75
|
+
],
|
76
|
+
"freighthop::packages": [
|
77
|
+
"git-core",
|
78
|
+
"libpq-dev",
|
79
|
+
"libsqlite3-dev",
|
80
|
+
"libxml2-dev",
|
81
|
+
"libxslt1-dev",
|
82
|
+
"nodejs"
|
83
|
+
]
|
84
|
+
}
|
85
|
+
```
|
86
|
+
|
87
|
+
### Spin it up
|
88
|
+
|
89
|
+
```
|
90
|
+
# boot the VM
|
91
|
+
fh up
|
92
|
+
# run your migrations
|
93
|
+
fh rake db:migrate
|
94
|
+
```
|
95
|
+
|
96
|
+
### Win
|
97
|
+
|
98
|
+
Thanks to landrush, we can hit our VM at a friendly URL.
|
99
|
+
|
100
|
+
```
|
101
|
+
curl http://myproject.vagrant.dev
|
102
|
+
```
|
103
|
+
|
104
|
+
### Shut 'er down
|
105
|
+
|
106
|
+
```
|
107
|
+
fh down
|
108
|
+
```
|
109
|
+
|
110
|
+
And your host system is none the wiser! No databases lying around, no daemons hanging out forever in the background; squeaky clean!
|
111
|
+
|
112
|
+
## `fh` - the friendly executable helper
|
113
|
+
|
114
|
+
For now this is a tiny bash script that mostly just delegates down to `vagrant`. Here are the important commands from vagrant:
|
115
|
+
|
116
|
+
* `fh up` - start and provision the VM
|
117
|
+
* `fh provision` - kick off provisioning if you change your config or something breaks
|
118
|
+
* `fh ssh` - log into your VM
|
119
|
+
* `fh halt` - shut down the VM
|
120
|
+
* `fh destroy` - delete the VM
|
121
|
+
|
122
|
+
And it also knows a few special commands of its own:
|
123
|
+
|
124
|
+
* `fh run '$COMMAND'` - run a command from the CWD of your project on the VM
|
125
|
+
* `fh console` - attempts to run a rails console inside the VM
|
126
|
+
* `fh rake $TASK` - runs a rake task in your project on the VM
|
127
|
+
|
128
|
+
## So much to do...
|
129
|
+
|
130
|
+
We're just getting started; this little project could really use your help!
|
131
|
+
|
132
|
+
* Try to get it running and report any problems you hit.
|
133
|
+
* Check out existing issues for the list of things we're working on.
|
134
|
+
* Submit your ideas for features as an issue.
|
135
|
+
* Do that open source thing where you fork, feature branch, and pull request.
|
data/Rakefile
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
desc 'run librarian-puppet to update puppet modules from Puppetfile'
|
4
|
+
task :librarian do
|
5
|
+
sh "librarian-puppet clean --verbose"
|
6
|
+
sh "librarian-puppet install --strip-dot-git --verbose"
|
7
|
+
end
|
8
|
+
|
9
|
+
Rake::Task['build'].enhance ['librarian']
|
data/Vagrantfile
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
require_relative 'lib/freighthop'
|
5
|
+
|
6
|
+
Vagrant.require_plugin 'landrush'
|
7
|
+
|
8
|
+
Vagrant.configure('2') do |config|
|
9
|
+
config.vm.box = 'precise64'
|
10
|
+
config.vm.box_url = Freighthop.box_url
|
11
|
+
|
12
|
+
config.landrush.enable
|
13
|
+
|
14
|
+
if config.respond_to? :cache
|
15
|
+
config.cache.auto_detect = true
|
16
|
+
config.cache.enable_nfs = true
|
17
|
+
end
|
18
|
+
|
19
|
+
config.vm.define Freighthop.app_name do |node_config|
|
20
|
+
node_config.vm.hostname = Freighthop.hostname
|
21
|
+
node_config.vm.network :private_network, ip: Freighthop.ip_address
|
22
|
+
|
23
|
+
node_config.vm.provider :vmware_fusion do |v|
|
24
|
+
v.vmx['displayName'] = Freighthop.hostname
|
25
|
+
v.vmx['memsize'] = 2048
|
26
|
+
v.vmx['numvcpus'] = 4
|
27
|
+
end
|
28
|
+
|
29
|
+
node_config.vm.provider :virtualbox do |v|
|
30
|
+
v.customize ['modifyvm', :id, '--memory', '2048']
|
31
|
+
v.customize ['modifyvm', :id, '--cpus', '4']
|
32
|
+
end
|
33
|
+
|
34
|
+
node_config.vm.synced_folder(
|
35
|
+
Freighthop.host_rails_root,
|
36
|
+
Freighthop.guest_rails_root,
|
37
|
+
nfs: true
|
38
|
+
)
|
39
|
+
|
40
|
+
node_config.vm.provision :shell, path: 'init/bootstrap_puppet_omnibus.sh'
|
41
|
+
|
42
|
+
node_config.vm.provision :shell do |s|
|
43
|
+
s.path = 'init/symlinks_for_hiera.sh'
|
44
|
+
s.args = Freighthop.guest_rails_root
|
45
|
+
end
|
46
|
+
|
47
|
+
puppet_options = [].tap do |options|
|
48
|
+
options << %w[--verbose --debug] if ENV['PUPPET_VERBOSE']
|
49
|
+
options << %w[--templatedir templates]
|
50
|
+
options << %w[--hiera_config /vagrant/hiera.yaml]
|
51
|
+
end
|
52
|
+
|
53
|
+
node_config.vm.provision :puppet, options: puppet_options do |puppet|
|
54
|
+
puppet.manifests_path = 'manifests'
|
55
|
+
puppet.module_path = 'modules'
|
56
|
+
puppet.manifest_file = 'site.pp'
|
57
|
+
puppet.facter = {
|
58
|
+
'app_name' => Freighthop.app_name
|
59
|
+
}
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/bin/fh
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
FREIGHTHOP_VARGANT_DOTFILE_PATH = File.expand_path('~/.freighthop.d/vagrant')
|
4
|
+
FREIGHTHOP_VARGANT_CWD = File.expand_path(File.dirname(__FILE__))
|
5
|
+
|
6
|
+
unless File.directory?(FREIGHTHOP_VARGANT_DOTFILE_PATH)
|
7
|
+
require 'fileutils'
|
8
|
+
FileUtils.mkdir_p(FREIGHTHOP_VARGANT_DOTFILE_PATH)
|
9
|
+
end
|
10
|
+
|
11
|
+
ENV['VAGRANT_DOTFILE_PATH'] = FREIGHTHOP_VARGANT_DOTFILE_PATH
|
12
|
+
ENV['VAGRANT_CWD'] = FREIGHTHOP_VARGANT_CWD
|
13
|
+
|
14
|
+
PROJECT_NAME = File.basename(Dir.pwd)
|
15
|
+
PROJECT_DIR = "/srv/#{PROJECT_NAME}"
|
16
|
+
|
17
|
+
def vagrant_ssh(cmd)
|
18
|
+
%Q(/usr/bin/vagrant ssh -c 'sudo /bin/bash -l -c "cd #{PROJECT_DIR}; #{cmd}"')
|
19
|
+
end
|
20
|
+
|
21
|
+
def console_command
|
22
|
+
if File.exist?('./bin/rails')
|
23
|
+
'./bin/rails console'
|
24
|
+
elsif File.exist?('./script/console')
|
25
|
+
'./script/console'
|
26
|
+
else
|
27
|
+
'./script/rails console'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
subcommand, *rest = ARGV
|
32
|
+
case subcommand
|
33
|
+
when 'run' then
|
34
|
+
exec vagrant_ssh(rest.join(' '))
|
35
|
+
when 'console' then
|
36
|
+
`vagrant ssh-config > /tmp/freighthop.ssh-config`
|
37
|
+
exec "ssh -t -F /tmp/freighthop.ssh-config #{PROJECT_NAME} 'sudo /bin/bash -l -c 'cd #{PROJECT_DIR}; #{console_command} #{rest.join(' ')}'"
|
38
|
+
when 'rake' then
|
39
|
+
exec vagrant_ssh("bundle exec rake #{rest.join(' ')}")
|
40
|
+
else
|
41
|
+
exec "/usr/bin/vagrant #{ARGV.join(' ')}"
|
42
|
+
end
|
data/freighthop.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'freighthop/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'freighthop'
|
8
|
+
spec.version = Freighthop::VERSION
|
9
|
+
spec.authors = ['Paul Hinze']
|
10
|
+
spec.email = ['paul.t.hinze@gmail.com']
|
11
|
+
spec.description = %q{Vagrant on Rails: quickly spin up a Vagrant VM to serve your rack-compatible app.}
|
12
|
+
spec.summary = %q{Vagrant on Rails: quickly spin up a Vagrant VM to serve your rack-compatible app.}
|
13
|
+
spec.homepage = 'https://github.com/phinze/freighthop'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/) + Dir.glob('modules/**/*')
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
22
|
+
spec.add_development_dependency 'rake'
|
23
|
+
spec.add_development_dependency 'guard-shell'
|
24
|
+
|
25
|
+
spec.add_development_dependency 'puppet'
|
26
|
+
spec.add_development_dependency 'librarian-puppet'
|
27
|
+
end
|
data/hiera.yaml
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
OMNIBUS_PACKAGE_PATH='/vagrant/puppet-omnibus.deb'
|
4
|
+
OMNIBUS_PACKAGE_URL='https://dl.dropboxusercontent.com/u/12210925/apt/puppet-omnibus_3.1.0%2Bfpm5_amd64.deb'
|
5
|
+
APT_CACHE='/var/cache/apt/pkgcache.bin'
|
6
|
+
ONE_DAY=$(( 24 * 60 * 60 ))
|
7
|
+
OMNIBUS_PROFILE=/etc/profile.d/puppet_omnibus.sh
|
8
|
+
|
9
|
+
# update apt-cache if older than one day
|
10
|
+
if [[ ! -f $APT_CACHE || $(( $(date +%s) - $(stat -c %Z $APT_CACHE) )) -gt $ONE_DAY ]]; then
|
11
|
+
apt-get update
|
12
|
+
fi
|
13
|
+
|
14
|
+
if [[ $(dpkg-query -W --showformat='${Status}' puppet-omnibus) != "install ok installed" ]]; then
|
15
|
+
# download puppet-omnibus package if it's not here yet
|
16
|
+
if [ ! -f "$OMNIBUS_PACKAGE_PATH" ]; then
|
17
|
+
wget -q -O "$OMNIBUS_PACKAGE_PATH" "$OMNIBUS_PACKAGE_URL"
|
18
|
+
fi
|
19
|
+
|
20
|
+
# install dependencies
|
21
|
+
dpkg -I $OMNIBUS_PACKAGE_PATH | grep 'Depends:' | cut -d':' -f2 | tr -d ',' | xargs apt-get install -y
|
22
|
+
|
23
|
+
# install it!
|
24
|
+
dpkg -i $OMNIBUS_PACKAGE_PATH
|
25
|
+
fi
|
26
|
+
|
27
|
+
# remove vagrant's puppet shim if it exists..
|
28
|
+
if [[ -f /etc/profile.d/vagrant_ruby.sh ]]; then
|
29
|
+
rm /etc/profile.d/vagrant_ruby.sh
|
30
|
+
fi
|
31
|
+
|
32
|
+
# ...and drop our puppet in there
|
33
|
+
|
34
|
+
if [[ ! -x $OMNIBUS_PROFILE ]]; then
|
35
|
+
echo 'PATH=$PATH:/opt/puppet-omnibus/embedded/bin' > $OMNIBUS_PROFILE
|
36
|
+
chmod +x $OMNIBUS_PROFILE
|
37
|
+
fi
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
|
4
|
+
HIERA_BASE="/etc/freighthop/hiera_data"
|
5
|
+
|
6
|
+
APP_HIERA_DATA_SOURCE="${1}/.freighthop.json"
|
7
|
+
APP_HIERA_DATA_TARGET="${HIERA_BASE}/app.json"
|
8
|
+
|
9
|
+
VAGRANT_HIERA_DATA_SOURCE="/vagrant/data"
|
10
|
+
VAGRANT_HIERA_DATA_TARGET="${HIERA_BASE}/vagrant"
|
11
|
+
|
12
|
+
if [ ! -d "$HIERA_BASE" ]; then
|
13
|
+
mkdir -p $HIERA_BASE
|
14
|
+
fi
|
15
|
+
|
16
|
+
if [ ! -h "$VAGRANT_HIERA_DATA_TARGET" ]; then
|
17
|
+
ln -s $VAGRANT_HIERA_DATA_SOURCE $VAGRANT_HIERA_DATA_TARGET
|
18
|
+
fi
|
19
|
+
|
20
|
+
if [ ! -h "$APP_HIERA_DATA_TARGET" ]; then
|
21
|
+
ln -s $APP_HIERA_DATA_SOURCE $APP_HIERA_DATA_TARGET
|
22
|
+
fi
|