
proxy v0.7.0
パッケージレジストリ向けの軽量キャッシングプロキシ。
git-pkgs proxy
パッケージレジストリ用のキャッシュプロキシ。アーティファクトをローカルにキャッシュすることでパッケージのダウンロードを高速化し、帯域幅の使用量を削減して信頼性を向上させます。
バージョンクールダウン
ほとんどのサプライチェーン攻撃はスピードに依存しています。悪意のあるバージョンが公開されると、誰も気づく前に数分以内に自動化されたパイプラインによって消費されてしまいます。クールダウン機能は、新しく公開されたバージョンに隔離期間を追加します。有効にすると、プロキシは設定可能なしきい値を経過するまで、メタデータレスポンスからバージョンを除外します。
cooldown:
default: "3d" # hide versions published less than 3 days ago
ecosystems:
npm: "7d" # npm gets a longer window
cargo: "0" # disable for cargo
packages:
"pkg:npm/lodash": "0" # exempt trusted packages
3日間のクールダウンとは、lodash がバージョン 4.18.0 を公開したとき、3日が経過するまでビルドは 4.17.21 を使い続けるという意味です。新しいリリースが侵害されていることが判明しても、あなたは一切影響を受けません。
解決順序: パッケージオーバーライド、次にエコシステムオーバーライド、次にグローバルデフォルト。これにより、保守的なデフォルトを設定し、より迅速な更新が必要なパッケージに対して例外を設けることができます。完全な設定リファレンスについては docs/configuration.md を参照してください。
アーティファクトスキャン
クールダウンはバージョンの公開タイムスタンプのみを参照し、実際のバイト列を検査することはありません。アーティファクトスキャンはそのギャップを埋めます。有効にすると、すべてのアーティファクトはストレージにステージングされ、キャッシュにコミットされてクライアントに配信される前に、1つ以上の外部サービス(trivy、ClamAV、Wiz、または小さな HTTP/JSON コントラクトを話すその他のサービス)によってスキャンされます。
scanning:
enabled: true
signing_key: ${PROXY_SCANNING_SIGNING_KEY}
scanners:
- name: clamav
url: http://clamav-adapter:8080/scan
mode: block # a block verdict deletes the artifact and returns 403
- name: trivy
url: http://trivy-adapter:8081/scan
mode: monitor # findings are logged, never gate caching
ecosystems: [npm, pypi]
プロキシはアーティファクトのバイト列をスキャナにアップロードすることはありません。各スキャナにはパッケージメタデータと短命な署名付きURLが通知され、スキャナはプロキシ自身のストレージからバイト列を取得します。スキャナは並行して実行され、blockモードのスキャナが最初にnot-allowedの判定を報告した時点で即座に勝者となり、残りはキャンセルされます。完全な設定リファレンスとスキャナのHTTPコントラクトについてはdocs/configuration.mdを参照してください。
対応レジストリ
| レジストリ | 言語/プラットフォーム | クールダウン | 完了 |
|---|---|---|---|
| npm | JavaScript | はい | ✓ |
| Cargo | Rust | はい | ✓ |
| RubyGems | Ruby | はい | ✓ |
| Go proxy | Go | ✓ | |
| Hex | Elixir | はい* | ✓ |
| pub.dev | Dart | はい | ✓ |
| PyPI | Python | はい | ✓ |
| Maven | Java | ✓ | |
| Gradle Build Cache | Java/Kotlin | ✓ | |
| NuGet | .NET | はい | ✓ |
| Composer | PHP | はい | ✓ |
| Conan | C/C++ | ✓ | |
| Conda | Python/R | はい | ✓ |
| CRAN | R | ✓ | |
| Julia | Julia | ✓ | |
| Swift | Swift | ✓ | |
| Container | Docker/OCI | ✓ | |
| Homebrew | macOS/Linux | ✓ | |
| Debian | Debian/Ubuntu | ✓ | |
| RPM | RHEL/Fedora | ✓ | |
| Alpine | Alpine Linux | ✓ | |
| Arch | Arch Linux | ✗ | |
| Chef | Chef | ✗ | |
| Generic | Any | ✓ | |
| Helm | Kubernetes | ✓ | |
| Vagrant | Vagrant | ✗ |
クールダウンにはメタデータ内の公開タイムスタンプが必要です。クールダウン列に「はい」がないレジストリは、タイムスタンプを公開していないか、まだ対応が完了していないかのいずれかです。
* Hexのクールダウンは、プロキシがprotobufペイロードを再エンコードするため、レジストリ署名検証を無効化する(HEX_NO_VERIFY_REPO_ORIGIN=1)必要があります。
インストール
brew install git-pkgs/git-pkgs/proxy
または、releases page からバイナリをダウンロードしてください。
Helm
GHCR からチャートをインストールし、パッケージマネージャークライアントがプロキシに到達するために使用する公開 URL を設定します:
helm install proxy oci://ghcr.io/git-pkgs/charts/proxy \
--set config.data.base_url=https://proxy.example.com
デフォルトのチャートは、/data 配下で SQLite とファイルシステムのアーティファクトストレージを使用し、10 GiB の永続ボリュームに支えられた 1 つのレプリカをデプロイします。イングレス、外部データベース、オブジェクトストレージの設定オプションについては
deploy/charts/proxy/values.yaml を参照してください。
クイックスタート
# Build from source
go build -o proxy ./cmd/proxy
# Run with defaults (listens on :8080)
./proxy
# Run with custom settings
./proxy -listen :3000 -base-url https://proxy.example.com
プロキシが起動しました。パッケージマネージャーを設定してこれを使用してください。
OpenAPI (Swagger)
このリポジトリでは、swaggo を使用してアノテーション付きハンドラから OpenAPI 仕様を生成します。
仕様を生成します:
go install github.com/swaggo/swag/cmd/swag@latest
go generate ./internal/server
生成されたファイルは docs/swagger/ に書き込まれます。
プロキシが実行中の場合は、以下からライブスペックを取得します:
http://localhost:8080/openapi.json
または、http://localhost:8080 を設定済みのベース URL に置き換えてください。このリンクはダッシュボードにも表示されます。
パッケージマネージャーの設定
npm
~/.npmrc を作成または編集します:
registry=http://localhost:8080/npm/
または .npmrc でプロジェクトごとに設定します:
registry=http://localhost:8080/npm/
または環境変数を使用します:
npm_config_registry=http://localhost:8080/npm/ npm install
npm audit、pnpm audit、yarn npm audit、npm audit signatures はプロキシ経由で動作します。audit および署名鍵のエンドポイントは、設定された上流レジストリに転送され、上流の認証が適用されます。したがって、アドバイザリはプロキシ自身の脆弱性データではなく上流のデータベースから取得され、cooldown によって保留されたバージョンはレポートから除外されません。
Cargo
~/.cargo/config.toml を作成または編集します:
[source.crates-io]
replace-with = "proxy"
[source.proxy]
registry = "sparse+http://localhost:8080/cargo/"
プロジェクトルートの .cargo/config.toml でプロジェクトごとに設定することもできます。
RubyGems / Bundler
Gemfile で gem ソースを設定します:
source "http://localhost:8080/gem"
グローバルに設定する場合:
gem sources --add http://localhost:8080/gem/
bundle config mirror.https://rubygems.org http://localhost:8080/gem
Goモジュール
GOPROXY環境変数を設定します:
export GOPROXY=http://localhost:8080/go,direct
または永続化のためにシェルプロファイルに記述します。
Homebrew
Homebrew の JSON API とアーティファクトドメインをプロキシに向けます:
export HOMEBREW_API_DOMAIN=http://localhost:8080/homebrew
export HOMEBREW_ARTIFACT_DOMAIN=http://localhost:8080
アーティファクトドメインは /v2/homebrew/core/ 配下のマニフェストとボトルブロブをプロキシします。GHCR ルーティングはそのリポジトリに限定されます。ソースアーカイブ、cask アプリケーションのダウンロード、カスタム tap アーティファクト、およびレガシーなフラットファイルボトルミラーは、Homebrew の通常のフォールバック URL を使用します。HOMEBREW_ARTIFACT_DOMAIN_NO_FALLBACK を未設定のままにしてフォールバックを有効に保ちます。
cache_metadata を有効にするか、PROXY_CACHE_METADATA=true を設定して、オフラインフォールバック用に Homebrew JSON API レスポンスを保持します。ボトルブロブとその OCI マニフェストは、この設定なしでキャッシュされます。
アップストリームは、JSON API の場合はデフォルトで https://formulae.brew.sh/api、アーティファクトの場合は https://ghcr.io になります。このプロキシを別のプロキシにチェーンするには、その Homebrew エンドポイントをアップストリームとして設定します:
upstream:
homebrew_api: "https://upstream-proxy.example.com/homebrew"
homebrew_artifact: "https://upstream-proxy.example.com"
対応する環境変数は PROXY_UPSTREAM_HOMEBREW_API と PROXY_UPSTREAM_HOMEBREW_ARTIFACT です。
Hex (Elixir)
~/.hex/hex.config で設定します:
{default_url, <<"http://localhost:8080/hex">>}.
または環境変数を設定します:
export HEX_MIRROR=http://localhost:8080/hex
pub.dev (Dart/Flutter)
環境変数 PUB_HOSTED_URL を設定します:
export PUB_HOSTED_URL=http://localhost:8080/pub
PyPI (pip)
pip をプロキシを使用するように設定します:
pip install --index-url http://localhost:8080/pypi/simple/ package_name
または ~/.pip/pip.conf に設定します:
[global]
index-url = http://localhost:8080/pypi/simple/
Maven
~/.m2/settings.xml に以下を追加します:
<settings>
<mirrors>
<mirror>
<id>proxy</id>
<mirrorOf>central</mirrorOf>
<url>http://localhost:8080/maven/</url>
</mirror>
</mirrors>
</settings>
/maven/ エンドポイントは、プライマリ上流として Maven Central を使用し、プライマリ上流が not found を返した場合、Gradle プラグインマーカーのメタデータおよび関連アーティファクトについて Gradle Plugin Portal にフォールバックします。
同じプロキシエンドポイント経由での Gradle プラグイン解決の場合:
pluginManagement {
repositories {
maven(url = "http://localhost:8080/maven/")
}
}
Gradle HTTP ビルドキャッシュ
settings.gradle(.kts) で設定します:
buildCache {
local {
enabled = false
}
remote<HttpBuildCache> {
url = uri("http://localhost:8080/gradle/")
push = true
}
}
NuGet
nuget.config で設定します:
<configuration>
<packageSources>
<clear />
<add key="proxy" value="http://localhost:8080/nuget/v3/index.json" />
</packageSources>
</configuration>
またはCLIを使用します:
dotnet nuget add source http://localhost:8080/nuget/v3/index.json -n proxy
Composer (PHP)
composer.json で設定します:
{
"repositories": [
{
"type": "composer",
"url": "http://localhost:8080/composer"
}
]
}
またはグローバルに設定します: