# Docker Prod 環境

這是一個可獨立運行的生產環境 Docker 配置，包含完整的 Laravel 運行環境。

## 包含服務

- **web**: Apache + PHP 8.3-FPM（使用 Supervisor 管理）
- **mysql**: MySQL 8.0

## 快速開始

### 1. 設定配置檔案

```bash
cp .env.example .env
cp docker-compose.yml.example docker-compose.yml
cp apache-data/000-default.conf.example apache-data/000-default.conf
cp apache-data/default-ssl.conf.example apache-data/default-ssl.conf
```

編輯 `.env` 檔案，修改以下設定：
- MySQL 密碼（`MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD`）
- 資料庫名稱（`MYSQL_DATABASE`）
- 連接埠（`HTTP_PORT`, `HTTPS_PORT`, `MYSQL_PORT`）

### 2. SSL 憑證設定（可選）

預設使用 Dockerfile 內建的自我簽署憑證，瀏覽器會顯示「不安全」警告。

如需使用正式 SSL 憑證：

1. 準備憑證目錄，包含：
   ```
   ~/docker-prod/ssl/
   ├── ssl.crt    # 憑證檔案
   └── ssl.key    # 私鑰檔案
   ```

2. 在 `.env` 中設定憑證目錄路徑：
   ```
   SSL_CERT_PATH=~/docker-prod/ssl
   ```

3. 在 `docker-compose.yml` 中取消 SSL 掛載的註解：
   ```yaml
   - ${SSL_CERT_PATH}/ssl.crt:/etc/ssl/certs/ssl.crt:ro
   - ${SSL_CERT_PATH}/ssl.key:/etc/ssl/private/ssl.key:ro
   ```

### 3. 建構與啟動

```bash
# 建構映像
docker compose build

# 啟動所有服務
docker compose up -d

# 查看服務狀態
docker compose ps
```

### 4. 初始化應用程式

```bash
# 進入容器
docker compose exec web bash

# 安裝依賴
composer install
npm install

# 編譯前端資源
npm run build

# 設定資料夾權限
chown -R www-data:www-data storage/ bootstrap/ public/

# 設定環境檔案
cp .env.example .env
php artisan key:generate

# 執行資料庫遷移
php artisan migrate

# 發布資源
php artisan module:publish --all

# 連結儲存目錄
php artisan storage:link

# 清除快取
php artisan optimize

# 創建預設角色權限
php artisan db:seed --class=Modules\\User\\Database\\Seeders\\RoleAndPermissionSeeder

# 創建預設管理者
php artisan db:seed --class="Modules\User\Database\Seeders\DefaultUserSeeder"

# 創建 Sprint 週期
php artisan task:create
```

### 5. 寄信 Google SMTP 設定

編輯 `.env` 檔案，設定以下內容：

| Name | Value |
| ------ | ------ |
| MAIL_DRIVER | smtp |
| MAIL_HOST | smtp.gmail.com |
| MAIL_PORT | 587 |
| MAIL_USERNAME | <帳號> |
| MAIL_PASSWORD | <密碼> |
| MAIL_ENCRYPTION | tls |
| MAIL_FROM_ADDRESS | <寄件者信箱> |
| MAIL_FROM_NAME | <寄件者名字> |

### 6. Google OAuth 設定

- [申請 Google OAuth](https://console.cloud.google.com/apis/credentials?hl=zh-tw)

編輯 `.env` 檔案，設定以下內容：

```sh
GOOGLE_CLIENT_ID=<用戶端ID>
GOOGLE_CLIENT_SECRET=<用戶端密碼>
GOOGLE_REDIRECT_URI=<重定向URI>
```

### 7. OAuth 與網域限制設定

| Name | Description |
| ------ | ------ |
| ALLOWED_OAUTH_PROVIDERS | 允許的 OAuth 登入提供者（逗號分隔），例如：google |
| AUTH_DOMAIN_RESTRICTION | 是否啟用網域限制（true/false） |
| AUTH_ALLOWED_DOMAINS | 允許登入的網域（逗號分隔），例如：example.com |

### 8. CSP (Content Security Policy) 設定

| Name | Description |
| ------ | ------ |
| CSP_ENABLED | 是否啟用 CSP（true/false） |

### 9. 每日工時設定

| Name | Description | 預設值 |
| ------ | ------ | ------ |
| WORK_HOURS_MONDAY | 週一工時 | 7.5 |
| WORK_HOURS_TUESDAY | 週二工時 | 7.5 |
| WORK_HOURS_WEDNESDAY | 週三工時 | 7.5 |
| WORK_HOURS_THURSDAY | 週四工時 | 7.5 |
| WORK_HOURS_FRIDAY | 週五工時 | 7.0 |
| WORK_HOURS_SATURDAY | 週六工時 | 0 |
| WORK_HOURS_SUNDAY | 週日工時 | 0 |

## 連接資訊

| 服務 | 主機端口 | 容器端口 |
|------|----------|----------|
| HTTP | 8180 | 80 |
| HTTPS | 8143 | 443 |
| MySQL | 3306 | 3306 |

> 端口可在 `.env` 中自訂（`HTTP_PORT`, `HTTPS_PORT`, `MYSQL_PORT`）

## 常用命令

```bash
# 查看日誌
docker compose logs -f web
docker compose logs -f mysql

# 進入容器
docker compose exec web bash
docker compose exec mysql mysql -u root -p

# 重啟服務
docker compose restart

# 停止服務
docker compose down

# 停止並刪除資料
docker compose down && rm -rf data/mysql
```

## 目錄結構

```
docker/prod/
├── Dockerfile                   # 主要映像定義
├── docker-compose.yml.example   # 服務編排配置範本
├── .env.example                 # 環境變數範本
├── conf/
│   ├── php.ini                  # PHP 配置
│   ├── supervisord.conf         # Supervisor 主配置
│   ├── web.conf                 # Web 服務配置（PHP-FPM + Apache）
│   └── workers.conf             # Laravel Queue Workers 配置
├── apache-data/
│   ├── 000-default.conf.example # Apache HTTP 配置範本
│   └── default-ssl.conf.example # Apache HTTPS 配置範本
└── data/
    └── mysql/                   # MySQL 資料持久化目錄
```

## 注意事項

1. **生產環境安全**
   - 務必修改 `.env` 中的所有預設密碼
   - 使用正式 SSL 憑證（Let's Encrypt 等）
   - 將 `.env` 加入 `.gitignore`

2. **OPcache**
   - 生產環境已啟用 OPcache
   - 部署新程式碼後需重啟 PHP-FPM：
     ```bash
     docker compose exec web service php8.3-fpm restart
     ```

3. **資料持久化**
   - MySQL 資料儲存於 `./data/mysql` 目錄

## 疑難排解

### 無法連接 MySQL

```bash
# 檢查 MySQL 是否正常運行
docker compose exec mysql mysql -u root -p

# 檢查網路連線
docker compose exec web ping mysql
```

### SSL 憑證問題

```bash
# 檢查憑證檔案
docker compose exec web ls -la /etc/ssl/certs/ssl.crt
docker compose exec web ls -la /etc/ssl/private/ssl.key

# 查看憑證資訊
docker compose exec web openssl x509 -in /etc/ssl/certs/ssl.crt -text -noout
```

### 權限問題

```bash
# 重新設定儲存目錄權限
docker compose exec web chown -R www-data:www-data /var/www/html/storage
docker compose exec web chmod -R 775 /var/www/html/storage
```
