<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Anurag Goel</title>
    <description>The latest articles on Forem by Anurag Goel (@anurag).</description>
    <link>https://forem.com/anurag</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F199318%2F3c6fe45d-8bbe-4d83-b780-ffbfa28294a3.jpeg</url>
      <title>Forem: Anurag Goel</title>
      <link>https://forem.com/anurag</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/anurag"/>
    <language>en</language>
    <item>
      <title>Why Render</title>
      <dc:creator>Anurag Goel</dc:creator>
      <pubDate>Wed, 29 Sep 2021 16:46:02 +0000</pubDate>
      <link>https://forem.com/render/why-render-2hl5</link>
      <guid>https://forem.com/render/why-render-2hl5</guid>
      <description>&lt;p&gt;When I joined Stripe in 2011, the company had four full-time engineers. Even then, one of them was focused exclusively on managing our AWS infrastructure. By the time I left in 2016, the engineering organization had grown to 120, and the team that managed AWS to 25. We had one of the strongest engineering teams on the planet, but more than a fifth of it was focused on undifferentiated AWS heavy lifting that our customers didn’t know or care about.&lt;/p&gt;

&lt;p&gt;Assuming a typical Bay Area cost-to-company of $200K per engineer, managing AWS likely cost Stripe at least $5 million in 2016. This was in addition to their AWS bill, equity compensation, and the often ignored organizational overhead that increases with every new hire.&lt;/p&gt;

&lt;p&gt;Stripe is hardly alone in spending millions of dollars on DevOps each year. According to data published by the U.S. Bureau of Labor Statistics, businesses spent $78 billion on DevOps salaries in 2020. Ironically, this number is greater than &lt;em&gt;global&lt;/em&gt; spending on public cloud providers, estimated at $65 billion in 2020.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frq0xcr43qoogb26h7mlj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frq0xcr43qoogb26h7mlj.png" alt="2020 US DevOps Salaries ($78B) vs Global Cloud Spend ($65B)" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;DevOps engineers cost much more than the cloud providers they manage.
  &lt;/p&gt;

&lt;p&gt;What do we get for $78 billion? Most DevOps time is spent on tasks that are painfully similar across every organization. Nearly every software stack requires the same infrastructure, tooling, and automation to operate reliably and to enable developers to focus on unique business concerns. There are, of course, minor yet important differences across companies, but the decision to build an internal deployment platform is typically made well before these differences emerge, and is often based on what’s fashionable or familiar. As a result, businesses end up with an ever-expanding DevOps footprint to maintain and expand undifferentiated platforms. Sadly, all this effort and expense is irrelevant and invisible to their customers.&lt;/p&gt;

&lt;p&gt;Why don’t more companies choose to scale on a platform like Heroku that minimizes the need for DevOps engineers? When it launched in 2007, Heroku provided a uniquely incredible experience for developers building web apps with an up-and-coming framework called Ruby on Rails. In many ways, this power duo of technologies focused on the developer experience helped usher in Web 2.0 and all the innovation that accompanied it. Sadly, after Salesforce &lt;a href="https://techcrunch.com/2010/12/08/breaking-salesforce-buys-heroku-for-212-million-in-cash/" rel="noopener noreferrer"&gt;acquired Heroku&lt;/a&gt; in 2010, the rate of innovation on the platform began to slow, eventually coming to a standstill in recent years. For companies that needed more than a simple web app, Heroku’s feature set was often incomplete. The lack of persistent disks meant tools like Elasticsearch couldn’t run on Heroku; missing private networking was a deal breaker for security-conscious companies. Websockets support came very late, and HTTP/2 didn’t show up at all. In contrast, AWS kept adding new features and products at an incredible pace, ultimately conditioning new companies to skip Heroku and go straight to AWS while resigning themselves to poor developer experience and reduced iteration speed.&lt;/p&gt;

