From d4b810e14e390877cce6f08987161bf28b183724 Mon Sep 17 00:00:00 2001
From: Adam Piontek <adam@73k.us>
Date: Fri, 27 Jan 2023 17:15:24 -0500
Subject: [PATCH] initial work on a releases runtime config

---
 config/dev.exs     |   3 --
 config/prod.exs    |   4 --
 config/runtime.exs | 129 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 129 insertions(+), 7 deletions(-)
 create mode 100644 config/runtime.exs

diff --git a/config/dev.exs b/config/dev.exs
index 40b57060..1399e8ef 100644
--- a/config/dev.exs
+++ b/config/dev.exs
@@ -72,6 +72,3 @@ config :phoenix, :stacktrace_depth, 20
 
 # Initialize plugs at runtime for faster development compilation
 config :phoenix, :plug_init_mode, :runtime
-
-# Import secret config
-import_config "dev.secret.exs"
diff --git a/config/prod.exs b/config/prod.exs
index 0d383b28..c0c11fde 100644
--- a/config/prod.exs
+++ b/config/prod.exs
@@ -49,7 +49,3 @@ config :logger, level: :info
 #       force_ssl: [hsts: true]
 #
 # Check `Plug.SSL` for all available options in `force_ssl`.
-
-# Finally import the config/prod.secret.exs which loads secrets
-# and configuration from environment variables.
-import_config "prod.secret.exs"
diff --git a/config/runtime.exs b/config/runtime.exs
new file mode 100644
index 00000000..a1050340
--- /dev/null
+++ b/config/runtime.exs
@@ -0,0 +1,129 @@
+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/shift73k 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 :shift73k, Shift73kWeb.Endpoint, server: true
+end
+
+if config_env() == :prod do
+  database_sock = System.get_env("DB_SOCK") || :false
+  database_name = System.get_env("DB_NAME") || :false
+  database_user = System.get_env("DB_USER") || :false
+  database_pass = System.get_env("DB_PASS") || :false
+  database_url = System.get_env("DATABASE_URL") || :false
+
+  if (!database_sock && !database_url) do
+    raise """
+    environment variable DATABASE_URL is missing.
+    can also configure with unix socket by providing
+    DB_SOCK, DB_NAME, DB_USER, and DB_PASS values.
+    """
+  end
+
+  if (database_sock) do
+    if (!database_name) do
+      raise """
+      environment variable DB_NAME is missing.
+      """
+    end
+    if (!database_user) do
+      raise """
+      environment variable DB_USER is missing.
+      """
+    end
+    if (!database_pass) do
+      raise """
+      environment variable DB_PASS is missing.
+      """
+    end
+  end
+
+  maybe_ipv6 = if System.get_env("ECTO_IPV6"), do: [:inet6], else: []
+
+  if (database_sock) do
+    config :shift73k, Shift73k.Repo,
+      username: database_user,
+      password: database_pass,
+      socket_dir: database_sock,
+      database: database_name,
+      pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"),
+      socket_options: maybe_ipv6
+  else
+    config :shift73k, Shift73k.Repo,
+      # ssl: true,
+      url: database_url,
+      pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"),
+      socket_options: maybe_ipv6
+  end
+
+  # 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 :shift73k, Shift73kWeb.Endpoint,
+    url: [host: host, port: 443, scheme: "https"],
+    http: [ip: {0, 0, 0, 0}, port: port],
+    secret_key_base: secret_key_base
+
+  # ## 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 :shift73k, Shift73k.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.
+  # Swoosh mailer config
+config :shift73k, Shift73k.Mailer,
+  adapter: Swoosh.Adapters.SMTP,
+  relay: System.get_env("SMTP_RELAY"),
+  port: System.get_env("SMTP_PORT"),
+  username: System.get_env("SMTP_USER"),
+  password: System.get_env("SMTP_PASS"),
+  ssl: false,
+  tls: :always,
+  auth: :always,
+  allowed_tls_versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"],
+  retries: 1,
+  no_mx_lookups: false
+
+config :shift73k, :app_global_vars,
+  mailer_reply_to: System.get_env("APP_REPLY_TO"),
+  mailer_from: {System.get_env("MAIL_FROM_FRIENDLY"), System.get_env("MAIL_FROM_ADDR")},
+  allow_registration: System.get_env("ALLOW_REG")
+end