<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>vagrant rails on random thoughts</title><link>https://awesomeprogrammer.com/categories/vagrant-rails/</link><description>Recent content in vagrant rails on random thoughts</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sun, 07 Dec 2014 00:00:00 +0000</lastBuildDate><atom:link href="https://awesomeprogrammer.com/categories/vagrant-rails/index.xml" rel="self" type="application/rss+xml"/><item><title>Vagrant setup for multiple subdomains application (dev box)</title><link>https://awesomeprogrammer.com/blog/2014/12/07/vagrant-setup-for-multiple-subdomains-application/</link><pubDate>Sun, 07 Dec 2014 00:00:00 +0000</pubDate><guid>https://awesomeprogrammer.com/blog/2014/12/07/vagrant-setup-for-multiple-subdomains-application/</guid><description><![CDATA[<h3 id="problem">Problem</h3>
<p>Build a vagrant development environment that will serve an rails application that works on multiple subdomains. Moreover that application consists of multiple smaller apps that all are running with a single domain.</p>
<ul>
<li><code>example.dev</code> -&gt; Application #1</li>
<li><code>app.example.dev</code> -&gt; Application #2</li>
<li><code>&lt;any other subdomain&gt;.example.dev</code> -&gt; Application #3</li>
</ul>
<p>Let&rsquo;s assume we&rsquo;re using <code>.dev</code> domains, because we&rsquo;re used to <a href="http://pow.cx/">pow</a>. Meaning those routing should work within vagrant machine and same subdomains should work exactly same way on our local machine.</p>
<h3 id="solution---nginx--dnsmasq">Solution - nginx &amp; dnsmasq</h3>
<p><em>(I assume you&rsquo;re running some kind of ubuntu-based distro, paths may vary between distros)</em></p>
<p>Install nginx &amp; dnsmasq. Edit file <code>/etc/dnsmasq.d/dev-tld</code> as follows:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># /etc/dnsmasq.d/dev-tld</span>
</span></span><span style="display:flex;"><span>local<span style="color:#f92672">=</span>/dev/
</span></span><span style="display:flex;"><span>address<span style="color:#f92672">=</span>/dev/127.0.0.1
</span></span></code></pre></div><p>Restart <code>dnsmasq</code> service. This rule will forward traffic from .dev domains to your localhost - and this is exactly what we want.</p>
<p>Now let&rsquo;s configure nginx, following the scenario above we will need configuration for three apps. We will need some kind of server (thin, puma, unicorn, whatever) that will listen on unix socket. In our nginx config / sites-enabled we need:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>upstream app1 <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  server unix:/apps/app1/tmp/some_rack_server.sock;
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>server <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  listen 80;
</span></span><span style="display:flex;"><span>  server_name example.dev;
</span></span><span style="display:flex;"><span>  root /apps/app1/public;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  location / <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    proxy_pass http://app1;
</span></span><span style="display:flex;"><span>    proxy_set_header Host $host;
</span></span><span style="display:flex;"><span>    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>upstream app2 <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  server unix:/apps/app2/tmp/some_rack_server.sock;
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>server <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  listen 80;
</span></span><span style="display:flex;"><span>  server_name app.example.dev;
</span></span><span style="display:flex;"><span>  root /apps/app2/public;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  location / <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    proxy_pass http://app2;
</span></span><span style="display:flex;"><span>    proxy_set_header Host $host;
</span></span><span style="display:flex;"><span>    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>upstream app3 <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  server unix:/apps/app3/tmp/some_rack_server.sock;
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>server <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  listen 80;
</span></span><span style="display:flex;"><span>  server_name *.example.dev;
</span></span><span style="display:flex;"><span>  root /apps/app3/public;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  location / <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    proxy_pass http://app3;
</span></span><span style="display:flex;"><span>    proxy_set_header Host $host;
</span></span><span style="display:flex;"><span>    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><p>Nging will listen on port 80 and forward request according to our needs. Traffic from <code>example.dev</code> will be served by our first app (app1), <code>app.example.dev</code> will be served by app2 and any other traffic (<code>*.example.dev</code>) will go through app3.</p>
<p>So this works, nice &amp; easy. We have 3 rack servers listing on UNIX sockets backed by nginx that routes everything. From vagrant box you can access all <code>.dev</code> domains, so far - very cool.</p>
<h3 id="next-step---accessing-dev-subdomains-from-local-machine">Next step - accessing .dev subdomains from local machine</h3>
<p>It&rsquo;s nice, but it&rsquo;s not very useful at this point really - we have no way for accessing <code>example.dev</code> (or any of it&rsquo;s subdomains) from our local machine. But there is already solution for that - some smart folks already created tools for us that solves this problem.</p>
<p>First we need to route traffic from ninx in vagrant (port 80) to our machine, in Vagrantfile you need:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span><span style="color:#66d9ef">Vagrant</span><span style="color:#f92672">.</span>configure(<span style="color:#e6db74">&#34;2&#34;</span>) <span style="color:#66d9ef">do</span> <span style="color:#f92672">|</span>config<span style="color:#f92672">|</span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># ...</span>
</span></span><span style="display:flex;"><span>  config<span style="color:#f92672">.</span>vm<span style="color:#f92672">.</span>network <span style="color:#e6db74">:forwarded_port</span>, <span style="color:#e6db74">guest</span>: <span style="color:#ae81ff">80</span>, <span style="color:#e6db74">host</span>: <span style="color:#ae81ff">8080</span> <span style="color:#75715e"># or any other port available on your machine</span>
</span></span></code></pre></div><p>Note: don&rsquo;t forget to restart your vagrant vm after making changes to Vagrantfile.</p>
<p>Now, depending on what system you are using:</p>
<ul>
<li>on Mac you have already mentioned <a href="http://pow.cx/">pow</a>, after installation you go to <code>~/.pow</code> and type:</li>
</ul>
<pre tabindex="0"><code>echo 8080 &gt; example
</code></pre><ul>
<li>on Linux you have <a href="https://github.com/ysbaddaden/prax">prax</a>, very similarly - after installation you to to <code>~/.prax</code> and type the same thing</li>
</ul>
<p>pow/prax will now forward traffic from <code>*.example.dev</code> on your local machine to port 8080 - so basically this will be handled by nginx in vagrant and it <em>just works</em> with our subdomains setup. Magic.</p>
<p>References: <a href="http://pow.cx/manual.html#section_2.1.4">Port Proxying (pow)</a>, <a href="https://github.com/ysbaddaden/prax/issues/11">Per-app port forwarding (prax)</a>, <a href="https://docs.vagrantup.com/v2/networking/forwarded_ports.html">Vagrant - port forwarding</a>, <a href="http://ruby-journal.com/how-to-setup-rails-app-with-puma-and-nginx/">Rails App With Puma and NGINX</a></p>]]></description><content:encoded><![CDATA[<h3 id="problem">Problem</h3>
<p>Build a vagrant development environment that will serve an rails application that works on multiple subdomains. Moreover that application consists of multiple smaller apps that all are running with a single domain.</p>
<ul>
<li><code>example.dev</code> -&gt; Application #1</li>
<li><code>app.example.dev</code> -&gt; Application #2</li>
<li><code>&lt;any other subdomain&gt;.example.dev</code> -&gt; Application #3</li>
</ul>
<p>Let&rsquo;s assume we&rsquo;re using <code>.dev</code> domains, because we&rsquo;re used to <a href="http://pow.cx/">pow</a>. Meaning those routing should work within vagrant machine and same subdomains should work exactly same way on our local machine.</p>
<h3 id="solution---nginx--dnsmasq">Solution - nginx &amp; dnsmasq</h3>
<p><em>(I assume you&rsquo;re running some kind of ubuntu-based distro, paths may vary between distros)</em></p>
<p>Install nginx &amp; dnsmasq. Edit file <code>/etc/dnsmasq.d/dev-tld</code> as follows:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># /etc/dnsmasq.d/dev-tld</span>
</span></span><span style="display:flex;"><span>local<span style="color:#f92672">=</span>/dev/
</span></span><span style="display:flex;"><span>address<span style="color:#f92672">=</span>/dev/127.0.0.1
</span></span></code></pre></div><p>Restart <code>dnsmasq</code> service. This rule will forward traffic from .dev domains to your localhost - and this is exactly what we want.</p>
<p>Now let&rsquo;s configure nginx, following the scenario above we will need configuration for three apps. We will need some kind of server (thin, puma, unicorn, whatever) that will listen on unix socket. In our nginx config / sites-enabled we need:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>upstream app1 <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  server unix:/apps/app1/tmp/some_rack_server.sock;
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>server <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  listen 80;
</span></span><span style="display:flex;"><span>  server_name example.dev;
</span></span><span style="display:flex;"><span>  root /apps/app1/public;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  location / <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    proxy_pass http://app1;
</span></span><span style="display:flex;"><span>    proxy_set_header Host $host;
</span></span><span style="display:flex;"><span>    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>upstream app2 <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  server unix:/apps/app2/tmp/some_rack_server.sock;
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>server <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  listen 80;
</span></span><span style="display:flex;"><span>  server_name app.example.dev;
</span></span><span style="display:flex;"><span>  root /apps/app2/public;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  location / <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    proxy_pass http://app2;
</span></span><span style="display:flex;"><span>    proxy_set_header Host $host;
</span></span><span style="display:flex;"><span>    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>upstream app3 <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  server unix:/apps/app3/tmp/some_rack_server.sock;
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>server <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>  listen 80;
</span></span><span style="display:flex;"><span>  server_name *.example.dev;
</span></span><span style="display:flex;"><span>  root /apps/app3/public;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  location / <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    proxy_pass http://app3;
</span></span><span style="display:flex;"><span>    proxy_set_header Host $host;
</span></span><span style="display:flex;"><span>    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><p>Nging will listen on port 80 and forward request according to our needs. Traffic from <code>example.dev</code> will be served by our first app (app1), <code>app.example.dev</code> will be served by app2 and any other traffic (<code>*.example.dev</code>) will go through app3.</p>
<p>So this works, nice &amp; easy. We have 3 rack servers listing on UNIX sockets backed by nginx that routes everything. From vagrant box you can access all <code>.dev</code> domains, so far - very cool.</p>
<h3 id="next-step---accessing-dev-subdomains-from-local-machine">Next step - accessing .dev subdomains from local machine</h3>
<p>It&rsquo;s nice, but it&rsquo;s not very useful at this point really - we have no way for accessing <code>example.dev</code> (or any of it&rsquo;s subdomains) from our local machine. But there is already solution for that - some smart folks already created tools for us that solves this problem.</p>
<p>First we need to route traffic from ninx in vagrant (port 80) to our machine, in Vagrantfile you need:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ruby" data-lang="ruby"><span style="display:flex;"><span><span style="color:#66d9ef">Vagrant</span><span style="color:#f92672">.</span>configure(<span style="color:#e6db74">&#34;2&#34;</span>) <span style="color:#66d9ef">do</span> <span style="color:#f92672">|</span>config<span style="color:#f92672">|</span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># ...</span>
</span></span><span style="display:flex;"><span>  config<span style="color:#f92672">.</span>vm<span style="color:#f92672">.</span>network <span style="color:#e6db74">:forwarded_port</span>, <span style="color:#e6db74">guest</span>: <span style="color:#ae81ff">80</span>, <span style="color:#e6db74">host</span>: <span style="color:#ae81ff">8080</span> <span style="color:#75715e"># or any other port available on your machine</span>
</span></span></code></pre></div><p>Note: don&rsquo;t forget to restart your vagrant vm after making changes to Vagrantfile.</p>
<p>Now, depending on what system you are using:</p>
<ul>
<li>on Mac you have already mentioned <a href="http://pow.cx/">pow</a>, after installation you go to <code>~/.pow</code> and type:</li>
</ul>
<pre tabindex="0"><code>echo 8080 &gt; example
</code></pre><ul>
<li>on Linux you have <a href="https://github.com/ysbaddaden/prax">prax</a>, very similarly - after installation you to to <code>~/.prax</code> and type the same thing</li>
</ul>
<p>pow/prax will now forward traffic from <code>*.example.dev</code> on your local machine to port 8080 - so basically this will be handled by nginx in vagrant and it <em>just works</em> with our subdomains setup. Magic.</p>
<p>References: <a href="http://pow.cx/manual.html#section_2.1.4">Port Proxying (pow)</a>, <a href="https://github.com/ysbaddaden/prax/issues/11">Per-app port forwarding (prax)</a>, <a href="https://docs.vagrantup.com/v2/networking/forwarded_ports.html">Vagrant - port forwarding</a>, <a href="http://ruby-journal.com/how-to-setup-rails-app-with-puma-and-nginx/">Rails App With Puma and NGINX</a></p>]]></content:encoded></item></channel></rss>