Slide 1

Slide 1 text

Deploy de aplicações web em Elixir ! • Philip Sampaio • twitter/twitch: philipsampaio • github: philss

Slide 2

Slide 2 text

screencasts de Elixir: twitch.tv/philipsampaio

Slide 3

Slide 3 text

Agenda • o estado atual dos deployments • mix • distillery • futuro

Slide 4

Slide 4 text

estado atual

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

estado atual • o básico recomendado pelo Phoenix: $ MIX_ENV=prod mix phx.server • fonte: https://hexdocs.pm/phoenix/ deployment.html

Slide 7

Slide 7 text

o Mix funciona bem se você está no Heroku

Slide 8

Slide 8 text

o Mix é ! se é seu primeiro deploy

Slide 9

Slide 9 text

mas tem problemas

Slide 10

Slide 10 text

! você precisa compilar no deploy

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

Todo o ambiente • Erlang

Slide 13

Slide 13 text

Todo o ambiente • Erlang • Elixir

Slide 14

Slide 14 text

Todo o ambiente • Erlang • Elixir • sua app

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

mas quebra o galho

Slide 17

Slide 17 text

e o Distillery?

Slide 18

Slide 18 text

as releases são

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

as releases são ! Elas ajudam a criar: - aplicações auto contidas - pacotes mais leves - padronização e portabilidade

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

pacotes mais leves não vai ter nada além da sua app

Slide 23

Slide 23 text

padronização e portabilidade • deployar essa app em qualquer lugar • separar o ambiente de build do de produção

Slide 24

Slide 24 text

Distillery • serve p/ criar releases; • atualmente a ferramenta mais recomendada; • https://hexdocs.pm/distillery/introduction/ understanding_releases.html

Slide 25

Slide 25 text

Distillery $ mix release.init

Slide 26

Slide 26 text

Distillery $ mix release.init vai criar: - rel/ - config.exs - plugins/ - vm.args

Slide 27

Slide 27 text

Distillery o rel/config.exs diz como será nossa release.

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

Distillery pra gerar nossa release: $ mix release ou $ MIX_ENV=prod mix release

Slide 30

Slide 30 text

==> 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

Slide 31

Slide 31 text

e como eu faço pra rodar mix ecto.migrate?

Slide 32

Slide 32 text

tasks • é preciso criar a task na mão • serve para qualquer task em que se usa o mix

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

mas e as env vars?

Slide 36

Slide 36 text

não era pra ser portátil?

Slide 37

Slide 37 text

Distillery • o Distillery facilita o uso de ENV vars; • existe uma configuração mágica: • REPLACE_OS_VARS=true

Slide 38

Slide 38 text

REPLACE_OS_VARS o Distillery vai trocar tudo que for ${ENV_NAME} em tempo de execução

Slide 39

Slide 39 text

tempo de execução x compilação

Slide 40

Slide 40 text

mas isso tudo parece difícil :sad:

Slide 41

Slide 41 text

no começo, realmente é • env vars • release tasks • runtime x compile time

Slide 42

Slide 42 text

talvez deixe de ser

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

Elixir 1.9-dev

Slide 45

Slide 45 text

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.

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

Elixir 1.9-dev: testes são bem-vindos!

Slide 48

Slide 48 text

estamos contratando na Magnetis! magnetis.workable.com

Slide 49

Slide 49 text

Obrigado! ❤ • Perguntas? • Philip Sampaio • twitter/twitch: philipsampaio • github: philss

Slide 50

Slide 50 text

No content