From 6d721dba79da27cd56dcb5a95f5660eec28a96e4 Mon Sep 17 00:00:00 2001 From: din9xtr Date: Sun, 8 Feb 2026 00:15:35 +0700 Subject: [PATCH] feat: add cron scheduling and update services - Added go-crond library to Dockerfile for task scheduling - Created schedule service in compose.yaml with go-crond - Added cron configuration file: docker/cron/laravel - Updated README.md - Improved service configurations with health checks - Switched to base frankenphp image --- README.md | 6 ++++-- compose.yaml | 36 +++++++++++++++++++++++++++--------- docker/Dockerfile | 7 +++++++ docker/cron/laravel | 1 + 4 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 docker/cron/laravel diff --git a/README.md b/README.md index a2ed88f..f5bbf7e 100644 --- a/README.md +++ b/README.md @@ -37,9 +37,11 @@ Route::middleware(['auth:sanctum'])->group(function () { ### Комментарий: -Не стал ставить редис и настраивать крон корректно, тк тестовое задание +Маршруты явно прописал, для наглядности -Запустил отдельными сервисами, проверил +Настроил крон, воспользовался библеотекой https://github.com/webdevops/go-crond, показалось удобной + +Не стал ставить редис для очередей, тк тестовое задание, в продакшене использовал https://laravel.com/docs/12.x/horizon Жестко не стал базу ограничивать, сделал просто каст через php enum (статус таски) diff --git a/compose.yaml b/compose.yaml index 10dd27f..81b92aa 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,5 +1,6 @@ services: app: + image: laravel_frankenphp build: context: . dockerfile: docker/Dockerfile @@ -69,28 +70,45 @@ services: networks: - laravel_network queue: - build: - context: . - dockerfile: docker/Dockerfile + image: laravel_frankenphp container_name: laravel_queue working_dir: /var/www - command: php artisan queue:work --verbose --tries=3 + restart: unless-stopped + command: php artisan queue:work --verbose --tries=3 --sleep=3 + healthcheck: + test: [ "CMD", "php", "artisan", "queue:monitor", "default" ] + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s volumes: - ./laravel:/var/www depends_on: - - postgres + postgres: + condition: service_healthy networks: - laravel_network schedule: - build: - context: . - dockerfile: docker/Dockerfile + image: laravel_frankenphp container_name: laravel_schedule + restart: unless-stopped working_dir: /var/www user: "${UID:-1000}:${GID:-1000}" - command: php artisan schedule:work volumes: - ./laravel:/var/www + - ./docker/cron:/etc/cron.d:ro + command: + - "go-crond" + - "--default-user=${UID:-1000}" + - "--allow-unprivileged" + - "--include=/etc/cron.d" + - "--verbose" + healthcheck: + test: [ "CMD", "pgrep", "-f", "go-crond" ] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s depends_on: - app networks: diff --git a/docker/Dockerfile b/docker/Dockerfile index 4dfef3d..93edeff 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -14,6 +14,13 @@ RUN apk add --no-cache \ curl \ bash +RUN GOCROND_VERSION=22.9.1 \ + GOCRON_OS=linux \ + GOCRON_ARCH=amd64 \ + && wget -O /usr/local/bin/go-crond \ + https://github.com/webdevops/go-crond/releases/download/${GOCROND_VERSION}/go-crond.${GOCRON_OS}.${GOCRON_ARCH} \ + && chmod +x /usr/local/bin/go-crond + COPY --from=composer:2 /usr/bin/composer /usr/bin/composer RUN addgroup -g ${GROUP_ID} ${USER_NAME} && \ diff --git a/docker/cron/laravel b/docker/cron/laravel new file mode 100644 index 0000000..c2f609c --- /dev/null +++ b/docker/cron/laravel @@ -0,0 +1 @@ +* * * * * appuser cd /var/www && /usr/local/bin/php artisan schedule:run >> /var/www/storage/logs/cron.log 2>&1