diff --git a/.forgejo/workflows/deploy-tradein.yml b/.forgejo/workflows/deploy-tradein.yml index eafe2980..6ae7a76c 100644 --- a/.forgejo/workflows/deploy-tradein.yml +++ b/.forgejo/workflows/deploy-tradein.yml @@ -276,7 +276,13 @@ jobs: env: IMAGE_TAG: latest GHCR_PAT: ${{ secrets.GHCR_PAT }} - SCRAPER_CHANGED: ${{ needs.changes.outputs.scraper == 'true' || needs.changes.outputs.infra == 'true' || github.event_name == 'workflow_dispatch' }} + # Phase 0: generic infra edits (compose / workflow / deploy/**) must NOT + # recreate the scraper and SIGKILL a running multi-hour job. Only genuine + # scraper-code paths (the `scraper` paths-filter already covers + # app/services/scrapers/**, scrape_pipeline.py, scheduler.py, + # scheduler_main.py, app/tasks/**) — or a manual workflow_dispatch — + # should trigger a scraper recreate. (infra term intentionally dropped.) + SCRAPER_CHANGED: ${{ needs.changes.outputs.scraper == 'true' || github.event_name == 'workflow_dispatch' }} GITHUB_SHA: ${{ github.sha }} with: host: ${{ secrets.DEPLOY_HOST }} diff --git a/tradein-mvp/docker-compose.prod.yml b/tradein-mvp/docker-compose.prod.yml index a349595b..d3a3d12f 100644 --- a/tradein-mvp/docker-compose.prod.yml +++ b/tradein-mvp/docker-compose.prod.yml @@ -129,6 +129,11 @@ services: browser: condition: service_started restart: unless-stopped + # Phase 1: give the in-flight scrape unit (browser card ~15-27s) time to finish + # + checkpoint on SIGTERM before Docker SIGKILLs. Default grace is only 10s, which + # SIGKILLs a running card mid-flight. (Cooperative-drain handler lands in a later phase.) + stop_grace_period: 120s + stop_signal: SIGTERM networks: - tradein-net