DEV Community

Miguel Cobá
Miguel Cobá

Posted on • Edited on • Originally published at blog.miguelcoba.com

Deploying an Elixir Release to Gigalixir

I'll show you how to deploy a Phoenix 1.6 application, with Elixir 1.12 Release to https://gigalixir.com

I'll use the Elixir Release we did before.

Configure the app for Gigalixir

Edit the runtime.exs file and add the url: line to the Endpoint section:

  config :saturn, SaturnWeb.Endpoint,
    url: [host: System.get_env("APP_NAME") <> ".gigalixirapp.com", port: 443],
    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: String.to_integer(System.get_env("PORT") || "4000")
    ],
    secret_key_base: secret_key_base
Enter fullscreen mode Exit fullscreen mode

Add the config for the buildpacks that Gigalixir uses to compile and deploy the application.

Create a file named elixir_buildpack.config on the root of the project and put this:

erlang_version=24.1.2
elixir_version=1.12.3
Enter fullscreen mode Exit fullscreen mode

Create a phoenix_static_buildpack.config file in the root and put this:

node_version=14.15.4
Enter fullscreen mode Exit fullscreen mode

Create a file in assets/package.json and put this:

{
    "scripts": {
        "deploy": "cd .. && mix assets.deploy && rm -f _build/esbuild"
    }
}
Enter fullscreen mode Exit fullscreen mode

This one is to use npm to use mix to use esbuild to compile our assets and after deploying them, delete the intermediate files!

Create a .buildpacks file and put this:

https://github.com/HashNuke/heroku-buildpack-elixir
https://github.com/gjaldon/heroku-buildpack-phoenix-static
https://github.com/gigalixir/gigalixir-buildpack-releases.git
Enter fullscreen mode Exit fullscreen mode

Ok, enough changes. I am creating a branch named gigalixir-deployment and committing all these changes to it:

git checkout -b gigalixir-deployment
git add .
git commit -m "Deploying to Gigalixir"
git push -u origin gigalixir-deployment
Enter fullscreen mode Exit fullscreen mode

Gigalixir setup

Install the gigalixir CLI

brew tap gigalixir/brew
brew install gigalixir
Enter fullscreen mode Exit fullscreen mode

Create an account in Gigalixir and login

gigalixir signup
gigalixir login
Enter fullscreen mode Exit fullscreen mode

Create a Gigalixir application:

export APP_NAME=$(gigalixir create)

Created app: harsh-some-cats.
Set git remote: gigalixir.
Enter fullscreen mode Exit fullscreen mode

Verify your app is created:

gigalixir apps

[
  {
    "cloud": "gcp",
    "region": "v2018-us-central1",
    "replicas": 0,
    "size": 0.3,
    "stack": "gigalixir-20",
    "unique_name": "harsh-some-cats",
    "version": 2
  }
]
Enter fullscreen mode Exit fullscreen mode

This command also creates a new remote in your git repo, pointing to gigalixir. Check it:

git remote -v

gigalixir   https://git.gigalixir.com/harsh-some-cats.git/ (fetch)
gigalixir   https://git.gigalixir.com/harsh-some-cats.git/ (push)
Enter fullscreen mode Exit fullscreen mode

Provision a database

Let's create a database for our app. This is the free plan so is not suitable for production but it will be good for testing.

gigalixir pg:create --free
Enter fullscreen mode Exit fullscreen mode

You can check if the database is running with this command:

gigalixir pg
Enter fullscreen mode Exit fullscreen mode

Finally, let's see the environment variables that Gigalixir created for us:

gigalixir config
Enter fullscreen mode Exit fullscreen mode

You should see something like this:

{
  "DATABASE_URL": "ecto://<some user>:<some password>@postgres-free-tier-v2020.gigalixir.com:5432/<some database name>",
  "POOL_SIZE": "2"
}
Enter fullscreen mode Exit fullscreen mode

As you see DATABASE_URL and POOL_SIZE are automatically created. Our app also needs the SECRET_KEY_BASE, PORT and APP_NAME but those will be automatically provided when the app starts, we don't need to worry about them.

Deploy the application

To deploy to Gigalixir, we must push our master branch to the gigalixir remote. Gigalixir only builds the master branch and ignore others. We use gigalixir-deployment as our main branch, so we need to push our branch changes to the master branch on the gigalixir remote:

git push gigalixir gigalixir-deployment:master
Enter fullscreen mode Exit fullscreen mode

This will start the building of the release on the gigalixir build servers.

You can see the status with gigalixir ps:

