vagrant-reverse-proxy 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.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/Gemfile +14 -0
- data/LICENSE.txt +22 -0
- data/README.md +87 -0
- data/Rakefile +2 -0
- data/lib/vagrant-reverse-proxy/action/write_nginx_config.rb +83 -0
- data/lib/vagrant-reverse-proxy/action.rb +25 -0
- data/lib/vagrant-reverse-proxy/config.rb +34 -0
- data/lib/vagrant-reverse-proxy/plugin.rb +37 -0
- data/lib/vagrant-reverse-proxy/version.rb +5 -0
- data/lib/vagrant-reverse-proxy.rb +8 -0
- data/vagrant-reverse-proxy.gemspec +23 -0
- metadata +86 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a5afc6f0add3b80d836ec3c2213d457bb11876a3
|
4
|
+
data.tar.gz: b95de26303e6bc4f8e5ef010e93935364f92694f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: bcc2c346c8fa987eab7bed882a33619b25e72a2fbee9191a7ce75e2f997f4fe841784e173b274d79f7cc365dd5ab3f23dc03da60a797de79ceb4cee056f37bb0
|
7
|
+
data.tar.gz: ac6e4a7fd17913ae04119176e6ad9dbc15888f7bf2464968b27943e3ab2e499551269d6e2f69df49494054025557fbe45675c24b0740944ced4a3b3fe71d5b18
|
data/.gitignore
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
group :development do
|
4
|
+
gem 'vagrant', :git => 'git://github.com/mitchellh/vagrant.git', :tag => 'v1.7.4'
|
5
|
+
end
|
6
|
+
|
7
|
+
group :plugins do
|
8
|
+
# This gem's dependencies are in vagrant-reverse-proxy.gemspec
|
9
|
+
gemspec
|
10
|
+
|
11
|
+
# Useful when testing
|
12
|
+
#gem 'vagrant-libvirt'
|
13
|
+
#gem 'vagrant-hostmanager'
|
14
|
+
end
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2016 Code Yellow BV
|
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/README.md
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# Vagrant Reverse Proxy
|
2
|
+
|
3
|
+
This Vagrant plugin automatically installs a reverse proxy
|
4
|
+
configuration for each of your Vagrant machines.
|
5
|
+
|
6
|
+
This means you can access the HTTP interface of your virtual machines
|
7
|
+
by accessing HTTP on your machine's IP address or DNS hostname, with
|
8
|
+
a suffix that indicates the VM.
|
9
|
+
|
10
|
+
In other words, `http://localhost/my-vm` refers to `http://my-vm/` on
|
11
|
+
the local machine. This also works if you access it from an external
|
12
|
+
machine, even though `my-vm` is a local machine name unknown on the
|
13
|
+
network.
|
14
|
+
|
15
|
+
This plugin currently only supports NGINX, but patches are accepted to
|
16
|
+
integrate it with other web servers.
|
17
|
+
|
18
|
+
## Installation
|
19
|
+
|
20
|
+
Install the plugin as usual:
|
21
|
+
|
22
|
+
$ vagrant plugin install vagrant-reverse-proxy
|
23
|
+
|
24
|
+
## Usage
|
25
|
+
|
26
|
+
First, install NGINX and create a configuration as usual. Then, in
|
27
|
+
the `server` configuration block for the host you want to use for
|
28
|
+
proxying, simply put `include "vagrant-proxy-config";` in the file.
|
29
|
+
|
30
|
+
If you don't need anything specific, just put the following in
|
31
|
+
`/etc/nginx/sites-enabled/default`:
|
32
|
+
|
33
|
+
server {
|
34
|
+
listen [::]:80 default ipv6only=off;
|
35
|
+
# This is the fallback server
|
36
|
+
server_name default;
|
37
|
+
# Redirect http://localhost/hostname/lalala
|
38
|
+
# to http://hostname/lalala
|
39
|
+
include "vagrant-proxy-config";
|
40
|
+
}
|
41
|
+
|
42
|
+
This will load the `/etc/nginx/vagrant-proxy-config` file which is
|
43
|
+
managed by this plugin. This file contains `location` statements for
|
44
|
+
each of your virtual machines, such that `http://localhost/foo` will
|
45
|
+
proxy to port 80 on the virtual machine with a `config.vm.hostname`
|
46
|
+
value of `foo`. This is only done for virtual machines that have
|
47
|
+
`config.reverse_proxy.enabled` set to `true` in their config.
|
48
|
+
|
49
|
+
Whenever you bring up or halt a machine, the plugin updates the proxy
|
50
|
+
config file and invokes `sudo systemctl reload nginx` to make the
|
51
|
+
change immediately visible.
|
52
|
+
|
53
|
+
### Custom host names
|
54
|
+
|
55
|
+
Sometimes you want to support several virtual hosts for one VM. To
|
56
|
+
set that up, you can override the `vhosts` option:
|
57
|
+
|
58
|
+
config.reverse_proxy.vhosts = ['foo.test', 'bar.test']
|
59
|
+
|
60
|
+
This will proxy `http://localhost/foo.test` and
|
61
|
+
`http://localhost/bar.test` to this VM, with a matching `Host` header.
|
62
|
+
|
63
|
+
## Adding proxy support to your application
|
64
|
+
|
65
|
+
This plugin will instruct NGINX to pass the following headers to your
|
66
|
+
Vagrant box:
|
67
|
+
|
68
|
+
- `X-Forwarded-For`: This contains the IP address of the client.
|
69
|
+
- `X-Forwarded-Host`: This contains the IP address of your hypervisor.
|
70
|
+
- `X-Forwarded-Port`: This contains the port number of NGINX on your hypervisor.
|
71
|
+
- `X-Base-Url`: This contains the base URL that redirects to this VM.
|
72
|
+
|
73
|
+
Redirects are transparently rewritten by NGINX, but if your
|
74
|
+
application generates links with absolute URLs, you'll need to ensure
|
75
|
+
that those links are prefixed with the value of `X-Base-Url`, but only
|
76
|
+
if the request originated from the trusted NGINX proxy on your
|
77
|
+
hypervisor.
|
78
|
+
|
79
|
+
Be sure to avoid using these headers when the request originated
|
80
|
+
elsewhere, because trusting these headers as sent by arbitrary clients
|
81
|
+
is a potential security issue! If you're using Laravel, you could
|
82
|
+
consider using the
|
83
|
+
[trusted proxies middleware](https://github.com/fideloper/TrustedProxy).
|
84
|
+
If you're using Symfony, just use `setTrustedProxies()` on your
|
85
|
+
`Request` object, and Symfony takes care of the rest. Note that
|
86
|
+
`X-Base-Url` is not supported by either framework, so you'll need to
|
87
|
+
add a bit of custom code there if you need to override the base URL.
|
data/Rakefile
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ReverseProxy
|
3
|
+
module Action
|
4
|
+
class WriteNginxConfig
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
@global_env = env[:machine].env
|
8
|
+
@provider = env[:machine].provider_name
|
9
|
+
@config = @global_env.vagrantfile.config
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(env)
|
13
|
+
@app.call(env)
|
14
|
+
|
15
|
+
return unless @config.reverse_proxy.enabled?
|
16
|
+
|
17
|
+
# Determine temp file and target file
|
18
|
+
tmp_file = @global_env.tmp_path.join('nginx.vagrant-proxies')
|
19
|
+
nginx_site = '/etc/nginx/vagrant-proxy-config'
|
20
|
+
|
21
|
+
env[:ui].info('Updating nginx configuration. Administrator privileges will be required...')
|
22
|
+
|
23
|
+
File.open(tmp_file, 'w') do |f|
|
24
|
+
get_machines().each do |m|
|
25
|
+
f.write(server_block(m))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
Kernel.system('sudo', 'cp', tmp_file.to_s, nginx_site)
|
30
|
+
Kernel.system('sudo', 'systemctl', 'reload', 'nginx')
|
31
|
+
end
|
32
|
+
|
33
|
+
def server_block(machine)
|
34
|
+
if @config.reverse_proxy.vhosts
|
35
|
+
vhosts = @config.reverse_proxy.vhosts
|
36
|
+
else
|
37
|
+
vhosts = [machine.config.vm.hostname || machine.name]
|
38
|
+
end
|
39
|
+
ip = get_ip_address(machine)
|
40
|
+
vhosts.collect do |vhost| <<EOF
|
41
|
+
location /#{vhost}/ {
|
42
|
+
proxy_set_header Host #{vhost};
|
43
|
+
proxy_set_header X-Forwarded-For $remote_addr;
|
44
|
+
proxy_set_header X-Forwarded-Host $host;
|
45
|
+
proxy_set_header X-Forwarded-Port $server_port;
|
46
|
+
proxy_set_header X-Base-Url http://$host:$server_port/nl.dr.dev/;
|
47
|
+
|
48
|
+
proxy_pass http://#{ip}/;
|
49
|
+
proxy_redirect http://#{vhost}/ /#{vhost}/;
|
50
|
+
}
|
51
|
+
EOF
|
52
|
+
end.join("\n")
|
53
|
+
end
|
54
|
+
|
55
|
+
# Machine-finding code stolen from vagrant-hostmanager :)
|
56
|
+
def get_machines()
|
57
|
+
# Collect only machines that exist for the current provider
|
58
|
+
@global_env.active_machines.collect do |name, provider|
|
59
|
+
if provider == @provider
|
60
|
+
begin
|
61
|
+
m = @global_env.machine(name, @provider)
|
62
|
+
m.state.id == :running ? m : nil
|
63
|
+
rescue Vagrant::Errors::MachineNotFound
|
64
|
+
nil #ignore
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end.compact
|
68
|
+
end
|
69
|
+
|
70
|
+
# Also from vagrant-hostmanager
|
71
|
+
def get_ip_address(machine)
|
72
|
+
ip = nil
|
73
|
+
machine.config.vm.networks.each do |network|
|
74
|
+
key, options = network[0], network[1]
|
75
|
+
ip = options[:ip] if key == :private_network
|
76
|
+
break if ip
|
77
|
+
end
|
78
|
+
ip || (machine.ssh_info ? machine.ssh_info[:host] : nil)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'action/write_nginx_config'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module ReverseProxy
|
5
|
+
module Action
|
6
|
+
include Vagrant::Action::Builtin
|
7
|
+
|
8
|
+
# We (currently) don't distinguish between upping and downing a
|
9
|
+
# machine; we always write a complete config with all machines.
|
10
|
+
def self.add_machine
|
11
|
+
Vagrant::Action::Builder.new.tap do |builder|
|
12
|
+
builder.use ConfigValidate
|
13
|
+
builder.use WriteNginxConfig
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.remove_machine
|
18
|
+
Vagrant::Action::Builder.new.tap do |builder|
|
19
|
+
builder.use ConfigValidate
|
20
|
+
builder.use WriteNginxConfig
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ReverseProxy
|
3
|
+
class Plugin
|
4
|
+
class Config < Vagrant.plugin(2, :config)
|
5
|
+
attr_accessor :enabled, :vhosts
|
6
|
+
alias_method :enabled?, :enabled
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@enabled = UNSET_VALUE
|
10
|
+
@vhosts = UNSET_VALUE
|
11
|
+
end
|
12
|
+
|
13
|
+
def finalize!
|
14
|
+
@enabled = false if @enabled == UNSET_VALUE
|
15
|
+
@vhosts = nil if @vhosts == UNSET_VALUE
|
16
|
+
end
|
17
|
+
|
18
|
+
def validate(machine)
|
19
|
+
errors = _detected_errors
|
20
|
+
|
21
|
+
unless [true, false, UNSET_VALUE].include?(@enabled)
|
22
|
+
errors << 'enabled must be a boolean'
|
23
|
+
end
|
24
|
+
|
25
|
+
unless @vhosts.instance_of?(Array) || @vhosts == nil || @vhosts == UNSET_VALUE
|
26
|
+
errors << 'vhosts must be an array of hostnames (or nil to use default name)'
|
27
|
+
end
|
28
|
+
|
29
|
+
{ 'Reverse proxy configuration' => errors.compact }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ReverseProxy
|
3
|
+
class Plugin < Vagrant.plugin(2)
|
4
|
+
name 'Reverse Proxy'
|
5
|
+
|
6
|
+
description <<-DESC
|
7
|
+
This plugin automatically manages a reverse proxy
|
8
|
+
configuration in your host machine's web server, which makes
|
9
|
+
it easy to access the web servers of your guest machines.
|
10
|
+
|
11
|
+
This is safer and easier than making the guest machine
|
12
|
+
completely available on the outside network.
|
13
|
+
DESC
|
14
|
+
|
15
|
+
config :reverse_proxy do
|
16
|
+
require_relative 'config'
|
17
|
+
Config
|
18
|
+
end
|
19
|
+
|
20
|
+
action_hook(:reverse_proxy, :machine_action_up) do |hook|
|
21
|
+
hook.append(Action.add_machine)
|
22
|
+
end
|
23
|
+
|
24
|
+
action_hook(:reverse_proxy, :machine_action_suspend) do |hook|
|
25
|
+
hook.append(Action.remove_machine)
|
26
|
+
end
|
27
|
+
|
28
|
+
action_hook(:reverse_proxy, :machine_action_resume) do |hook|
|
29
|
+
hook.append(Action.add_machine)
|
30
|
+
end
|
31
|
+
|
32
|
+
action_hook(:reverse_proxy, :machine_action_halt) do |hook|
|
33
|
+
hook.append(Action.remove_machine)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'vagrant-reverse-proxy/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "vagrant-reverse-proxy"
|
8
|
+
spec.version = VagrantPlugins::ReverseProxy::VERSION
|
9
|
+
spec.authors = ["Peter Bex"]
|
10
|
+
spec.email = ["peter@codeyellow.nl"]
|
11
|
+
spec.summary = %q{A vagrant plugin that adds reverse proxies for your VMs}
|
12
|
+
spec.description = %q{This plugin manages reverse proxy configuration (currently nginx-only) so you can reach your Vagrant VM's web servers externally without having to set up bridge networking.}
|
13
|
+
spec.homepage = "https://github.com/CodeYellowBV/vagrant-reverse-proxy"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
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.7"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vagrant-reverse-proxy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Peter Bex
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-03-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.7'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
description: This plugin manages reverse proxy configuration (currently nginx-only)
|
42
|
+
so you can reach your Vagrant VM's web servers externally without having to set
|
43
|
+
up bridge networking.
|
44
|
+
email:
|
45
|
+
- peter@codeyellow.nl
|
46
|
+
executables: []
|
47
|
+
extensions: []
|
48
|
+
extra_rdoc_files: []
|
49
|
+
files:
|
50
|
+
- ".gitignore"
|
51
|
+
- Gemfile
|
52
|
+
- LICENSE.txt
|
53
|
+
- README.md
|
54
|
+
- Rakefile
|
55
|
+
- lib/vagrant-reverse-proxy.rb
|
56
|
+
- lib/vagrant-reverse-proxy/action.rb
|
57
|
+
- lib/vagrant-reverse-proxy/action/write_nginx_config.rb
|
58
|
+
- lib/vagrant-reverse-proxy/config.rb
|
59
|
+
- lib/vagrant-reverse-proxy/plugin.rb
|
60
|
+
- lib/vagrant-reverse-proxy/version.rb
|
61
|
+
- vagrant-reverse-proxy.gemspec
|
62
|
+
homepage: https://github.com/CodeYellowBV/vagrant-reverse-proxy
|
63
|
+
licenses:
|
64
|
+
- MIT
|
65
|
+
metadata: {}
|
66
|
+
post_install_message:
|
67
|
+
rdoc_options: []
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
requirements: []
|
81
|
+
rubyforge_project:
|
82
|
+
rubygems_version: 2.2.2
|
83
|
+
signing_key:
|
84
|
+
specification_version: 4
|
85
|
+
summary: A vagrant plugin that adds reverse proxies for your VMs
|
86
|
+
test_files: []
|