Deploy de aplicações web em Elixir

Deploy de aplicações web em Elixir

Nessa apresentação curta falei sobre o estado atual dos deployments, e o que está por vir com o Elixir 1.9-dev.
Aconteceu no ElugSP.

A69ccd99c8ef0be30b5dc870d7c8e9f8?s=128

Philip Sampaio

April 27, 2019
Tweet

Transcript

  1. Deploy de aplicações web em Elixir ! • Philip Sampaio

    • twitter/twitch: philipsampaio • github: philss
  2. screencasts de Elixir: twitch.tv/philipsampaio

  3. Agenda • o estado atual dos deployments • mix •

    distillery • futuro
  4. estado atual

  5. estado atual • o básico recomendado pelo Phoenix: $ MIX_ENV=prod

    mix phx.server
  6. estado atual • o básico recomendado pelo Phoenix: $ MIX_ENV=prod

    mix phx.server • fonte: https://hexdocs.pm/phoenix/ deployment.html
  7. o Mix funciona bem se você está no Heroku

  8. o Mix é ! se é seu primeiro deploy

  9. mas tem problemas

  10. ! você precisa compilar no deploy

  11. ! por consequência, tem que ter todo o ambiente

  12. Todo o ambiente • Erlang

  13. Todo o ambiente • Erlang • Elixir

  14. Todo o ambiente • Erlang • Elixir • sua app

  15. o Mix não é a melhor ferramenta p/ isso (ainda

    )
  16. mas quebra o galho

  17. e o Distillery?

  18. as releases são

  19. An OTP release is a package containing one or more

    applications, in their compiled form (i.e. BEAM files), along with various metadata files, such as vm.args, configuration files, boot scripts, and management scripts in the form of shell or batch files, depending on your platform. Releases may also contain the Erlang Runtime System (ERTS) it depends on. • https://hexdocs.pm/distillery/introduction/ terminology.html
  20. as releases são ! Elas ajudam a criar: - aplicações

    auto contidas - pacotes mais leves - padronização e portabilidade
  21. aplicações auto contidas • você não precisa do Elixir/Erlang •

    só fazer o build da imagem em um sistema que tenha • quase não tem dependência do sistema
  22. pacotes mais leves não vai ter nada além da sua

    app
  23. padronização e portabilidade • deployar essa app em qualquer lugar

    • separar o ambiente de build do de produção
  24. Distillery • serve p/ criar releases; • atualmente a ferramenta

    mais recomendada; • https://hexdocs.pm/distillery/introduction/ understanding_releases.html
  25. Distillery $ mix release.init

  26. Distillery $ mix release.init vai criar: - rel/ - config.exs

    - plugins/ - vm.args
  27. Distillery o rel/config.exs diz como será nossa release.

  28. use Mix.Releases.Config, default_release: :default, default_environment: Mix.env() environment :dev do set

    dev_mode: true set include_erts: false end environment :prod do set include_erts: true set include_src: false end release :myapp do set version: current_version(:myapp) end
  29. Distillery pra gerar nossa release: $ mix release ou $

    MIX_ENV=prod mix release
  30. ==> Assembling release.. ==> Building release myapp:0.1.0 using environment dev

    ==> You have set dev_mode to true, skipping archival phase Release succesfully built! To start the release you have built, you can use one of the following tasks: # start a shell, like 'iex -S mix' > _build/dev/rel/myapp/bin/myapp console # start in the foreground, like 'mix run --no-halt' > _build/dev/rel/myapp/bin/myapp foreground # start in the background, must be stopped with the 'stop' command > _build/dev/rel/myapp/bin/myapp start If you started a release elsewhere, and wish to connect to it: # connects a local shell to the running node > _build/dev/rel/myapp/bin/myapp remote_console # connects directly to the running node's console > _build/dev/rel/myapp/bin/myapp attach For a complete listing of commands and their use: > _build/dev/rel/myapp/bin/myapp help
  31. e como eu faço pra rodar mix ecto.migrate?

  32. tasks • é preciso criar a task na mão •

    serve para qualquer task em que se usa o mix
  33. defmodule MyApp.ReleaseTasks do @start_apps [:crypto, :ssl, :postgrex, :ecto, :ecto_sql] defp

    app_name, do: :myapp defp repos, do: Application.get_env(app_name(), :ecto_repos, []) def migrate do prepare() Enum.each(repos(), &run_migrations_for/1) stop() end def rollback do prepare() Enum.each(repos(), &rollback_migrations_for/1) stop() end # ... end
  34. tasks • é preciso criar um arquivo de command: #!/bin/sh

    $RELEASE_ROOT_DIR/bin/myapp command Elixir.MyApp.ReleaseTasks migrate • ele fica em rel/commands/migrate.sh
  35. mas e as env vars?

  36. não era pra ser portátil?

  37. Distillery • o Distillery facilita o uso de ENV vars;

    • existe uma configuração mágica: • REPLACE_OS_VARS=true
  38. REPLACE_OS_VARS o Distillery vai trocar tudo que for ${ENV_NAME} em

    tempo de execução
  39. tempo de execução x compilação

  40. mas isso tudo parece difícil :sad:

  41. no começo, realmente é • env vars • release tasks

    • runtime x compile time
  42. talvez deixe de ser

  43. None
  44. Elixir 1.9-dev

  45. Elixir 1.9-dev ! • mix new não vai mais gerar

    o diretório config/ • mix release vai substituir o Distillery • o Mix vai ter suporte à config providers: • você vai poder ler configurações de diversas formas.
  46. Providers # rel/config.exs environment :prod do set include_erts: true set

    include_src: false set cookie: :"long-cookie-here" set vm_args: "rel/vm.args" set overlays: [ {:copy, "rel/runtime_config/config.exs", "etc/runtime_config.exs"} ] set config_providers: [ {Mix.Releases.Config.Providers.Elixir, ["${RELEASE_ROOT_DIR}/etc/runtime_config.exs"]}, ] end
  47. Elixir 1.9-dev: testes são bem-vindos!

  48. estamos contratando na Magnetis! magnetis.workable.com

  49. Obrigado! ❤ • Perguntas? • Philip Sampaio • twitter/twitch: philipsampaio

    • github: philss
  50. None