FROM node:20-alpine # Install curl explicitly for the healthcheck (wget in alpine has had IPv6/connection-resolved quirks) RUN apk add --no-cache curl # Create app directory and data directory for the persistent volume WORKDIR /app RUN mkdir -p /data # Install dependencies (cached layer) COPY package.json ./ RUN npm install --omit=dev --no-audit --no-fund && npm cache clean --force # Copy the rest of the app COPY . . # Defaults — override these in Coolify's Environment section ENV PORT=3000 \ DATA_FILE=/data/data.json \ NODE_ENV=production EXPOSE 3000 # Healthcheck for Coolify / orchestrators # Use 127.0.0.1 (IPv4 explicit) to avoid IPv6 connection-refused races. # Generous start-period because Node + Alpine cold-start can take ~30-60s on first deploy. HEALTHCHECK --interval=20s --timeout=5s --start-period=60s --retries=8 \ CMD curl -fsS http://127.0.0.1:3000/api/health || exit 1 # Run as non-root for safety RUN addgroup -S app && adduser -S app -G app && chown -R app:app /app /data USER app CMD ["node", "server.js"]