如何利用 Heroku 免費將本地 Laravel 專案部署到線上,已解決
前言:我的一個仿微博玩具專案便是部署在 Heroku 上,網址為:https://weibo2.herokuapp.com/, 有興趣的朋友可以點選去看一下。
我的 Laravel 開發環境為 Homestead(官推),如何部署 Homestead 開發環境可以參考這篇文章 Laravel 開發環境部署,虛擬機器作業系統為 Ubuntu,Homestead 預設帶有 Heroku 命令號工具集,沒有的同學請自行搜尋安裝。
部署步驟:
- 註冊 heroku 賬號
- 將專案納入版本控制
- 在 Heroku 上建立一個新應用
- 宣告專案語言
- 設定 APP-Key
- 初步部署上線
- 使用 PostgreSQL 資料庫
- 根據不同開發環境選擇不同資料庫
- 線上專案配置項問題
- 推送並部署到線上
- 執行專案內的遷移檔案
1. 註冊 heroku 賬號
Heroku 註冊地址,需要科學上網,記住賬號密碼然後在命令列執行$ heroku login
登入;新增 SSH Key 到 Heroku 上:$ heroku keys:add
2. 將專案納入版本控制
我們還需要在 Laravel 專案下新建一個 Procfile 檔案,通過配置該檔案來告訴 Heroku 應當使用什麼命令來啟動 Web 伺服器。
$ cd ~/Code/Laravel //此處為你的專案根目錄,各人會有所不同
$ echo web: vendor/bin/heroku-php-apache2 public/ > Procfile
$ git add -A
$ git commit -m "Procfile for Heroku"
3. 在 Heroku 上建立一個新應用
使用 heroku create
命令在 Heroku 上建立一個新應用,如果你對生成的預設名稱不滿意,你可以使用 heroku rename
來對應用名稱進行更改,但要保證更改的名稱未被其它人佔用
4. 宣告專案語言
對應用的 buildpack 進行宣告,告訴 Heroku 說我們的應用是用 PHP 寫的。宣告命令如下:
$ heroku buildpacks:set heroku/php
5. 設定 APP-Key
首先,使用 Laravel 自帶的 artisan 命令來生成 App Key:
$ php artisan key:generate --show
將生成的 App Key 替換掉下面命令的 <your_app_key>
,並執行該命令列來完成配置:
$ heroku config:set APP_KEY=<your_app_key>
6. 初步部署上線
使用 git push heroku master
將程式碼推送和部署到 Heroku 上,可以看到靜態頁面,但還無法使用資料庫功能。
7. 使用 PostgreSQL 資料庫
由於 Heroku 對 PostgreSQL 的支援比 MySQL 更好,因此在 Heroku 上使用 PostgreSQL 來作為我們應用的資料庫,要在 Heroku 上使用 PostgreSQL,我們需要先安裝 PostgreSQL 擴充套件。
$ heroku addons:add heroku-postgresql:hobby-dev
8. 根據不同開發環境選擇不同資料庫
在本地開發中,使用 MySQL 來作為資料庫儲存,但在 Heroku 環境上我們要改為使用 PostgreSQL 來作為資料庫儲存。我們可以通過為 Heroku 新增一個 IS_IN_HEROKU
配置項來判斷應用是否執行在 Heroku 上。
$ heroku config:set IS_IN_HEROKU=true
一般來說,應用的資料庫都在 config/database.php
中進行配置,因此我們需要針對該配置檔案,來為不同環境的資料庫連線方式定義一個幫助方法,以便根據應用不同的執行環境來指定資料庫配置資訊,因此新建一個 helpers.php
檔案並寫入以下內容:
app/helpers.php
<?php
function get_db_config()
{
if (getenv('IS_IN_HEROKU')) {
$url = parse_url(getenv("DATABASE_URL"));
return $db_config = [
'connection' => 'pgsql',
'host' => $url["host"],
'database' => substr($url["path"], 1),
'username' => $url["user"],
'password' => $url["pass"],
];
} else {
return $db_config = [
'connection' => env('DB_CONNECTION', 'mysql'),
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
];
}
}
在我們新增 helpers.php 檔案之後,還需要在專案根目錄下 composer.json
檔案中的 autoload
選項裡 files
欄位加入該檔案:
composer.json
{
...
"autoload": {
"psr-4": {
"App\\": "app/"
},
"classmap": [
"database/seeds",
"database/factories"
],
"files": [
"app/helpers.php"
]
}
...
}
修改儲存後執行以下命令進行重新載入檔案即可:
$ composer dump-autoload
現在,讓我們使用剛剛定義好的 get_db_config
方法對資料庫進行配置。
config/database.php
<?php
$db_config = get_db_config();
return [
'default' => $db_config['connection'],
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
],
'pgsql' => [
'driver' => 'pgsql',
'host' => $db_config['host'],
'port' => env('DB_PORT', '5432'),
'database' => $db_config['database'],
'username' => $db_config['username'],
'password' => $db_config['password'],
'charset' => 'utf8',
'prefix' => '',
'schema' => 'public',
'sslmode' => 'prefer',
],
'sqlsrv' => [
'driver' => 'sqlsrv',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '1433'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
],
],
'migrations' => 'migrations',
'redis' => [
'client' => 'predis',
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DB', 0),
],
'cache' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_CACHE_DB', 1),
],
],
];
9. 線上專案配置項問題
由於 Git 提交時會忽略根目錄下的 .env 配置檔案,因此為了保證線上配置檔案一致,若對本地的 .env 檔案有做過修改之後,需要同步到線上 。例如對本地的郵件相關的配置進行了修改之後,需要使用如下程式碼同步到線上
10. 推送並部署到線上
現在部署步驟到此已完畢。讓我們將改動的程式碼進行提交,並推送到 Heroku 上。
$ git add -A
$ git commit -m "Updated database configuration"
$ git push heroku master
11.執行專案內的遷移檔案
我們可以使用 heroku run
在 Heroku 執行 Laravel 的指定命令。現在我們需要在 Heroku 上執行遷移,生成資料表,可通過下面命令來完成:
$ heroku run php artisan migrate
若提示是否要在生產環境上執行此命令,請輸入 yes 或者 y。
至此將本地專案成功部署到線上!如有問題歡迎留言指正。