Speed up deploys with BuildKit caches and incremental service rebuilds.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
eric 2026-08-29 01:36:33 -05:00
parent 402e2e950b
commit 871ea78bf8
6 changed files with 56 additions and 18 deletions

View File

@ -229,25 +229,26 @@ NEXT_PUBLIC_API_URL=http://localhost:8000/api/v1
**更新部署:**
本地一键增量部署(推荐):
```bash
python scripts/deploy_update.py
```
脚本会对比上次成功部署的 commit:仅前端改动只重建 `frontend`,仅后端改动只重建 `backend`,并启用 BuildKit npm/pip 缓存;健康检查改为短轮询。
服务器手动全量:
```bash
# SSH 登录服务器后(当前开发分支为 dev1)
cd /opt/nomadweb
git fetch origin && git checkout -B dev1 origin/dev1
export DOMAIN=nomadweb.nomadro.com
export DOMAIN=nomadweb.nomadro.com DOCKER_BUILDKIT=1
export NEXT_PUBLIC_API_URL=https://nomadweb.nomadro.com/api/v1
export NEXT_PUBLIC_SITE_URL=https://nomadweb.nomadro.com
export CORS_ORIGINS=https://nomadweb.nomadro.com
docker compose -f docker-compose.prod.yml up -d --build
```
或使用 Docker Compose 生产配置:
```bash
docker compose -f docker-compose.prod.yml up -d --build
cp deploy/caddy/nomadweb.caddy /etc/caddy/sites/nomadweb.caddy
systemctl reload caddy
```
### 本地 Docker Compose
```bash

14
backend/.dockerignore Normal file
View File

@ -0,0 +1,14 @@
__pycache__
*.py[cod]
*.egg-info
.venv
venv
.env*
!.env.example
.git
.gitignore
*.md
.pytest_cache
.mypy_cache
.ruff_cache
tests

View File

@ -1,7 +1,10 @@
# syntax=docker/dockerfile:1
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
RUN --mount=type=cache,target=/root/.cache/pip \
pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

View File

@ -29,6 +29,7 @@ services:
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
args:
NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-https://nomadweb.nomadro.com/api/v1}
NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL:-https://nomadweb.nomadro.com}

15
frontend/.dockerignore Normal file
View File

@ -0,0 +1,15 @@
node_modules
.next
.git
.gitignore
*.md
.env*
!.env.example
Dockerfile*
docker-compose*
coverage
.turbo
.vercel
npm-debug.log*
playwright-report
test-results

View File

@ -1,24 +1,28 @@
# syntax=docker/dockerfile:1
FROM node:20-alpine AS base
WORKDIR /app
ENV NEXT_TELEMETRY_DISABLED=1
FROM base AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --legacy-peer-deps || npm install --legacy-peer-deps
RUN --mount=type=cache,target=/root/.npm \
npm ci --legacy-peer-deps --prefer-offline
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
ARG NEXT_PUBLIC_API_URL=http://localhost:8000/api/v1
ARG NEXT_PUBLIC_SITE_URL=http://localhost:3000
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
ENV NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL \
NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL \
NODE_ENV=production
RUN npm run build
FROM base AS runner
WORKDIR /app
ENV NODE_ENV=production
RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 nextjs
RUN addgroup --system --gid 1001 nodejs \
&& adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static