berrypod/lib/berrypod_web/endpoint.ex
jamey 9a27723b52
All checks were successful
deploy / deploy (push) Successful in 3m36s
persist image cache on fly volume across deploys
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>
2026-03-02 09:49:53 +00:00

74 lines
2.4 KiB
Elixir

defmodule BerrypodWeb.Endpoint do
use Phoenix.Endpoint, otp_app: :berrypod
# The session will be stored in the cookie and signed,
# this means its contents can be read but not tampered with.
# Set :encryption_salt if you would also like to encrypt it.
@session_options [
store: :cookie,
key: "_berrypod_key",
signing_salt: "JNwRcD7y",
same_site: "Lax",
max_age: 604_800
]
socket "/live", Phoenix.LiveView.Socket,
websocket: [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.
# gzip only in prod — avoids stale .gz files from mix assets.deploy
# shadowing freshly-built dev assets.
plug Plug.Static,
at: "/",
from: :berrypod,
gzip: Application.compile_env(:berrypod, :env) == :prod,
only: BerrypodWeb.static_paths(),
cache_control_for_etags:
if(Application.compile_env(:berrypod, :env) == :prod,
do: "public, max-age=31536000, immutable",
else: "public"
)
if Code.ensure_loaded?(Tidewave) do
plug Tidewave, allow_remote_access: true
end
# Code reloading can be explicitly enabled under the
# :code_reloader configuration of your endpoint.
if code_reloading? do
socket "/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket
plug Phoenix.LiveReloader
plug Phoenix.CodeReloader
plug Phoenix.Ecto.CheckRepoStatus, otp_app: :berrypod
end
plug Phoenix.LiveDashboard.RequestLogger,
param_key: "request_logger",
cookie_key: "request_logger"
plug Plug.RequestId
plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint]
plug Plug.Parsers,
parsers: [:urlencoded, :multipart, :json],
pass: ["*/*"],
body_reader: {BerrypodWeb.Plugs.CacheRawBody, :read_body, []},
json_decoder: Phoenix.json_library()
plug Plug.MethodOverride
plug Plug.Head
plug Plug.Session, @session_options
plug BerrypodWeb.Plugs.Redirects
plug BerrypodWeb.Plugs.BrokenUrlTracker, router: BerrypodWeb.Router
end