&lt;p&gt;Fast-forward to today, and most new applications are being packaged and deployed as containers, often with &lt;a href="https://kubernetes.io/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;. Let loose on the world by Google in 2015, it has quickly replaced VMs as the target management layer for infrastructure, promising portability and automation for containerized workloads. Large corporate marketing budgets have certainly helped, making Kubernetes the tool of choice for DevOps teams managing applications in the cloud. However, in adopting Kubernetes we have traded the mostly well-understood complexity of AWS for a &lt;a href="https://landscape.cncf.io/" rel="noopener noreferrer"&gt;labyrinthian ecosystem&lt;/a&gt; that is as convoluted as it is inconsistent in quality. This has forced every company to build their own internal PaaS so application developers can focus on code. Ironically, these custom platforms look more similar than ever, since they're all based on Kubernetes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This is the $78 billion question: if every internal PaaS looks the same, why waste inordinate amounts of time and money on building and managing these platforms at every company?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Render is the answer to this question: we’re building the modern PaaS every team and company needs to ship better software faster, effectively becoming the ever-expanding devops team for our customers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz4pbo87t6iq8s9t89b07.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz4pbo87t6iq8s9t89b07.png" alt="Render has come a long way since 2017, with over 300,000 services created since launch." width="800" height="2040"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our relentless focus on developer experience is matched only by our resolve to offer customers all the infrastructure flexibility they need without the associated complexity. This has helped us evolve from what started as a passion project in late 2017 to something that looks very different today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tens of thousands of developers and businesses have created more than 300,000 services on Render. In addition to APIs and full stack apps, we now support static sites, cron jobs, managed PostgreSQL databases, background workers, private services, and of course, Docker containers, with more managed services on the way.&lt;/li&gt;
&lt;li&gt;We've launched multiple industry-firsts in the PaaS market, including private networking, persistent storage, managed wildcard SSL, and true resource-based autoscaling, effectively blurring the boundaries between PaaS and IaaS.&lt;/li&gt;
&lt;li&gt;Most importantly, Render has grown to include immensely talented, kind, and diverse humans with stellar backgrounds at companies like Stripe, Twitter, Uber, Lyft, Twitch, LinkedIn, and Heroku. We're &lt;a href="https://render.com/careers" rel="noopener noreferrer"&gt;always hiring&lt;/a&gt;!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As we grow, our goal remains the same: empower developers and businesses to ship better products faster by eliminating DevOps. We’re working to end the tyranny of complexity forced on developers by cloud providers who’d rather sell certifications than focus on developer productivity. We are deprecating antiquated definitions of PaaS and IaaS, combining delightful developer experiences with the flexibility today's applications need. Most importantly, we are asking developers around the world to expect much more from the cloud. &lt;a href="https://dashboard.render.com/register" rel="noopener noreferrer"&gt;Let's get started&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>startup</category>
      <category>news</category>
      <category>devops</category>
      <category>ux</category>
    </item>
    <item>
      <title>Distributed Elixir with Mix Releases and libcluster</title>
      <dc:creator>Anurag Goel</dc:creator>
      <pubDate>Tue, 30 Jul 2019 18:21:48 +0000</pubDate>
      <link>https://forem.com/render/distributed-elixir-with-mix-releases-and-libcluster-47f5</link>
      <guid>https://forem.com/render/distributed-elixir-with-mix-releases-and-libcluster-47f5</guid>
      <description>&lt;p&gt;This is a guide to deploying a distributed Elixir cluster on Render using &lt;a href="https://hexdocs.pm/libcluster" rel="noopener noreferrer"&gt;libcluster&lt;/a&gt;, &lt;a href="https://phoenixframework.org" rel="noopener noreferrer"&gt;Phoenix&lt;/a&gt; and &lt;a href="https://hexdocs.pm/mix/Mix.Tasks.Release.html" rel="noopener noreferrer"&gt;Mix releases&lt;/a&gt;. The cluster is set up to discover nodes automatically and keep the node list current as they join or leave the cluster.&lt;/p&gt;

