# Dockerfile # Stage 1: Build the Quartz site FROM node:lts-slim AS builder # Create a non-root user to own files and run npm commands USER node WORKDIR /home/node/app # Copy the locally cloned Quartz source code from the build context # This 'quartz_framework_source' dir is expected to be in the build context root, # prepared by the update_quartz_docker.sh script. COPY --chown=node:node quartz/ . # Now /home/node/app contains the full cloned Quartz repo structure, # including its package.json, its quartz/ directory with bootstrap-cli.mjs, etc. # Install dependencies based on the cloned Quartz source's package.json RUN npm ci # This will also make ./node_modules/.bin/quartz available, pointing to ./quartz/bootstrap-cli.mjs # Now, copy your specific custom configuration files and the prepared content # from the root of your deployment repo (the build context's root) # into the current WORKDIR (/home/node/app), overwriting any placeholders # from the cloned Quartz source if they share the same names/paths. COPY --chown=node:node quartz.config.ts ./quartz.config.ts COPY --chown=node:node quartz.layout.ts ./quartz.layout.ts # If you have other custom files/dirs at the root of your deployment repo that Quartz needs: # e.g., custom assets not part of Obsidian content, or custom components to overlay # COPY --chown=node:node assets/ ./assets/ # COPY --chown=node:node components/ ./components/ # Copy the Obsidian content prepared by the host script into ./content COPY --chown=node:node content/ ./content/ # Now run the build command. # `npx quartz build` should work because: # 1. `npm ci` (based on the framework's package.json) made node_modules/.bin/quartz available, # pointing to the local ./quartz/bootstrap-cli.mjs. # 2. It will use your custom quartz.config.ts, quartz.layout.ts, and ./content. RUN npx quartz build # Output is expected in /home/node/app/public # ---- START DEBUG (Optional) ---- # USER root # If you need root to ls everything for debug # RUN echo "Listing contents of /home/node/app after all copies:" && ls -lA /home/node/app # RUN echo "Listing contents of /home/node/app/content:" && ls -lA /home/node/app/content # RUN echo "Listing contents of /home/node/app/public after build:" && ls -lA /home/node/app/public # RUN echo "Checking for /home/node/app/public/index.html:" && \ # if [ -f /home/node/app/public/index.html ]; then \ # echo "index.html found. First few lines:"; \ # head -n 10 /home/node/app/public/index.html; \ # else \ # echo "index.html NOT FOUND in /home/node/app/public!"; \ # fi # USER node # Switch back if you changed it # ---- END DEBUG ---- # Stage 2: Serve the static files with NGINX FROM nginx:alpine RUN rm /etc/nginx/conf.d/default.conf COPY custom_nginx.conf /etc/nginx/conf.d/default.conf # Adjust source path for public files from the builder stage COPY --from=builder /home/node/app/public /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]