我在 aws elastic beanstalk 上设置 laravels 护照时遇到问题。 eb 客户端设置正确,我可以部署代码更改。没有显示错误。
然而,向 laravel 发出请求之后会导致错误 500,告诉我我丢失了“app/current/storage/oauth-public.key\”中的护照密钥。在本地一切运行良好。
我想我缺少工匠命令“php artisan passport:install”,所以我在作曲家文件中添加了它:
"post-install-cmd": [
"Illuminate\\Foundation\\ComposerScripts::postInstall",
"@php artisan passport:install"
]
但显然它不会创建密钥。
要么运行 eb deploy 后没有执行 post-install hook,要么有另一个错误不允许我创建密钥文件(缺少写入权限?)
如何验证安装后挂钩是否已执行? 有人有类似的问题吗?
我遵循了这个问题的建议,但到目前为止它没有帮助: https://github.com/laravel/passport/issues/418
更新: 我进入应用程序并尝试手动运行 php artisan passport:install,这导致了错误。我必须先授予该文件夹权限(sudo chmod -R 777 存储),然后它才能工作。 不幸的是,每次我运行 eb deploy 时,密钥都会被删除,所以我每次都必须重做这些步骤——非常麻烦。有人找到了自动化的好方法吗?
显然这个 PR https://github.com/laravel/passport/pull/683 使得通过 envvars 传递密钥成为可能。
/*
|--------------------------------------------------------------------------
| Encryption Keys
|--------------------------------------------------------------------------
|
| Passport uses encryption keys while generating secure access tokens for
| your application. By default, the keys are stored as local files but
| can be set via environment variables when that is more convenient.
|
*/
'private_key' => env('PASSPORT_PRIVATE_KEY'),
'public_key' => env('PASSPORT_PUBLIC_KEY'),
我还没有测试过,但我很快就会测试。
更新
我们试过了,我们达到了 4K 的 envvars 大小限制:https://forums.aws.amazon.com/thread.jspa?messageID=618423
最后,我们最终使用了我们的 CI。
在您的 .ebextensions 文件夹中添加一个文件或命令(在您的项目的根目录中),这将在您部署时创建新密钥。
container_commands:
01_passport_install:
command: "php artisan passport:keys --force"
这有利也有弊:
您还可以在部署后自动执行命令。
如 Elastic Beanstalk 部署工作流程 中所述,部署后挂钩按字母数字顺序最后执行。
在源代码的根目录中创建文件夹 .platform/hooks/postdeploy/ 并在“postdeploy/”文件夹中创建一个包含您要执行的命令的 bash 脚本。即:
#! /bin/bash
sudo php artisan passport:install
然后(正如 Markus Lechner 在 this forum 中对 amesStreet 的回答)您还必须使用 container_commands 创建一个配置文件,以便授予执行 bash 脚本的权限(也在第一个链接中进行了解释,您必须使用
chmod +x
设置挂钩文件的执行权限)
在源代码的根目录中创建一个名为 .ebextensions/ 的文件夹,并在该文件夹中创建一个配置文件:“.ebextensions/some_name.config”并键入:
container_commands:
10_deploy_hook_permissions:
command: |
sudo find .platform/ -type f -iname "*.sh" -exec chmod -R 755 {} \;
sudo find /var/app/staging/.platform/ -type f -iname "*.sh" -exec chmod -R 755 {} \;
wich 相当于为 .platform 文件夹和 staging/ 文件夹中的每个 .sh 文件授予执行权限(这是预构建和预部署阶段部署工作流的一部分)
我遇到了同样的问题。现在它工作 100%
在安装 laravel 护照之前:
.ebextensions/02-deploy.config
container_commands:
# Install laravel passport
01_passport_install:
command: "php artisan passport:install"
安装laravel passport后:
.ebextensions/02-deploy.config
container_commands:
# Install laravel passport
# 01_passport_install:
# command: "php artisan passport:install"
诀窍是使用不同的 .ebignore 和 .gitignore 文件。
因此密钥不会在 git 中被跟踪,但仍会使用 eb deploy 命令上传到 elasticbeanstalk。