Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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.

Philip Sampaio

April 27, 2019
Tweet

More Decks by Philip Sampaio

Other Decks in Programming

Transcript

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

    • twitter/twitch: philipsampaio • github: philss
  2. estado atual • o básico recomendado pelo Phoenix: $ MIX_ENV=prod

    mix phx.server • fonte: https://hexdocs.pm/phoenix/ deployment.html
  3. 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
  4. as releases são ! Elas ajudam a criar: - aplicações

    auto contidas - pacotes mais leves - padronização e portabilidade
  5. 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
  6. padronização e portabilidade • deployar essa app em qualquer lugar

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

    mais recomendada; • https://hexdocs.pm/distillery/introduction/ understanding_releases.html
  8. 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
  9. ==> 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
  10. tasks • é preciso criar a task na mão •

    serve para qualquer task em que se usa o mix
  11. 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
  12. 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
  13. Distillery • o Distillery facilita o uso de ENV vars;

    • existe uma configuração mágica: • REPLACE_OS_VARS=true
  14. 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.
  15. 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