From b3097670c016b2ceab089a5ac6807e3135c7a02f Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Mon, 18 May 2026 17:53:30 +0200 Subject: [PATCH] infra: add persistent uploads volume and configure Caddy to serve static images - Add named Docker volume `uploads` mounted at /app/public/uploads in app container - Share same volume with Caddy at /srv/uploads for direct static file serving - Add Caddy `handle /uploads/*` block so images bypass Next.js (standalone mode does not serve runtime public files) - Create uploads directory with correct nextjs:nodejs ownership in Dockerfile - Add mkdir safeguard in entrypoint.sh --- Caddyfile | 4 ++++ app/Dockerfile | 1 + app/entrypoint.sh | 2 ++ docker-compose.yml | 4 ++++ 4 files changed, 11 insertions(+) diff --git a/Caddyfile b/Caddyfile index d3c9a1c..1921f60 100644 --- a/Caddyfile +++ b/Caddyfile @@ -1,3 +1,7 @@ localhost { + handle /uploads/* { + root * /srv + file_server + } reverse_proxy app:3000 } diff --git a/app/Dockerfile b/app/Dockerfile index fc949a0..912ea40 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -31,6 +31,7 @@ COPY --from=builder /app/scripts ./scripts COPY entrypoint.sh ./ RUN chmod +x entrypoint.sh RUN apk add --no-cache postgresql-client openssl +RUN mkdir -p /app/public/uploads && chown nextjs:nodejs /app/public/uploads USER nextjs EXPOSE 3000 ENTRYPOINT ["./entrypoint.sh"] diff --git a/app/entrypoint.sh b/app/entrypoint.sh index 8dbfdeb..b9a9163 100644 --- a/app/entrypoint.sh +++ b/app/entrypoint.sh @@ -1,6 +1,8 @@ #!/bin/sh set -e +mkdir -p /app/public/uploads + echo "Waiting for database..." until pg_isready -h db -p 5432 -U ecommerce; do sleep 2 diff --git a/docker-compose.yml b/docker-compose.yml index 652fc4d..72be136 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -27,6 +27,8 @@ services: DATABASE_URL: postgresql://ecommerce:ecommerce_password@db:5432/ecommerce expose: - "3000" + volumes: + - uploads:/app/public/uploads mailpit: image: axllent/mailpit:latest @@ -44,6 +46,7 @@ services: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config + - uploads:/srv/uploads depends_on: - app @@ -51,3 +54,4 @@ volumes: pgdata: caddy_data: caddy_config: + uploads: