Unable to deploy basic phoenix 1.7.7 app without any changes

I create a phoenix app using:
Elixir 1.15.3
Erlang/OTP 26

with this command:
mix phx.new server --live --database sqlite3

And followed the basic tutorial to enable sqlite3.

│WARNING The app is not listening on the expected address and will not be reachable by fly-proxy. │
│You can fix this by configuring your app to listen on the following addresses: │
│ - 0.0.0.0:8080 │
│Found these processes inside the machine with open listening sockets: │
│ PROCESS | ADDRESSES │
│-----------------*---------------------------------------- │
│ /.fly/hallpass | [fdaa:2:8f96:a7b:d828:4b26:4a18:2]:22 │
│ │
│ Finished deploying │

I’m not seeing anything in the logs.
Just nothing :frowning:

Hi @bluehotdog

Can you share what you see on logs when a deployment happens, your fly.toml, your runtime.exs and the script that boots your server?

What I’d like to spot is some reason you might not be getting any logs for your app.

I’m seeing this:

2023-07-21T13:15:34.947 app[148e777f367689] den [info] INFO Main child exited with signal (with signal 'SIGTERM', core dumped? false)

2023-07-21T13:15:34.948 app[148e777f367689] den [info] WARN Reaped child process with pid: 31755 and signal: SIGPIPE, core dumped? false

2023-07-21T13:15:34.948 app[148e777f367689] den [info] INFO Starting clean up.

2023-07-21T13:15:34.948 app[148e777f367689] den [info] INFO Umounting /dev/vdb from /mnt/meetings_meter_data

2023-07-21T13:15:34.950 app[148e777f367689] den [info] WARN hallpass exited, pid: 246, status: signal: 15 (SIGTERM)

2023-07-21T13:15:34.954 app[148e777f367689] den [info] 2023/07/21 13:15:34 listening on [fdaa:2:8f96:a7b:d828:4b26:4a18:2]:22 (DNS: [fdaa::3]:53)

2023-07-21T13:15:35.950 app[148e777f367689] den [info] [ 472.743844] reboot: Restarting system

fly.toml

# fly.toml app configuration file generated for meetings-meter-server on 2023-07-21T14:20:35+03:00
#
# See https://fly.io/docs/reference/configuration/ for information about how to use this file.
#

app = "meetings-meter-server"
primary_region = "den"
kill_signal = "SIGTERM"

# [deploy]
#   release_command = "/app/bin/migrate"

[env]
  PHX_HOST = "meetings-meter-server.fly.dev"
  PORT = "8080"
  DATABASE_PATH="/mnt/meetings_meter_data/server/server_prod.db"

[mounts]
  source="meetings_meter_data"
  destination="/mnt/meetings_meter_data"

[http_service]
  internal_port = 8080
force_https = true
  auto_stop_machines = true
  auto_start_machines = true
  min_machines_running = 0
  processes = ["app"]
  [http_service.concurrency]
    type = "connections"
    hard_limit = 1000
    soft_limit = 1000

runtime.exs

import Config

# config/runtime.exs is executed for all environments, including
# during releases. It is executed after compilation and before the
# system starts, so it is typically used to load production configuration
# and secrets from environment variables or elsewhere. Do not define
# any compile-time configuration in here, as it won't be applied.
# The block below contains prod specific runtime configuration.

# ## Using releases
#
# If you use `mix release`, you need to explicitly enable the server
# by passing the PHX_SERVER=true when you start it:
#
#     PHX_SERVER=true bin/server start
#
# Alternatively, you can use `mix phx.gen.release` to generate a `bin/server`
# script that automatically sets the env var above.
if System.get_env("PHX_SERVER") do
  config :server, ServerWeb.Endpoint, server: true
end

if config_env() == :prod do
  database_path =
    System.get_env("DATABASE_PATH") ||
      raise """
      environment variable DATABASE_PATH is missing.
      For example: /etc/server/server.db
      """

  config :server, Server.Repo,
    database: database_path,
    pool_size: String.to_integer(System.get_env("POOL_SIZE") || "5")

  # The secret key base is used to sign/encrypt cookies and other secrets.
  # A default value is used in config/dev.exs and config/test.exs but you
  # want to use a different value for prod and you most likely don't want
  # to check this value into version control, so we use an environment
  # variable instead.
  secret_key_base =
    System.get_env("SECRET_KEY_BASE") ||
      raise """
      environment variable SECRET_KEY_BASE is missing.
      You can generate one by calling: mix phx.gen.secret
      """

  host = System.get_env("PHX_HOST") || "example.com"
  port = String.to_integer(System.get_env("PORT") || "4000")

  config :server, ServerWeb.Endpoint,
    url: [host: host, port: 443, scheme: "https"],
    http: [
      # Enable IPv6 and bind on all interfaces.
      # Set it to  {0, 0, 0, 0, 0, 0, 0, 1} for local network only access.
      # See the documentation on https://hexdocs.pm/plug_cowboy/Plug.Cowboy.html
      # for details about using IPv6 vs IPv4 and loopback vs public addresses.
      ip: {0, 0, 0, 0, 0, 0, 0, 0},
      port: 8080
    ],
    secret_key_base: secret_key_base

  # ## SSL Support
  #
  # To get SSL working, you will need to add the `https` key
  # to your endpoint configuration:
  #
  #     config :server, ServerWeb.Endpoint,
  #       https: [
  #         ...,
  #         port: 443,
  #         cipher_suite: :strong,
  #         keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"),
  #         certfile: System.get_env("SOME_APP_SSL_CERT_PATH")
  #       ]
  #
  # The `cipher_suite` is set to `:strong` to support only the
  # latest and more secure SSL ciphers. This means old browsers
  # and clients may not be supported. You can set it to
  # `:compatible` for wider support.
  #
  # `:keyfile` and `:certfile` expect an absolute path to the key
  # and cert in disk or a relative path inside priv, for example
  # "priv/ssl/server.key". For all supported SSL configuration
  # options, see https://hexdocs.pm/plug/Plug.SSL.html#configure/1
  #
  # We also recommend setting `force_ssl` in your endpoint, ensuring
  # no data is ever sent via http, always redirecting to https:
  #
  #     config :server, ServerWeb.Endpoint,
  #       force_ssl: [hsts: true]
  #
  # Check `Plug.SSL` for all available options in `force_ssl`.

  # ## Configuring the mailer
  #
  # In production you need to configure the mailer to use a different adapter.
  # Also, you may need to configure the Swoosh API client of your choice if you
  # are not using SMTP. Here is an example of the configuration:
  #
  #     config :server, Server.Mailer,
  #       adapter: Swoosh.Adapters.Mailgun,
  #       api_key: System.get_env("MAILGUN_API_KEY"),
  #       domain: System.get_env("MAILGUN_DOMAIN")
  #
  # For this example you need include a HTTP client required by Swoosh API client.
  # Swoosh supports Hackney and Finch out of the box:
  #
  #     config :swoosh, :api_client, Swoosh.ApiClient.Hackney
  #
  # See https://hexdocs.pm/swoosh/Swoosh.html#module-installation for details.
