Phoenix app crashes on startup

Hi, I’ve set up a Phoenix app on Heroku which builds but then crashes. Below is the error message.

019-04-08T21:18:29.878617+00:00 app[web.1]: 21:18:29.878 [info] Application log_server exited: LogServer.Application.start(:normal, []) returned an error: shutdown: failed to start child: LogServer.Repo
2019-04-08T21:18:29.878635+00:00 app[web.1]: ** (EXIT) an exception was raised:
2019-04-08T21:18:29.878644+00:00 app[web.1]: ** (ArgumentError) supervisors expect the child to be a module, a {module, arg} tuple or a map with the child specification, got: {DBConnection.ConnectionPool, {Ecto.Repo.Supervisor, :start_child, [{DBConnection.ConnectionPool, :start_link, [{Postgrex.Protocol, [types: Postgrex.DefaultTypes, hostname: "localhost", port: 5432, repo: LogServer.Repo, telemetry_prefix: [:log_server, :repo], otp_app: :log_server, timeout: 15000, pool_size: 10, pool: DBConnection.ConnectionPool]}]}, Ecto.Adapters.Postgres, #Reference<0.1050692944.2562588678.94950>, %{opts: [timeout: 15000, pool_size: 10, pool: DBConnection.ConnectionPool], sql: Ecto.Adapters.Postgres.Connection, telemetry: {LogServer.Repo, :debug, [:log_server, :repo, :query]}}]}, :permanent, 5000, :worker, [DBConnection.ConnectionPool]}

The shape of the data in that error message looks like what the old Supervisor.Spec.worker() would produce; can you share your application.ex file?

Yes, @al2o3cr , here is the application.ex file:

defmodule LogServer.Application do
  # See https://hexdocs.pm/elixir/Application.html
  # for more information on OTP Applications
  @moduledoc false

  use Application

  def start(_type, _args) do
    # List all child processes to be supervised
    children = [
      # Start the Ecto repository
      LogServer.Repo,
      # Start the endpoint when the application starts
      LogServerWeb.Endpoint
      # Starts a worker by calling: LogServer.Worker.start_link(arg)
      # {LogServer.Worker, arg},
    ]

    # See https://hexdocs.pm/elixir/Supervisor.html
    # for other strategies and supported options
    opts = [strategy: :one_for_one, name: LogServer.Supervisor]
    Supervisor.start_link(children, opts)
  end

  # Tell Phoenix to update the endpoint configuration
  # whenever the application is updated.
  def config_change(changed, _new, removed) do
    LogServerWeb.Endpoint.config_change(changed, removed)
    :ok
  end
end

https://hexdocs.pm/phoenix/heroku.html#making-our-project-ready-for-heroku

what is the db setup in prod.exs?

# Configure your database
config :hello, Hello.Repo,
  url: System.get_env("DATABASE_URL"),

Below is prod.exs, I fixed one stupid error at (XX), but am still getting crashes. See further on down for the error message.

use Mix.Config

config :log_server, LogServerWeb.Endpoint,
  http: [:inet6, port: System.get_env("PORT") || 4000],
  url: [scheme: "https", host: "sleepy-thicket-56112.herokuapp.com", port: 443],
  force_ssl: [rewrite_on: [:x_forwarded_proto]],
  cache_static_manifest: "priv/static/cache_manifest.json",
  secret_key_base: Map.fetch!(System.get_env(), "SECRET_KEY_BASE")

config :log_server, LogServer.Repo,  ### I had :hello -- copy-paste stupidity (XX)
       url: System.get_env("DATABASE_URL"),
       pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"),
       ssl: true

config :logger, level: :info

ERROR MESSAGE:

** (ArgumentError) supervisors expect the child to be a module, a {module, arg} tuple or a map with the
 child specification, got: {DBConnection.ConnectionPool, {Ecto.Repo.Supervisor, :start_child,
 [{DBConnection.ConnectionPool, :start_link, [{Postgrex.Protocol, [types: Postgrex.DefaultTypes, repo: 
LogServer.Repo, telemetry_prefix: [:log_server, :repo], otp_app: :log_server, timeout: 15000, pool_size: 
18, ssl: true, username: "cojsatwazejmbx", password: 
"4dfe...1ef", database: 
"daamng1gklnulc", hostname: "ec2-23-23-92-204.compute-1.amazonaws.com", port: 5432, pool: 
DBConnection.ConnectionPool]}]}, Ecto.Adapters.Postgres, 
#Reference<0.3988542057.1389756417.239247>, %{opts: [timeout: 15000, pool_size: 18, pool: 
DBConnection.ConnectionPool], sql: Ecto.Adapters.Postgres.Connection, telemetry: {LogServer.Repo, 
:debug, [:log_server, :repo, :query]}}]}, :permanent, 5000, :worker, [DBConnection.ConnectionPool]}

You may want to check what version of Elixir is used when your buildpack runs - the symptoms you’re describing sound just like the ones here:

2 Likes

I think that is part of the solution. I added a file elixir_buildpack.config with contents

# Erlang version
erlang_version=21.0

# Elixir version
elixir_version=1.7.4

The app builds, but now I get a different error message:

2019-04-10T01:42:15.145593+00:00 app[api]: Deploy 82c054fb by user jxxcarlson@gmail.com
2019-04-10T01:42:20.871582+00:00 heroku[web.1]: Starting process with command `mix run --no-halt`
2019-04-10T01:42:23.883024+00:00 app[web.1]: 01:42:23.882 [error] Could not find static manifest at "/app/_build/prod/lib/log_server/priv/static/cache_manifest.json". Run "mix phx.digest" after building your static files or remove the configuration from "config/prod.exs".
2019-04-10T01:42:31.000000+00:00 app[api]: Build succeeded
2019-04-10T01:43:21.338573+00:00 heroku[web.1]: State changed from starting to crashed
2019-04-10T01:43:21.347358+00:00 heroku[web.1]: State changed from crashed to starting
2019-04-10T01:43:21.212847+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2019-04-10T01:43:21.212919+00:00 heroku[web.1]: Stopping process with SIGKILL
2019-04-10T01:43:21.305627+00:00 heroku[web.1]: Process exited with status 137
2019-04-10T01:43:25.048741+00:00 heroku[web.1]: Starting process with command `mix run --no-halt`
2019-04-10T01:43:27.994723+00:00 app[web.1]: 01:43:27.994 [error] Could not find static manifest at "/app/_build/prod/lib/log_server/priv/static/cache_manifest.json". Run "mix phx.digest" after building your static files or remove the configuration from "config/prod.exs".
2019-04-10T01:44:25.646995+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2019-04-10T01:44:25.647086+00:00 heroku[web.1]: Stopping process with SIGKILL
2019-04-10T01:44:25.842085+00:00 heroku[web.1]: State changed from starting to crashed
2019-04-10T01:44:25.819827+00:00 heroku[web.1]: Process exited with status 137

Background: I did not set up the app with --no-brunch --no-html and have tried to reconfigure it to that end. Am using only the hashnuke/elixir buildpack`.

On heroku the app looks for the nonexistent

“/app/_build/prod/lib/log_server/priv/static/cache_manifest.json”

I don’t know if this is what is causing the crash. The app runs fine locally.

I don’t know if it’s the reason for the crash either, but have you tried removing the cache_static_manifest key from prod.exs as per the app[web.1] errors?

If you’re following the Phoenix heroku guide you’re probably missing server: true in your Endpoint config. It only happens if you don’t use the heroku-buildpack-phoenix-static buildpack, which does use mix phx.server in the Procfile.

As context, when you run mix phx.server it automatically runs with server: true, but not if you run with mix run --no-halt, which is what the buildpack does.

Made a PR here to update it

2 Likes

Hello jola, where would I put server: true in endpoint,ex? I see various plug .. entries in that file, and also socket ,,,, which I think is irrelevant.

You can also just provide your own Procfile, in your root make a file named Procfile with contents like:

web: MIX_ENV=prod mix phx.server
release: POOL_SIZE=3 MIX_ENV=prod mix ecto.migrate

I meant the Endpoint config, you’ll find that in config/prod.exs. In there there should be a block for your endpoint, something like

config :hello, HelloWeb.Endpoint,
  url: ...
  ...
  # add server: true here
  server: true
2 Likes

All good!! This fixed the problem. Thanks so much.

1 Like