diff --git a/config/docker.exs b/config/docker.exs index 6363cfc6b..3664c5586 100644 --- a/config/docker.exs +++ b/config/docker.exs @@ -1,6 +1,7 @@ # Mobilizon instance configuration import Config +import Mobilizon.Service.Config.Helpers {:ok, _} = Application.ensure_all_started(:tls_certificate_check) @@ -49,9 +50,20 @@ config :mobilizon, :instance, description: "Change this to a proper description of your instance", hostname: System.get_env("MOBILIZON_INSTANCE_HOST", "mobilizon.lan"), registrations_open: System.get_env("MOBILIZON_INSTANCE_REGISTRATIONS_OPEN", "false") == "true", - demo: false, - allow_relay: true, - federating: true, + registration_email_allowlist: + System.get_env("MOBILIZON_INSTANCE_REGISTRATIONS_EMAIL_ALLOWLIST", "") + |> String.split(",", trim: true), + registration_email_denylist: + System.get_env("MOBILIZON_INSTANCE_REGISTRATIONS_EMAIL_DENYLIST", "") + |> String.split(",", trim: true), + disable_database_login: + System.get_env("MOBILIZON_INSTANCE_DISABLE_DATABASE_LOGIN", "false") == "true", + default_language: System.get_env("MOBILIZON_INSTANCE_DEFAULT_LANGUAGE", "en"), + demo: System.get_env("MOBILIZON_INSTANCE_DEMO", "false") == "true", + allow_relay: System.get_env("MOBILIZON_INSTANCE_ALLOW_RELAY", "true") == "true", + federating: System.get_env("MOBILIZON_INSTANCE_FEDERATING", "true") == "true", + enable_instance_feeds: + System.get_env("MOBILIZON_INSTANCE_ENABLE_INSTANCE_FEEDS", "true") == "true", email_from: System.get_env("MOBILIZON_INSTANCE_EMAIL", "noreply@mobilizon.lan"), email_reply_to: System.get_env("MOBILIZON_REPLY_EMAIL", "noreply@mobilizon.lan") @@ -79,7 +91,7 @@ config :mobilizon, Mobilizon.Web.Email.Mailer, ssl: System.get_env("MOBILIZON_SMTP_SSL", "false"), retries: 1, no_mx_lookups: false, - auth: :if_available + auth: System.get_env("MOBILIZON_SMTP_AUTH", "if_available") config :geolix, databases: [ @@ -93,13 +105,30 @@ config :geolix, config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: System.get_env("MOBILIZON_UPLOADS", "/var/lib/mobilizon/uploads") +formats = + if System.get_env("MOBILIZON_EXPORTS_FORMAT_CSV_ENABLED", "true") == "true" do + [Mobilizon.Service.Export.Participants.CSV] + else + [] + end + +formats = + if System.get_env("MOBILIZON_EXPORTS_FORMAT_PDF_ENABLED", "true") == "true" do + formats ++ [Mobilizon.Service.Export.Participants.PDF] + else + formats + end + +formats = + if System.get_env("MOBILIZON_EXPORTS_FORMAT_ODS_ENABLED", "true") == "true" do + formats ++ [Mobilizon.Service.Export.Participants.ODS] + else + formats + end + config :mobilizon, :exports, path: System.get_env("MOBILIZON_UPLOADS_EXPORTS", "/var/lib/mobilizon/uploads/exports"), - formats: [ - Mobilizon.Service.Export.Participants.CSV, - Mobilizon.Service.Export.Participants.PDF, - Mobilizon.Service.Export.Participants.ODS - ] + formats: formats config :tz_world, data_dir: System.get_env("MOBILIZON_TIMEZONES_DIR", "/var/lib/mobilizon/timezones") @@ -110,3 +139,131 @@ config :web_push_encryption, :vapid_details, subject: System.get_env("MOBILIZON_WEB_PUSH_ENCRYPTION_SUBJECT", nil), public_key: System.get_env("MOBILIZON_WEB_PUSH_ENCRYPTION_PUBLIC_KEY", nil), private_key: System.get_env("MOBILIZON_WEB_PUSH_ENCRYPTION_PRIVATE_KEY", nil) + +geospatial_service = + case System.get_env("MOBILIZON_GEOSPATIAL_SERVICE", "Nominatim") do + "Nominatim" -> Mobilizon.Service.Geospatial.Nominatim + "Addok" -> Mobilizon.Service.Geospatial.Addok + "Photon" -> Mobilizon.Service.Geospatial.Photon + "GoogleMaps" -> Mobilizon.Service.Geospatial.GoogleMaps + "MapQuest" -> Mobilizon.Service.Geospatial.MapQuest + "Mimirsbrunn" -> Mobilizon.Service.Geospatial.Mimirsbrunn + "Pelias" -> Mobilizon.Service.Geospatial.Pelias + end + +config :mobilizon, Mobilizon.Service.Geospatial, service: geospatial_service + +if System.get_env("MOBILIZON_GEOSPATIAL_SERVICE", "Nominatim") == "Nominatim" do + config :mobilizon, Mobilizon.Service.Geospatial.Nominatim, + endpoint: + System.get_env( + "MOBILIZON_GEOSPATIAL_NOMINATIM_ENDPOINT", + "https://nominatim.openstreetmap.org" + ), + api_key: System.get_env("MOBILIZON_GEOSPATIAL_NOMINATIM_API_KEY", nil) +end + +if System.get_env("MOBILIZON_GEOSPATIAL_SERVICE", "Nominatim") == "Addok" do + config :mobilizon, Mobilizon.Service.Geospatial.Addok, + endpoint: + System.get_env("MOBILIZON_GEOSPATIAL_ADDOK_ENDPOINT", "https://api-adresse.data.gouv.fr") +end + +if System.get_env("MOBILIZON_GEOSPATIAL_SERVICE", "Nominatim") == "Photon" do + config :mobilizon, Mobilizon.Service.Geospatial.Photon, + endpoint: System.get_env("MOBILIZON_GEOSPATIAL_PHOTON_ENDPOINT", "https://photon.komoot.de") +end + +if System.get_env("MOBILIZON_GEOSPATIAL_SERVICE", "Nominatim") == "GoogleMaps" do + config :mobilizon, Mobilizon.Service.Geospatial.GoogleMaps, + api_key: System.get_env("MOBILIZON_GEOSPATIAL_GOOGLE_MAPS_API_KEY", nil), + fetch_place_details: true +end + +if System.get_env("MOBILIZON_GEOSPATIAL_SERVICE", "Nominatim") == "MapQuest" do + config :mobilizon, Mobilizon.Service.Geospatial.MapQuest, + api_key: System.get_env("MOBILIZON_GEOSPATIAL_MAP_QUEST_API_KEY", nil) +end + +if System.get_env("MOBILIZON_GEOSPATIAL_SERVICE", "Nominatim") == "Mimirsbrunn" do + config :mobilizon, Mobilizon.Service.Geospatial.Mimirsbrunn, + endpoint: System.get_env("MOBILIZON_GEOSPATIAL_MIMIRSBRUNN_ENDPOINT", nil) +end + +if System.get_env("MOBILIZON_GEOSPATIAL_SERVICE", "Nominatim") == "Pelias" do + config :mobilizon, Mobilizon.Service.Geospatial.Pelias, + endpoint: System.get_env("MOBILIZON_GEOSPATIAL_PELIAS_ENDPOINT", nil) +end + +sentry_dsn = System.get_env("MOBILIZON_ERROR_REPORTING_SENTRY_DSN", nil) + +included_environments = if sentry_dsn, do: ["prod"], else: [] + +config :sentry, + dsn: sentry_dsn, + included_environments: included_environments, + release: to_string(Application.spec(:mobilizon, :vsn)) + +config :logger, Sentry.LoggerBackend, + capture_log_messages: true, + level: :error + +if sentry_dsn != nil do + config :mobilizon, Mobilizon.Service.ErrorReporting, + adapter: Mobilizon.Service.ErrorReporting.Sentry +end + +matomo_enabled = System.get_env("MOBILIZON_FRONT_END_ANALYTICS_MATOMO_ENABLED", "false") == "true" +matomo_endpoint = System.get_env("MOBILIZON_FRONT_END_ANALYTICS_MATOMO_ENDPOINT", nil) +matomo_site_id = System.get_env("MOBILIZON_FRONT_END_ANALYTICS_MATOMO_SITE_ID", nil) + +matomo_tracker_file_name = + System.get_env("MOBILIZON_FRONT_END_ANALYTICS_MATOMO_TRACKER_FILE_NAME", "matomo") + +matomo_host = host_from_uri(matomo_endpoint) + +analytics_providers = + if matomo_enabled do + [Mobilizon.Service.FrontEndAnalytics.Matomo] + else + [] + end + +analytics_providers = + if sentry_dsn != nil do + analytics_providers ++ [Mobilizon.Service.FrontEndAnalytics.Sentry] + else + analytics_providers + end + +config :mobilizon, :analytics, providers: analytics_providers + +matomo_csp = + if matomo_enabled and matomo_host do + [ + connect_src: [matomo_host], + script_src: [matomo_host], + img_src: [matomo_host] + ] + else + [] + end + +config :mobilizon, Mobilizon.Service.FrontEndAnalytics.Matomo, + enabled: matomo_enabled, + host: matomo_endpoint, + siteId: matomo_site_id, + trackerFileName: matomo_tracker_file_name, + csp: matomo_csp + +config :mobilizon, Mobilizon.Service.FrontEndAnalytics.Sentry, + enabled: sentry_dsn != nil, + dsn: sentry_dsn, + tracesSampleRate: 1.0, + organization: System.get_env("MOBILIZON_ERROR_REPORTING_SENTRY_ORGANISATION", nil), + project: System.get_env("MOBILIZON_ERROR_REPORTING_SENTRY_PROJECT", nil), + host: System.get_env("MOBILIZON_ERROR_REPORTING_SENTRY_HOST", nil), + csp: [ + connect_src: + System.get_env("MOBILIZON_ERROR_REPORTING_SENTRY_HOST", "") |> String.split(" ", trim: true) + ] diff --git a/lib/service/config/helpers.ex b/lib/service/config/helpers.ex new file mode 100644 index 000000000..42796eaeb --- /dev/null +++ b/lib/service/config/helpers.ex @@ -0,0 +1,12 @@ +defmodule Mobilizon.Service.Config.Helpers do + @moduledoc """ + Provide some helpers to configuration files + """ + + @spec host_from_uri(String.t() | nil) :: String.t() | nil + def host_from_uri(nil), do: nil + + def host_from_uri(uri) when is_binary(uri) do + URI.parse(uri).host + end +end