a620906209 6a7d98b0fe
Run Tests / test (pull_request) Successful in 32s
feat(docker): 移除 bind mount,程式碼與 vendor 烘進 image
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
2026-08-04 16:59:18 +08:00
2025-05-12 01:22:09 +08:00
2025-05-11 03:45:17 +08:00
2025-05-11 03:45:17 +08:00
2025-05-11 03:45:17 +08:00
2025-05-11 03:45:17 +08:00
2025-05-11 03:45:17 +08:00
2025-05-11 03:45:17 +08:00
2025-05-11 03:45:17 +08:00

CFDive Platform

潛水課程媒合平台 — 連結潛水教練與學員,提供課程瀏覽、線上預約、即時訊息、評價與通知等完整服務。


功能概覽

會員(Member

  • 註冊 / 登入(Email + Google OAuth
  • Token 自動續期(401 refresh-then-retrysessionStorage 儲存)
  • 瀏覽、搜尋、篩選潛水課程
  • 查看課程時段並送出預約
  • 與教練即時訊息(文字 + 圖片,含已讀回執)
  • 對完成的課程留下評價(支援匿名、有幫助投票)
  • 站內通知(Bell Icon 即時更新 + 瀏覽器推播)

教練(Provider

  • 課程 CRUD(含封面 + 相簿圖片上傳,伺服器端壓縮)
  • 課程時段管理
  • 預約管理(確認 / 拒絕 / 完成 / 取消)
  • 與學員即時訊息
  • 證照上傳與教練資格送審

管理員(Admin

  • 平台統計數據(會員數、教練數、課程數)
  • 會員與教練帳號管理(啟用 / 停用)
  • 教練資格審核(送審 / 通過 / 駁回 / 撤銷)
  • 課程、預約、評價管理

技術棧

層級 技術
後端 PHP 8.x / Laravel 11
前端 Vue 3 + Vite + Tailwind CSS
資料庫 MySQL 8.0
快取 Redis
即時通訊 Laravel ReverbWebSocketwss://ws.hank-space.com
認證 Laravel Sanctum + Google OAuth + Token Refresh
容器 Docker / Docker Compose
API 文件 Swagger UIl5-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
S
Description
No description provided
Readme 2.1 MiB
Languages
PHP 71.4%
Vue 17.1%
HTML 4.1%
Blade 4.1%
JavaScript 2.7%
Other 0.5%