6a7d98b0fe24a0eb8c944610745d49874cfb0b8f
Run Tests / test (pull_request) Successful in 32s
Dockerfile 改 multi-stage(app + web),app/scheduler/queue-worker/ reverb/nginx 五個服務都不再依賴 ./:/var/www bind mount 取得程式碼; nginx 改本地 build 從 app 階段 COPY --from 取得 public/,public/storage symlink 在兩階段各自於 build 時建立。docker-compose.yml 新增具名 volume storage-app-public 讓上傳檔案跨 image 重建保留;env_file: 取代原本 bind mount 帶入 .env 的方式,只給四個 Laravel runtime 服務。 compose.override.yml 補上開發用 bind mount 維持改 code 立即生效; docker-entrypoint.sh 收斂到只剩目錄權限設定,migration/cache/swagger 移到 deploy.yml 統一負責,避免職責重疊。 實作驗證時發現並修復三個規劃階段沒預見的問題:app 服務的 build: 缺 target: app 導致預設建到最後一個 stage(image 實際變成 nginx); .dockerignore 需排除本機既有的 public/storage 符號連結(Windows 上 會讓 build context 打包失敗);env_file: 讓 .env 全部變數變成真實 環境變數、蓋掉 phpunit.xml 的測試隔離設定,已擴大 tests/bootstrap.php 的強制覆蓋清單修復(239 tests 全綠)。 本機 dev 模式與 production 模式(無 override)皆完整驗證:healthcheck、 migration/cache/swagger、上傳檔案持久性、nginx 獨立於 app 服務靜態檔 與 storage 檔案、.env 熱更新、nginx 無 .env 存取權。 openspec change: bake-image-remove-bind-mount Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0142LC1kQb8EyV59TjHDkhWS
CFDive Platform
潛水課程媒合平台 — 連結潛水教練與學員,提供課程瀏覽、線上預約、即時訊息、評價與通知等完整服務。
功能概覽
會員(Member)
- 註冊 / 登入(Email + Google OAuth)
- Token 自動續期(401 refresh-then-retry,sessionStorage 儲存)
- 瀏覽、搜尋、篩選潛水課程
- 查看課程時段並送出預約
- 與教練即時訊息(文字 + 圖片,含已讀回執)
- 對完成的課程留下評價(支援匿名、有幫助投票)
- 站內通知(Bell Icon 即時更新 + 瀏覽器推播)
教練(Provider)
- 課程 CRUD(含封面 + 相簿圖片上傳,伺服器端壓縮)
- 課程時段管理
- 預約管理(確認 / 拒絕 / 完成 / 取消)
- 與學員即時訊息
- 證照上傳與教練資格送審
管理員(Admin)
- 平台統計數據(會員數、教練數、課程數)
- 會員與教練帳號管理(啟用 / 停用)
- 教練資格審核(送審 / 通過 / 駁回 / 撤銷)
- 課程、預約、評價管理
技術棧
| 層級 | 技術 |
|---|---|
| 後端 | PHP 8.x / Laravel 11 |
| 前端 | Vue 3 + Vite + Tailwind CSS |
| 資料庫 | MySQL 8.0 |
| 快取 | Redis |
| 即時通訊 | Laravel Reverb(WebSocket,wss://ws.hank-space.com) |
| 認證 | Laravel Sanctum + Google OAuth + Token Refresh |
| 容器 | Docker / Docker Compose |
| API 文件 | Swagger UI(l5-swagger) |
| 錯誤監控 | Sentry |
| CI/CD | Gitea Actions(自動部署至 VPS) |
| 測試 | PHPUnit / Laravel Feature & Unit Tests |
API 文件
Swagger UI(由 l5-swagger 生成)涵蓋所有端點,包含:
- 認證(Email + Google OAuth)、Token 刷新
- 公開課程查詢
- 會員預約 / 即時訊息 / 評價 / 通知
- 教練課程 / 時段 / 預約管理 / 資格驗證申請(證照送審)
- 管理員後台
| 環境 | Swagger UI |
|---|---|
| 本地 | http://localhost:8080/api/documentation |
| 生產 | https://api.hank-space.com/api/documentation |
健康檢查
GET /health
回傳 DB、Redis、Cache 狀態,供 UptimeRobot 監控使用。全部正常回 200,任一異常回 503。
本地開發
測試用帳號
| 角色 | 帳號 | 密碼 | 用途 |
|---|---|---|---|
| 會員 | Guest@cfdive.com | guestpassword | 體驗課程瀏覽、預約、會員預約紀錄 |
| 教練 | Guest_Coach@cfdive.com | coachpassword | 體驗課程管理、時段管理、預約管理 |
教練頁入口
目前首頁尚未提供明顯導引到教練後台的入口。若要體驗教練功能,請直接開啟 /coach/login,使用上方教練試用帳號登入後會進入 /coach/dashboard。
| 服務 | 本地 | 生產 |
|---|---|---|
| 前端 | http://localhost:8080 | https://app.hank-space.com |
| API | http://localhost:8080/api | https://api.hank-space.com/api |
| Swagger UI | http://localhost:8080/api/documentation | https://api.hank-space.com/api/documentation |
| phpMyAdmin | http://localhost:8081 | http://<vps-ip>:8081 |
| Mailpit | http://localhost:8025 | http://<vps-ip>:8025 |
| Reverb WebSocket | ws://localhost:8085 | wss://ws.hank-space.com |
Description
Languages
PHP
71.4%
Vue
17.1%
HTML
4.1%
Blade
4.1%
JavaScript
2.7%
Other
0.5%