Preparing the production environment for deployment in GCP with Cloud SQL database


Elixir version = 1.13.1
Phoenix version = 1.6.6

I created a REST API in Elixir/Phoenix and everything works fine with the PostgreSQL database (hosted in Google Cloud SQL), but I have some issues when configuring the deployment env, I was following this tutorial :

But in my project structure I didn’t find the file config/prod.secret.exs, so I created one and compiled and now I’m having error about missing : DATABASE_URL variable

In the config/dev.exs file I was configuring the database like this :

config :test_api, TestApi.Repo,
  socket_dir: "/cloudsql/CONNEXTION_NAME_CLOUD_SQL",
  username: "testUser",
  password: "testPassword",
  database: "testDB",
  pool_size: 10

But in config/runtime.exs the format required is :
For example: ecto://USER:PASS@HOST/DATABASE

How can I inject the socket dir (cloudsql) inside ?

Best regards


I tried to set the DATABASE_URL env variable like :
DATABASE_URL: “ecto://user:password@/database?host=/cloudsql/DATABASE_CONNECTION_NAME”

But I get the following error :

    ** (EXIT) an exception was raised:
        ** (Ecto.InvalidURLError) invalid url ecto://user:password@/database?host=/cloudsql/DATABASE_CONNECTION_NAME, host is not present. The parsed URL is: %URI{authority: "user:password@", fragment: nil, host: nil, path: "/database", port: nil, query: "host=/cloudsql/DATABASE_CONNECTION_NAME", scheme: "ecto", userinfo: "user:password"}

This is the format that is provided by default in runtime.exs, but this is not required. You can pass all of the same options that are passed to config/dev.exs, you probably just want to substitute the username and password options with System.get_env calls.