Speed up updates: hot-copy backend code, suppress GPU warnings

- update.sh: docker cp backend into running container + restart (no rebuild)
  Backend updates now take ~5s instead of 2min
- backend/Dockerfile: ORT_DISABLE_GPU=1 suppresses ONNX GPU discovery errors
  on CPU-only servers

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Vadym Samoilenko 2026-03-20 17:49:48 +00:00
parent 598f7343c3
commit ae511f1086
2 changed files with 44 additions and 54 deletions

View file

@ -23,6 +23,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
ENV PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium
ENV APP_DATA_DIRECTORY=/app_data
ENV TEMP_DIRECTORY=/tmp/deckforge
ENV ORT_DISABLE_GPU=1
ENV ONNXRUNTIME_DEVICE=CPU
WORKDIR /app

View file

@ -1,6 +1,6 @@
#!/usr/bin/env bash
# DeckForge Fast Update Script
# Use this for code-only updates (no new dependencies).
# For code-only updates: copies files into running containers, no Docker rebuild.
# Run ./deploy.sh only when Dockerfile or dependencies change.
set -euo pipefail
@ -29,72 +29,60 @@ fi
if echo "$CHANGED" | grep -q "package.json\|package-lock.json\|frontend/Dockerfile"; then
FRONTEND_DEPS_CHANGED=true
fi
if echo "$CHANGED" | grep -q "^frontend/"; then
if echo "$CHANGED" | grep -qE "^frontend/"; then
FRONTEND_CHANGED=true
fi
if echo "$CHANGED" | grep -q "^backend/"; then
if echo "$CHANGED" | grep -qE "^backend/"; then
BACKEND_CHANGED=true
fi
export API_PORT WEB_PORT PG_PORT REDIS_PORT
export API_PORT WEB_PORT
env_val() { local key=$1 def=$2; grep -E "^${key}=" .env 2>/dev/null | cut -d= -f2 | tr -d '"' | head -1 | grep -v '^$' || echo "$def"; }
API_PORT=${API_PORT:-$(env_val API_PORT 8000)}
WEB_PORT=${WEB_PORT:-$(env_val WEB_PORT 3000)}
# ── Step 2: Rebuild only what's needed ───────────────────────────────────────
REBUILD_API=false
REBUILD_WEB=false
# ── Backend: hot-copy files if no dep changes (avoids 2min Docker rebuild) ───
if $BACKEND_DEPS_CHANGED; then
warn "Backend dependencies changed — full rebuild required. Run ./deploy.sh instead."
REBUILD_API=true
elif $BACKEND_CHANGED; then
REBUILD_API=true
warn "Backend dependencies changed — run ./deploy.sh for a full rebuild."
warn "Continuing with hot-copy anyway (new deps won't be available until full rebuild)."
fi
if $FRONTEND_DEPS_CHANGED; then
warn "Frontend dependencies changed — full rebuild required. Run ./deploy.sh instead."
REBUILD_WEB=true
elif $FRONTEND_CHANGED; then
REBUILD_WEB=true
fi
if ! $REBUILD_API && ! $REBUILD_WEB; then
info "No relevant changes detected. Restarting services anyway..."
docker compose -f docker-compose.yml -f docker-compose.prod.yml restart api worker web
info "Done."
exit 0
fi
# ── Step 3: Build changed services ───────────────────────────────────────────
SERVICES_TO_BUILD=""
SERVICES_TO_UP="api worker"
if $REBUILD_API; then
info "Rebuilding api/worker..."
SERVICES_TO_BUILD="$SERVICES_TO_BUILD api worker"
fi
if $REBUILD_WEB; then
info "Rebuilding web..."
SERVICES_TO_BUILD="$SERVICES_TO_BUILD web"
SERVICES_TO_UP="$SERVICES_TO_UP web"
fi
DOCKER_BUILDKIT=1 docker compose -f docker-compose.yml -f docker-compose.prod.yml \
build $SERVICES_TO_BUILD
# ── Step 4: Restart updated services ─────────────────────────────────────────
info "Restarting services: $SERVICES_TO_UP"
docker compose -f docker-compose.yml -f docker-compose.prod.yml \
up -d $SERVICES_TO_UP
# ── Step 5: Run migrations if backend changed ─────────────────────────────────
if $BACKEND_CHANGED; then
info "Running migrations..."
sleep 5
docker compose -f docker-compose.yml -f docker-compose.prod.yml \
exec -T api alembic upgrade head || warn "Migration failed or already up to date"
API_CONTAINER=$(docker compose -f docker-compose.yml -f docker-compose.prod.yml ps -q api 2>/dev/null | head -1)
WORKER_CONTAINER=$(docker compose -f docker-compose.yml -f docker-compose.prod.yml ps -q worker 2>/dev/null | head -1)
if [[ -n "$API_CONTAINER" ]]; then
info "Hot-copying backend code into containers..."
docker cp backend/. "$API_CONTAINER":/app/
[[ -n "$WORKER_CONTAINER" ]] && docker cp backend/. "$WORKER_CONTAINER":/app/
info "Restarting api + worker..."
docker compose -f docker-compose.yml -f docker-compose.prod.yml restart api worker
info "Running migrations..."
sleep 5
docker compose -f docker-compose.yml -f docker-compose.prod.yml \
exec -T api alembic upgrade head || warn "Migration already up to date"
else
warn "api container not running — falling back to docker build"
DOCKER_BUILDKIT=1 docker compose -f docker-compose.yml -f docker-compose.prod.yml build api worker
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d api worker
fi
fi
# ── Frontend: still needs build (Next.js compilation required) ───────────────
if $FRONTEND_DEPS_CHANGED; then
warn "Frontend dependencies changed — run ./deploy.sh for a full rebuild."
fi
if $FRONTEND_CHANGED; then
info "Rebuilding frontend (Next.js build required)..."
DOCKER_BUILDKIT=1 docker compose -f docker-compose.yml -f docker-compose.prod.yml build web
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d web
fi
if ! $BACKEND_CHANGED && ! $FRONTEND_CHANGED; then
info "No relevant changes. Services are up to date."
fi
info "Update complete."