&lt;p&gt;We'll start off with a bare Phoenix project, modify it to use Mix releases and &lt;code&gt;libcluster&lt;/code&gt; and deploy it on Render. The full source code for this example is available at &lt;a href="https://github.com/render-examples/elixir_cluster" rel="noopener noreferrer"&gt;https://github.com/render-examples/elixir_cluster&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a Phoenix App
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create a new Phoenix app in the terminal. We don't need a database in this example, so we're passing the &lt;code&gt;--no-ecto&lt;/code&gt; flag to &lt;code&gt;mix&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# install phx.new; feel free to change 1.4.9 to a different version&lt;/span&gt;
   &lt;span class="nv"&gt;$ &lt;/span&gt;mix archive.install hex phx_new 1.4.9
   &lt;span class="c"&gt;# create a new Phoenix app&lt;/span&gt;
   &lt;span class="nv"&gt;$ &lt;/span&gt;mix phx.new elixir_cluster_demo &lt;span class="nt"&gt;--no-ecto&lt;/span&gt; &lt;span class="c"&gt;# also fetch and install dependencies&lt;/span&gt;
   &lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;elixir_cluster_demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Update &lt;code&gt;mix.exs&lt;/code&gt; to add &lt;code&gt;libcluster&lt;/code&gt; to deps.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;   &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;deps&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
     &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:libcluster&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"~&amp;gt; 3.1"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
     &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run &lt;code&gt;mix deps.get&lt;/code&gt; in your terminal to update dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Mix Releases
&lt;/h2&gt;

&lt;p&gt;Create &lt;a href="https://hexdocs.pm/phoenix/releases.html#runtime-configuration" rel="noopener noreferrer"&gt;runtime configuration&lt;/a&gt; needed for Mix releases.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rename &lt;code&gt;config/prod.secret.exs&lt;/code&gt; to &lt;code&gt;config/releases.exs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Change &lt;code&gt;use Mix.Config&lt;/code&gt; in your new &lt;code&gt;config/releases.exs&lt;/code&gt; file to &lt;code&gt;import Config&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Uncomment the following line in &lt;code&gt;config/releases.exs&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;   &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="ss"&gt;:elixir_cluster_demo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;ElixirClusterDemoWeb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;server:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, update &lt;code&gt;config/prod.exs&lt;/code&gt; to delete the line &lt;code&gt;import_config "prod.secret.exs"&lt;/code&gt; at the bottom.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure libcluster
&lt;/h2&gt;

&lt;p&gt;Our setup will create nodes with names like &lt;code&gt;elixir-cluster-demo@10.200.30.4&lt;/code&gt;, where the IP addresses are dynamic. Render assigns IPs to nodes when they first start, and every deploy results in a new node IP. This is where &lt;code&gt;libcluster&lt;/code&gt; comes in: it enables &lt;a href="https://hexdocs.pm/libcluster/readme.html#features" rel="noopener noreferrer"&gt;automatic cluster formation &lt;/a&gt; through multiple configurable &lt;a href="https://hexdocs.pm/libcluster/readme.html#clustering" rel="noopener noreferrer"&gt;cluster management strategies&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Given dynamic node IPs, DNS is the best way to reliably form a cluster and keep it up to date. Consequently, we will use &lt;code&gt;libcluster&lt;/code&gt;'s &lt;a href="https://hexdocs.pm/libcluster/Cluster.Strategy.Kubernetes.DNS.html" rel="noopener noreferrer"&gt;DNS strategy&lt;/a&gt; for cluster formation.&lt;/p&gt;

