BitOfUniverse
BitOfUniverse

Reputation: 6021

Read files in Phoenix in production mode

I've Phoenix app (I created it with --api flag) that has some additional data required to process requests that I store in priv/data/filters.csv.

So it works fine in dev mode, I can read this file like: File.stream!("priv/data/filters.csv"), but once app is delivered using mix edeliver update this file is not accessible anymore.

I can see this folder in build directory, but after app is delivered there is no such folder priv. I'm not sure why it's not copied to deliver folder.

What I'm doing wrong? Do I need to copy these files after deliver process? Where can I store my files that I have to use in prod mode?

Upvotes: 7

Views: 5751

Answers (3)

RobStallion
RobStallion

Reputation: 1703

I had a similar issue and managed to resolve it using Application.app_dir(my_app, "priv")

Upvotes: 2

Apostolis Economou
Apostolis Economou

Reputation: 21

You should check your configuration in the lib/YOUR_APP/endpoint.ex. By default Plug.Static white lists the files that are served. Try adding your files at the only: ~w(...) list.

Upvotes: 0

Dogbert
Dogbert

Reputation: 222398

You should use :code.priv_dir/1 to get the absolute path to the priv directory of your application at runtime. This will work with Erlang releases created by e.g. Distillery:

File.stream!(Path.join(:code.priv_dir(:my_app), "data/filters.csv"))

For me, after doing MIX_ENV=prod mix release, the file priv/foo is copied to _build/prod/lib/my_app/priv/foo.

Upvotes: 16

Related Questions