Phoenix doesn't serve static files

Hi there,

I just managed to deploy my first Phoenix app using edeliver. The only problem left are static files, which Phoenix doesn’t serve right now: When I try to access /css/app.css, I get Phoenix 404 page.

I’ve added the following to my .deliver/config file:


pre_erlang_clean_compile() {
    status "Running phoenix.digest" # log output prepended with "----->"
    __sync_remote " # runs the commands on the build host
      [ -f ~/.profile ] && source ~/.profile # load profile (optional)
      set -e # fail if any command fails (recommended)
      cd '$BUILD_AT' # enter the build directory on the build host (required)
      # prepare something
      mkdir -p priv/static # required by the phoenix.digest task
      # run your custom task
      APP='$APP' MIX_ENV='$TARGET_MIX_ENV' $MIX_CMD phoenix.digest $SILENCE
    "
  }

In my config/prod.exs file, I’ve got the following configuration:

# (PORT is "80" and URL is the server's IP)
config :app, App.Endpoint,
  http: [port: {:system, "PORT"}],
  url: [host: {:system, "URL"}, port: 80],
  cache_static_manifest: "priv/static/manifest.json"

config :app, App.Endpoint, root: "."

When I run mix phoenix.digest and MIX_ENV=prod mix release --prod locally, phoenix serves my static files though.

EDIT: On my build server, /tmp/edeliver/app/builds/priv only contains a manifest.json file, which again just consists of an empty object {}. The static files do exist inside of /tmp/edeliver/app/builds/web/static.

EDIT 2: I’ve changed the last line of my .deliver/config file to the following:

APP='$APP' MIX_ENV='$TARGET_MIX_ENV' $MIX_CMD phoenix.digest web/static -o priv/static $SILENCE

The mix phoenix.digest thing seems to work now, but I have to run brunch before somehow. How can I do that?

3 Likes

All right, looks like I found a working solution. Just in case someone has similar problem, here’s a .deliver/config file, that works for me:

#!/usr/bin/env bash

APP="app"

BUILD_HOST="123.45.67.8"
BUILD_USER="root"
BUILD_AT="/tmp/edeliver/app/builds"

STAGING_HOSTS="123.45.67.8"
STAGING_USER="root"
DELIVER_TO="/home/web"

pre_erlang_get_and_update_deps() {
  local _prod_secret_path="/home/builder/prod.secret.exs"
  if [ "$TARGET_MIX_ENV" = "prod" ]; then
    __sync_remote "
      ln -sfn '$_prod_secret_path' '$BUILD_AT/config/prod.secret.exs'
    "
  fi
}

pre_erlang_clean_compile() {
    status "Installing NPM dependencies"
    __sync_remote "  # runs the commands on the build host
      [ -f ~/.profile ] && source ~/.profile # load profile
      set -e # fail if any command fails

      cd '$BUILD_AT' # go to the build directory on the build host
      npm install $SILENCE
    "

    status "Building static files"
    __sync_remote "
      [ -f ~/.profile ]
      set -e

      cd '$BUILD_AT'
      mkdir -p priv/static
      npm run deploy $SILENCE
    "

    status "Running phoenix.digest"
    __sync_remote "
      [ -f ~/.profile ] && source ~/.profile
      set -e

      cd '$BUILD_AT'
      APP='$APP' MIX_ENV='$TARGET_MIX_ENV' $MIX_CMD phoenix.digest $SILENCE
    "
  }
4 Likes