mirror of
				https://github.com/kevinveenbirkenbach/computer-playbook.git
				synced 2025-11-04 12:18:17 +00:00 
			
		
		
		
	web-app-chess: build/runtime hardening & feature enablement
Build: use Yarn 4 via Corepack; immutable install with inline builds. Runtime: enable Corepack as user 'node', use project-local cache (/app/.yarn/cache), add curl; fix ownership. Entrypoint: generate keys in correct dir; run 'yarn install --immutable --inline-builds' before migrations; wait for Postgres. Config: enable matomo/css/desktop; notify 'docker compose build' on entrypoint changes. Docs: rename README title to 'Chess'. Ref: ChatGPT conversation (2025-09-03) — https://chatgpt.com/share/68b88126-7a6c-800f-acae-ae61ed577f46
This commit is contained in:
		@@ -1,4 +1,4 @@
 | 
				
			|||||||
# web-app-chess
 | 
					# Chess
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Description
 | 
					## Description
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,9 +12,9 @@ docker:
 | 
				
			|||||||
  volumes:
 | 
					  volumes:
 | 
				
			||||||
    data:           "chess_data"
 | 
					    data:           "chess_data"
 | 
				
			||||||
features:
 | 
					features:
 | 
				
			||||||
  matomo:           false
 | 
					  matomo:           true
 | 
				
			||||||
  css:              false
 | 
					  css:              true
 | 
				
			||||||
  desktop:          false
 | 
					  desktop:          true
 | 
				
			||||||
  central_database: true
 | 
					  central_database: true
 | 
				
			||||||
  logout:           false
 | 
					  logout:           false
 | 
				
			||||||
  oidc:             false
 | 
					  oidc:             false
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,9 +7,16 @@ APP_KEY_PUB="${APP_KEY_FILE}.pub"
 | 
				
			|||||||
# 1) Generate signing key pair if missing
 | 
					# 1) Generate signing key pair if missing
 | 
				
			||||||
if [[ ! -f "${APP_KEY_FILE}" || ! -f "${APP_KEY_PUB}" ]]; then
 | 
					if [[ ! -f "${APP_KEY_FILE}" || ! -f "${APP_KEY_PUB}" ]]; then
 | 
				
			||||||
  echo "[chess] generating RSA signing key pair at ${APP_KEY_FILE}"
 | 
					  echo "[chess] generating RSA signing key pair at ${APP_KEY_FILE}"
 | 
				
			||||||
  /app/tools/gen-signing-key.sh "${APP_KEY_FILE}"
 | 
					  key_dir="$(dirname "${APP_KEY_FILE}")"
 | 
				
			||||||
 | 
					  key_base="$(basename "${APP_KEY_FILE}")"
 | 
				
			||||||
 | 
					  ( cd "${key_dir}" && bash /app/tools/gen-signing-key.sh "${key_base}" )
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # 1.5) Ensure Yarn is ready and deps are installed (PnP, immutable)
 | 
				
			||||||
 | 
					echo "[chess] preparing yarn & installing deps (immutable)"
 | 
				
			||||||
 | 
					corepack enable || true
 | 
				
			||||||
 | 
					yarn install --immutable --inline-builds
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# 2) Wait for PostgreSQL if env is provided
 | 
					# 2) Wait for PostgreSQL if env is provided
 | 
				
			||||||
if [[ -n "${PGHOST:-}" ]]; then
 | 
					if [[ -n "${PGHOST:-}" ]]; then
 | 
				
			||||||
  echo "[chess] waiting for PostgreSQL at ${PGHOST}:${PGPORT}..."
 | 
					  echo "[chess] waiting for PostgreSQL at ${PGHOST}:${PGPORT}..."
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,5 +6,7 @@
 | 
				
			|||||||
  copy:
 | 
					  copy:
 | 
				
			||||||
    src:    "{{ CHESS_ENTRYPOINT_FILE }}"
 | 
					    src:    "{{ CHESS_ENTRYPOINT_FILE }}"
 | 
				
			||||||
    dest:   "{{ CHESS_ENTRYPOINT_ABS }}"
 | 
					    dest:   "{{ CHESS_ENTRYPOINT_ABS }}"
 | 
				
			||||||
 | 
					  notify: 
 | 
				
			||||||
 | 
					    - docker compose build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- include_tasks: utils/run_once.yml
 | 
					- include_tasks: utils/run_once.yml
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,34 +12,41 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
 | 
				
			|||||||
