paymeservice/remotisan

交互式执行 Artisan 命令

1.7.6 2024-08-11 09:04 UTC

README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

该包允许您通过 HTTP 远程执行 artisan 命令,并在页面上接收传播的输出。

您的命令执行不会遇到服务器的 MAX_EXECUTION_TIME,允许您保留原始服务器配置。

一般来说,当支持/devops/开发者没有直接访问服务器终端时,该包可以很好地帮助您的项目过渡到 CI/CD 并实现自动扩展。

安装

使用 composer 将 Remotisan 安装到您的 Laravel 项目中。需要 php7.4+。

composer require paymeservice/remotisan

您可以使用以下命令发布配置文件:

php artisan vendor:publish --tag="remotisan-config"

可选地,您可以使用以下命令发布视图。视图将被发布到 /resources/views/vendor/remotisan/ 目录,以便您进行进一步调整。

php artisan vendor:publish --tag="remotisan-views"

配置

  • Remotisan 允许您通过调整 base_url_prefix 设置来自定义默认路由前缀,之后不要忘记清除缓存的路由。

  • 通过调整以下部分,在配置中添加您希望暴露给 Remotisan 的任何命令。

注意:UserRoles 类不提供,仅用于演示目的!

使用您自己的模型用于访问控制层 (ACL)。

[
    "commands" =>   [
        "allowed" => [ // command level ACL.
            "COMMAND_NAME"            => ["roles" => [UserRoles::TECH_SUPPORT]],
            "COMMAND_FOR_DEVOPS_ONLY" => ["roles" => [UserRoles::DEV_OPS]],
            "COMMAND_SHARED"          => ["roles" => [UserRoles::TECH_SUPPORT, UserRoles::DEV_OPS]]
        ]
    ]
]

使用角色定义谁可以执行命令。

设置环境特定命令

您可以通过在 .env 文件中添加名为 REMOTISAN_ALLOWED_COMMANDS 的静态 json 字符串来配置环境特定命令。

REMOTISAN_ALLOWED_COMMANDS='{"artisanCommandName":{"roles":[]}, "artisanSecondCommand":{"roles":[]}}'

身份验证

在您的 AppServiceProvider::boot() 中添加对 \Remotisan::authWith($role, $callable) 的调用。

可调用函数接收 \Illuminate\Http\Request 实例,如果请求与给定的角色匹配,则应返回 true。

角色 必须 与您在 Remotisan 配置中定义的角色相匹配。

\Remotisan::authWith(UserRoles::TECH_SUPPORT, function(\Illuminate\Http\Request $request) {
    $user = $request->user('web');
    return $user && $user->isAllowed(UserPermissions::TECH_SUPPORT);
});

\Remotisan::authWith(UserRoles::DEV_OPS, function(\Illuminate\Http\Request $request) {
    $user = $request->user('web');
    return $user && $user->isAllowed(UserPermissions::DEV_OPS);
});

用户标识符

用户标识符用于审计作业执行,实现者可以使用他们信任的任何参数。此外,必须在 AppServiceProvider 中实现您自己的 UserIdentifierGetter。

        Remotisan::setUserIdentifierGetter(function (HttpRequest $request) {
            /** @var User|null $user */
            $user = $request->user("web");
            return $user->getDisplayName();
        });

审计

实现者必须在安装包后运行迁移,这样包将创建其自己的历史/审计表。审计表记录执行情况,并允许用户查看谁执行了什么,以及终止正在运行的过程。审计表对于终止机制的正常工作以及我们将在下一节中介绍实例标识符是必须的。名为 remotisan_executions 的表,避免删除。

实例标识符

由于应用程序可能在没有直接 ssh 访问服务器的多实例环境中运行,我们必须标识安装了 Remotisan 的实例。这种方式是从代码中“自动”完成的,在访问 Remotisan 时,我们使用 GUID 标记服务器。

注意:如果服务器已部署 Remotisan,则已标记且不会被重新标记,以继续在现有终止列表上工作(如果已存在)。

服务器 GUID 写入到特定实例的 Laravel 存储中的本地文件中,然后用于终止作业。

多实例要求

在多实例环境中,您必须实现审计和用户标识符部分。此外,您可能希望使用 Redis(memcached 或其他共享)缓存在实例之间以及进程杀手任务之间进行适当的通信。

技术细节

该软件包通过cache()外观向Redis发送终止信号(在多服务器环境中必须使用共享缓存),其中包含服务器标识符和作业的guid。随后,remotisan:broker会访问Redis以检查终止信号,如果发现作业uuid在终止列表中,则向该进程发送SIG_*。

信号发送有明确的顺序,首先尝试优雅地结束运行,然后发送越来越激进的信号,直至SIG_KILL,如果作业未能成功退出。

在终止之前,作业将向作业日志写入“由{USER_IDENTIFIER}于{DATETIME}终止进程”。

超级用户

要允许超级用户或管理员终止任何正在运行的作业,您需要在remotisan配置的super_users部分中声明用户标识符。列表中的任何超级用户都将能够终止任何正在运行的作业。只有正在运行的作业可以被终止。

待办事项

  1. 简化API的请求-响应,以方便希望实现自己的视图和前端逻辑的开发者。

快乐的工作,快乐的终止! :)

测试

composer test

变更日志

请参阅变更日志以获取有关最近更改的更多信息。

贡献

请参阅贡献指南以获取详细信息。

安全漏洞

请查阅我们的安全策略了解如何报告安全漏洞。

鸣谢

许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。