sitelease/acappella

为 Gitea 的 Composer 仓库

1.0.3 2021-11-05 02:55 UTC

README

Acappella 是一个私有 Composer 仓库服务器,它与 Gitea 同步。你可以把它看作是一个自托管的、无头、带有 Gitea 超级功能的 Packagist。

目录

为什么选择 Acappella

虽然已经有一些私有 Composer 仓库项目(如 satisCompoLabgitlab-composer),但它们都不是专门为 Gitea 设计的。Acappella 是。

它是如何工作的?

第一次设置 Acappella 时,它将通过 API 连接到你的 Gitea 服务器,并解析它所拥有的所有仓库。然后,它将注册找到的任何有效的 * Composer 包,并为 Composer 生成一个 package.json 文件。

* 为了使 Acappella 将 Gitea 仓库注册为“有效”的 Composer 包,它必须在其根目录中包含一个格式正确的 composer.json 文件。

安全免责声明

默认情况下,Acappella 未经保护,任何人都可以访问你的服务器并访问你的包。为了保护包的访问权限,你需要设置某种形式的安全层(使用 IP 白名单、SSL 证书或你选择的任何其他系统)。

要求

配置如下(最好是 Unix)的服务器

  • PHP 7.2 或以上(仅在 PHP 7.4.2 上进行了测试)
  • Git / Composer
  • Web 服务器(Nginx 或 Apache)
  • 一个有效的 Gitea 实例(最好为 Acappella 设有一个专用账户)

