前言:我的一个仿微博玩具项目便是部署在 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。
至此将本地项目成功部署到线上!如有问题欢迎留言指正。