{
  "cloud": "gcp",
  "pods": [
    {
      "lastState": {},
      "name": "harsh-some-cats-77d577b7cd-2s9c2",
      "sha": "5dd02b3af6fc7958615b9ee2cbcd6af934845506",
      "status": "Healthy",
      "version": "4"
    }
  ],
  "region": "v2018-us-central1",
  "replicas_desired": 1,
  "replicas_running": 1,
  "size": 0.3,
  "stack": "gigalixir-20",
  "unique_name": "harsh-some-cats"
}
Enter fullscreen mode Exit fullscreen mode

When the build is finished, the app is deployed and started and you'll see log lines like these:

remote: Creating release.
remote: Starting zero-downtime rolling deploy.
remote: Please wait a minute for the new instance(s) to roll out and pass health checks.
remote: For troubleshooting, See:      http://gigalixir.readthedocs.io/en/latest/main.html#troubleshooting
remote: For help, contact:             help@gigalixir.com
remote: Try hitting your app with:     curl https://harsh-some-cats.gigalixirapp.com/
remote: Check your app logs with:      gigalixir logs -a harsh-some-cats
remote: Check deploy status with:      gigalixir ps -a harsh-some-cats
remote: Updated property [core/account].
To https://git.gigalixir.com/harsh-some-cats.git/
 * [new branch]      gigalixir-deployment -> master
Enter fullscreen mode Exit fullscreen mode

You can open your app in your browser by running:

gigalixir open
Enter fullscreen mode Exit fullscreen mode

And you'll see the familiar home screen:

Elixir release running on Gigalixir

Opening a remote console and running migrations

First we need to add our ssh public key so that we can connect securely:

gigalixir account:ssh_keys:add "$(cat ~/.ssh/id_rsa.pub)"
Enter fullscreen mode Exit fullscreen mode

Opening a remote console

gigalixir ps:remote_console

Erlang/OTP 24 [erts-12.1.2] [source] [64-bit] [smp:8:1] [ds:8:1:10] [async-threads:1] [jit]

Interactive Elixir (1.12.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(harsh-some-cats@10.56.18.206)1> ls
.bashrc           .profile          .profile.d        bin               erts-12.1.2
lib               releases          saturn.tar.gz
Enter fullscreen mode Exit fullscreen mode

Running migrations

First, let's watch the logs:

gigalixir logs
Enter fullscreen mode Exit fullscreen mode

Then, in another terminal, run:

gigalixir ps:migrate

Connection to v2018-us-central1.gcp.ssh.gigalixir.com closed.
Enter fullscreen mode Exit fullscreen mode

You should see something like this:

2021-11-02T22:45:07.937626+00:00 harsh-some-cats[b'harsh-some-cats-77d577b7cd-2s9c2']: web.1  | 22:45:07.937 [info] Running SaturnWeb.Endpoint with cowboy 2.9.0 at :::4000 (http)
2021-11-02T22:45:07.938503+00:00 harsh-some-cats[b'harsh-some-cats-77d577b7cd-2s9c2']: web.1  | 22:45:07.938 [info] Access SaturnWeb.Endpoint at http://harsh-some-cats.gigalixirapp.com:443
2021-11-02T22:47:27.795085+00:00 harsh-some-cats[b'harsh-some-cats-77d577b7cd-2s9c2']: web.1  | 22:47:27.794 request_id=6ae142c1367400361510a08fb8000235 [info] GET /
2021-11-02T22:47:27.799510+00:00 harsh-some-cats[b'harsh-some-cats-77d577b7cd-2s9c2']: web.1  | 22:47:27.798 request_id=6ae142c1367400361510a08fb8000235 [info] Sent 200 in 4ms
2021-11-02T22:48:38.509918+00:00 harsh-some-cats[b'harsh-some-cats-77d577b7cd-2s9c2']: web.1  | 22:48:38.508 request_id=bbc52891b40f8bb8ec1c6e96b766c8fd [info] GET /
2021-11-02T22:48:38.509940+00:00 harsh-some-cats[b'harsh-some-cats-77d577b7cd-2s9c2']: web.1  | 22:48:38.509 request_id=bbc52891b40f8bb8ec1c6e96b766c8fd [info] Sent 200 in 1ms
2021-11-02T22:53:33.926744+00:00 harsh-some-cats[b'harsh-some-cats-77d577b7cd-2s9c2']: web.1  | 22:53:33.926 [info] Migrations already up
Enter fullscreen mode Exit fullscreen mode

That's it.

Source code

The source code for the saturn project is open source under the MIT license. Use the gigalixir-deployment branch.

About

I'm Miguel Cobá. I write about Elixir, Elm, Software Development, and eBook writing.

Top comments (0)