1"use strict";(self.webpackChunkgatsby_starter_default=self.webpackChunkgatsby_starter_default||[]).push([[142],{35286:function(e,n,t){t.r(n),t.d(n,{Head:function(){return g},default:function(){return m}});var a=t(28453),r=t(96540);function l(e){const n=Object.assign({h1:"h1",a:"a",span:"span",blockquote:"blockquote",p:"p",strong:"strong",h2:"h2",h3:"h3",table:"table",thead:"thead",tr:"tr",th:"th",tbody:"tbody",td:"td",em:"em",ol:"ol",li:"li",ul:"ul"},(0,a.R)(),e.components);return r.createElement(r.Fragment,null,r.createElement(n.h1,{id:"node-renderer-heroku-deployment",style:{position:"relative"}},r.createElement(n.a,{href:"#node-renderer-heroku-deployment","aria-label":"node renderer heroku deployment permalink",className:"anchor before"},r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" height="20" version="1.1" viewBox="0 0 16 16" width="20"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}})),"Node Renderer: Heroku Deployment"),"\n",r.createElement(n.blockquote,null,"\n",r.createElement(n.p,null,r.createElement(n.strong,null,"Pro Feature")," â Available with ",r.createElement(n.a,{href:"/linked-assets/5f3eacdd52b97cebdce257aa7836a6e1/react-on-rails-pro.md"},"React on Rails Pro"),".\nFree in development, test, CI, and staging, and in production for small organizations, charities, schools, and hospitals; larger organizations subscribe at ",r.createElement(n.a,{href:"https://pro.reactonrails.com/"},"https://pro.reactonrails.com/")," ($1,800 per year per organization). No license key is needed to run Pro."),"\n"),"\n",r.createElement(n.p,null,"Most React on Rails Pro installations of the Node SSR Renderer will deploy the Rails and Renderer\ninstances on the same server. This technique results in better performance since it avoids network\nlatency."),"\n",r.createElement(n.p,null,"Scroll down if you want to have different servers."),"\n",r.createElement(n.h2,{id:"deploying-to-the-same-server-as-your-app-server",style:{position:"relative"}},r.createElement(n.a,{href:"#deploying-to-the-same-server-as-your-app-server","aria-label":"deploying to the same server as your app server permalink",className:"anchor before"},r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" height="20" version="1.1" viewBox="0 0 16 16" width="20"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}})),"Deploying to the Same Server As Your App Server"),"\n",r.createElement(n.p,null,r.createElement(n.a,{href:"https://github.com/danp/heroku-buildpack-runit"},"buildpack for runit")),"\n",r.createElement(n.h3,{id:"procfile",style:{position:"relative"}},r.createElement(n.a,{href:"#procfile","aria-label":"procfile permalink",className:"anchor before"},r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" height="20" version="1.1" viewBox="0 0 16 16" width="20"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}})),"Procfile"),"\n",r.createElement(n.p,null,r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">/Procfile</code>'}})),"\n",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">web: bin/runsvdir-dyno</code></pre></div>'}}),"\n",r.createElement(n.h3,{id:"procfileweb",style:{position:"relative"}}
1,r.createElement(n.a,{href:"#procfileweb","aria-label":"procfileweb permalink",className:"anchor before"},r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" height="20" version="1.1" viewBox="0 0 16 16" width="20"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}})),"Procfile.web"),"\n",r.createElement(n.p,null,r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">/Procfile.web</code>'}})),"\n",r.createElement(n.p,null,"Your ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">/Procfile.web</code>'}})," should keep the ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">puma</code>'}})," line and use the ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">renderer</code>'}})," line that matches your\npackage manager:"),"\n",r.createElement(n.table,null,r.createElement(n.thead,null,r.createElement(n.tr,null,r.createElement(n.th,null,"Package manager"),r.createElement(n.th,null,r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">renderer</code>'}})," line"))),r.createElement(n.tbody,null,r.createElement(n.tr,null,r.createElement(n.td,null,"npm"),r.createElement(n.td,null,r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">renderer: npm run node-renderer</code>'}}))),r.createElement(n.tr,null,r.createElement(n.td,null,"yarn"),r.createElement(n.td,null,r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">renderer: yarn run node-renderer</code>'}}))),r.createElement(n.tr,null,r.createElement(n.td,null,"pnpm"),r.createElement(n.td,null,r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">renderer: pnpm run node-renderer</code>'}}))))),"\n",r.createElement(n.p,null,"For example, a complete ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">/Procfile.web</code>'}})," using pnpm:"),"\n",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">puma: bundle exec puma -C config/puma.rb\nrenderer: pnpm run node-renderer</code></pre></div>'}}),"\n",r.createElement(n.p,null,"Define the script in your root ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">package.json</code>'}})," so Heroku can run it from the app root:"),"\n",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="json"><pre class="language-json"><code class="language-json"><span class="token punctuation">{</span>\n <span class="token property">"scripts"</span><span class="token operator">:</span> <span class="token punctuation">{</span>\n <span class="token property">"node-renderer"</span><span class="token operator">:</span> <span class="token string">"node renderer/node-renderer.js"</span>\n <span class="token punctuation">}</span>\n<span class="token punctuation">}</span></code></pre></div>'}}),"\n",r.createElement(n.blockquote,null,"\n",r.createElement(n.p,null,r.createElement(n.strong,null,"Note:")," The script above relies on the default\n",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">port: process.env.RENDERER_PORT || 3800</code>'}})," in the JS configuration example. That default is fine\nfor the same-dyno deployment above. If you deploy the renderer as a separate Heroku app, switch\nthe renderer config to ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">process.env.PORT</code>'}})," instead of ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">RENDERER_PORT</code>'}}),"."),"\n"),"\n",r.createElement(n.p,null,"Be sure your node-renderer script listens on the same port as the Rails ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">config.renderer_url</code>'}}),"\nvalue, for example ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">http://localhost:3800</code>'}}),"."),"\n",r.createElement(n.h3,{id:"modifying-precompile-task",style:{position:"relative"}}
1,r.createElement(n.a,{href:"#modifying-precompile-task","aria-label":"modifying precompile task permalink",className:"anchor before"},r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" height="20" version="1.1" viewBox="0 0 16 16" width="20"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}})),"Modifying Precompile Task"),"\n",r.createElement(n.p,null,r.createElement(n.em,null,"Not necessary if you are using ",r.createElement(n.a,{href:"/linked-assets/f510a0cc0d0a89ff64eeae37ca0b63da/bundle-caching.md"},"bundle caching")," as doing so will result in the below being done automatically.")),"\n",r.createElement(n.p,null,"To avoid the initial round trip to get a bundle on the renderer, you can pre-stage the renderer cache during precompile."),"\n",r.createElement(n.p,null,"See ",r.createElement(n.a,{href:"https://github.com/shakacode/react_on_rails/blob/main/react_on_rails_pro/lib/tasks/assets.rake"},"lib/tasks/assets.rake")," for a couple tasks that you can use."),"\n",r.createElement(n.p,null,"For same-dyno / same-filesystem deployments such as Heroku, the legacy\n",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">react_on_rails_pro:pre_stage_bundle_for_node_renderer</code>'}})," task is deprecated: it emits a deprecation warning and delegates to ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">react_on_rails_pro:pre_seed_renderer_cache</code>'}})," with ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">MODE=symlink</code>'}}),". That mode pre-stages the same bundle-hash cache layout the renderer uses at runtime, but does so with symlinks instead of copies. Use ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">MODE=copy</code>'}})," (the default) for Docker/image-build workflows where the cache needs to be copied into an immutable artifact."),"\n",r.createElement(n.p,null,"If you're not using the default cache location, set ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">RENDERER_SERVER_BUNDLE_CACHE_PATH</code>'}})," so the files stage into the right place. ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">RENDERER_BUNDLE_PATH</code>'}})," remains a deprecated compatibility alias."),"\n",r.createElement(n.p,null,"Then you can use the rake task: ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">react_on_rails_pro:pre_seed_renderer_cache MODE=symlink</code>'}}),"."),"\n",r.createElement(n.p,null,"You might do something like this:"),"\n",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="ruby"><pre class="language-ruby"><code class="language-ruby">Rake<span class="token double-colon punctuation">::</span>Task<span class="token punctuation">[</span><span class="token string-literal"><span class="token string">"assets:precompile"</span></span><span class="token punctuation">]</span><span class="token punctuation">.</span>enhance <span class="token keyword">do</span>\n ReactOnRailsPro<span class="token double-colon punctuation">::</span>PreSeedRendererCache<span class="token punctuation">.</span>call<span class="token punctuation">(</span><span class="token symbol">mode</span><span class="token operator">:</span> <span class="token symbol">:symlink</span><span class="token punctuation">)</span>\n<span class="token keyword">end</span></code></pre></div>'}}),"\n",r.createElement(n.h2,{id:"troubleshooting",style:{position:"relative"}},r.createElement(n.a,{href:"#troubleshooting","aria-label":"troubleshooting permalink",className:"anchor before"},r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" height="20" version="1.1" viewBox="0 0 16 16" width="20"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}})),"Troubleshooting"),"\n",r.createElement(n.p,null,"If you get this sort of error, then you're forgetting to configure the PORT on the node-renderer and\nsetting the config.renderer_url on the Rails App."),"\n",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="text"><pre class="language-text"><code class="language-text">bundler: failed to load command: puma (/app/vendor/bundle/ruby/2.6.0/bin/puma)\nErrno::EADDRINUSE: Address already in use - bind(2) for "0.0.0.0" port 21752\n /app/vendor/bundle/ruby/2.6.0/gems/puma-4.3.3/lib/puma/binder.rb:229:in `initialize\'</code></pre></div>'}}),"\n",r.createElement(n.h2,{id:"separate-rails-and-node-render-instances",style:{position:"relative"}}
1,r.createElement(n.a,{href:"#separate-rails-and-node-render-instances","aria-label":"separate rails and node render instances permalink",className:"anchor before"},r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" height="20" version="1.1" viewBox="0 0 16 16" width="20"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}})),"Separate Rails and Node Render Instances"),"\n",r.createElement(n.h3,{id:"deploy-node-renderer-to-heroku",style:{position:"relative"}},r.createElement(n.a,{href:"#deploy-node-renderer-to-heroku","aria-label":"deploy node renderer to heroku permalink",className:"anchor before"},r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" height="20" version="1.1" viewBox="0 0 16 16" width="20"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}})),"Deploy Node renderer to Heroku"),"\n",r.createElement(n.ol,null,"\n",r.createElement(n.li,null,"Create your ",r.createElement(n.strong,null,"Heroku")," app with ",r.createElement(n.strong,null,"Node.js")," buildpack, say ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">renderer-test.herokuapp.com</code>'}}),"."),"\n",r.createElement(n.li,null,"In your JS configuration file or","\n",r.createElement(n.ol,null,"\n",r.createElement(n.li,null,"If setting the port, ensure the port uses ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">process.env.PORT</code>'}})," so it will use port number provided by ",r.createElement(n.strong,null,"Heroku")," environment. The default is to use the env value ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">RENDERER_PORT</code>'}})," if available."),"\n",r.createElement(n.li,null,"Set password in your configuration to something like ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">process.env.RENDERER_PASSWORD</code>'}})," and configure the corresponding ",r.createElement(n.strong,null,"ENV variable")," on your ",r.createElement(n.strong,null,"Heroku")," dyno so the ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">config/initializers/react_on_rails_pro.rb</code>'}})," uses this value."),"\n"),"\n"),"\n",r.createElement(n.li,null,"Run deployment process (usually by pushing changes to ",r.createElement(n.strong,null,"Git")," repo associated with created ",r.createElement(n.strong,null,"Heroku")," app)."),"\n",r.createElement(n.li,null,"Once deployment process is finished, renderer should start listening from something like ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">renderer-test.herokuapp.com</code>'}})," host."),"\n"),"\n",r.createElement(n.h3,{id:"deploy-react_on_rails-application-to-heroku",style:{position:"relative"}},r.createElement(n.a,{href:"#deploy-react_on_rails-application-to-heroku","aria-label":"deploy react_on_rails application to heroku permalink",className:"anchor before"},r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" height="20" version="1.1" viewBox="0 0 16 16" width="20"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}})),"Deploy react_on_rails application to Heroku"),"\n",r.createElement(n.ol,null,"\n",r.createElement(n.li,null,"Create your ",r.createElement(n.strong,null,"Heroku")," app for ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">react_on_rails</code>'}}),"."),"\n",r.createElement(n.li,null,"Configure your app to communicate with renderer app you've created above. Put the following to your ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">
1initializers/react_on_rails_pro</code>'}})," (assuming you have ",r.createElement(n.strong,null,"SSL")," certificate uploaded to your renderer ",r.createElement(n.strong,null,"Heroku")," app or you use ",r.createElement(n.strong,null,"Heroku")," wildcard certificate under ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">*.herokuapp.com</code>'}}),") and configure corresponding ",r.createElement(n.strong,null,"ENV variable")," for the render_url and/or password on your ",r.createElement(n.strong,null,"Heroku")," dyno."),"\n",r.createElement(n.li,null,"Run deployment process (usually by pushing changes to ",r.createElement(n.strong,null,"Git")," repo associated with created ",r.createElement(n.strong,null,"Heroku")," app)."),"\n",r.createElement(n.li,null,"Once deployment process is finished, all rendering requests form your ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text">react_on_rails</code>'}})," app should be served by ",r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<code class="language-text"><your-heroku-app>.herokuapp.com</code>'}})," app via ",r.createElement(n.strong,null,"HTTPS"),"."),"\n"),"\n",r.createElement(n.h2,{id:"references",style:{position:"relative"}},r.createElement(n.a,{href:"#references","aria-label":"references permalink",className:"anchor before"},r.createElement(n.span,{dangerouslySetInnerHTML:{__html:'<svg aria-hidden="true" height="20" version="1.1" viewBox="0 0 16 16" width="20"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg>'}})),"References"),"\n",r.createElement(n.ul,null,"\n",r.createElement(n.li,null,r.createElement(n.a,{href:"https://github.com/damianmr/heroku-node-settings"},"Heroku Node Settings")),"\n"))}var s=function(e){void 0===e&&(e={});const{wrapper:n}=Object.assign({},(0,a.R)(),e.components);return n?r.createElement(n,e,r.createElement(l,e)):l(e)},o=t(63679),c=t(95197),i=t(47388),d=t(23690),u=t(14487);const p=o.default.p.withConfig({displayName:"doc-article__RedirectFallback",componentId:"sc-tic2w5-0"})(["padding:2rem;"]),h=e=>{let{data:n,location:t,children:a}=e;const{headings:l}=n.article.childMdx,s=(0,c.X9)(t.pathname),[o,d]=r.useState(null),h=t.pathname.split("/"),m=h.indexOf("docs"),g=-1===m?t.pathname.length:h.slice(0,m+1).join("/").length,E=t.pathname.slice(0,g),y=t.pathname.slice(g+1).replace(/\/$/,"").split("/").filter((e=>""!==e)),_=y.length>1?y.slice(0,-1).join("/"):"";r.useEffect((()=>{if(!s)return;const{hash:e}=window.location;d(e);const n=""+s+e;window.location.href!==n&&window.location.replace(n)}),[s]);const f=null===s||null===o?null:""+s+o;return r.createElement(r.Fragment,null,null!==f?r.createElement(p,{role:"status","aria-live":"polite"},"Redirecting..."," ",r.createElement("a",{href:f,target:"_blank",rel:"noopener noreferrer"},"Click here if not redirected.")):r.createElement(i.A,{main:r.createElement(u.A,{body:a,headings:l,transformUrl:e=>{if(e.startsWith("http")||e.startsWith("#"))return e;const n=e.replace(/\.md$/,"/");if(n.startsWith("./"))return E+(""===_?"":"/"+_)+n.slice(1);if(n.startsWith("../")){if(""===_)return""+E+n.slice(2);const e=_.split("/").slice(0,-1).join("/");return E+(""===e?"":"/"+e)+n.slice(2)}return E+"/"+(""===_?"":_+"/")+n}})}))};function m(e){return r.createElement(h,e,r.createElement(s,e))}const g=e=>{let{data:n,location:t,pageContext:a}=e;const{headings:l}=n.article.childMdx,{siteUrl:s}=n.site.siteMetadata,{repoDisplayName:o}=a,i=l.find((e=>1===e.depth)),u=(0,c.X9)(t.pathname)||""+s.replace(/\/+$/,"")+t.pathname;return r.createElement(d.A,{title:i?i.value:o,description:i?i.value:o+" documentation",isArticle:!0,canonical:u,pathname:t.pathname})}}}]); 2//# sourceMappingURL=component---src-template-doc-article-tsx-content-file-path-cache-gatsby-source-git-react-on-rails-docs-oss-building-features-node-renderer-heroku-md-abedef8eecba669598c5.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.