安装

  1. 从你的 Gitea 实例,转到你的账户设置,然后转到 应用程序 选项卡,创建一个你选择的名称的令牌(例如,Acappella)。一旦重定向,复制生成的令牌(显示在蓝色警告框中)。

  2. 在用作 Composer 仓库的服务器上运行以下 composer 命令:composer create-project sitelease/acappella --no-dev --keep-vcs /var/www/acappella(最后一个命令参数是你想要安装 Acappella 的路径)。

  3. 现在转到 Acappella 目录,并执行安装脚本,通过在终端中运行 php bin/install 来执行。

    你需要输入你的 Gitea URL 并粘贴你之前复制的 API 令牌。

    注意:设置将保存在 config/settings.yml 文件中(该文件不进行版本控制)。如果你喜欢,你可以使用 config/settings.yml.example 模板手动创建此文件。

  4. 接下来,你需要确保你的 Web 服务器已经正确配置,以便接收 Gitea Webhooks 和 GET /packages.json 请求。

    主要问题是使 public/packages.jsonpublic/archives 可从域名根目录访问(例如,https://composer.my-website.com/packages.json)。所有其他查询都必须转发到 public/index.php

    Apache: 如果您使用Apache,此功能应该可以正常工作,因为我们已经包含了某些 .htacess 文件(在根目录和 public/ 文件夹中)。但是为了确保它正常工作,请确保您可以访问 packages.json 文件(通过 https://composer.my-website.com/packages.json)以及 /gitea 路径(通过 https://composer.my-website.com/gitea)。

    第一个URL应该显示一个空的JSON字符串(或者如果您已经同步了包,可能不是空的),第二个应该会显示一个警告,内容为 "FAILED: Not POST - The request was not sent using the POST protocol"。这是预期的(换句话说,这是一个好事)。

    "No route found" ERROR - 如果您访问 packages.json 文件,并且收到一个包含消息 "No route found for \"GET /packages.json\"" 的JSON响应,那么您可能有一个阻止访问 package.jsonpackages.json 文件的防黑客软件正在运行(我们在我们的服务器安装中遇到过这种情况)。在这种情况下,您可能需要联系您的服务器管理员或支持团队以获得帮助。

    Nginx: Nginx用户可以在 config/templates/ 文件夹中找到一个配置文件,但它尚未经过测试,因此我无法保证它将正常工作(对不起大家,我不使用 NGINX)

  5. 完成这些后,您现在可以使用它的 cli 脚本来使用 Acappella 注册现有的 composer 包。打开您的服务器上的终端(如果需要,通过 SSH)并运行以下命令

    php bin/cli sync
    

    这将完全同步您的 Gitea 服务器与 Acappella 仓库。执行后,所有分发存档都将存储在 Acappella 缓存中,并且 packages.json 索引将是最新的。

  6. 最后但同样重要的是,您需要创建一个 Push Events webhook。

    为此,您有两个选项(实际上有三个),创建默认 webhook(仅管理员可用),创建组织 webhook,或创建仓库 webhook(不推荐)。每个选项都有其优缺点。

    默认 Webhooks: 默认 webhook 将应用于(或复制到)所有未来的仓库,因此对于确保所有新的仓库都有 webhook 来说是非常有用的。不幸的是,它们不会应用于现有的仓库,一旦添加就无法更改,除非手动更新每个仓库。

    组织 Webhooks: 组织 webhook 克服了许多默认 webhook 的缺点。它们适用于 所有当前和未来的仓库,并且创建后可以轻松更改。但它们也有自己的缺点,因为它们 仅应用于组织拥有的仓库

    仓库 Webhooks: 这些 webhook 是应用于 单个仓库 的,因此在 Acappella 的上下文中,它们 仅适用于测试(例如,检查 Acappella 是否已正确配置)。

    多个 Webhooks: 如果这三个选项中的任何一个都不适合您的特定用例,您可以选择设置多个 webhook。只需记住,它们可能会在某些仓库上重叠,在这种情况下,同一个仓库将触发两个 webhook。虽然这不会直接对 Acappella 产生任何问题(据我所知),但它可能会在您有大量包的情况下造成速度减慢。

    在本文档中,我们将设置一个“组织 webhook”。为此,请登录到您的 Gitea 账户,转到您想要添加 webhook 的组织,然后点击其名称旁边的小齿轮。然后点击 Webhooks > 添加 Webhook 并然后选择 Gitea。将出现一个新的屏幕,您可以配置新的 webhook。

    将目标 URL 设置为 https://composer.my-website.com/gitea(其中 composer.my-website.com 是您想要与 Acappella 实例一起使用的域名或 IP),将 HTTP 方法设置为 POST,POST 内容类型设置为 application/json,并确保触发条件设置为 Push Events

    最后但同样重要的是,打开一个终端并运行以下命令来生成一个16字符的秘密密钥:

    openssl rand -hex 16
    

    将生成的密钥粘贴到Secret字段并保存webhook。

设置完成!您的仓库现在已完整设置,任何未来推送到Gitea的push/tag都将由Acappella注册。

CLI 命令

以下是一个CLI命令列表

  • php bin/cli sync - sync命令将完全同步您的Gitea服务器与Acappella。

    执行后,所有包含composer包的Gitea仓库将被下载为存档并存储在Acappella的系统缓存中,且packages.json索引将是最新的。

  • php bin/cli update argument - update命令接受一个参数,并将从Gitea检索指定包的更新。

    参数可以是composer包的名称(如firesphere/social)、Gitea仓库的名称(如Sitelease/sugar-cube-client)或Gitea仓库的ID(如241

  • php bin/cli install - install命令用于首次配置Acappella。

连接到 Acappella

为了让您的本地Composer安装连接到Acappella,您需要创建一个新的repository配置。您可以在全局Composer配置文件中创建此设置,或者在composer包中直接创建。

使用全局设置

您可以在本地计算机/服务器上执行以下命令,让Composer知道Acappella的存在并禁用安全HTTP:

composer config -g repositories.acappella composer http://composer.mygit.ca
composer config --global secure-http false

此命令应在Unix系统上的~/.composer/config.json文件中添加以下行

{
    "config": {
        "secure-http": false
    },
    "repositories": {
        "acappella": {
            "type": "composer",
            "url": "http://composer.mygit.ca"
        }
    }
}

使用包设置

或者您也可以直接在包的composer.json文件中设置仓库地址

{
    "config": {
        "secure-http": false
    },
    "repositories": [
        {
            "type": "composer",
            "url": "http://composer.mygit.ca"
        }
    ]
}

接下来是什么?

  • 修复cli "update"命令
  • 更新PHPUnit测试
  • 更新并测试Dockerfile
  • 添加一个示例Apache配置文件
  • 创建一个简单的基于Web的界面