如何使用Satis或Packagist搭建私有Composer仓库? (内网部署)

发布时间 - 2026-01-14 00:00:00    点击率:
Satis 更适合内网私有 Composer 仓库,因其是轻量静态元数据生成器,无需数据库和运行时服务,仅通过配置即可支持私有 Git 仓库、分支/标签精准控制及全版本兼容。

私有 Composer 仓库在内网环境下,Satis 是更轻量、可控且无需数据库和 Web 框架的首选;Packagist 官方版(packagist/packagist)不适合直接内网部署——它依赖 PostgreSQL、Elasticsearch、Redis 和大量后台服务,运维成本远超实际需求。

为什么 Satis 更适合内网私有仓库

Satis 本质是一个静态包元数据生成器:它读取 composer.json 配置,拉取 Git 仓库(支持 SSH/HTTP),执行 git clonecomposer install(可选),最后输出 packages.json 和压缩包(.zip.tar)。整个过程无运行时服务,生成结果可直接托管在 Nginx/Apache 或甚至 file:// 协议下被 composer 客户端消费。

  • 不依赖数据库或队列,配置即生效
  • 支持私有 Git 仓库(如 Gitea、GitLab Self-Hosted),通过 auth.json 注入凭据
  • 可精确控制哪些分支/标签被发布(用 "minimum-stability""stability-flags"
  • 生成的 packages.json 兼容所有 Composer 版本(包括 2.x)

Satis 部署三步走:配置 → 构建 → 托管

以 Ubuntu 22.04 + PHP 8.1 环境为例,目标是将公司内部 git@git.internal:php/my-sdk.gitv1.2.0dev-main 发布为私有包。

第一步:安装 Satis(推荐全局 Phar)

curl -sS https://getcomposer.org/installer | php
php composer.phar global require composer/satis --no-plugins

第二步:编写 satis.json

{
  "name": "internal/packagist",
  "homepage": "https://packages.internal",
  "repositories": [
    {
      "type": "vcs",
      "url": "git@git.internal:php/my-sdk.git"
    }
  ],
  "require-all": true,
  "archive": {
    "directory": "dist",
    "format": "zip",
    "skip-dev": false,
    "prefix-url": "https://packages.internal/dist"
  }
}

第三步:构建并发布

  • 确保 ~/.composer/auth.json 已配置 SSH key 或 HTTP token(用于访问私有 Git)
  • 运行:php ~/.composer/vendor/bin/satis build satis.json web/
  • web/ 目录部署到 Nginx 根路径(如 /var/www/packages),确保 packages.json 可被公开 GET 访问

客户端如何使用该私有仓库

项目根目录下创建或修改 composer.json,添加 repositories 条目:

{
  "repositories": [
    {
      "type": "composer",
      "url": "https://packages.internal"
    }
  ],
  "require": {
    "internal/my-sdk": "^1.2"
  }
}

关键注意事项:

  • url 必须指向包含 packages.json 的目录(不是文件本身),且该 URL 必须能被开发机/CI 环境直连(内网 DNS 或 hosts 要配好)
  • 若使用自签名 HTTPS 证书,需在客户端机器设置:export COMPOSER_DISABLE_TLS=1(仅限测试)或向系统 CA 信任库导入证书
  • 每次更新包版本后,必须重新运行 satis build,否则客户端查不到新版本(Satis 无自动监听机制)

常见失败现象与定位点

典型报错:[Composer\Downloader\TransportException] The 'https://packages.internal/packs/internal/my-sdk/1.2.0.0-zip' URL could not be accessed

原因往往不在 Satis 配置,而在路径映射断层:

  • archive.prefix-url 值是否与 Nginx 实际服务路径一致?比如 Nginx root 是 /var/www/packages,但 prefix-url 写成 ht

    tps://packages.internal/assets
    ,就会 404
  • 生成的 dist/ 目录是否被 Nginx 正确暴露?检查 Nginx 配置中是否有 location /dist { alias /var/www/packages/dist; } 这类映射
  • Git 仓库的 tag 名是否符合 Composer 版本规范?v1.2.0 合法,1.2.0-release 默认不识别(需加 "version": "1.2.0.0"composer.json 中)

最易被忽略的是权限链:Satis 构建时用的用户(如 www-data)能否 git clone 私有仓库?能否写入 web/dist/?这些错误不会中断构建,但会导致 packages.json 中的 dist.url 指向一个根本不存在的 ZIP 文件。


# php  # redis  # js  # git  # json  # composer  # apache  # nginx  # access  # ubuntu  # Token  # internal  # var  # 并发  # location  # gitlab  # elasticsearch  # postgresql  # 数据库  # http  # https  # ssh  # gitea  # 内网  # 客户端  # 更适合  # 的是  # 是一个  # 就会  # 而在  # 这类  # 不存在  # 可选 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在阿里云域名上完成建站全流程?  简历在线制作网站免费版,如何创建个人简历?  青岛网站建设如何选择本地服务器?  JS中对数组元素进行增删改移的方法总结  详解Huffman编码算法之Java实现  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Laravel如何实现API版本控制_Laravel版本化API设计方案  大连 网站制作,大连天途有线官网?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  Laravel集合Collection怎么用_Laravel集合常用函数详解  如何在Windows环境下新建FTP站点并设置权限?  制作旅游网站html,怎样注册旅游网站?  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  如何在腾讯云免费申请建站?  微信推文制作网站有哪些,怎么做微信推文,急?  Laravel如何处理和验证JSON类型的数据库字段  Laravel如何实现API资源集合?(Resource Collection教程)  如何挑选高效建站主机与优质域名?  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  公司网站制作价格怎么算,公司办个官网需要多少钱?  Java解压缩zip - 解压缩多个文件或文件夹实例  如何在 React 中条件性地遍历数组并渲染元素  制作企业网站建设方案,怎样建设一个公司网站?  如何获取免费开源的自助建站系统源码?  php 三元运算符实例详细介绍  如何在搬瓦工VPS快速搭建网站?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  如何在自有机房高效搭建专业网站?  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  如何获取PHP WAP自助建站系统源码?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何正确选择百度移动适配建站域名?  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  Laravel如何处理文件下载请求?(Response示例)  历史网站制作软件,华为如何找回被删除的网站?  如何在建站宝盒中设置产品搜索功能?  详解Oracle修改字段类型方法总结  Laravel怎么在Controller之外的地方验证数据  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  如何用腾讯建站主机快速创建免费网站?  如何快速配置高效服务器建站软件?