summaryrefslogtreecommitdiff
path: root/config
diff options
context:
space:
mode:
authorDawid Rycerz <dawid@rycerz.xyz>2025-03-23 17:11:39 +0100
committerDawid Rycerz <dawid@rycerz.xyz>2025-04-05 21:16:51 +0200
commit0ab2e5ba2b0631b28b5b1405559237b3913c878f (patch)
tree791cea788b0a62bc483d0041fbd0c655d2ad49e8 /config
feat: initialize Phoenix application for weather alerts
This commit sets up the initial Silmataivas project structure, including: Phoenix web framework configuration, database models for users and locations, weather polling service, notification system, Docker and deployment configurations, CI/CD pipeline setup
Diffstat (limited to 'config')
-rw-r--r--config/config.exs43
-rw-r--r--config/dev.exs76
-rw-r--r--config/prod.exs14
-rw-r--r--config/runtime.exs196
-rw-r--r--config/test.exs26
5 files changed, 355 insertions, 0 deletions
diff --git a/config/config.exs b/config/config.exs
new file mode 100644
index 0000000..c3d80d5
--- /dev/null
+++ b/config/config.exs
@@ -0,0 +1,43 @@
+# This file is responsible for configuring your application
+# and its dependencies with the aid of the Config module.
+#
+# This configuration file is loaded before any dependency and
+# is restricted to this project.
+
+# General application configuration
+import Config
+
+config :silmataivas,
+ ecto_repos: [Silmataivas.Repo],
+ generators: [timestamp_type: :utc_datetime]
+
+# Configures the endpoint
+config :silmataivas, SilmataivasWeb.Endpoint,
+ url: [host: "localhost"],
+ adapter: Bandit.PhoenixAdapter,
+ render_errors: [
+ formats: [json: SilmataivasWeb.ErrorJSON],
+ layout: false
+ ],
+ pubsub_server: Silmataivas.PubSub,
+ live_view: [signing_salt: "uNqy5+eV"]
+
+# Configures the mailer
+#
+# By default it uses the "Local" adapter which stores the emails
+# locally. You can see the emails in your browser, at "/dev/mailbox".
+#
+# For production it's recommended to configure a different adapter
+# at the `config/runtime.exs`.
+
+# Configures Elixir's Logger
+config :logger, :console,
+ format: "$time $metadata[$level] $message\n",
+ metadata: [:request_id]
+
+# Use Jason for JSON parsing in Phoenix
+config :phoenix, :json_library, Jason
+
+# Import environment specific config. This must remain at the bottom
+# of this file so it overrides the configuration defined above.
+import_config "#{config_env()}.exs"
diff --git a/config/dev.exs b/config/dev.exs
new file mode 100644
index 0000000..2c2821e
--- /dev/null
+++ b/config/dev.exs
@@ -0,0 +1,76 @@
+import Config
+
+# Database configuration is now handled in runtime.exs
+# using DB_ADAPTER and DATABASE_URL environment variables
+config :silmataivas, Silmataivas.Repo, show_sensitive_data_on_connection_error: true
+
+# OpenWeatherMap API configuration for development
+config :silmataivas, :openweathermap_api_key, System.get_env("OPENWEATHERMAP_API_KEY")
+
+# For development, we disable any cache and enable
+# debugging and code reloading.
+#
+# The watchers configuration can be used to run external
+# watchers to your application. For example, we can use it
+# to bundle .js and .css sources.
+# Binding to loopback ipv4 address prevents access from other machines.
+config :silmataivas, SilmataivasWeb.Endpoint,
+ # Change to `ip: {0, 0, 0, 0}` to allow access from other machines.
+ http: [ip: {127, 0, 0, 1}, port: 4000],
+ check_origin: false,
+ code_reloader: true,
+ debug_errors: true,
+ secret_key_base: "2n9j4hR64BSG/CPD59PFf9u2obxbBtOJw2KMeJmXdQDwt4zOFyyIwWX7lamgQJhi",
+ watchers: []
+
+# ## SSL Support
+#
+# In order to use HTTPS in development, a self-signed
+# certificate can be generated by running the following
+# Mix task:
+#
+# mix phx.gen.cert
+#
+# Run `mix help phx.gen.cert` for more information.
+#
+# The `http:` config above can be replaced with:
+#
+# https: [
+# port: 4001,
+# cipher_suite: :strong,
+# keyfile: "priv/cert/selfsigned_key.pem",
+# certfile: "priv/cert/selfsigned.pem"
+# ],
+#
+# If desired, both `http:` and `https:` keys can be
+# configured to run both http and https servers on
+# different ports.
+
+# Enable dev routes for dashboard and mailbox
+config :silmataivas, dev_routes: true
+
+# Do not include metadata nor timestamps in development logs
+config :logger, :console, format: "[$level] $message\n"
+
+# Set a higher stacktrace during development. Avoid configuring such
+# in production as building large stacktraces may be expensive.
+config :phoenix, :stacktrace_depth, 20
+
+# Initialize plugs at runtime for faster development compilation
+config :phoenix, :plug_init_mode, :runtime
+
+# Disable swoosh api client as it is only required for production adapters.
+config :swoosh, :api_client, Swoosh.ApiClient.Hackney
+
+config :silmataivas, Silmataivas.Mailer,
+ adapter: Swoosh.Adapters.AmazonSES,
+ access_key: System.get_env("AWS_ACCESS_KEY_ID"),
+ secret: System.get_env("AWS_SECRET_ACCESS_KEY"),
+ region: "eu-central-1"
+
+# Configure scheuler
+config :silmataivas, Silmataivas.Scheduler,
+ jobs: [
+ # {"0 * * * *", {Silmataivas.WeatherPoller, :check_all, []}}
+ {"*/5 * * * *", {Silmataivas.WeatherPoller, :check_all, []}}
+ ]
diff --git a/config/prod.exs b/config/prod.exs
new file mode 100644
index 0000000..07964dd
--- /dev/null
+++ b/config/prod.exs
@@ -0,0 +1,14 @@
+import Config
+
+# Configures Swoosh API Client
+# config :swoosh, api_client: Swoosh.ApiClient.Finch, finch_name: Silmataivas.Finch
+config :swoosh, :api_client, Swoosh.ApiClient.Hackney
+
+# Disable Swoosh Local Memory Storage
+config :swoosh, local: false
+
+# Do not print debug messages in production
+# config :logger, level: :info
+
+# Runtime production configuration, including reading
+# of environment variables, is done on config/runtime.exs.
diff --git a/config/runtime.exs b/config/runtime.exs
new file mode 100644
index 0000000..a038e6f
--- /dev/null
+++ b/config/runtime.exs
@@ -0,0 +1,196 @@
+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/silmataivas 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 :silmataivas, SilmataivasWeb.Endpoint, server: true
+end
+
+# Configure database adapter (SQLite or PostgreSQL)
+db_adapter = System.get_env("DB_ADAPTER", "sqlite")
+
+# In test environment, configure test database with sandbox pool
+if config_env() == :test do
+ database_path = System.get_env("DATABASE_URL", "sqlite3:/tmp/silmataivas_test.db")
+
+ config :silmataivas, Silmataivas.Repo,
+ adapter: Ecto.Adapters.SQLite3,
+ database: String.replace_prefix(database_path, "sqlite3:", ""),
+ pool: Ecto.Adapters.SQL.Sandbox,
+ pool_size: System.schedulers_online() * 2,
+ queue_target: 5000,
+ queue_interval: 10000,
+ timeout: 30000,
+ pragma: [
+ # Write-Ahead Logging for better concurrency
+ journal_mode: :wal,
+ # Wait longer before failing on locks
+ busy_timeout: 10000,
+ # Balance between safety and performance
+ synchronous: :normal
+ ]
+else
+ case db_adapter do
+ "sqlite" ->
+ database_path =
+ System.get_env(
+ "DATABASE_URL",
+ "sqlite3:#{Path.join(System.get_env("HOME"), ".silmataivas.db")}"
+ )
+
+ config :silmataivas, Silmataivas.Repo,
+ adapter: Ecto.Adapters.SQLite3,
+ database: String.replace_prefix(database_path, "sqlite3:", ""),
+ pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10")
+
+ "postgres" ->
+ database_url = System.get_env("DATABASE_URL")
+
+ if config_env() != :prod and is_nil(database_url) do
+ # Default development PostgreSQL config if DATABASE_URL is not set
+ config :silmataivas, Silmataivas.Repo,
+ adapter: Ecto.Adapters.Postgres,
+ username: System.get_env("PGUSER", "postgres"),
+ password: System.get_env("PGPASSWORD", "postgres"),
+ hostname: System.get_env("PGHOST", "localhost"),
+ database: System.get_env("PGDATABASE", "silmataivas_#{config_env()}"),
+ pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10")
+ else
+ maybe_ipv6 = if System.get_env("ECTO_IPV6") in ~w(true 1), do: [:inet6], else: []
+
+ if config_env() == :prod and is_nil(database_url) do
+ raise """
+ environment variable DATABASE_URL is missing.
+ For example: ecto://USER:PASS@HOST/DATABASE
+ """
+ end
+
+ config :silmataivas, Silmataivas.Repo,
+ adapter: Ecto.Adapters.Postgres,
+ url: database_url,
+ pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"),
+ socket_options: maybe_ipv6
+ end
+
+ other ->
+ raise "Unsupported database adapter: #{other}. Supported adapters are 'sqlite' and 'postgres'."
+ end
+end
+
+if config_env() == :prod do
+ # Add OpenWeatherMap API key for production
+ openweathermap_api_key =
+ System.get_env("OPENWEATHERMAP_API_KEY") ||
+ raise """
+ environment variable OPENWEATHERMAP_API_KEY is missing.
+ Please set this environment variable to your OpenWeatherMap API key.
+ """
+
+ config :silmataivas, :openweathermap_api_key, openweathermap_api_key
+
+ # 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 :silmataivas, :dns_cluster_query, System.get_env("DNS_CLUSTER_QUERY")
+
+ config :silmataivas, SilmataivasWeb.Endpoint,
+ url: [host: host, port: 443, scheme: "https"],
+ http: [
+ # Enable IPv6 and bind on all interfaces.
+ # Set it to {0, 0, 0, 0, 0, 0, 0, 1} for local network only access.
+ # See the documentation on https://hexdocs.pm/bandit/Bandit.html#t:options/0
+ # for details about using IPv6 vs IPv4 and loopback vs public addresses.
+ ip: {0, 0, 0, 0},
+ port: port
+ ],
+ secret_key_base: secret_key_base
+
+ config :logger, level: String.to_atom(System.get_env("LOG_LEVEL") || "info")
+
+ # ## SSL Support
+ #
+ # To get SSL working, you will need to add the `https` key
+ # to your endpoint configuration:
+ #
+ # config :silmataivas, SilmataivasWeb.Endpoint,
+ # https: [
+ # ...,
+ # port: 443,
+ # cipher_suite: :strong,
+ # keyfile: System.get_env("SOME_APP_SSL_KEY_PATH"),
+ # certfile: System.get_env("SOME_APP_SSL_CERT_PATH")
+ # ]
+ #
+ # The `cipher_suite` is set to `:strong` to support only the
+ # latest and more secure SSL ciphers. This means old browsers
+ # and clients may not be supported. You can set it to
+ # `:compatible` for wider support.
+ #
+ # `:keyfile` and `:certfile` expect an absolute path to the key
+ # and cert in disk or a relative path inside priv, for example
+ # "priv/ssl/server.key". For all supported SSL configuration
+ # options, see https://hexdocs.pm/plug/Plug.SSL.html#configure/1
+ #
+ # We also recommend setting `force_ssl` in your config/prod.exs,
+ # ensuring no data is ever sent via http, always redirecting to https:
+ #
+ # config :silmataivas, SilmataivasWeb.Endpoint,
+ # force_ssl: [hsts: true]
+ #
+ # Check `Plug.SSL` for all available options in `force_ssl`.
+
+ # ## 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 :silmataivas, Silmataivas.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.
+
+ config :silmataivas, Silmataivas.Mailer,
+ adapter: Swoosh.Adapters.AmazonSES,
+ access_key: System.get_env("AWS_ACCESS_KEY_ID"),
+ secret: System.get_env("AWS_SECRET_ACCESS_KEY"),
+ region: "eu-central-1"
+
+ config :silmataivas, Silmataivas.Scheduler,
+ jobs: [
+ {"0 * * * *", {Silmataivas.WeatherPoller, :check_all, []}}
+ ]
+end
diff --git a/config/test.exs b/config/test.exs
new file mode 100644
index 0000000..7b5e8c3
--- /dev/null
+++ b/config/test.exs
@@ -0,0 +1,26 @@
+import Config
+
+# Database configuration is now handled in runtime.exs
+# using DB_ADAPTER and DATABASE_URL environment variables
+config :silmataivas, Silmataivas.Repo,
+ pool: Ecto.Adapters.SQL.Sandbox,
+ pool_size: System.schedulers_online() * 2
+
+# We don't run a server during test. If one is required,
+# you can enable the server option below.
+config :silmataivas, SilmataivasWeb.Endpoint,
+ http: [ip: {127, 0, 0, 1}, port: 4002],
+ secret_key_base: "QfqSXcc0rT7DLhF/zLnd5MGzXX3+NbSe46do+x4nQs9b4wlNixD0cDHJKsq/faLU",
+ server: false
+
+# In test we don't send emails
+config :silmataivas, Silmataivas.Mailer, adapter: Swoosh.Adapters.Test
+
+# Disable swoosh api client as it is only required for production adapters
+config :swoosh, :api_client, false
+
+# Print only warnings and errors during test
+config :logger, level: :warning
+
+# Initialize plugs at runtime for faster test compilation
+config :phoenix, :plug_init_mode, :runtime