mirror of
https://github.com/screentinker/screentinker.git
synced 2026-06-17 03:32:32 -06:00
The /openapi.yaml route does res.sendFile(../docs/openapi.yaml) -> /app/docs/openapi.yaml in the container, but the Dockerfile copied server/, frontend/, VERSION, scripts/ and never docs/, so the spec 404'd in every deployed build (Redoc's /docs page loaded but couldn't fetch the spec). Served fine from a dev checkout only because the repo has docs/ on disk. Verified in a built image: /app/docs/openapi.yaml present, GET /openapi.yaml -> 200 text/yaml. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
41 lines
1.7 KiB
Docker
41 lines
1.7 KiB
Docker
# ScreenTinker server image: serves the dashboard, the web player, and the
|
|
# device API. All mutable state (db, uploads, jwt secret) lives under /data so it
|
|
# survives container restarts - mount a volume there. A built ScreenTinker.apk
|
|
# can be mounted at /data/ScreenTinker.apk to enable OTA APK downloads.
|
|
#
|
|
# No TLS in the image: it listens on plain HTTP :3001. Front it with a
|
|
# TLS-terminating reverse proxy / Cloudflare in production.
|
|
|
|
# --- builder: install production deps (native: better-sqlite3, sharp) ---
|
|
FROM node:20-slim AS builder
|
|
WORKDIR /app/server
|
|
# build toolchain in case a native prebuild is missing for the target arch
|
|
RUN apt-get update \
|
|
&& apt-get install -y --no-install-recommends python3 build-essential \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
COPY server/package.json server/package-lock.json ./
|
|
RUN npm ci --omit=dev
|
|
|
|
# --- runtime ---
|
|
FROM node:20-slim
|
|
ENV NODE_ENV=production
|
|
# Relocate all state onto the volume (config.js reads DATA_DIR; unset would use
|
|
# the in-repo paths, which we do not want in a container).
|
|
ENV DATA_DIR=/data
|
|
WORKDIR /app/server
|
|
# App source (node_modules/test/db/uploads/certs are excluded via .dockerignore),
|
|
# then the built deps, the frontend the server serves, and the VERSION file it
|
|
# reads as ../VERSION.
|
|
COPY server/ /app/server/
|
|
COPY --from=builder /app/server/node_modules /app/server/node_modules
|
|
COPY frontend/ /app/frontend/
|
|
COPY VERSION /app/VERSION
|
|
# the /openapi.yaml route serves ../docs/openapi.yaml (the spec Redoc on /docs fetches);
|
|
# without this it 404s in the image even though it serves fine from a dev checkout.
|
|
COPY docs/openapi.yaml /app/docs/openapi.yaml
|
|
# database.js requires scripts/migrate-multitenancy at boot
|
|
COPY scripts/ /app/scripts/
|
|
VOLUME ["/data"]
|
|
EXPOSE 3001
|
|
CMD ["node", "server.js"]
|