end

and FYI I’m literally just trying to deploy the barebones app. happy to delete it and start from scratch

This specific line might be telling us your server exited. Though these logs don’t include the part where your app is getting started, a good thing to look for is logs after “Starting init”
, those might tell a lot.

How is your app being started? Can you share your Dockefile and any script you might be using as entrypoint?

Not sure what else i can share… i literally just did a new phx server(generator) and then fly launch…
here’s the docker file:

# Find eligible builder and runner images on Docker Hub. We use Ubuntu/Debian
# instead of Alpine to avoid DNS resolution issues in production.
#
# https://hub.docker.com/r/hexpm/elixir/tags?page=1&name=ubuntu
# https://hub.docker.com/_/ubuntu?tab=tags
#
# This file is based on these images:
#
#   - https://hub.docker.com/r/hexpm/elixir/tags - for the build image
#   - https://hub.docker.com/_/debian?tab=tags&page=1&name=bullseye-20230612-slim - for the release image
#   - https://pkgs.org/ - resource for finding needed packages
#   - Ex: hexpm/elixir:1.15.3-erlang-26.0.2-debian-bullseye-20230612-slim
#
ARG ELIXIR_VERSION=1.15.3
ARG OTP_VERSION=26.0.2
ARG DEBIAN_VERSION=bullseye-20230612-slim

ARG BUILDER_IMAGE="hexpm/elixir:${ELIXIR_VERSION}-erlang-${OTP_VERSION}-debian-${DEBIAN_VERSION}"
ARG RUNNER_IMAGE="debian:${DEBIAN_VERSION}"

FROM ${BUILDER_IMAGE} as builder

# install build dependencies
RUN apt-get update -y && apt-get install -y build-essential git \
    && apt-get clean && rm -f /var/lib/apt/lists/*_*

# prepare build dir
WORKDIR /app

# install hex + rebar
RUN mix local.hex --force && \
    mix local.rebar --force

# set build ENV
ENV MIX_ENV="prod"

# install mix dependencies
COPY mix.exs mix.lock ./
RUN mix deps.get --only $MIX_ENV
RUN mkdir config

# copy compile-time config files before we compile dependencies
# to ensure any relevant config change will trigger the dependencies
# to be re-compiled.
COPY config/config.exs config/${MIX_ENV}.exs config/
RUN mix deps.compile

COPY priv priv

COPY lib lib

COPY assets assets

# compile assets
RUN mix assets.deploy

# Compile the release
RUN mix compile

# Changes to config/runtime.exs don't require recompiling the code
COPY config/runtime.exs config/

COPY rel rel
RUN mix release

# start a new build stage so that the final image will only contain
# the compiled release and other runtime necessities
FROM ${RUNNER_IMAGE}

RUN apt-get update -y && apt-get install -y libstdc++6 openssl libncurses5 locales \
  && apt-get clean && rm -f /var/lib/apt/lists/*_*

# Set the locale
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen

ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

WORKDIR "/app"
RUN chown nobody /app

# set runner ENV
ENV MIX_ENV="prod"

# Only copy the final release from the build stage
COPY --from=builder --chown=nobody:root /app/_build/${MIX_ENV}/rel/server ./

USER nobody

CMD ["/app/bin/server"]

@bluehotdog I think I’ve figured your issue

Phoenix generates a file under rel/overlays/bin/server, the name here server is important. Its contents are:

#!/bin/sh
cd -P -- "$(dirname -- "$0")"
PHX_SERVER=true exec ./your_mix_app_name start

You generated a project using mix phx.new server so your_mix_app_name == server so your file might be:

#!/bin/sh
cd -P -- "$(dirname -- "$0")"
PHX_SERVER=true exec ./server start

Which means that file is calling itself forever and never really starting anything. That might be the source of confusion. It’s a very edge case.

3 Likes

Phoenix is the one that generates the rel/overlays/bin/server script, so I’ll need to have phoenix detect this and raise as this will happen regardless of hosting platform.

oh jesus.
thank you folks

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.