From c3572682ad4ccd0b4e8205beb63e9cdf1073318c Mon Sep 17 00:00:00 2001 From: Hank Date: Thu, 18 Jun 2026 03:05:57 +0800 Subject: [PATCH] =?UTF-8?q?chore(openspec):=20=E6=AD=B8=E6=AA=94=20cloud-r?= =?UTF-8?q?eady-p1=20+=20=E5=90=8C=E6=AD=A5=E4=B8=BB=E8=A6=8F=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 所有 task 驗證完成(7.1 stderr log / 7.2 無新增日誌檔 / 7.3 session 走 Redis) - 同步 env-cloud-annotations 主 spec(LOG_CHANNEL 取代 LOG_STACK + 新增 scenario) - 新增 scheduler-container 主 spec(獨立 container 取代 cron daemon) - 移至 archive/2026-06-18-cloud-ready-p1 Co-Authored-By: Claude Sonnet 4.6 --- .../2026-06-18-cloud-ready-p1}/.openspec.yaml | 0 .../2026-06-18-cloud-ready-p1}/design.md | 0 .../2026-06-18-cloud-ready-p1}/proposal.md | 0 .../specs/env-cloud-annotations/spec.md | 0 .../specs/scheduler-container/spec.md | 0 .../2026-06-18-cloud-ready-p1}/tasks.md | 6 ++--- openspec/specs/env-cloud-annotations/spec.md | 16 +++++++++---- openspec/specs/scheduler-container/spec.md | 23 +++++++++++++++++++ 8 files changed, 38 insertions(+), 7 deletions(-) rename openspec/changes/{cloud-ready-p1 => archive/2026-06-18-cloud-ready-p1}/.openspec.yaml (100%) rename openspec/changes/{cloud-ready-p1 => archive/2026-06-18-cloud-ready-p1}/design.md (100%) rename openspec/changes/{cloud-ready-p1 => archive/2026-06-18-cloud-ready-p1}/proposal.md (100%) rename openspec/changes/{cloud-ready-p1 => archive/2026-06-18-cloud-ready-p1}/specs/env-cloud-annotations/spec.md (100%) rename openspec/changes/{cloud-ready-p1 => archive/2026-06-18-cloud-ready-p1}/specs/scheduler-container/spec.md (100%) rename openspec/changes/{cloud-ready-p1 => archive/2026-06-18-cloud-ready-p1}/tasks.md (88%) create mode 100644 openspec/specs/scheduler-container/spec.md diff --git a/openspec/changes/cloud-ready-p1/.openspec.yaml b/openspec/changes/archive/2026-06-18-cloud-ready-p1/.openspec.yaml similarity index 100% rename from openspec/changes/cloud-ready-p1/.openspec.yaml rename to openspec/changes/archive/2026-06-18-cloud-ready-p1/.openspec.yaml diff --git a/openspec/changes/cloud-ready-p1/design.md b/openspec/changes/archive/2026-06-18-cloud-ready-p1/design.md similarity index 100% rename from openspec/changes/cloud-ready-p1/design.md rename to openspec/changes/archive/2026-06-18-cloud-ready-p1/design.md diff --git a/openspec/changes/cloud-ready-p1/proposal.md b/openspec/changes/archive/2026-06-18-cloud-ready-p1/proposal.md similarity index 100% rename from openspec/changes/cloud-ready-p1/proposal.md rename to openspec/changes/archive/2026-06-18-cloud-ready-p1/proposal.md diff --git a/openspec/changes/cloud-ready-p1/specs/env-cloud-annotations/spec.md b/openspec/changes/archive/2026-06-18-cloud-ready-p1/specs/env-cloud-annotations/spec.md similarity index 100% rename from openspec/changes/cloud-ready-p1/specs/env-cloud-annotations/spec.md rename to openspec/changes/archive/2026-06-18-cloud-ready-p1/specs/env-cloud-annotations/spec.md diff --git a/openspec/changes/cloud-ready-p1/specs/scheduler-container/spec.md b/openspec/changes/archive/2026-06-18-cloud-ready-p1/specs/scheduler-container/spec.md similarity index 100% rename from openspec/changes/cloud-ready-p1/specs/scheduler-container/spec.md rename to openspec/changes/archive/2026-06-18-cloud-ready-p1/specs/scheduler-container/spec.md diff --git a/openspec/changes/cloud-ready-p1/tasks.md b/openspec/changes/archive/2026-06-18-cloud-ready-p1/tasks.md similarity index 88% rename from openspec/changes/cloud-ready-p1/tasks.md rename to openspec/changes/archive/2026-06-18-cloud-ready-p1/tasks.md index 6e30901..81da104 100644 --- a/openspec/changes/cloud-ready-p1/tasks.md +++ b/openspec/changes/archive/2026-06-18-cloud-ready-p1/tasks.md @@ -40,6 +40,6 @@ ## 7. 手動驗證(VPS,需更新 .env 後) -- [ ] 7.1 [整合測試] 確認 log 走 stderr:呼叫任意 API 後 `docker compose logs app | tail -20` 有日誌輸出 -- [ ] 7.2 [整合測試] 確認 `storage/logs/` 無新增日誌檔(舊檔保留) -- [ ] 7.3 [整合測試] 確認 session 走 Redis:登入後 `docker compose exec redis redis-cli keys "laravel_session*"` 有輸出 +- [x] 7.1 [整合測試] 確認 log 走 stderr:呼叫任意 API 後 `docker compose logs app | tail -20` 有日誌輸出 +- [x] 7.2 [整合測試] 確認 `storage/logs/` 無新增日誌檔(舊檔保留) +- [x] 7.3 [整合測試] 確認 session 走 Redis:登入後 `docker compose exec redis redis-cli keys "cfdiveplatform_database_*"` 有輸出(prefix 為 APP_NAME_database_,非 laravel_session*) diff --git a/openspec/specs/env-cloud-annotations/spec.md b/openspec/specs/env-cloud-annotations/spec.md index fe6abb4..489dee2 100644 --- a/openspec/specs/env-cloud-annotations/spec.md +++ b/openspec/specs/env-cloud-annotations/spec.md @@ -12,11 +12,19 @@ - **THEN** Laravel queue driver 使用 Redis,queue worker 正常消費 Redis 佇列中的 job ### Requirement: .env.example 標示雲端必要變數 -`.env.example` SHALL 以行內註解標示以下雲端部署時必須明確設定的變數: +`.env.example` SHALL 以行內註解或正確預設值標示以下雲端部署時必須明確設定的變數: - `FILESYSTEM_DISK`:雲端應設為 `s3`(預設 `local` 在容器重啟後遺失上傳檔案) -- `LOG_STACK`:雲端建議改為 `stderr` 以接入雲端 logging aggregator -- `QUEUE_CONNECTION`:應為 `redis` -- `SESSION_DRIVER`:雲端建議改為 `redis` +- `LOG_CHANNEL`:預設改為 `stderr`(雲端 logging aggregator 標準;原 `stack/daily` 寫檔案不適合雲端) +- `QUEUE_CONNECTION`:預設為 `redis` +- `SESSION_DRIVER`:預設改為 `redis`(取代 `database`,擴容更高效) + +#### Scenario: 新環境照 .env.example 初始化 session driver +- **WHEN** 開發者以 `.env.example` 為基礎建立 `.env`,未手動修改 `SESSION_DRIVER` +- **THEN** Laravel session driver 使用 Redis + +#### Scenario: 新環境照 .env.example 初始化 log channel +- **WHEN** 開發者以 `.env.example` 為基礎建立 `.env`,未手動修改 `LOG_CHANNEL` +- **THEN** Laravel 日誌寫入 stderr,可透過 `docker compose logs app` 查看 #### Scenario: 操作者閱讀 .env.example 進行雲端部署 - **WHEN** 操作者參照 `.env.example` 設定雲端環境的 `.env` diff --git a/openspec/specs/scheduler-container/spec.md b/openspec/specs/scheduler-container/spec.md new file mode 100644 index 0000000..903f79b --- /dev/null +++ b/openspec/specs/scheduler-container/spec.md @@ -0,0 +1,23 @@ +# scheduler-container + +Laravel Scheduler 以獨立 container 執行,取代 app container 內的 cron daemon。 + +## Requirements + +### Requirement: Scheduler 以獨立 container 執行 +`docker-compose.yml` SHALL 定義 `scheduler` service,使用 `cfdive-platform` image,以 `php artisan schedule:work` 前台輪詢方式執行 Laravel Scheduler,取代原本在 app container 內的 cron daemon。 + +#### Scenario: Scheduler container 隨 app 啟動 +- **WHEN** 執行 `docker compose up -d` 且 `app` container 已 healthy +- **THEN** `scheduler` container 啟動並持續執行 `php artisan schedule:work` + +#### Scenario: App container 重啟時 scheduler 等待就緒 +- **WHEN** `app` container 重啟中(unhealthy) +- **THEN** `scheduler` container 依 `depends_on` 等待 `app` healthy 後才啟動,避免 scheduler 在 PHP-FPM 未就緒時執行任務 + +### Requirement: App container 不再包含 cron daemon +`Dockerfile` SHALL 不安裝 `cron` 套件,`docker-entrypoint.sh` SHALL 不執行 `service cron start`,確保 app container 職責單一(只跑 PHP-FPM)。 + +#### Scenario: App container 啟動不啟動 cron +- **WHEN** `app` container 啟動並執行 entrypoint +- **THEN** 不存在 cron daemon 程序,`pgrep cron` 回傳 exit code 1