Static asset magnification for the Website service (#20)

This PR contains the work done for build-time optimization of the static assets served by the Website service. The production Docker image now ships minified JS/CSS and losslessly recompressed images, while the sources in the repository stay readable and un-minified.

Reviewed-on: rock-n-code/loud-amsterdam#20
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
This commit is contained in:
2026-07-19 03:02:17 +00:00
committed by javier
parent 79ecf311f4
commit 698cd60521
3 changed files with 55 additions and 2 deletions
+30 -1
View File
@@ -1,3 +1,27 @@
# ================================
# Asset image
# ================================
FROM node:22-alpine AS assets
# Install the minifiers in their own layer, so they are cached across asset changes
RUN apk add --no-cache oxipng \
&& npm install --global esbuild svgo
# Copy the static files and minify the JS/CSS/SVG sources and losslessly recompress
# the PNG images in place, keeping their names so the URL paths derived from the
# StaticFile enumeration stay unchanged.
WORKDIR /static
COPY ./Services/Website/Resources/Static .
RUN esbuild --minify --allow-overwrite --outdir=css css/*.css \
&& esbuild --minify --allow-overwrite --outdir=js js/*.js \
&& oxipng --opt max --strip safe *.png \
&& svgo icon.svg
# Export stage: `docker build --target assets-export --output <dir>` writes the
# minified static files to <dir> for local inspection.
FROM scratch AS assets-export
COPY --from=assets /static /
# ================================
# Build image
# ================================
@@ -45,8 +69,13 @@ RUN cp "/usr/libexec/swift/linux/swift-backtrace-static" ./
RUN find -L "$(swift build --package-path /build/Services/Website -c release --show-bin-path)/" -regex '.*\.resources$' -exec cp -Ra {} ./ \;
# Copy the static files directory (served by FileMiddleware) if it exists
RUN [ -d /build/Services/Website/Resources ] && mv /build/Services/Website/Resources ./Resources || true
# Overwrite the static files with the minified copies from the assets stage
COPY --from=assets /static ./Resources/Static
# Ensure that by default, neither the directory nor any of its contents are writable.
RUN [ -d /build/Services/Website/Resources ] && { mv /build/Services/Website/Resources ./Resources && chmod -R a-w ./Resources; } || true
RUN chmod -R a-w ./Resources
# ================================
# Run image