diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..24c9cfe --- /dev/null +++ b/.dockerignore @@ -0,0 +1,21 @@ +# Build output / зависимости — пересобираются внутри контейнера +node_modules +.next +.turbo +dist + +# VCS / IDE +.git +.gitea +.idea +.vscode + +# Env / секреты — на сервере есть отдельный tablet.env +.env* + +# Документация / временные +*.md +HANDOFF.md +.DS_Store +*.log +tsconfig.tsbuildinfo diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 8121007..7cfb4e6 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -9,11 +9,17 @@ jobs: runs-on: self-hosted steps: - name: Build and deploy + env: + DOCKER_BUILDKIT: "1" run: | apk add --no-cache docker-cli git cd /opt/digital-home/smart-home-tablet git config --global --add safe.directory /opt/digital-home/smart-home-tablet git pull origin main + # BuildKit включён через DOCKER_BUILDKIT=1 — Dockerfile использует + # cache mounts для /root/.npm и .next/cache, что ускоряет повторные + # сборки в 3-5 раз (npm install не качает заново, next build + # пользует incremental TS-cache). docker build -t smart-home-tablet:latest . docker stop tablet-yfh53kixpwkjlo4zibglx4n2 || true docker rm tablet-yfh53kixpwkjlo4zibglx4n2 || true diff --git a/Dockerfile b/Dockerfile index 96f0853..7db91ee 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,20 @@ +# syntax=docker/dockerfile:1.7 FROM node:20-alpine AS deps WORKDIR /app COPY package.json package-lock.json* ./ -RUN npm ci --prefer-offline || npm install +# BuildKit cache mount → npm cache переживает между билдами, install в 5-10x быстрее +RUN --mount=type=cache,target=/root/.npm,sharing=locked \ + npm ci --prefer-offline --no-audit --no-fund FROM node:20-alpine AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . ENV NEXT_TELEMETRY_DISABLED=1 -RUN npm run build +ENV NODE_OPTIONS="--max-old-space-size=4096" +# BuildKit cache mount → .next/cache (incremental TS/swc) переживает между билдами +RUN --mount=type=cache,target=/app/.next/cache,sharing=locked \ + npm run build FROM node:20-alpine AS runner WORKDIR /app