1. 程式人生 > >如何利用 Heroku 免費將本地 Laravel 專案部署到線上,已解決

如何利用 Heroku 免費將本地 Laravel 專案部署到線上,已解決

前言:我的一個仿微博玩具專案便是部署在 Heroku 上,網址為:https://weibo2.herokuapp.com/, 有興趣的朋友可以點選去看一下。
我的 Laravel 開發環境為 Homestead(官推),如何部署 Homestead 開發環境可以參考這篇文章 Laravel 開發環境部署,虛擬機器作業系統為 Ubuntu,Homestead 預設帶有 Heroku 命令號工具集,沒有的同學請自行搜尋安裝。

部署步驟:

  1. 註冊 heroku 賬號
  2. 將專案納入版本控制
  3. 在 Heroku 上建立一個新應用
  4. 宣告專案語言
  5. 設定 APP-Key
  6. 初步部署上線
  7. 使用 PostgreSQL 資料庫
  8. 根據不同開發環境選擇不同資料庫
  9. 線上專案配置項問題
  10. 推送並部署到線上
  11. 執行專案內的遷移檔案

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。

至此將本地專案成功部署到線上!如有問題歡迎留言指正。