FROM node:20-alpine ENV TZ=Europe/Moscow WORKDIR /app COPY package.json package-lock.json* ./ RUN npm install --omit=dev COPY . . RUN mkdir -p uploads certs ARG GIT_COMMIT="" ARG GIT_COMMIT_DATE="" RUN node -e "require('fs').writeFileSync('public/version.json', JSON.stringify({ full: process.env.GIT_COMMIT || '', short: (process.env.GIT_COMMIT || '').slice(0, 7), date: process.env.GIT_COMMIT_DATE || '' }, null, 2))" RUN set -e; \ V="v$(cut -d. -f1-2 /etc/alpine-release)"; \ try_repo() { \ printf "%s/%s/main\n%s/%s/community\n" "$1" "$V" "$1" "$V" > /etc/apk/repositories; \ echo "Trying apk mirror: $1"; \ timeout 45 apk add --no-cache --timeout 20 openssl; \ }; \ if ! try_repo "https://dl-cdn.alpinelinux.org/alpine" && \ ! try_repo "https://mirrors.edge.kernel.org/alpine" && \ ! try_repo "http://mirrors.edge.kernel.org/alpine"; then \ echo "apk failed on all mirrors (HTTPS and HTTP). Diagnostics:"; \ echo "-- date:"; date; \ echo "-- resolv.conf:"; cat /etc/resolv.conf; \ echo "-- proxy env:"; env | grep -i proxy || echo none; \ wget -qO- --timeout=15 https://mirrors.edge.kernel.org/alpine/$V/main/x86_64/APKINDEX.tar.gz >/dev/null && echo "https probe: ok" || echo "https probe: fail"; \ wget -qO- --timeout=15 http://mirrors.edge.kernel.org/alpine/$V/main/x86_64/APKINDEX.tar.gz >/dev/null && echo "http probe: ok" || echo "http probe: fail"; \ exit 1; \ fi && \ openssl req -x509 -nodes -newkey rsa:2048 -days 3650 \ -keyout certs/key.pem -out certs/cert.pem \ -subj "/CN=whatido.local" -addext "subjectAltName=DNS:localhost,IP:127.0.0.1" EXPOSE 3003 3443 CMD ["node", "server.js"]