Heroku雲端部署
===
###### tags: `Laravel` `部署` `Heroku`
### 環境準備
* 註冊Heroku帳號
* Heroku CLI
* Git
* 已經完成的Laravel專案
### 建立Heroku專案
#### 1. 登入heroku
開啟cmd輸入以下指令
```
heroku login
```
這時會顯示網頁視窗,點擊「Log In」即可登入

#### 2. 建立Heroku APP
完成登入之後,接下來輸入以下指令來建立Heroku APP
```
heroku create 專案名稱
```
建立完成,輸入以下指令,確認剛剛建立的專案是否出現在Heroku裡
```
heroku list
```

△ 出錯:Name is already taken

△ 原因:表示你取的專案名稱有重複到
△ 解決:可以在專案後加入序號或是日期
### 建置Laravel專案
#### 1. 下載專案
```
git clone 專案位址
```
#### 2. 安裝composer
```
composer install
```
#### 3. 複製.env .example檔案,並且重新命名成.env
#### 4. 建立金鑰
```
php artisan key:generate
```
#### 5. 建立Procfile檔案,指定Heroku啟動位置
```
echo web: vendor/bin/heroku-php-apache2 public/ > Procfile
```

### 指定上傳路徑到剛剛建立的Heroku專案
```
heroku git:remote -a "Heroku專案名稱"
```
### 上傳至Heroku伺服器
```
git init
```
```
git add .
```
```
git commit -m "first herohu commit"
```
```
git push herohu master
```
△ 出錯:


△ 原因:
△ 解決:
### 設定環境變數&檢視網頁
#### 1. 環境變數
成功把專案push伺服器之後,切換到Heroku APP > setting

下拉到Config Vars區域,把.env的環境變數新增到Heroku中


#### 2. 檢視網頁
輸入以下指令,確認網頁是否有出現
```
heroku open
```
△ 出錯1:403 forbidden
△ 原因:客戶端沒有存取該資源的權限
△ 解決:確認Procfile內容是否正確or未push乾淨
△ 出錯2:HTTP 404
△ 原因:找不到網頁
△ 解決:確認網址是否正確
△ 出錯3:HTTP 500
△ 原因:未設定環境變數
△ 解決:閱讀第1個步驟
△ 出錯4:Mixed Content Page(未跑出CSS樣式)

△ 原因:無法取得http://的內容
△ 解決:URL::asset('...')改為https://專案名稱.herokuapp.com/...

△參考網址:https://stackoverflow.com/questions/30434786/mixed-content-page-requested-an-insecure-stylesheet-error)
△ 出錯5:View[...] not found (500 internal server error)

△ 原因:伺服器(apache)有區分大小寫,所以找不到相對應的檔案
△ 解決:將wiew的連結更改成正確的檔案名稱

### 資料庫設定
#### 1. 新增Heroku Postgres服務
Heroku APP > Resources > 「Find more add-ons」

找到Heroku Postgres

點擊「Install Heroku Postgres」

選擇要連接的專案

確認專案後,點擊「Submit Order Form」

完成後,所出現的畫面
☆ Config Vars會自動新增DATABASE_URL的值

#### 2. 設定pgsql
前往config/database.php,於上方加入以下程式碼
```php=
$DATABASE_URL=parse_url('DATABASE_URL');
```
大約第68行,修改pgsql設定
```php=
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
'host' => $DATABASE_URL['host'],
'port' => $DATABASE_URL['port'],
'database' => ltrim($DATABASE_URL['path'], '/'),
'username' => $DATABASE_URL['user'],
'password' => $DATABASE_URL['pass'],
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'schema' => 'public',
'sslmode' => 'prefer',
],
```
接著在大約第20行,修改預設的資料庫
```php=
'default' => env('DB_CONNECTION', 'pgsql'),
```
設定完成後,把專案重新push到伺服器
#### 3. 遷移資料表
完成push後,接下來就可以把資料表遷移到資料庫中
```
heroku run php artisan migrate
```
△出錯1:syntax error at or neat "MODIFY"

△原因:pgsql不支援Modify語法
△解決:更改成
```
ALTER TABLE 資料表名稱 ALTER COLUMN 欄位名稱 TYPE 資料型態
```
△參考網址:https://www.appsloveworld.com/postgresql/100/37/error-syntax-error-at-or-near-modify-in-postgres
△出錯2:

△原因:pgsql不適合使用char型態做加總
△解決:將欄位的資料型態更改為decimal、integer、float,sum()才能正常運作
△參考網址:https://stackoverflow.com/questions/24650533/sum-values-of-column-with-type-character
△出錯3:


△原因:在PostgreSQL語法會將大寫字母自動換成小寫,而我要加總欄位是設定成大寫,導致無法抓到正確的欄位名稱
△解決:在欄位使用雙引號,確保欄位名稱為大寫
```
DB::statement('ALTER TABLE studnet_scoring_peer ALTER COLUMN "EV" TYPE integer USING ("EV"::integer)');
```
△參考網址
* https://stackoverflow.com/questions/63005845/postgres-and-laravel-how-to-change-column-from-type-string-to-integer?fbclid=IwAR3oLpcGWkZR-LfCL--p_B_Igp1HfSFtzhp1LHM-4uYdrpNKRAj-3lxyoJU
* https://www.cnblogs.com/abclife/p/11866037.html
* https://blog.51cto.com/u_15257164/2896558
#### 4. Bonus:資料填充
輸入以下code,將預設的資料輸入至資料表
```
heroku run php artisan db:seed --class=名稱
```
#### 6. Bonus:清除資料庫
```
heroku pg:reset DATABASE
```
清除後,必須再跑一次遷移指令
### 透過 pgAdmin 操作 Heroku PostgreSQL 資料庫
[pgAdmin下載](https://www.pgadmin.org/download/?source=post_page-----90d9499ed8fb----------------------)
#### 取得PostgreSQL資料庫設定
1. 開啟Heroku專案,點選 Resources 頁籤中下方 Add-ons 區域裡的 Heroku Postgres

2. 點選 Setting 頁籤中的 View Credentials...按鈕,就會顯示有關資料的資訊


#### 設定pgAdmin
1. 開啟剛剛下載好的pgAdmin,點選左上角 Server 右鍵 > Register ➙ Server...

2. 建立與 Heroku PostgreSQL 資料庫的連線設定
* General 頁籤中,於Name欄位輸入一個可識別的名稱

* Connection 頁籤中,根據Database Credentials資訊,依序填入相對應的值

* SSL 頁籤中,SSL mode 選擇 Allow

* Advanced 頁籤中,於DB restriction 欄位輸入 Database Credentials 的 Database 資訊

* 最後點選 Save
#### 查看資料表
點選左邊的 Schemas > Tables 即可看到在 Heroku 中所建立的資料表

#### 操作說明
* 查看表格資料
* 透過tool 進行
### 參考資料
[Heroku前人筆記]
https://juangsalazprabowo.medium.com/how-to-deploy-a-laravel-app-into-heroku-df55efbf8e4e
https://www.youtube.com/watch?v=skGZ8laUQco&t=450s
https://hackmd.io/@Monastery/rkzYdLQwU
https://104.es/2020/10/08/%E6%8A%8Alaravel%E7%B6%B2%E7%AB%99%E9%83%A8%E7%BD%B2%E5%88%B0%E5%85%8D%E8%B2%BB%E7%9A%84heroku%E4%B8%8A/
http://anndo-blog.logdown.com/posts/1927297
[pgAdmin]
https://learningsky.io/database-pgadmin-postgresql-heroku/