WORKDIR /src
 | 
					WORKDIR /src
 | 
				
			||||||
RUN git clone --depth 1 --branch "${CHESS_REPO_REF}" "${CHESS_REPO_URL}" ./
 | 
					RUN git clone --depth 1 --branch "${CHESS_REPO_REF}" "${CHESS_REPO_URL}" ./
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Yarn is preinstalled in Node images via corepack; enable it.
 | 
					# Use Yarn 4 for the build
 | 
				
			||||||
RUN corepack enable
 | 
					RUN corepack enable && corepack prepare yarn@4.9.1 --activate && yarn -v
 | 
				
			||||||
 | 
					RUN yarn install --immutable --inline-builds
 | 
				
			||||||
# Install deps and build TS
 | 
					RUN yarn build
 | 
				
			||||||
RUN yarn install --frozen-lockfile && yarn build
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Stage 2: runtime
 | 
					# Stage 2: runtime
 | 
				
			||||||
FROM node:{{ CHESS_VERSION }}
 | 
					FROM node:{{ CHESS_VERSION }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WORKDIR /app
 | 
					WORKDIR /app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Minimal runtime packages + dumb-init
 | 
					# Minimal runtime packages + dumb-init (+ curl for healthcheck)
 | 
				
			||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
 | 
					RUN apt-get update && apt-get install -y --no-install-recommends \
 | 
				
			||||||
    openssl dumb-init postgresql-client \
 | 
					    bash openssl dumb-init postgresql-client ca-certificates curl \
 | 
				
			||||||
 && rm -rf /var/lib/apt/lists/*
 | 
					 && rm -rf /var/lib/apt/lists/*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copy built app
 | 
					# Copy built app from builder
 | 
				
			||||||
COPY --from=build /src /app
 | 
					COPY --from=build /src /app
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Create data dir for signing keys & cache
 | 
					# Entrypoint script (root so chmod works in /usr/local/bin)
 | 
				
			||||||
RUN mkdir -p {{ CHESS_APP_DATA_DIR }} && chown -R node:node /app
 | 
					 | 
				
			||||||
VOLUME ["{{ CHESS_APP_DATA_DIR }}"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Entrypoint script
 | 
					 | 
				
			||||||
COPY {{ CHESS_ENTRYPOINT_REL }} {{ CHESS_ENTRYPOINT_INT }}
 | 
					COPY {{ CHESS_ENTRYPOINT_REL }} {{ CHESS_ENTRYPOINT_INT }}
 | 
				
			||||||
RUN chmod +x {{ CHESS_ENTRYPOINT_INT }}
 | 
					RUN chmod +x {{ CHESS_ENTRYPOINT_INT }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Create data dir for signing keys and Yarn cache; fix ownership
 | 
				
			||||||
 | 
					RUN mkdir -p {{ CHESS_APP_DATA_DIR }} /app/.yarn/cache /home/node \
 | 
				
			||||||
 | 
					 && chown -R node:node /app /home/node
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Use project-local yarn cache (avoid /root/.yarn)
 | 
				
			||||||
 | 
					ENV YARN_ENABLE_GLOBAL_CACHE=false
 | 
				
			||||||
 | 
					ENV YARN_CACHE_FOLDER=/app/.yarn/cache
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Switch to non-root and prep yarn 4
 | 
				
			||||||
USER node
 | 
					USER node
 | 
				
			||||||
 | 
					ENV HOME=/home/node
 | 
				
			||||||
 | 
					RUN corepack enable && corepack prepare yarn@4.9.1 --activate && yarn -v
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EXPOSE {{ container_port }}
 | 
					EXPOSE {{ container_port }}
 | 
				
			||||||
ENTRYPOINT ["dumb-init", "--"]
 | 
					ENTRYPOINT ["dumb-init", "--"]
 | 
				
			||||||
CMD ["{{ CHESS_ENTRYPOINT_INT }}"]
 | 
					CMD ["{{ CHESS_ENTRYPOINT_INT }}"]
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user