Hi folks, hope you are all doing well.
I’m having trouble to deploy my app on heroku using two databases.
[error] GenServer #PID<0.268.0> terminating
** (Postgrex.Error) FATAL 42501 (insufficient_privilege) permission denied for database "postgres"
User does not have CONNECT privilege.
(db_connection 2.4.2) lib/db_connection/connection.ex:100: DBConnection.Connection.connect/2
(connection 1.1.0) lib/connection.ex:622: Connection.enter_connect/5
(stdlib 3.14.2) proc_lib.erl:226: :proc_lib.init_p_do_apply/3
Last message: nil
State: Postgrex.Protocol
My prod.exs:
import Config
database_url =
System.get_env("DATABASE_URL") ||
raise """
environment variable DATABASE_URL is missing.
For example: ecto://USER:PASS@HOST/DATABASE
"""
database_url_2 =
System.get_env("HEROKU_POSTGRESQL_JADE_URL") ||
raise """
environment variable DATABASE_URL is missing.
For example: ecto://USER:PASS@HOST/DATABASE
"""
config :multi_repo, MultiRepo.Repo,
ssl: true,
url: database_url,
pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10")
config :multi_repo, MultiRepo.Repo2,
ssl: true,
url: database_url_2,
pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10")
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
"""
config :multi_repo, MultiRepoWeb.Endpoint,
http: [
port: String.to_integer(System.get_env("PORT") || "4000"),
transport_options: [socket_opts: [:inet6]]
],
secret_key_base: secret_key_base
It works when I use only one database and locally both works.
I created a NodeJs app that connects to two databases on Heroku and it worked fine, so I believe there may be something wrong with Postgrex.
Has anyone had the same error?
I had consulted this page but unfortunately I didn’t find a solution.
The error happens when I try to create the database, that is, when I run the command mix ecto.setup.
(I use elixir release, so I created a task for creating/migrating the database)
Yes, you’re right about that, but I use Elixir Release on Heroku.
I just mentioned the mix ecto.setup to try to make it understand that the error is related to the database setup, I apologize if I didn’t make myself understood.
And I run my migrations in production with the command: _build/prod/rel/my_app/bin/my_app eval "MyApp.Release.migrate"
If you are using releases, the prod.exs is evaluated when the release is built not when the release is executed. Are you setting those environment variables in the build environment or in the environment when the release is being run?
looks like the database is being replaced by “postgres”, the other options are correct like password, hostname and username.
The database name only appears when I use the :maintenance_database option.
Exmaple:
coming from rails, the following is relatively common within the Procfile :
web: ...run the server...
release: ...run the migrations on each deployment...
If prod.exs is evaluated when the release is built not when the release is executed, what’s the best place to run mix ecto.migrate for each deployment ?