summaryrefslogtreecommitdiff
path: root/config/runtime.exs
blob: a038e6f76d1e651aa347ce947a173b5d10495f05 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
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