aprs.me/config/config.exs
Graham McIntire 7dc6c616a2
Bundle all vendor JavaScript files locally instead of loading from CDNs
This change eliminates all external CDN dependencies by bundling JavaScript
libraries locally using esbuild. All vendor files are now served from the
application's own assets, improving reliability and privacy.

Changes:
- Created assets/js/vendor.js to bundle all external libraries
- Added vendor bundle configuration to esbuild in config files
- Updated all templates to use local vendor.js instead of CDN scripts
- Created download-vendor-files.sh script to fetch vendor libraries
- Added vendor files to .gitignore (they're downloaded during setup)
- Updated CSS imports to include vendor stylesheets
- Added vendor build step to assets.deploy mix task

Bundled libraries:
- Leaflet 1.9.4 (mapping library)
- Leaflet.heat 0.2.0 (heatmap plugin)
- Leaflet.markercluster 1.5.3 (marker clustering)
- OverlappingMarkerSpiderfier 0.2.6 (overlapping marker handling)
- Chart.js 4.5.0 (charting library)
- chartjs-adapter-date-fns 3.0.0 (date adapter for Chart.js)

All functionality tested and working correctly with local bundles.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-21 09:52:39 -05:00

117 lines
3.5 KiB
Elixir

# 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
# 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`.
config :aprsme, Aprsme.Mailer, adapter: Swoosh.Adapters.Local
# Configures the endpoint
config :aprsme, AprsmeWeb.Endpoint,
url: [host: "localhost"],
render_errors: [
formats: [html: AprsmeWeb.ErrorHTML, json: AprsmeWeb.ErrorJSON],
layout: false
],
pubsub_server: Aprsme.PubSub,
live_view: [signing_salt: "ees098qG"]
# Configure Gettext with supported locales from AprsmeWeb.Gettext module
config :aprsme, AprsmeWeb.Gettext,
locales: ~w(en es de fr),
default_locale: "en"
# Configure Oban for background jobs
config :aprsme, Oban,
repo: Aprsme.Repo,
plugins: [
{Oban.Plugins.Pruner, max_age: 60 * 60 * 24 * 7},
{Oban.Plugins.Cron,
crontab: [
{"0 */6 * * *", Aprsme.Workers.PacketCleanupWorker}
]}
],
queues: [default: 10, maintenance: 2]
config :aprsme,
ecto_repos: [Aprsme.Repo]
config :aprsme,
ecto_repos: [Aprsme.Repo],
aprs_is_server: System.get_env("APRS_SERVER", "dallas.aprs2.net"),
aprs_is_port: 10_152,
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_PASSCODE"),
auto_migrate: true,
env: config_env(),
# Packet retention period in days (default: 365 days = 1 year)
packet_retention_days: String.to_integer(System.get_env("PACKET_RETENTION_DAYS", "365")),
# GenStage packet processing configuration
# Optimized for PostgreSQL with work_mem=16MB and synchronous_commit=off
packet_pipeline: [
# Larger buffer since inserts are async
max_buffer_size: 5000,
# Smaller batch size to reduce memory pressure
batch_size: 100,
# 1 second timeout for smaller batches
batch_timeout: 1000,
# Adjust demand for smaller batches
max_demand: 300,
# Number of parallel consumers for better throughput
num_consumers: 3
]
config :error_tracker,
repo: Aprsme.Repo,
otp_app: :aprsme,
enabled: true
# Configure esbuild (the version is required)
config :esbuild,
version: "0.24.2",
default: [
args:
~w(js/app.js --bundle --target=es2017 --outdir=../priv/static/assets --external:/fonts/* --external:/images/* --external:chart.js/auto --define:global.L=window.L),
cd: Path.expand("../assets", __DIR__),
env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)}
],
vendor: [
args:
~w(js/vendor.js --bundle --target=es2017 --outdir=../priv/static/assets --minify),
cd: Path.expand("../assets", __DIR__),
env: %{"NODE_PATH" => Path.expand("../deps", __DIR__)}
]
config :gettext, :plural_forms, GettextPseudolocalize.Plural
# 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
# Configure tailwind (the version is required)
config :tailwind,
version: "4.0.9",
default: [
args: ~w(
--input=assets/css/app.css
--output=priv/static/assets/css/app.css
),
cd: Path.expand("..", __DIR__)
]
import_config "#{config_env()}.exs"