How to point your domain to a Phoenix site on Fly.io

Fly.io gives you a temporary domain so you can access your site during development. But sooner or later, you want to point a real domain to your Phoenix site. In a previous post, I went through the process of deplying to Fly.io. Since I have a domain for my new project, I want to make sure that that domain is pointed to my app instead of the development domain.

This post goes through how you can do that in a few simple steps.

Step 1 - find out where to point the domain

if I log into my app on Fly.io, I can see it on the overview.

In my case, its an IP-version 4 number like this one:

Step 2 - Point the A-record to that domain

When you have located the IP number, you can login to your domain dashboard and add the IP as an A-record

Note, this can take up to an hour before it takes effect. Sometimes even longer. So don't assume that you have made a mistake.

Step 3 - Add a certificate in Fly dashboard

Since I want to enforce SSL on the webtraffic, I need to create an SSL certificate in the Fly dashboard. That is a neat service provided for free and Fly makes sure to renew the certificate.

Start with entering the domain in the certificates page and press create.

When I press create, I get some additional instructions for DNS settings that I need to add in my domain providers dashboard:

Step 4 - Code changes and deploy

Last step here is to make sure that my site responds to the new domain. The only changes that I need to do is in the config/runtime.exs file.

  host = "liveview.build"
  port = String.to_integer(System.get_env("PORT") || "4000")

  config :screen_builder, ScreenBuilderWeb.Endpoint,
    force_ssl: [rewrite_on: [:x_forwarded_proto]],
    url: [host: host, port: 443, scheme: "https"],
    http: [
      # Enable IPv6 and bind on all interfaces.
      # Set it to  {0, 0, 0, 0, 0, 0, 0, 1} for local network only access.
      # See the documentation on https://hexdocs.pm/plug_cowboy/Plug.Cowboy.html
      # for details about using IPv6 vs IPv4 and loopback vs public addresses.
      ip: {0, 0, 0, 0, 0, 0, 0, 0},
      port: port,
      compress: true,
    secret_key_base: secret_key_base

I need to change the host to "liveview.build", port to 443 and scheme to "https". There is also the line force_ssl: [rewrite_on: [:x_forwarded_proto]], that is there to forwars unsecure http requests to https.

Last thing I need to do now it to visit my new URL and make sure everything works:

Great success!!