tahaghafuri/acappella

为Gitea的Composer仓库

3.0.0 2023-04-02 10:53 UTC

This package is auto-updated.

Last update: 2024-10-02 12:38:44 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/文件夹中)。但是,为了确保它正常工作,请确保你可以通过https://composer.my-website.com/packages.json访问packages.json文件,以及通过https://composer.my-website.com/gitea访问/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 或打标签的都将由 Acappella 进行注册。

用法

为了让您的本地 Composer 安装知道 Acappella 仓库的位置,您需要添加一些配置。您可以从您的机器或直接从您的包中配置仓库。

本地设置

您可以在本地计算机/服务器上执行以下命令,让 Composer 了解 Acappella 的存在

composer config -g repositories.acappella composer https://composer.my-website.com

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

{
    "repositories": {
        "acappella": {
            "type": "composer",
            "url": "https://composer.my-website.com"
        }
    }
}
包设置

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

{
    "repositories": [
        {
            "type": "composer",
            "url": "https://composer.my-website.com"
        }
    ]
}

接下来做什么?

  • 更新 PHPUnit 测试
  • 更新和测试 Dockerfile
  • 添加一个示例 Apache 配置文件
  • 创建一个简单的基于 Web 的界面