mirror of
https://github.com/ClaperCo/Claper.git
synced 2025-12-15 19:37:53 +01:00
236 lines
7.8 KiB
Elixir
236 lines
7.8 KiB
Elixir
import Config
|
|
import Claper.ConfigHelpers
|
|
|
|
config_dir = System.get_env("CONFIG_DIR", "/run/secrets")
|
|
|
|
database_url =
|
|
get_var_from_path_or_env(
|
|
config_dir,
|
|
"DATABASE_URL",
|
|
"postgres://claper:claper@localhost:5432/postgres"
|
|
)
|
|
|
|
db_ssl = get_var_from_path_or_env(config_dir, "DB_SSL", "false") |> String.to_existing_atom()
|
|
|
|
# Listen IP supports IPv4 and IPv6 addresses.
|
|
listen_ip =
|
|
(
|
|
str = get_var_from_path_or_env(config_dir, "LISTEN_IP") || "0.0.0.0"
|
|
|
|
case :inet.parse_address(String.to_charlist(str)) do
|
|
{:ok, ip_addr} ->
|
|
ip_addr
|
|
|
|
{:error, reason} ->
|
|
raise "Invalid LISTEN_IP '#{str}' error: #{inspect(reason)}"
|
|
end
|
|
)
|
|
|
|
port = get_int_from_path_or_env(config_dir, "PORT", "4000")
|
|
|
|
secret_key_base = get_var_from_path_or_env(config_dir, "SECRET_KEY_BASE", nil)
|
|
|
|
if System.get_env("MIX_ENV") == "prod" or Application.get_env(:claper, :server, false) do
|
|
case secret_key_base do
|
|
nil ->
|
|
raise "SECRET_KEY_BASE configuration option is required. See https://docs.claper.co/configuration.html#production-docker"
|
|
|
|
key when byte_size(key) < 32 ->
|
|
raise "SECRET_KEY_BASE must be at least 32 bytes long. See https://docs.claper.co/configuration.html#production-docker"
|
|
|
|
_ ->
|
|
nil
|
|
end
|
|
end
|
|
|
|
base_url = get_var_from_path_or_env(config_dir, "BASE_URL", "http://localhost:4000")
|
|
|
|
if System.get_env("MIX_ENV") == "prod" or Application.get_env(:claper, :server, false) do
|
|
case base_url do
|
|
nil ->
|
|
raise "BASE_URL configuration option is required. See https://docs.claper.co/configuration.html#production-docker"
|
|
|
|
_ ->
|
|
nil
|
|
end
|
|
end
|
|
|
|
base_url = URI.parse(base_url)
|
|
|
|
if System.get_env("MIX_ENV") == "prod" or Application.get_env(:claper, :server, false) do
|
|
if base_url.scheme not in ["http", "https"] do
|
|
raise "BASE_URL must start with `http` or `https`. Currently configured as `#{System.get_env("BASE_URL")}`"
|
|
end
|
|
end
|
|
|
|
max_file_size = get_int_from_path_or_env(config_dir, "MAX_FILE_SIZE_MB", 15)
|
|
|
|
enable_account_creation =
|
|
get_var_from_path_or_env(config_dir, "ENABLE_ACCOUNT_CREATION", "true")
|
|
|> String.to_existing_atom()
|
|
|
|
email_confirmation =
|
|
get_var_from_path_or_env(config_dir, "EMAIL_CONFIRMATION", "false")
|
|
|> String.to_existing_atom()
|
|
|
|
pool_size = get_int_from_path_or_env(config_dir, "POOL_SIZE", 10)
|
|
queue_target = get_int_from_path_or_env(config_dir, "QUEUE_TARGET", 5_000)
|
|
|
|
mail_transport = get_var_from_path_or_env(config_dir, "MAIL_TRANSPORT", "local")
|
|
|
|
smtp_relay = get_var_from_path_or_env(config_dir, "SMTP_RELAY", nil)
|
|
smtp_username = get_var_from_path_or_env(config_dir, "SMTP_USERNAME", nil)
|
|
smtp_password = get_var_from_path_or_env(config_dir, "SMTP_PASSWORD", nil)
|
|
smtp_ssl = get_var_from_path_or_env(config_dir, "SMTP_SSL", "true") |> String.to_existing_atom()
|
|
smtp_tls = get_var_from_path_or_env(config_dir, "SMTP_TLS", "always")
|
|
smtp_auth = get_var_from_path_or_env(config_dir, "SMTP_AUTH", "always")
|
|
smtp_port = get_int_from_path_or_env(config_dir, "SMTP_PORT", 25)
|
|
|
|
aws_access_key_id = get_var_from_path_or_env(config_dir, "AWS_ACCESS_KEY_ID", nil)
|
|
aws_secret_access_key = get_var_from_path_or_env(config_dir, "AWS_SECRET_ACCESS_KEY", nil)
|
|
aws_region = get_var_from_path_or_env(config_dir, "AWS_REGION", nil)
|
|
|
|
same_site_cookie = get_var_from_path_or_env(config_dir, "SAME_SITE_COOKIE", "Lax")
|
|
|
|
secure_cookie =
|
|
get_var_from_path_or_env(config_dir, "SECURE_COOKIE", "false") |> String.to_existing_atom()
|
|
|
|
oidc_issuer = get_var_from_path_or_env(config_dir, "OIDC_ISSUER", "https://accounts.google.com")
|
|
|
|
oidc_client_id = get_var_from_path_or_env(config_dir, "OIDC_CLIENT_ID", nil)
|
|
oidc_client_secret = get_var_from_path_or_env(config_dir, "OIDC_CLIENT_SECRET", nil)
|
|
oidc_scopes = get_var_from_path_or_env(config_dir, "OIDC_SCOPES", "openid email profile")
|
|
oidc_provider_name = get_var_from_path_or_env(config_dir, "OIDC_PROVIDER_NAME", "OpenID Connect")
|
|
oidc_logo_url = get_var_from_path_or_env(config_dir, "OIDC_LOGO_URL", "/images/icons/openid.png")
|
|
|
|
oidc_auto_redirect_login =
|
|
get_var_from_path_or_env(config_dir, "OIDC_AUTO_REDIRECT_LOGIN", "false")
|
|
|> String.to_existing_atom()
|
|
|
|
oidc_property_mappings =
|
|
get_var_from_path_or_env(config_dir, "OIDC_PROPERTY_MAPPINGS", nil)
|
|
|> case do
|
|
nil ->
|
|
nil
|
|
|
|
mappings ->
|
|
String.split(mappings, ",")
|
|
|> Enum.map(&String.split(&1, ":"))
|
|
|> Enum.into(%{}, fn [key, value] -> {key, value} end)
|
|
end
|
|
|
|
oidc_enabled =
|
|
!is_nil(oidc_client_id) and !is_nil(oidc_client_secret)
|
|
|
|
allow_unlink_external_provider =
|
|
get_var_from_path_or_env(config_dir, "ALLOW_UNLINK_EXTERNAL_PROVIDER", "true")
|
|
|> String.to_existing_atom()
|
|
|
|
logout_redirect_url = get_var_from_path_or_env(config_dir, "LOGOUT_REDIRECT_URL", nil)
|
|
|
|
languages =
|
|
get_var_from_path_or_env(config_dir, "LANGUAGES", "en,fr,es,it,de")
|
|
|> String.split(",")
|
|
|> Enum.map(&String.trim/1)
|
|
|
|
config :claper, :oidc,
|
|
enabled: oidc_enabled,
|
|
issuer: oidc_issuer,
|
|
client_id: oidc_client_id,
|
|
client_secret: oidc_client_secret,
|
|
scopes: String.split(oidc_scopes, " "),
|
|
provider_name: oidc_provider_name,
|
|
logo_url: oidc_logo_url,
|
|
property_mappings: oidc_property_mappings,
|
|
auto_redirect_login: oidc_auto_redirect_login
|
|
|
|
config :claper, Claper.Repo,
|
|
url: database_url,
|
|
ssl: db_ssl,
|
|
ssl_opts: [
|
|
verify: :verify_none
|
|
],
|
|
prepare: :unnamed,
|
|
pool_size: pool_size,
|
|
queue_target: queue_target
|
|
|
|
config :claper, ClaperWeb.Endpoint,
|
|
url: [scheme: base_url.scheme, host: base_url.host, path: base_url.path, port: base_url.port],
|
|
base_url: base_url,
|
|
http: [
|
|
ip: listen_ip,
|
|
port: port,
|
|
transport_options: [max_connections: :infinity],
|
|
protocol_options: [max_request_line_length: 8192, max_header_value_length: 8192]
|
|
],
|
|
secret_key_base: secret_key_base,
|
|
same_site_cookie: same_site_cookie,
|
|
secure_cookie: secure_cookie
|
|
|
|
config :claper,
|
|
enable_account_creation: enable_account_creation,
|
|
email_confirmation: email_confirmation,
|
|
allow_unlink_external_provider: allow_unlink_external_provider,
|
|
logout_redirect_url: logout_redirect_url,
|
|
languages: languages
|
|
|
|
config :claper, :presentations,
|
|
max_file_size: max_file_size,
|
|
storage: get_var_from_path_or_env(config_dir, "PRESENTATION_STORAGE", "local"),
|
|
aws_bucket: get_var_from_path_or_env(config_dir, "AWS_PRES_BUCKET", nil),
|
|
resolution: get_var_from_path_or_env(config_dir, "GS_JPG_RESOLUTION", "300x300")
|
|
|
|
config :claper, :mail,
|
|
from: get_var_from_path_or_env(config_dir, "MAIL_FROM", "noreply@claper.co"),
|
|
from_name: get_var_from_path_or_env(config_dir, "MAIL_FROM_NAME", "Claper")
|
|
|
|
config :claper, ClaperWeb.MailboxGuard,
|
|
username: get_var_from_path_or_env(config_dir, "MAILBOX_USER", nil),
|
|
password: get_var_from_path_or_env(config_dir, "MAILBOX_PASSWORD", nil),
|
|
enabled:
|
|
get_var_from_path_or_env(config_dir, "ENABLE_MAILBOX_ROUTE", "false")
|
|
|> String.to_existing_atom()
|
|
|
|
case mail_transport do
|
|
"smtp" ->
|
|
config :claper, Claper.Mailer,
|
|
adapter: Swoosh.Adapters.Mua,
|
|
relay: smtp_relay,
|
|
port: smtp_port
|
|
|
|
cond do
|
|
smtp_username && smtp_password ->
|
|
config :claper, Claper.Mailer, auth: [username: smtp_username, password: smtp_password]
|
|
|
|
smtp_username || smtp_password ->
|
|
raise ArgumentError, """
|
|
Both SMTP_USERNAME and SMTP_PASSWORD must be set for SMTP authentication.
|
|
Please provide values for both environment variables.
|
|
"""
|
|
|
|
true ->
|
|
nil
|
|
end
|
|
|
|
config :swoosh, :api_client, false
|
|
|
|
"postmark" ->
|
|
config :claper, Claper.Mailer,
|
|
adapter: Swoosh.Adapters.Postmark,
|
|
api_key: get_var_from_path_or_env(config_dir, "POSTMARK_API_KEY", nil)
|
|
|
|
config :swoosh, :api_client, Swoosh.ApiClient.Hackney
|
|
|
|
_ ->
|
|
config :claper, Claper.Mailer, adapter: Swoosh.Adapters.Local
|
|
config :swoosh, :api_client, false
|
|
end
|
|
|
|
config :ex_aws,
|
|
access_key_id: aws_access_key_id,
|
|
secret_access_key: aws_secret_access_key,
|
|
region: aws_region,
|
|
normalize_path: false
|
|
|
|
config :swoosh, :api_client, Swoosh.ApiClient.Finch
|