From 718a70f6e994081dd9df0e166f02c41a9763f4d6 Mon Sep 17 00:00:00 2001 From: lekss361 Date: Sat, 16 May 2026 22:03:45 +0300 Subject: [PATCH] fix(beat): use /tmp/celerybeat-schedule (workdir /app not writable by app user) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Beat был в restart-loop после force-recreate в PR #225 deploy: beat raised exception : error(13, 'Permission denied') shelve.py / dbm/__init__.py — попытка создать 'celerybeat-schedule' в CWD. Root cause - backend/Dockerfile runner stage: WORKDIR /app создаётся под root → owner root:root. - COPY --chown=app:app переносит файлы под app, но саму директорию /app не chown'ит. - USER app → app (uid 1000) не может создавать новые файлы в /app/ (нет write permission на parent dir). - До PR #225 beat container не пересоздавался force-recreate, файл schedule существовал в writable forme из inherited state. Force-recreate сбросил. Fix - --schedule=/tmp/celerybeat-schedule — /tmp всегда writable. - Schedule-файл хранит только last_run_at для periodic tasks; потеря на container restart OK, beat перестраивает из celery_app.conf.beat_schedule. Permanent fix (отдельный PR — runner Dockerfile) - Добавить `chown app:app /app` в runner stage после WORKDIR. Не делаю в этом PR — хотфикс минимальный, runner стейдж шарится с FastAPI image и worker, риск регрессии больше чем у однострочного --schedule override. --- docker-compose.prod.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 28ad5e36..316f6335 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -119,7 +119,12 @@ services: depends_on: redis: condition: service_healthy - command: ["celery", "-A", "app.workers.celery_app", "beat", "--loglevel=info"] + # --schedule=/tmp/...: default location `/app/celerybeat-schedule` падает + # с Permission denied — WORKDIR `/app` принадлежит root, `app` (uid 1000) + # не может создавать там файлы. `/tmp` всегда writable; schedule-файл + # хранит только last_run_at для periodic tasks — потеря на restart OK, + # beat перестроит из `celery_app.conf.beat_schedule` на старте. + command: ["celery", "-A", "app.workers.celery_app", "beat", "--loglevel=info", "--schedule=/tmp/celerybeat-schedule"] glitchtip-web: image: glitchtip/glitchtip:6.1.6