Speed up deploys with BuildKit caches and incremental service rebuilds.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
402e2e950b
commit
871ea78bf8
21
README.md
21
README.md
@ -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
|
```bash
|
||||||
# SSH 登录服务器后(当前开发分支为 dev1)
|
|
||||||
cd /opt/nomadweb
|
cd /opt/nomadweb
|
||||||
git fetch origin && git checkout -B dev1 origin/dev1
|
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_API_URL=https://nomadweb.nomadro.com/api/v1
|
||||||
export NEXT_PUBLIC_SITE_URL=https://nomadweb.nomadro.com
|
export NEXT_PUBLIC_SITE_URL=https://nomadweb.nomadro.com
|
||||||
export CORS_ORIGINS=https://nomadweb.nomadro.com
|
export CORS_ORIGINS=https://nomadweb.nomadro.com
|
||||||
docker compose -f docker-compose.prod.yml up -d --build
|
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
|
### 本地 Docker Compose
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
14
backend/.dockerignore
Normal file
14
backend/.dockerignore
Normal 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
|
||||||
@ -1,7 +1,10 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
FROM python:3.12-slim
|
FROM python:3.12-slim
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY requirements.txt .
|
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 . .
|
COPY . .
|
||||||
EXPOSE 8000
|
EXPOSE 8000
|
||||||
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
||||||
|
|||||||
@ -29,6 +29,7 @@ services:
|
|||||||
frontend:
|
frontend:
|
||||||
build:
|
build:
|
||||||
context: ./frontend
|
context: ./frontend
|
||||||
|
dockerfile: Dockerfile
|
||||||
args:
|
args:
|
||||||
NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-https://nomadweb.nomadro.com/api/v1}
|
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}
|
NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL:-https://nomadweb.nomadro.com}
|
||||||
|
|||||||
15
frontend/.dockerignore
Normal file
15
frontend/.dockerignore
Normal 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
|
||||||
@ -1,24 +1,28 @@
|
|||||||
|
# syntax=docker/dockerfile:1
|
||||||
|
|
||||||
FROM node:20-alpine AS base
|
FROM node:20-alpine AS base
|
||||||
|
WORKDIR /app
|
||||||
|
ENV NEXT_TELEMETRY_DISABLED=1
|
||||||
|
|
||||||
FROM base AS deps
|
FROM base AS deps
|
||||||
WORKDIR /app
|
|
||||||
COPY package.json package-lock.json ./
|
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
|
FROM base AS builder
|
||||||
WORKDIR /app
|
|
||||||
COPY --from=deps /app/node_modules ./node_modules
|
COPY --from=deps /app/node_modules ./node_modules
|
||||||
COPY . .
|
COPY . .
|
||||||
ARG NEXT_PUBLIC_API_URL=http://localhost:8000/api/v1
|
ARG NEXT_PUBLIC_API_URL=http://localhost:8000/api/v1
|
||||||
ARG NEXT_PUBLIC_SITE_URL=http://localhost:3000
|
ARG NEXT_PUBLIC_SITE_URL=http://localhost:3000
|
||||||
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL
|
ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL \
|
||||||
ENV NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL
|
NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL \
|
||||||
|
NODE_ENV=production
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
FROM base AS runner
|
FROM base AS runner
|
||||||
WORKDIR /app
|
|
||||||
ENV NODE_ENV=production
|
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 /app/public ./public
|
||||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
||||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user