Beat был в restart-loop после force-recreate в PR #225 deploy:
beat raised exception <class '_gdbm.error'>: 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.