如何使用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 clone 和 composer 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.git 的 v1.2.0 和 dev-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,就会 404
tps://packages.internal/assets
- 生成的
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多级路由嵌套与命名空间隔离【步骤】
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何用腾讯建站主机快速创建免费网站?
如何快速配置高效服务器建站软件?


