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>
74 lines
2.4 KiB
Elixir
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
|