Phoenix Elixir – Deploy Phoenix Apps on Heroku

Heroku merupakan salah satu tempat publish apps yang free, daftarkan akun anda pada website heroku di https://signup.heroku.com/ dan service heroku dapat digunakan. Heroku juga support dengan bahasa pemrograman elixir dan phoenix framework tentunya.. Bagaimana langkah men-deploy aplikasi phoenix pada Heroku? Phoenix sendiri sudah menjelaskan tahapan ini pada website resmi phoenix framework https://hexdocs.pm/phoenix/heroku.html, tapi saya akan menjelaskan beberapa detail yang saya alami dalam men-deploy project phoenix ke heroku.

Proses pertama yang harus dilakukan adalah mendaftarkan email anda pada web heroku dan siapkan project phoenix yang akan di-deploy.

Initialisasi project dengan git, hal ini juga akan membantu proses deploy ke depan. Untuk diketahui project yang di deploy dapat dihubungkan dengan server heroku melalui git, artinya setiap perintah commit yang dijalankan pada project akan mengupdate (setelah dilakukan push ke server heroku) file project pada server. Untuk melakukan initialisasi project dengan git, arahkan directory terminal ke directory project kemudian jalankan perintah berikut pada terminal:

$ git init
$ git add .
$ git commit -m "Initial commit"

Install heroku toolbelt, download di https://toolbelt.heroku.com/. Heroku toolbelt digunakan untuk menjalankan perintah2 heroku melalui terminal. Setelah menginstall heroku toolbelt, masukkan perintah berikut pada terminal:

$ heroku -v

Jika heroku toolbelt telah terinstal terminal akan menampilkan pesan berikut (versi bisa berbeda):

heroku-cli/6.14.30-304197d (darwin-x64) node-v8.5.0

 

MEMBUAT APLIKASI HEROKU

Kita akan membuat aplikasi baru pada heroku dengan heroke toolbelt. Pertama-tama pastikan terminal sudah berada pada direktori project yang akan di -deploy, kemudian login melalui heroku toolbelt, masukkan perintah

$ heroku login

Buat aplikasi baru dengan perintah berikut:

$ heroku create --buildpack "https://github.com/HashNuke/heroku-buildpack-elixir.git"
Creating stark-savannah-17693... done, stack is cedar-14 Buildpack set. Next release on mysterious-meadow-6277 will use https://github.com/HashNuke/heroku-buildpack-elixir.git. 
https://stark-savannah-17693.herokuapp.com/ | https://git.heroku.com/stark-savannah-17693.git

Perintah di atas akan membuat aplikasi pada heroku. Nama aplikasi heroku yang dibuat digenerate secara acak.

Kita harus mendefinisikan environment apa saja yang dibutuhkan pada aplikasi heroku yang dibuat, misal kita ingin server tersebut memiliki environment PHP 5.7, Elixir x.x, Erlang x.x. Heroku akan membaca environment ini dari sebuah file buildpack yang diletakkan pada root project. Kita juga dapat mendefinisikan buildpack dengan menambahkan perintah “–buildpack” pada proses create aplikasi baru. Pada perintah di atas aplikasi yang dibuat akan memiliki buildpack dari tautan yang didefinisikan.

Jika ditelusur ke dalam tautan buildpack diatas, environment yang diminta adalah berikut:

erlang_version=19.3
elixir_version=1.4.2
always_rebuild=false
runtime_path=/app

Anda dapat memodifikasi buildpack di atas jika diperlukan.

Selain buildpack tersebut, phoenix masih membutuhkan beberapa environment agar dapat dijalankan pada heroku. Masukkan perintah berikut

$ heroku buildpacks:add https://github.com/gjaldon/heroku-buildpack-phoenix-static.git 
Buildpack added. Next release on stark-savannah-17693 will use: 
1. https://github.com/HashNuke/heroku-buildpack-elixir.git 
2. https://github.com/gjaldon/heroku-buildpack-phoenix-static.git 
Run `git push heroku master` to create a new release using these buildpacks.

Perintah di atas menambahkan buildpack tambahan seperti library dan komponen yang diperlukan oleh phoenix framework.

Setiap kita masukkan perintah heroku, secara otomatis perintah tersebut akan berpengaruh pada project yang didefinisikan sebelumnya. Namun dalam kondisi anda menutup terminal (yah pasti butuh istirahat kan?), kita dapat mengarahkan perintah terminal ke aplikasi yang dituju dengan perintah:

heroku git:remote -a [our-app-name]

KONFIGURASI APLIKASI

Aplikasi phoenix memilik konfigurasi pada file “config/prod.secret.exs” dimana secara default file tersebut masuk ke dalam daftar .gitignore (file tersebut tidak masuk pada proses commit melalui git). Hal ini menyebabkan file configurasi tidak ditemukan pada heroku. Kita akan memindahkan configurasi aplikasi dari “config/prod.secret.exs” ke “config/prod.exs”. Modifikasi code pada “config/prod.exs” seperti berikut:

config :myapp, Myapp.Endpoint,
http: [port: {:system, "PORT"}],
url: [scheme: "https", host: "your heroku app url", port: 443],
force_ssl: [rewrite_on: [:x_forwarded_proto]],
cache_static_manifest: "priv/static/manifest.json",
secret_key_base: Map.fetch!(System.get_env(), "SECRET_KEY_BASE")

Konfigurasi di atas mengarahkan url aplikasi ke url heroku. Kita juga mendefinisikan nilai “secret_key_base” dengan nilai dari (System.get_env(), “SECRET_KEY_BASE”).