&lt;p&gt;Let's add &lt;code&gt;libcluster&lt;/code&gt; to our production config. Add the lines below to &lt;code&gt;rel/prod.exs&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;dns_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"RENDER_DISCOVERY_SERVICE"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"RENDER_SERVICE_NAME"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="ss"&gt;:libcluster&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;topologies:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="ss"&gt;render:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="ss"&gt;strategy:&lt;/span&gt; &lt;span class="no"&gt;Cluster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Strategy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Kubernetes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;DNS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;config:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="ss"&gt;service:&lt;/span&gt; &lt;span class="n"&gt;dns_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="ss"&gt;application_name:&lt;/span&gt; &lt;span class="n"&gt;app_name&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Render automatically populates &lt;code&gt;RENDER_DISCOVERY_SERVICE&lt;/code&gt; and &lt;code&gt;RENDER_SERVICE_NAME&lt;/code&gt; based on the name of your service.&lt;/p&gt;

&lt;p&gt;Finally, add &lt;code&gt;libcluster&lt;/code&gt; to the application supervisor by adding the lines highlighted below to &lt;code&gt;application.ex&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="c1"&gt;# List all child processes to be supervised&lt;/span&gt;
    &lt;span class="n"&gt;topologies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Application&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:libcluster&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:topologies&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="n"&gt;children&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="c1"&gt;# start libcluster&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;Cluster&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Supervisor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;topologies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;name:&lt;/span&gt; &lt;span class="no"&gt;ElixirClusterDemo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;ClusterSupervisor&lt;/span&gt;&lt;span class="p"&gt;]]},&lt;/span&gt;
      &lt;span class="c1"&gt;# Start the endpoint when the application starts&lt;/span&gt;
      &lt;span class="no"&gt;ElixirClusterDemoWeb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Endpoint&lt;/span&gt;
      &lt;span class="c1"&gt;# Starts a worker by calling: ElixirClusterDemo.Worker.start_link(arg)&lt;/span&gt;
      &lt;span class="c1"&gt;# {ElixirClusterDemo.Worker, arg},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;# See https://hexdocs.pm/elixir/Supervisor.html&lt;/span&gt;
    &lt;span class="c1"&gt;# for other strategies and supported options&lt;/span&gt;
    &lt;span class="n"&gt;opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;strategy:&lt;/span&gt; &lt;span class="ss"&gt;:one_for_one&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;name:&lt;/span&gt; &lt;span class="no"&gt;ElixirClusterDemo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Supervisor&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="no"&gt;Supervisor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Display Connected Nodes
&lt;/h2&gt;

&lt;p&gt;Once everything is wired up, you can access the current node using &lt;code&gt;node()&lt;/code&gt; and other nodes in the cluster using &lt;code&gt;Node.list()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Our sample app displays all connected nodes on the homepage. Edit the index view and template in your own app as shown in &lt;a href="https://github.com/render-examples/elixir_cluster/commit/a7bec265602ab3e038a8e7af5e8a6cd67eba3e8b" rel="noopener noreferrer"&gt;this commit&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update Your App for Render
&lt;/h2&gt;

&lt;p&gt;Update &lt;code&gt;config/prod.exs&lt;/code&gt; to change the code below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;   &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="ss"&gt;:elixir_cluster_demo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;ElixirClusterDemoWeb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="ss"&gt;url:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;host:&lt;/span&gt; &lt;span class="s2"&gt;"example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;port:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;   &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="ss"&gt;:elixir_cluster_demo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;ElixirClusterDemoWeb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="ss"&gt;url:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;host:&lt;/span&gt; &lt;span class="no"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"RENDER_EXTERNAL_HOSTNAME"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s2"&gt;"localhost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;port:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Render populates &lt;code&gt;RENDER_EXTERNAL_HOSTNAME&lt;/code&gt; for &lt;code&gt;config/prod.exs&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you add a custom domain to your Render app, don't forget to change the host to your new domain.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Create a Build Script
&lt;/h2&gt;

