persist image cache on fly volume across deploys
All checks were successful
deploy / deploy (push) Successful in 3m36s
All checks were successful
deploy / deploy (push) Successful in 3m36s
Image variants were written to the ephemeral release directory and wiped on every deploy, causing 500 errors with 50s timeouts as browsers waited for images that could never be served. - Point image_cache_dir at /data/image_cache in prod - Add Plug.Static to serve from the persistent volume - Exclude /image_cache/ from broken URL tracking Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
e787f1f663
commit
9a27723b52
@ -19,5 +19,8 @@ config :logger, level: :info
|
|||||||
# Structured JSON logs for production (machine-parseable by fly logs, journalctl, Loki, etc.)
|
# Structured JSON logs for production (machine-parseable by fly logs, journalctl, Loki, etc.)
|
||||||
config :logger, :default_handler, formatter: {LoggerJSON.Formatters.Basic, []}
|
config :logger, :default_handler, formatter: {LoggerJSON.Formatters.Basic, []}
|
||||||
|
|
||||||
|
# Persistent image cache on the Fly volume (survives deploys)
|
||||||
|
config :berrypod, :image_cache_dir, "/data/image_cache"
|
||||||
|
|
||||||
# Runtime production configuration, including reading
|
# Runtime production configuration, including reading
|
||||||
# of environment variables, is done on config/runtime.exs.
|
# of environment variables, is done on config/runtime.exs.
|
||||||
|
|||||||
@ -16,6 +16,15 @@ defmodule BerrypodWeb.Endpoint do
|
|||||||
websocket: [connect_info: [session: @session_options]],
|
websocket: [connect_info: [session: @session_options]],
|
||||||
longpoll: [connect_info: [session: @session_options]]
|
longpoll: [connect_info: [session: @session_options]]
|
||||||
|
|
||||||
|
# In prod, image variants live on the persistent volume (/data/image_cache)
|
||||||
|
# rather than inside the ephemeral release directory.
|
||||||
|
if image_cache_dir = Application.compile_env(:berrypod, :image_cache_dir) do
|
||||||
|
plug Plug.Static,
|
||||||
|
at: "/image_cache",
|
||||||
|
from: image_cache_dir,
|
||||||
|
cache_control_for_etags: "public, max-age=31536000, immutable"
|
||||||
|
end
|
||||||
|
|
||||||
# Serve at "/" the static files from "priv/static" directory.
|
# Serve at "/" the static files from "priv/static" directory.
|
||||||
# gzip only in prod — avoids stale .gz files from mix assets.deploy
|
# gzip only in prod — avoids stale .gz files from mix assets.deploy
|
||||||
# shadowing freshly-built dev assets.
|
# shadowing freshly-built dev assets.
|
||||||
|
|||||||
@ -34,6 +34,7 @@ defmodule BerrypodWeb.Plugs.BrokenUrlTracker do
|
|||||||
defp static_path?(path) do
|
defp static_path?(path) do
|
||||||
String.starts_with?(path, "/assets/") or
|
String.starts_with?(path, "/assets/") or
|
||||||
String.starts_with?(path, "/images/") or
|
String.starts_with?(path, "/images/") or
|
||||||
|
String.starts_with?(path, "/image_cache/") or
|
||||||
String.starts_with?(path, "/favicon")
|
String.starts_with?(path, "/favicon")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user