From ae511f1086c36418dcd1665ef463ac4a19eb6608 Mon Sep 17 00:00:00 2001 From: Vadym Samoilenko Date: Fri, 20 Mar 2026 17:49:48 +0000 Subject: [PATCH] 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 --- backend/Dockerfile | 2 + update.sh | 96 ++++++++++++++++++++-------------------------- 2 files changed, 44 insertions(+), 54 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 4a73b6e..13d9bc2 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -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 diff --git a/update.sh b/update.sh index 6438a5f..e132e8d 100755 --- a/update.sh +++ b/update.sh @@ -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."