如何利用 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。

至此将本地项目成功部署到线上!如有问题欢迎留言指正。

猜你喜欢

转载自blog.csdn.net/Mr_Lewis/article/details/85542571