&lt;p&gt;We need to run a series of commands to build our app on every push to our Git repo, and we can accomplish this with a build script. Create a script called &lt;code&gt;build.sh&lt;/code&gt; at the root of your repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
   &lt;span class="c"&gt;# Initial setup&lt;/span&gt;
   mix deps.get &lt;span class="nt"&gt;--only&lt;/span&gt; prod
   &lt;span class="nv"&gt;MIX_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;prod mix compile

   &lt;span class="c"&gt;# Compile assets&lt;/span&gt;
   npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--prefix&lt;/span&gt; ./assets
   npm run deploy &lt;span class="nt"&gt;--prefix&lt;/span&gt; ./assets
   mix phx.digest

   &lt;span class="c"&gt;# Remove the existing release directory and build the release&lt;/span&gt;
   &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; &lt;span class="s2"&gt;"_build"&lt;/span&gt;
   &lt;span class="nv"&gt;MIX_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;prod mix release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure the script is executable before checking it into Git:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;a+x build.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Build Your Release Locally
&lt;/h2&gt;

&lt;p&gt;Compile your release locally by running &lt;code&gt;./build.sh&lt;/code&gt;. The output should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   Generated elixir_cluster_demo app
   &lt;span class="k"&gt;*&lt;/span&gt; assembling elixir_cluster_demo-0.1.0 on &lt;span class="nv"&gt;MIX_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;prod
   &lt;span class="k"&gt;*&lt;/span&gt; using config/releases.exs to configure the release at runtime
   &lt;span class="k"&gt;*&lt;/span&gt; skipping elixir.bat &lt;span class="k"&gt;for &lt;/span&gt;windows &lt;span class="o"&gt;(&lt;/span&gt;bin/elixir.bat not found &lt;span class="k"&gt;in &lt;/span&gt;the Elixir installation&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="k"&gt;*&lt;/span&gt; skipping iex.bat &lt;span class="k"&gt;for &lt;/span&gt;windows &lt;span class="o"&gt;(&lt;/span&gt;bin/iex.bat not found &lt;span class="k"&gt;in &lt;/span&gt;the Elixir installation&lt;span class="o"&gt;)&lt;/span&gt;

   Release created at _build/prod/rel/elixir_cluster_demo!

       &lt;span class="c"&gt;# To start your system&lt;/span&gt;
       _build/prod/rel/elixir_cluster_demo/bin/elixir_cluster_demo start

   Once the release is running:

       &lt;span class="c"&gt;# To connect to it remotely&lt;/span&gt;
       _build/prod/rel/elixir_cluster_demo/bin/elixir_cluster_demo remote

       &lt;span class="c"&gt;# To stop it gracefully (you may also send SIGINT/SIGTERM)&lt;/span&gt;
       _build/prod/rel/elixir_cluster_demo/bin/elixir_cluster_demo stop

   To list all commands:

       _build/prod/rel/elixir_cluster_demo/bin/elixir_cluster_demo 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything looks good, push your changes to your repo. You can now deploy your app in production! 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploying to Render
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create a new &lt;strong&gt;Web Service&lt;/strong&gt; on Render, and give Render permission to access your new repo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use the following values during creation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Elixir&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build Command&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;./build.sh&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Start Command&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;_build/prod/rel/elixir_cluster_demo/bin/elixir_cluster_demo start&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Under the &lt;strong&gt;Advanced&lt;/strong&gt; section, add the following environment variables:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SECRET_KEY_BASE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A sufficiently strong secret. You can generate a secret locally by running &lt;code&gt;mix phx.gen.secret&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it! Your distributed Elixir web service will be live on your Render URL as soon as the build finishes.&lt;/p&gt;



&lt;p&gt;You can add nodes to your cluster by increasing the number of instances for your service under &lt;strong&gt;Settings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fazz92456jqjuc0g86h4v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fazz92456jqjuc0g86h4v.png" alt="Update Server Instance Count" width="800" height="121"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;You should see the second node on the homepage as soon as the instance update is live.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1znm42ogck22dajfy06.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1znm42ogck22dajfy06.png" alt="Screenshot of Elixir Cluster Nodes" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Congratulations! You've successfully set up distributed Elixir in production, and your cluster will automatically update as nodes are added or removed from it. 🎉&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>erlang</category>
      <category>devops</category>
    </item>
    <item>
      <title>Deploy a Phoenix App with Mix Releases</title>
      <dc:creator>Anurag Goel</dc:creator>
      <pubDate>Mon, 22 Jul 2019 04:12:19 +0000</pubDate>
      <link>https://forem.com/render/deploy-a-phoenix-app-with-mix-releases-1e6d</link>
      <guid>https://forem.com/render/deploy-a-phoenix-app-with-mix-releases-1e6d</guid>
      <description>&lt;p&gt;This is a guide to deploying a &lt;a href="https://phoenixframework.org" rel="noopener noreferrer"&gt;Phoenix&lt;/a&gt; application with &lt;a href="https://hexdocs.pm/mix/Mix.Tasks.Release.html" rel="noopener noreferrer"&gt;Mix releases&lt;/a&gt; on &lt;a href="https://render.com" rel="noopener noreferrer"&gt;Render&lt;/a&gt;, a new cloud platform with native support for Elixir.&lt;/p&gt;

&lt;p&gt;The finished code for this example is &lt;a href="https://github.com/render-examples/phoenix_hello" rel="noopener noreferrer"&gt;available on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Create a new Phoenix app in the terminal. We don't need a database for this example, so we're passing the &lt;code&gt;--no-ecto&lt;/code&gt; flag to &lt;code&gt;mix&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# install phx.new; feel free to change 1.4.9 to a different version&lt;/span&gt;
   &lt;span class="nv"&gt;$ &lt;/span&gt;mix archive.install hex phx_new 1.4.9
   &lt;span class="nv"&gt;$ &lt;/span&gt;mix phx.new phoenix_hello &lt;span class="nt"&gt;--no-ecto&lt;/span&gt; &lt;span class="c"&gt;# also fetch and install dependencies&lt;/span&gt;
   &lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;phoenix_hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configure Mix Releases
&lt;/h2&gt;

&lt;p&gt;Create &lt;a href="https://hexdocs.pm/phoenix/releases.html#runtime-configuration" rel="noopener noreferrer"&gt;runtime configuration&lt;/a&gt; needed for Mix releases.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rename &lt;code&gt;config/prod.secret.exs&lt;/code&gt; to &lt;code&gt;config/releases.exs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Change &lt;code&gt;use Mix.Config&lt;/code&gt; in your new &lt;code&gt;config/releases.exs&lt;/code&gt; file to &lt;code&gt;import Config&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Uncomment the following line in &lt;code&gt;config/releases.exs&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;   &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="ss"&gt;:phoenix_hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;PhoenixHelloWeb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;server:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;# uncomment me!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Finally, update &lt;code&gt;config/prod.exs&lt;/code&gt; to delete the line &lt;code&gt;import_config "prod.secret.exs"&lt;/code&gt; at the bottom.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Create a Build Script
&lt;/h2&gt;

&lt;p&gt;We need to run a series of commands to build our app on every push to our Git repo, and we can accomplish this with a build script. Create a script called &lt;code&gt;build.sh&lt;/code&gt; at the root of your repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
   &lt;span class="c"&gt;# Initial setup&lt;/span&gt;
   mix deps.get &lt;span class="nt"&gt;--only&lt;/span&gt; prod
   &lt;span class="nv"&gt;MIX_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;prod mix compile

   &lt;span class="c"&gt;# Compile assets&lt;/span&gt;
   npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--prefix&lt;/span&gt; ./assets
   npm run deploy &lt;span class="nt"&gt;--prefix&lt;/span&gt; ./assets
   mix phx.digest

   &lt;span class="c"&gt;# Remove the existing release directory and build the release&lt;/span&gt;
   &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; &lt;span class="s2"&gt;"_build"&lt;/span&gt;
   &lt;span class="nv"&gt;MIX_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;prod mix release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure the script is executable before checking it into Git:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;a+x build.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Update Your App for Render
&lt;/h2&gt;

&lt;p&gt;Update &lt;code&gt;config/prod.exs&lt;/code&gt; to change the lines below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   config :phoenix_hello, PhoenixHelloWeb.Endpoint,
     url: [host: "example.com", port: 80],
     cache_static_manifest: "priv/static/cache_manifest.json"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   config :phoenix_hello, PhoenixHelloWeb.Endpoint,
     url: [host: System.get_env("RENDER_EXTERNAL_HOSTNAME") || "localhost", port: 80],
     cache_static_manifest: "priv/static/cache_manifest.json",
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Render populates &lt;code&gt;RENDER_EXTERNAL_HOSTNAME&lt;/code&gt; for &lt;code&gt;config/prod.exs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you add a custom domain to your Render app, don't forget to change the host to your new domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build and Test Your Release Locally
&lt;/h2&gt;

&lt;p&gt;Compile your release locally by running &lt;code&gt;./build.sh&lt;/code&gt;. The output should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="k"&gt;*&lt;/span&gt; assembling phoenix_hello-0.1.0 on &lt;span class="nv"&gt;MIX_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;prod
   &lt;span class="k"&gt;*&lt;/span&gt; using config/releases.exs to configure the release at runtime
   &lt;span class="k"&gt;*&lt;/span&gt; skipping elixir.bat &lt;span class="k"&gt;for &lt;/span&gt;windows &lt;span class="o"&gt;(&lt;/span&gt;bin/elixir.bat not found &lt;span class="k"&gt;in &lt;/span&gt;the Elixir installation&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="k"&gt;*&lt;/span&gt; skipping iex.bat &lt;span class="k"&gt;for &lt;/span&gt;windows &lt;span class="o"&gt;(&lt;/span&gt;bin/iex.bat not found &lt;span class="k"&gt;in &lt;/span&gt;the Elixir installation&lt;span class="o"&gt;)&lt;/span&gt;

   Release created at _build/prod/rel/phoenix_hello!

       &lt;span class="c"&gt;# To start your system&lt;/span&gt;
       _build/prod/rel/phoenix_hello/bin/phoenix_hello start

   Once the release is running:

       &lt;span class="c"&gt;# To connect to it remotely&lt;/span&gt;
       _build/prod/rel/phoenix_hello/bin/phoenix_hello remote

       &lt;span class="c"&gt;# To stop it gracefully (you may also send SIGINT/SIGTERM)&lt;/span&gt;
       _build/prod/rel/phoenix_hello/bin/phoenix_hello stop

   To list all commands:

       _build/prod/rel/phoenix_hello/bin/phoenix_hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test your release by running the following command and navigating to &lt;a href="http://localhost:4000" rel="noopener noreferrer"&gt;http://localhost:4000&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;SECRET_KEY_BASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;mix phx.gen.secret&lt;span class="sb"&gt;`&lt;/span&gt; _build/prod/rel/phoenix_hello/bin/phoenix_hello start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything looks good, push your changes to your repo. You can now deploy your app in production! 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy to Render
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create a new &lt;strong&gt;Web Service&lt;/strong&gt; on Render, and give Render permission to access your Phoenix repo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use the following values during creation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Elixir&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build Command&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;./build.sh&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Start Command&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;_build/prod/rel/phoenix_hello/bin/phoenix_hello start&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Under the &lt;strong&gt;Advanced&lt;/strong&gt; section, add the following environment variables:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SECRET_KEY_BASE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A sufficiently strong secret. Generate it locally by running &lt;code&gt;mix phx.gen.secret&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it! Your Phoenix web service built with Mix releases will be live on your Render URL as soon as the build finishes. Going forward, every push to your GitHub repo will automatically update and deploy your app with zero downtime. 💯&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>erlang</category>
    </item>
  </channel>
</rss>
