# Laravel

## 環境版本
  - php 8.3
  - Laravel 12.7.2

## Installation

基本安裝
```sh
$ cp .env.example .env
$ composer install
```

資料庫設定
```sh
$ vim .env
```
| Name | Description |
| ------ | ------ |
| DB_CONNECTION | 連線方式 |
| DB_HOST | Host Or IP |
| DB_PORT | 連線Port |
| DB_DATABASE | 資料庫名稱 |
| DB_USERNAME | 連線帳號 |
| DB_PASSWORD | 連線密碼 |

第一次環境設定
```sh
$ php artisan key:generate
$ php artisan migrate
$ php artisan db:seed
```

寄信SMTP設定
```sh
$ vim .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 | <寄件者名字> |

## 設定排程任務 (Crontab)

添加以下內容到系統 crontab：
```sh
$ sudo crontab -u www-data -e
* * * * * cd /var/www/html/steps_maintain/ && php artisan schedule:run >> /dev/null 2>&1
```

## 安裝 Supervisor（用於 Queue 發送信件）

1. 安裝
```sh
$ sudo apt update
$ sudo apt install supervisor
```

2. 設定（建立配置文件）
```sh
$ sudo vi /etc/supervisor/conf.d/steps_maintain-queue.conf
[program:steps_maintain-queue]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /var/www/html/steps_maintain/artisan queue:work --tries=3 --sleep=5 --timeout=90
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/html/steps_maintain/storage/logs/queue.log
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=10
stopwaitsecs=10
```

> 注意：`numprocs` 參數決定了啟動的處理進程數量。根據伺服器資源和負載需求調整此值。對於資源有限的環境，建議使用 1；對於需要高吞吐量的生產環境，可以設為 2 或更高。

3. 啟動服務
```sh
$ sudo supervisorctl reread
$ sudo supervisorctl update
$ sudo supervisorctl start steps_maintain-queue:*
```

4. 修改設定檔後重啟

如果修改了 Supervisor 設定檔，請依序執行以下指令重啟服務：
```sh
# 重新讀取設定檔
$ sudo supervisorctl reread

# 更新 Supervisor 配置
$ sudo supervisorctl update

# 查看工作狀態
$ sudo supervisorctl status

# 如果需要重新啟動特定工作
$ sudo supervisorctl restart steps_maintain-queue:*

# 如果需要重啟所有工作
$ sudo supervisorctl restart all

# 如果需要停止工作
$ sudo supervisorctl stop steps_maintain-queue:*
```
