From 642603ffee930bc7261597905c72c243154febe9 Mon Sep 17 00:00:00 2001 From: narawat Date: Thu, 23 Oct 2025 19:08:19 +0700 Subject: [PATCH] update --- docker-compose.yml | 18 ++++++++++++++++++ web/Caddyfile | 8 ++++++++ web/Dockerfile | 26 ++++++++++++++++++++++++++ web/svelte.config.js | 12 +++++++++--- 4 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 docker-compose.yml create mode 100644 web/Caddyfile create mode 100644 web/Dockerfile diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..82309c0 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,18 @@ +version: "3.8" +services: + web: + build: + context: ./web + dockerfile: Dockerfile + image: my-svelte-web:latest + container_name: web_static + ports: + - "10210:80" + volumes: + - caddy_data:/data + - caddy_config:/config + restart: unless-stopped + +volumes: + caddy_data: + caddy_config: diff --git a/web/Caddyfile b/web/Caddyfile new file mode 100644 index 0000000..63045bd --- /dev/null +++ b/web/Caddyfile @@ -0,0 +1,8 @@ +:80 { + root * /srv/web_build + try_files {path} /200.html + file_server + + @health path /health + respond @health "ok" 200 +} diff --git a/web/Dockerfile b/web/Dockerfile new file mode 100644 index 0000000..802a43d --- /dev/null +++ b/web/Dockerfile @@ -0,0 +1,26 @@ +# Builder: build the SvelteKit static site (adapter-static -> /app/build) +FROM node:20-alpine AS builder +WORKDIR /app + +# cache package install +COPY package.json package-lock.json* ./ +RUN npm ci --production=false + +# copy source and build +COPY . . +RUN npm run build + +# Final: lightweight Caddy image to serve the built static files +FROM caddy:2-alpine AS runtime +# copy built static output +COPY --from=builder /app/build /srv/web_build +# copy Caddyfile from build context (provide Caddyfile at ./web/Caddyfile) +COPY Caddyfile /etc/caddy/Caddyfile +# # ensure permissions (caddy runs as non-root) +# RUN chown -R caddy:caddy /srv/web_build /etc/caddy/Caddyfile +CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile"] + +# expose standard HTTP/HTTPS (optional in compose) +EXPOSE 80 + +# container runs Caddy by default (CMD provided by base image) diff --git a/web/svelte.config.js b/web/svelte.config.js index 9338c8c..1062b49 100644 --- a/web/svelte.config.js +++ b/web/svelte.config.js @@ -1,6 +1,12 @@ import adapter from '@sveltejs/adapter-static'; - /** @type {import('@sveltejs/kit').Config} */ -const config = { kit: { adapter: adapter() } }; - +const config = { + kit: { + adapter: adapter({ + pages: 'build', + assets: 'build', + fallback: '200.html' // SPA fallback for all unknown paths + }) + } +}; export default config;