From d3786c97689779b56a634ef33c43a5488f34380e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20Luis=20Monta=C3=B1es?= Date: Fri, 1 May 2026 18:58:55 +0200 Subject: [PATCH] deploy: add Dockerfile + nginx config for static hosting The web/ directory is fully self-contained (index.html + worklet.js, all JS deps pulled from esm.sh via the importmap). Package it as a tiny nginx:alpine image so Coolify can build + serve it behind Caddy. - Dockerfile: nginx:1.27-alpine, copies web/ to the document root, healthcheck. - nginx.conf: serves /, no-cache for index.html and worklet.js (so engine changes land immediately after a redeploy), short cache for everything else, gzip on text payloads, JS MIME for AudioWorklet. - .dockerignore: keep the image small (excludes Python sources, docs, references, sandbox is included since it's served from /sandbox/). --- .dockerignore | 16 ++++++++++++++++ Dockerfile | 14 ++++++++++++++ nginx.conf | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 nginx.conf diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..6a5fff6 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,16 @@ +.git +.gitignore +__pycache__/ +*.pyc +*.pyo +.venv/ +venv/ +.idea/ +.vscode/ +*.swp +*.tmp +referencias/ +docs/ +code_sinth/ +run.py +*.md diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2e3ef0f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +# code-sinth — static site served by nginx +# The web/ folder is fully self-contained (index.html + worklet.js). +# All JS dependencies are loaded from esm.sh via the importmap. +FROM nginx:1.27-alpine + +# Replace the default nginx site config with one that serves /web/ at /, +# applies long cache for the worklet, and sets the right MIME types. +RUN rm /etc/nginx/conf.d/default.conf +COPY nginx.conf /etc/nginx/conf.d/default.conf +COPY web/ /usr/share/nginx/html/ + +EXPOSE 80 +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD wget -qO- http://localhost/ >/dev/null || exit 1 diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..0d7bf85 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,39 @@ +server { + listen 80; + server_name _; + root /usr/share/nginx/html; + index index.html; + + # AudioWorkletProcessor needs the worklet served as a real JS module. + types { + application/javascript js; + text/html html; + text/css css; + image/svg+xml svg; + } + + # Static index — short cache so updates land quickly after a redeploy. + location = / { + try_files /index.html =404; + add_header Cache-Control "no-cache, must-revalidate"; + } + location = /index.html { + add_header Cache-Control "no-cache, must-revalidate"; + } + + # Worklet: revalidate on every load (it changes whenever we touch the engine). + location = /worklet.js { + add_header Cache-Control "no-cache, must-revalidate"; + } + + # Everything else (sandbox/, future static assets) gets a moderate cache. + location / { + try_files $uri $uri/ =404; + add_header Cache-Control "public, max-age=300"; + } + + # Gzip the text payloads. + gzip on; + gzip_types text/plain text/css application/javascript application/json image/svg+xml; + gzip_min_length 256; +}