aprs.me/config/runtime.exs
Graham McIntire 781fdd88a3
Remove dead modules, unused deps, and commented-out code
Delete 5 unused modules: Presence (untracked), LiveView ShutdownHandler
(unused mixin), RateLimiterWrapper (pointless delegation), Passcode
(only used by own test), MapLive.Utils (pure delegates).

Fix ShutdownHandler to not call deleted Presence. Inline ParamUtils
at call sites. Remove cachex dep and 27 stale entries from mix.lock.
Clean commented-out Exq/Redis config from application.ex.
2026-02-20 08:09:22 -06:00

190 lines
6.6 KiB
Elixir

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/aprsme start
#
# Alternatively, you can use `mix phx.gen.release` to generate a `bin/server`
# script that automatically sets the env var above.
# Always start the server in production/docker environments
if System.get_env("PHX_SERVER") || config_env() == :prod do
config :aprsme, AprsmeWeb.Endpoint, server: true
end
if config_env() == :prod do
database_url =
System.get_env("DATABASE_URL") ||
raise """
environment variable DATABASE_URL is missing.
For example: ecto://USER:PASS@HOST/DATABASE
"""
maybe_ipv6 = if System.get_env("ECTO_IPV6") in ~w(true 1), do: [:inet6], else: []
# 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")
# Configure clustering based on environment
cluster_enabled = System.get_env("CLUSTER_ENABLED", "false") == "true"
# Parse SSL configuration from environment
ssl_enabled = System.get_env("DATABASE_SSL", "false") == "true"
ssl_verify = System.get_env("DATABASE_SSL_VERIFY", "true") == "true"
ssl_opts =
if ssl_enabled do
if ssl_verify do
[ssl: true]
else
[ssl: true, ssl_opts: [verify: :verify_none]]
end
else
[]
end
# ## Configuring the mailer
#
# Configure Resend for email delivery
config :aprsme, Aprsme.Mailer,
adapter: Resend.Swoosh.Adapter,
api_key: System.get_env("RESEND_API_KEY")
config :aprsme,
Aprsme.Repo,
Keyword.merge(
[
url: database_url,
# Increased pool size for better concurrency (was 25)
pool_size: String.to_integer(System.get_env("POOL_SIZE") || "45"),
# Increased timeout for ARM system under load
pool_timeout: String.to_integer(System.get_env("POOL_TIMEOUT") || "10000"),
# Match PostgreSQL statement timeout capabilities
timeout: String.to_integer(System.get_env("DB_TIMEOUT") || "30000"),
socket_options:
maybe_ipv6 ++
[
# TCP optimizations for better connection handling
keepalive: true,
nodelay: true,
recbuf: 8192,
sndbuf: 8192
],
types: Aprsme.PostgresTypes,
# Reduced queue target for faster response
queue_target: 100,
# Check queue more frequently
queue_interval: 1_000,
# Optimize for unnamed prepared statements (better for dynamic queries)
prepare: :unnamed,
# Connection parameters to leverage PostgreSQL settings
# Note: When using PgBouncer, only certain parameters are supported
parameters: [
# Application name for monitoring
application_name: "aprsme"
]
],
ssl_opts
)
config :aprsme, AprsmeWeb.Endpoint,
url: [host: host, port: 443, scheme: "https"],
http: [
# Bind on all IPv4 interfaces for better container compatibility
# Use {0, 0, 0, 0} for IPv4 or {0, 0, 0, 0, 0, 0, 0, 0} for IPv6
# See the documentation on https://hexdocs.pm/plug_cowboy/Plug.Cowboy.html
# 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,
server: true,
check_origin: [
"https://#{host}",
"http://10.0.19.221",
"http://10.0.19.222:33897",
"https://aprs.me",
"https://www.aprs.me",
"https://www.openstreetmap.org",
"https://tile.openstreetmap.org",
"https://static.cloudflareinsights.com"
]
config :aprsme, :cluster_enabled, cluster_enabled
# Optional: Set the default "from" email address
config :aprsme,
default_from_email: "w5isp@aprs.me"
config :aprsme,
ecto_repos: [Aprsme.Repo],
aprs_is_server: System.get_env("APRS_HOST") || System.get_env("APRS_SERVER", "dallas.aprs2.net"),
aprs_is_port: String.to_integer(System.get_env("APRS_PORT") || "14580"),
aprs_is_default_filter: System.get_env("APRS_FILTER"),
aprs_is_login_id: System.get_env("APRS_CALLSIGN"),
aprs_is_password: System.get_env("APRS_PASSWORD") || System.get_env("APRS_PASSCODE"),
env: :prod
# Configure Hammer for production environment
config :hammer,
backend: {Hammer.Backend.ETS, [expiry_ms: 60_000 * 60 * 4, cleanup_interval_ms: 60_000 * 10]}
# Configure libcluster topology based on environment
if cluster_enabled do
# Use DNS strategy with headless service for node discovery
config :libcluster,
topologies: [
k8s: [
strategy: Cluster.Strategy.Kubernetes.DNS,
config: [
service: "aprs-headless.aprs.svc.cluster.local",
application_name: "aprsme",
polling_interval: 5_000
]
]
]
else
# Keep existing Dokku configuration for non-Kubernetes deployments
config :libcluster,
topologies: [
dokku: [
strategy: Cluster.Strategy.Gossip,
config: [
port: 45_892,
if_addr: "0.0.0.0",
multicast_addr: "230.1.1.1",
multicast_ttl: 1
]
]
]
end
#
# For this example you need include a HTTP client required by Swoosh API client.
# Swoosh supports Hackney, Finch, and Req out of the box:
#
# config :swoosh, :api_client, Swoosh.ApiClient.Hackney
#
# See https://hexdocs.pm/swoosh/Swoosh.html#module-installation for details.
end