Dari mana dan apa System.get_env() ??

System.get_env() adalah nilai yang tersimpan pada server. Penggunaan System.get_env() sering digunakan untuk nilai yang bersifat rahasia seperti token, password, API secret, dll. Hal ini karena dengan System.get_env() tidak perlu menuliskan informasi rahasia tersebut langsung ke dalam code aplikasi, tapi di generate ke dalam variabel server (selanjutnya akan dicontohkan cara menambahkan suatu variabel keserver)

Tambahkan juga code berikut untuk untuk configurasi database:

config :myapp, Myapp.Repo,
adapter: Ecto.Adapters.Postgres,
url: System.get_env("DATABASE_URL"),
pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"),
ssl: true

Konfigurasi di atas mengatur koneksi database yang digunakan pada heroku.  Karena informasi database rahasia, akan dimasukkan juga dengan System.get_env(). Kita tidak lagi menggunakan file “config/prod.secret.exs” sehingga kita dapat menghapus baris berikut:

import_config "prod.secret.exs"

Karena heroku memiliki batas minimun 55 detik waktu timeout, kita perlu mengurangi timeout untuk websocket transport. Pada file “web/channels/user_socket.ex” (untuk phoenix versi 1.3 file ini terdapat pada “lib/myapp/channels/user_socket.ex”) modifikasi code menjadi seperti berikut:

defmodule Myapp.UserSocket do 
   use Phoenix.Socket 
   ... 

   ## Transports 
   transport :websocket, Phoenix.Transports.WebSocket, 
   timeout: 45_000 
   ... 
end

Untuk men-deploy aplikasi pada heroku, kita perlu membuat file “Procfile” pada root aplikasi. File ini selanjutnya dibaca oleh heroku server untuk menjalankan perintah terminal awal saat menjalankan aplikasi pada heroku. Buatlah sebuah file dengan nama “Procfile” pada root project dan masukkan perintah berikut (untuk phoenix 1.2 atau kebawah bisa dengan “mix phoenix.server”):

web: MIX_ENV=prod mix phx.server

Kita telah menyelesaikan konfigurasi aplikasi, selanjutnya menambahkan konfigurasi variabel pada server.

DATABASE_URL

Nilai “DATABASE_URL” secara otomatis sudah ditambahkan ke dalam konfigurasi server saat kita membuat database postgresql pada heroku. Untuk membuat database pada baru pada heroku, masukkan perintah berikut pada terminal:

heroku addons:create heroku-postgresql:hobby-dev

Database yang dibuat juga dapat dilihat melalui web dashboard heroku.

 

POOL_SIZE

Konfigurasi nilai POOL_SIZE dengan memasukkan menjalankan perintah berikut:

$ heroku config:set POOL_SIZE=18

 

SECRET_KEY_BASE

Pertama-tama kita harus dapatkan nilai secret key dari aplikasi dengan menjalankan perintah berikut (untuk phoenix 1.2 dengan mix phoenix.gen.secret) :

mix phx.gen.secret xvafzY4y01jYuzLm3ecJqo008dVnU3CN4f+MamNd1Zue4pXvfvUjbiXT8akaIF53

Nilai yang di dapat barulah di arahkan ke dalam server heroku dengan perintah berikut:

heroku config:set SECRET_KEY_BASE="xvafzY4y01jYuzLm3ecJqo008dVnU3CN4f+MamNd1Zue4pXvfvUjbiXT8akaIF53"

Selesai konfigurasi variabel, selanjutnya adalah men-deploy project ke dalam heroku server. Sebelum men-deploy project, commit seluruh perubahan yang telah dilakukan pada langkah di atas. Kemudian deploy project dengan perintah berikut:

$ git push heroku master

Proses deploy akan memakan waktu, juga tergantung koneksi internet yang dimiliki. Jika proses deploy berjalan tanpa pesan error, artinya project berhasil di deploy hingga dan dapat diakses di server heroku.

BEBERAPA KONDISI DAN PROBLEM

Terdapat beberapa permasalahan umum yang terjadi pada proses deploy project phoenix ke server heroku. Berikut permasalahannya dan pemecahannya:

 

ERLANG TIDAK DAPAT DIINSTAL

Terkadang Heroku gagal dalam melakukan installasi erlang bisa jadi karena versi Erlang yang tidak support atau kesalahan penulisan version. Jika versi Erlang memang tidak di support, kita harus mengubah versi Erlang yang di support oleh Heroku. Untuk kesalahan penulisan sering terjadi karena kita menuliskan versi Erlang seperti berikut:

erlang_version=19
elixir_version=1.3.4

harusnya ditulis seperti berikut:

erlang_version=19.0
elixir_version=1.3.4

 

MIGRASI DATABASE

Mengelola database Heroku tidak semudah mengelola database pada komputer lokal karena Heroku tidak menyediakan fitur untuk mengelola database (untuk versi gratisan) seperti menambah tabel, manambah kolom, insert data, dll. Satu-satunya cara mendefinisikan tabel2 tersebut ke dalam database adalah menjalankan perintah database pada aplikasi. Yah… phoenix punya fitur migrate untuk mengelola schema database. Kita cukup menjalankan perintah migrate database dengan perintah berikut:

migrate database: heroku run "POOL_SIZE=2 mix ecto.migrate"

 

Selesai.. itulah langkah men-deploy project phoenix ke Heroku.. Semoga berhasil, happy coding…

Advertisements
%d bloggers like this: