diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1c4fe71 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,15 @@ +node_modules +dist +.git +.github +.husky +coverage +*.md +.env +.env.* +dump*.sql +*.log +npm-debug.log* +.DS_Store +.idea +.vscode diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 7fd0d89..ffea65d 100755 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -38,6 +38,8 @@ jobs: file: ./Dockerfile push: true tags: ${{ env.IMAGE_URL }} + cache-from: type=gha + cache-to: type=gha,mode=max - name: Install CapRover CLI run: npm install -g caprover diff --git a/Dockerfile b/Dockerfile index 5269dae..5661f64 100755 --- a/Dockerfile +++ b/Dockerfile @@ -1,39 +1,36 @@ -# Stage 1: Build Stage FROM node:22-alpine AS base -# Use Alpine mirror RUN sed -i 's|https://dl-cdn.alpinelinux.org/alpine|https://mirror.de.velop.ir/alpine|g' /etc/apk/repositories -# Configure npm registry mirror ENV NPM_CONFIG_REGISTRY=https://registry.npmmirror.com +ENV HUSKY=0 -FROM base AS deps -WORKDIR /temp-deps +FROM base AS prod-deps +WORKDIR /app COPY package*.json package-lock.json ./ -ENV NODE_ENV=development -RUN npm ci --include=dev --loglevel info - +RUN npm ci --omit=dev FROM base AS builder -WORKDIR /build -ENV NODE_ENV=development -COPY . ./ -COPY --from=deps /temp-deps/node_modules ./node_modules -RUN if [ -f package.json ] && grep -q '"build":' package.json; then npm run build; fi -RUN npm prune --omit=dev +WORKDIR /app +COPY package*.json package-lock.json ./ +RUN npm ci --include=dev +COPY . . +RUN npm run build FROM base AS runner RUN addgroup -S appgroup && adduser -S appuser -G appgroup WORKDIR /app -COPY . ./ -COPY --from=builder --chown=appuser:appgroup /build/ ./ +ENV NODE_ENV=production -RUN chown -R appuser:appgroup /app +COPY --from=prod-deps --chown=appuser:appgroup /app/node_modules ./node_modules +COPY --from=builder --chown=appuser:appgroup /app/dist ./dist +COPY --from=builder --chown=appuser:appgroup /app/package*.json ./ +COPY --from=builder --chown=appuser:appgroup /app/database ./database +COPY --from=builder --chown=appuser:appgroup /app/keys ./keys USER appuser -ENV NODE_ENV=production EXPOSE 4000 CMD ["npm", "start"]