From 9bbde8b7b52327fd46f5429a8fc023bc7f9c8413 Mon Sep 17 00:00:00 2001 From: gunshiz Date: Sun, 2 Aug 2026 18:09:00 +0700 Subject: [PATCH] fix(upload): prevent overlapping cron runs --- Dockerfile.scheduler | 3 +++ scripts/process-scheduled-video-uploads.sh | 18 ++++++++++++++++++ scripts/video-upload-crontab | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 scripts/process-scheduled-video-uploads.sh diff --git a/Dockerfile.scheduler b/Dockerfile.scheduler index 2ffed5e..c62f487 100644 --- a/Dockerfile.scheduler +++ b/Dockerfile.scheduler @@ -1,5 +1,8 @@ FROM nginx:alpine COPY scripts/video-upload-crontab /etc/crontabs/root +COPY scripts/process-scheduled-video-uploads.sh /usr/local/bin/process-scheduled-video-uploads + +RUN chmod 0755 /usr/local/bin/process-scheduled-video-uploads ENTRYPOINT ["crond", "-f", "-l", "2", "-L", "/dev/stdout"] diff --git a/scripts/process-scheduled-video-uploads.sh b/scripts/process-scheduled-video-uploads.sh new file mode 100644 index 0000000..32eac4d --- /dev/null +++ b/scripts/process-scheduled-video-uploads.sh @@ -0,0 +1,18 @@ +#!/bin/sh +set -eu + +upload_cron_lock=/tmp/erika-video-upload-cron.lock + +if ! mkdir "$upload_cron_lock" 2>/dev/null; then + echo "Previous scheduled video upload run is still active; skipping this minute." + exit 0 +fi + +trap 'rmdir "$upload_cron_lock"' EXIT INT TERM + +wget -q -O /dev/null \ + --header="Authorization: Bearer ${CRON_SECRET}" \ + http://app:3000/api/cron/video-uploads || { + echo "Scheduled video upload processing failed." >&2 + exit 1 + } diff --git a/scripts/video-upload-crontab b/scripts/video-upload-crontab index 184fa0f..a07a4f0 100644 --- a/scripts/video-upload-crontab +++ b/scripts/video-upload-crontab @@ -1 +1 @@ -* * * * * wget -q -O /dev/null --header="Authorization: Bearer ${CRON_SECRET}" http://app:3000/api/cron/video-uploads || echo "Scheduled video upload processing failed." >&2 +* * * * * /usr/local/bin/process-scheduled-video-uploads