अपडेट पर वापस जाएँ
New releaseAug 31, 2026

proxy v0.7.0

पैकेज रजिस्ट्रियों के लिए एक हल्का-फुल्का कैशिंग प्रॉक्सी।

साझा करें

git-pkgs प्रॉक्सी

पैकेज रजिस्ट्रियों के लिए एक कैशिंग प्रॉक्सी। आर्टिफैक्ट्स को स्थानीय रूप से कैश करके पैकेज डाउनलोड को तेज़ करता है, बैंडविड्थ उपयोग को कम करता है और विश्वसनीयता में सुधार करता है।

संस्करण कूलडाउन

अधिकांश सप्लाई चेन हमले गति पर निर्भर करते हैं: एक दुर्भावनापूर्ण संस्करण प्रकाशित होता है और किसी के ध्यान में आने से पहले मिनटों के भीतर स्वचालित पाइपलाइनों द्वारा उपभोग कर लिया जाता है। कूलडाउन सुविधा नए प्रकाशित संस्करणों में एक क्वारंटीन अवधि जोड़ती है। जब सक्षम होता है, तो प्रॉक्सी मेटाडेटा प्रतिक्रियाओं से संस्करणों को हटा देता है जब तक कि वे एक कॉन्फ़िगर करने योग्य सीमा से अधिक पुराने न हो जाएं।```yaml 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` प्रकाशित करता है, तो आपके बिल्ड `4.17.21` का उपयोग करते रहते हैं जब तक कि 3 दिन न बीत जाएं। यदि नया रिलीज़ समझौता हो जाता है, तो आप कभी उजागर नहीं हुए थे।

समाधान क्रम: पैकेज ओवरराइड, फिर इकोसिस्टम ओवरराइड, फिर वैश्विक डिफ़ॉल्ट। यह आपको एक रूढ़िवादी डिफ़ॉल्ट सेट करने और उन पैकेजों के लिए अपवाद बनाने की अनुमति देता है जहां आपको तेज़ अपडेट की आवश्यकता होती है। पूर्ण कॉन्फ़िग संदर्भ के लिए [docs/configuration.md](https://github.com/git-pkgs/proxy/blob/main/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 | | ✓ |
| Container | Docker/OCI | | ✓ |
| Debian | Debian/Ubuntu | | ✓ |
| RPM | RHEL/Fedora | | ✓ |
| Alpine | Alpine Linux | | ✗ |
| Arch | Arch Linux | | ✗ |
| Chef | Chef | | ✗ |
| Generic | कोई भी | | ✗ |
| Helm | Kubernetes | | ✗ |
| Swift | Swift | | ✗ |
| Vagrant | Vagrant | | ✗ |

कूलडाउन के लिए मेटाडेटा में प्रकाशन टाइमस्टैम्प की आवश्यकता होती है। कूलडाउन कॉलम में "हाँ" के बिना रजिस्ट्रियां या तो टाइमस्टैम्प उजागर नहीं करती हैं या अभी तक जुड़ी नहीं हैं।

\* Hex कूलडाउन के लिए रजिस्ट्री हस्ताक्षर सत्यापन अक्षम करना आवश्यक है (`HEX_NO_VERIFY_REPO_ORIGIN=1`) क्योंकि प्रॉक्सी प्रोटोबफ़ पेलोड को फिर से एनकोड करता है।

## इंस्टॉल```bash
brew install git-pkgs/git-pkgs/proxy

या releases page से एक बाइनरी डाउनलोड करें।

Quick Start```bash

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)

यह रिपॉजिटरी एनोटेटेड हैंडलर्स से OpenAPI स्पेक उत्पन्न करने के लिए swaggo का उपयोग करती है।

स्पेक उत्पन्न करें:```bash
go install github.com/swaggo/swag/cmd/swag@latest
go generate ./internal/server

Generated files are written to docs/swagger/.

जब प्रॉक्सी चल रहा हो, तो लाइव स्पेक यहाँ से प्राप्त करें:

  • http://localhost:8080/openapi.json

या http://localhost:8080 को अपने कॉन्फ़िगर किए गए बेस URL से बदलें। यह लिंक डैशबोर्ड पर भी दिखाया गया है।

पैकेज मैनेजर कॉन्फ़िगर करना

npm

~/.npmrc बनाएं या संपादित करें:``` registry=http://localhost:8080/npm/

Or set per-project in `.npmrc`:

(यह पंक्ति कोड/कॉन्फ़िगरेशन संदर्भ में है, इसलिए इसे अपरिवर्तित रखा गया है।)```
registry=http://localhost:8080/npm/

या पर्यावरण चर का उपयोग करें:```bash npm_config_registry=http://localhost:8080/npm/ npm install

### कार्गो

`~/.cargo/config.toml` बनाएं या संपादित करें:```toml
[source.crates-io]
replace-with = "proxy"

[source.proxy]
registry = "sparse+http://localhost:8080/cargo/"

Or set per-project in .cargo/config.toml in your project root.

RubyGems / Bundler

Set the gem source in your Gemfile:```ruby source "http://localhost:8080/gem"

या वैश्विक रूप से कॉन्फ़िगर करें:```bash
gem sources --add http://localhost:8080/gem/
bundle config mirror.https://rubygems.org http://localhost:8080/gem

Go मॉड्यूल

GOPROXY पर्यावरण चर सेट करें:```bash export GOPROXY=http://localhost:8080/go,direct

Or in your shell profile for persistence.

### Hex (Elixir)

`~/.hex/hex.config` में कॉन्फ़िगर करें:```erlang
{default_url, <<"http://localhost:8080/hex">>}.

या पर्यावरण चर सेट करें:```bash export HEX_MIRROR=http://localhost:8080/hex

### pub.dev (Dart/Flutter)

`PUB_HOSTED_URL` पर्यावरण चर सेट करें:```bash
export PUB_HOSTED_URL=http://localhost:8080/pub

PyPI (pip)

प्रॉक्सी का उपयोग करने के लिए pip को कॉन्फ़िगर करें:```bash pip install --index-url http://localhost:8080/pypi/simple/ package_name

Or set in `~/.pip/pip.conf`:

(यह पंक्ति पहले से ही अंग्रेज़ी में है और इसमें कोई अनुवाद योग्य प्राकृतिक भाषा पाठ नहीं है। इसे यथावत रखा गया है।)```ini
[global]
index-url = http://localhost:8080/pypi/simple/

Maven

अपने ~/.m2/settings.xml में जोड़ें:```xml proxy central http://localhost:8080/maven/

`/maven/` एंडपॉइंट Maven Central को प्राथमिक अपस्ट्रीम के रूप में उपयोग करता है और जब प्राथमिक अपस्ट्रीम नहीं मिलता है, तो Gradle प्लगइन मार्कर मेटाडेटा और संबंधित आर्टिफैक्ट्स के लिए Gradle Plugin Portal पर फॉलबैक करता है।

उसी प्रॉक्सी एंडपॉइंट के माध्यम से Gradle प्लगइन रिज़ॉल्यूशन के लिए:```kotlin
pluginManagement {
  repositories {
    maven(url = "http://localhost:8080/maven/")
  }
}

Gradle HTTP Build Cache

settings.gradle(.kts) में कॉन्फ़िगर करें:```kotlin buildCache { local { enabled = false } remote { url = uri("http://localhost:8080/gradle/") push = true } }

### NuGet

`nuget.config` में कॉन्फ़िगर करें:```xml
<configuration>
  <packageSources>
    <clear />
    <add key="proxy" value="http://localhost:8080/nuget/v3/index.json" />
  </packageSources>
</configuration>

या CLI का उपयोग करें:```bash dotnet nuget add source http://localhost:8080/nuget/v3/index.json -n proxy

### Composer (PHP)

`composer.json` में कॉन्फ़िगर करें:```json
{
    "repositories": [
        {
            "type": "composer",
            "url": "http://localhost:8080/composer"
        }
    ]
}

या वैश्विक रूप से सेट करें:```bash composer config -g repositories.proxy composer http://localhost:8080/composer

### Conan (C/C++)

प्रॉक्सी को रिमोट के रूप में जोड़ें:```bash
conan remote add proxy http://localhost:8080/conan
conan remote disable conancenter

Or ~/.conan2/remotes.json में कॉन्फ़िगर करें।

Conda

~/.condarc में कॉन्फ़िगर करें:```yaml channels:

या कमांड के माध्यम से सेट करें:```bash
conda config --add channels http://localhost:8080/conda/main

CRAN (R)

R में रिपॉजिटरी सेट करें:```r options(repos = c(CRAN = "http://localhost:8080/cran"))

Or in `~/.Rprofile` for persistence:```r
local({
  r <- getOption("repos")
  r["CRAN"] <- "http://localhost:8080/cran"
  options(repos = r)
})

Julia

Julia शुरू करने से पहले Pkg सर्वर सेट करें:```bash export JULIA_PKG_SERVER=http://localhost:8080/julia

या चालू सत्र के अंदर:```julia
ENV["JULIA_PKG_SERVER"] = "http://localhost:8080/julia"
using Pkg; Pkg.update()

Docker / कंटेनर रजिस्ट्री

Docker को /etc/docker/daemon.json में प्रॉक्सी को रजिस्ट्री मिरर के रूप में उपयोग करने के लिए कॉन्फ़िगर करें:```json { "registry-mirrors": ["http://localhost:8080"] }

तब Docker को पुनः आरंभ करें:```bash
sudo systemctl restart docker

या छवियों को सीधे खींचें:```bash docker pull localhost:8080/library/nginx:latest

### Helm

प्रत्येक HTTP चार्ट रिपॉजिटरी को एक नाम के साथ कॉन्फ़िगर करें, फिर संबंधित प्रॉक्सी
URL को Helm में जोड़ें:```yaml
upstream:
  helm:
    bitnami: "https://charts.bitnami.com/bitnami"

[INST] I need to translate this content from English to Hindi while preserving all markdown formatting, code blocks, and technical terms. Let me translate the natural language text only.

Since the input appears to be empty (no content was provided after "INPUT:"), I cannot produce a translation. Please provide the actual content to translate. [/INST]```bash helm repo add bitnami http://localhost:8080/helm/bitnami helm repo update helm pull bitnami/nginx

प्रॉक्सी `index.yaml` को सामान्य मेटाडेटा-कैश सेटिंग्स का उपयोग करके कैश करता है और
इंडेक्स से उनके SHA-256 डाइजेस्ट को सत्यापित करने के बाद चार्ट आर्काइव्स को कैश करता है।

OCI रजिस्ट्री में संग्रहीत चार्ट्स के लिए, एक नामित OCI अपस्ट्रीम कॉन्फ़िगर करें और
चार्ट संदर्भ में आरक्षित `upstream/{name}` उपसर्ग जोड़ें:```yaml
upstream:
  oci:
    ghcr: "https://ghcr.io"

यहाँ आपके लिए अनुवाद है:

## स्थापना

### आवश्यक शर्तें

- Python 3.8+
- pip

### चरण-दर-चरण स्थापना

```bash
git clone https://github.com/example/tool.git
cd tool
pip install -r requirements.txt

वैकल्पिक रूप से, आप इसे pip के माध्यम से सीधे स्थापित कर सकते हैं:

pip install tool-name

उपयोग

मूल उपयोग

tool-name --target example.com

उन्नत विकल्प

tool-name --target example.com --verbose --output results.json

कॉन्फ़िगरेशन

टूल config.yaml फ़ाइल का उपयोग करके कॉन्फ़िगर किया जा सकता है। मुख्य विकल्प:

target: example.com
threads: 10
timeout: 30
output: results.json

योगदान

योगदान का स्वागत है! कृपया सुनिश्चित करें कि आप योगदान दिशानिर्देश का पालन करते हैं।

लाइसेंस

यह परियोजना MIT लाइसेंस के अंतर्गत लाइसेंस प्राप्त है।

helm pull oci://localhost:8080/upstream/ghcr/owner/charts/mychart --version 1.0.0 --plain-http
```
### Debian / APT

`/etc/apt/sources.list.d/proxy.list` में प्रॉक्सी का उपयोग करने के लिए APT को कॉन्फ़िगर करें:```
deb http://localhost:8080/debian stable main contrib
```
अपनी मौजूदा sources.list प्रविष्टियों को बदलें, फिर:```bash
sudo apt update
```
अपस्ट्रीम डिफ़ॉल्ट रूप से `http://deb.debian.org/debian` होता है। किसी अलग APT रिपॉज़िटरी (जैसे Ubuntu) को प्रॉक्सी करने के लिए, कॉन्फ़िग फ़ाइल में `upstream.debian` या एनवायरनमेंट में `PROXY_UPSTREAM_DEBIAN` सेट करें:```yaml
upstream:
  debian: "http://archive.ubuntu.com/ubuntu"
```
### RPM / Yum / DNF

`/etc/yum.repos.d/proxy.repo` में yum/dnf को प्रॉक्सी उपयोग करने के लिए कॉन्फ़िगर करें:```ini
[proxy-fedora]
name=Fedora via Proxy
baseurl=http://localhost:8080/rpm/releases/$releasever/Everything/$basearch/os/
enabled=1
gpgcheck=0
```
तब:```bash
sudo dnf clean all
sudo dnf update
```
## कॉन्फ़िगरेशन

प्रॉक्सी को निम्नलिखित तरीकों से कॉन्फ़िगर किया जा सकता है:

1. कमांड लाइन फ़्लैग (सर्वोच्च प्राथमिकता)
2. पर्यावरण चर
3. कॉन्फ़िगरेशन फ़ाइल (YAML या JSON)

### कमांड लाइन फ़्लैग```
-config string           Path to configuration file
-listen string           Address to listen on (default ":8080")
-base-url string         Public URL of this proxy (default "http://localhost:8080")
-storage-url string      Storage URL (file://, s3://, gs://, azblob://)
-storage-path string     Path to artifact storage directory (deprecated, use -storage-url)
-database-driver string  Database driver: sqlite or postgres (default "sqlite")
-database-path string    Path to SQLite database file (default "./cache/proxy.db")
-database-url string     PostgreSQL connection URL
-log-level string        Log level: debug, info, warn, error (default "info")
-log-format string       Log format: text, json (default "text")
-access-log string       Path to the JSONL access log
-version                 Print version and exit
```
### पर्यावरण चर```bash
PROXY_LISTEN=:8080
PROXY_BASE_URL=http://localhost:8080
PROXY_UI_URL=http://localhost:8080  # Optional; defaults to PROXY_BASE_URL
PROXY_STORAGE_URL=file:///var/cache/proxy/artifacts
PROXY_DATABASE_DRIVER=sqlite
PROXY_DATABASE_PATH=./cache/proxy.db
PROXY_DATABASE_URL=postgres://user:pass@localhost/proxy?sslmode=disable
PROXY_LOG_LEVEL=info
PROXY_LOG_FORMAT=text
PROXY_ACCESS_LOG_PATH=/var/log/proxy/access.jsonl
```
### कॉन्फ़िगरेशन फ़ाइल```yaml
listen: ":8080"
base_url: "http://localhost:8080"

storage:
  url: "file:///var/cache/proxy/artifacts"
  max_size: "10GB"  # Optional: evict LRU when exceeded

database:
  driver: "sqlite"
  path: "/var/lib/proxy/cache.db"

log:
  level: "info"
  format: "text"

access_log:
  path: "/var/log/proxy/access.jsonl"  # Optional JSONL activity log

# Optional: override upstream URLs
upstream:
  npm: "https://registry.npmjs.org"
  cargo: "https://index.crates.io"

# Optional: version cooldown (see above)
cooldown:
  default: "3d"
```
See the [configuration reference](https://github.com/git-pkgs/proxy/blob/main/docs/configuration.md#upstream-registries) for every upstream key, environment variable, and default URL.

Run with config file:```bash
./proxy -config /etc/proxy/config.yaml
```
### PostgreSQL

SQLite डिफ़ॉल्ट है और सिंगल-नोड डिप्लॉयमेंट के लिए अच्छा काम करता है। मल्टी-नोड सेटअप के लिए या यदि आप मैनेज्ड डेटाबेस पसंद करते हैं, तो Postgres पर स्विच करें:```yaml
database:
  driver: "postgres"
  url: "postgres://user:password@localhost:5432/proxy?sslmode=disable"
```
या पर्यावरण चरों के माध्यम से:```bash
PROXY_DATABASE_DRIVER=postgres
PROXY_DATABASE_URL=postgres://user:password@localhost:5432/proxy?sslmode=disable
```
प्रॉक्सी पहली बार चलने पर टेबल स्वचालित रूप से बनाता है।

### S3 स्टोरेज

प्रॉक्सी कैश्ड आर्टिफैक्ट्स को स्थानीय फाइलसिस्टम के बजाय S3 या किसी भी S3-संगत सेवा (MinIO, R2, आदि) में स्टोर कर सकता है।```yaml
storage:
  url: "s3://my-bucket-name?region=us-east-1"
```
S3-संगत सेवाओं जैसे MinIO के लिए:```yaml
storage:
  url: "s3://my-bucket?endpoint=http://localhost:9000&disableSSL=true&s3ForcePathStyle=true"
```
AWS मानक पर्यावरण चर (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`) के माध्यम से क्रेडेंशियल सेट करें।

### Google Cloud Storage

प्रॉक्सी `gs://` URL स्कीम का उपयोग करके कैश किए गए आर्टिफैक्ट्स को GCS बकेट में संग्रहीत कर सकता है।```yaml
storage:
  url: "gs://my-bucket-name"
```
प्रमाणीकरण [एप्लिकेशन डिफ़ॉल्ट क्रेडेंशियल](https://docs.cloud.google.com/docs/authentication/application-default-credentials) का उपयोग करता है, जिसका अर्थ है कि कॉन्फ़िग या पर्यावरण में कोई क्रेडेंशियल एम्बेड करने की आवश्यकता नहीं है। समर्थित स्रोत, क्रम में:

- **GKE वर्कलोड आइडेंटिटी** — प्रॉक्सी चलाने वाले Kubernetes सेवा खाते को एक Google सेवा खाते से बाँधें जिसके पास बकेट पर `roles/storage.objectAdmin` हो। प्रॉक्सी वर्कलोड के टोकन का स्वचालित रूप से उपयोग करेगा।
- **संलग्न सेवा खाता** GCE, Cloud Run, Cloud Functions, आदि पर।
- **`GOOGLE_APPLICATION_CREDENTIALS`** पर्यावरण चर जो सेवा खाते की JSON कुंजी फ़ाइल की ओर इंगित करता है।
- **`gcloud auth application-default login`** स्थानीय विकास के लिए।

#### GKE वर्कलोड आइडेंटिटी सेटअप```bash
# 1. Create a Google service account
gcloud iam service-accounts create git-pkgs-proxy \
  --project=PROJECT_ID

# 2. Grant it access to the bucket
gsutil iam ch \
  serviceAccount:git-pkgs-proxy@PROJECT_ID.iam.gserviceaccount.com:objectAdmin \
  gs://my-bucket-name

# 3. Bind the Kubernetes service account to it
gcloud iam service-accounts add-iam-policy-binding \
  git-pkgs-proxy@PROJECT_ID.iam.gserviceaccount.com \
  --role=roles/iam.workloadIdentityUser \
  --member="serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"

# 4. Annotate the Kubernetes service account
kubectl annotate serviceaccount KSA_NAME \
  --namespace=NAMESPACE \
  iam.gke.io/gcp-service-account=git-pkgs-proxy@PROJECT_ID.iam.gserviceaccount.com
```
#### वर्कलोड आइडेंटिटी के साथ डायरेक्ट सर्व (साइन किए गए URL)

जब `direct_serve: true` सक्षम होता है, तो प्रॉक्सी प्री-साइन किए गए GCS URL पर HTTP 302 रीडायरेक्ट जारी करता है। वर्कलोड आइडेंटिटी कोई निजी कुंजी प्रदान नहीं करती है, इसलिए GCS बैकएंड [IAM क्रेडेंशियल्स `signBlob` API](https://docs.cloud.google.com/iam/docs/reference/credentials/rest/v1/projects.serviceAccounts/signBlob) को कॉल करता है। सेवा खाते को स्वयं पर token-creator भूमिका प्रदान करें:```bash
gcloud iam service-accounts add-iam-policy-binding \
  git-pkgs-proxy@PROJECT_ID.iam.gserviceaccount.com \
  --role=roles/iam.serviceAccountTokenCreator \
  --member="serviceAccount:git-pkgs-proxy@PROJECT_ID.iam.gserviceaccount.com"
```
## CLI कमांड

### serve (डिफ़ॉल्ट)

प्रॉक्सी सर्वर शुरू करें। यदि कोई कमांड निर्दिष्ट नहीं है, तो यह डिफ़ॉल्ट कमांड है।```bash
proxy serve [flags]
proxy [flags]  # same as 'proxy serve'
```
### mirror

PURL, SBOM फ़ाइलों, या संपूर्ण रजिस्ट्रियों से कैश को पहले से भरें। ऑफ़लाइन उपलब्धता सुनिश्चित करने या तैनाती से पहले कैश को गर्म करने के लिए उपयोगी।```bash
# Mirror specific package versions
proxy mirror pkg:npm/[email protected] pkg:cargo/[email protected]

# Mirror all versions of a package
proxy mirror pkg:npm/lodash

# Mirror from a CycloneDX or SPDX SBOM
proxy mirror --sbom sbom.cdx.json

# Preview what would be mirrored
proxy mirror --dry-run pkg:npm/lodash

# Control parallelism
proxy mirror --concurrency 8 pkg:npm/[email protected]
```
दर्पण कमांड `serve` के समान स्टोरेज और डेटाबेस फ्लैग स्वीकार करता है। पहले से कैश किए गए आर्टिफैक्ट छोड़ दिए जाते हैं।

सर्वर चल रहा होने पर एक मिरर API भी उपलब्ध है:```bash
# Start a mirror job
curl -X POST http://localhost:8080/api/mirror \
  -H "Content-Type: application/json" \
  -d '{"purls": ["pkg:npm/[email protected]"]}'

# Check job status
curl http://localhost:8080/api/mirror/mirror-1

# Cancel a running job
curl -X DELETE http://localhost:8080/api/mirror/mirror-1
```
### stats

सर्वर चलाए बिना कैश आँकड़े दिखाएँ।```bash
# Text output
proxy stats

# JSON output
proxy stats -json

# Custom database path
proxy stats -database-path /var/lib/proxy/cache.db

# With PostgreSQL
proxy stats -database-driver postgres -database-url postgres://user:pass@localhost/proxy

# Show top 20 most popular packages
proxy stats -popular 20
```
उदाहरण आउटपुट:```
Cache Statistics
================

Packages:   45
Versions:   128
Artifacts:  128
Total size: 892.4 MB
Total hits: 1547

Packages by ecosystem:
  npm        32
  cargo      13

Most popular packages:
   1. npm/lodash (342 hits, 24.7 KB)
   2. npm/react (198 hits, 89.3 KB)
   3. cargo/serde (156 hits, 234.1 KB)

Recently cached:
  npm/[email protected] (2024-01-15 14:32, 54.2 KB)
  cargo/[email protected] (2024-01-15 14:28, 412.8 KB)
```
## API एंडपॉइंट्स

### रजिस्ट्री प्रोटोकॉल

| एंडपॉइंट | विवरण |
|----------|-------------|
| `GET /` | डैशबोर्ड (वेब UI) |
| `GET /health` | हेल्थ चेक (JSON; HTTP 200 स्वस्थ, 503 अस्वस्थ) |
| `GET /stats` | कैश आँकड़े (JSON) |
| `GET /metrics` | Prometheus मेट्रिक्स |
| `GET /npm/*` | npm रजिस्ट्री प्रोटोकॉल |
| `GET /cargo/*` | Cargo स्पार्स इंडेक्स प्रोटोकॉल |
| `GET /gem/*` | RubyGems प्रोटोकॉल |
| `GET /go/*` | Go मॉड्यूल प्रॉक्सी प्रोटोकॉल |
| `GET /hex/*` | Hex.pm प्रोटोकॉल |
| `GET /pub/*` | pub.dev प्रोटोकॉल |
| `GET /pypi/*` | PyPI सिंपल/JSON API |
| `GET /maven/*` | Maven रिपॉजिटरी प्रोटोकॉल |
| `GET /nuget/*` | NuGet V3 API |
| `GET /composer/*` | Composer/Packagist प्रोटोकॉल |
| `GET /conan/*` | Conan C/C++ प्रोटोकॉल |
| `GET /conda/*` | Conda/Anaconda प्रोटोकॉल |
| `GET /cran/*` | CRAN (R) प्रोटोकॉल |
| `GET /julia/*` | Julia Pkg सर्वर प्रोटोकॉल |
| `GET /helm/{repository}/*` | HTTP Helm चार्ट रिपॉजिटरी प्रोटोकॉल |
| `GET /v2/*` | OCI/Docker रजिस्ट्री प्रोटोकॉल |
| `GET /debian/*` | Debian/APT रिपॉजिटरी प्रोटोकॉल |
| `GET /rpm/*` | RPM/Yum रिपॉजिटरी प्रोटोकॉल |

### मिरर API

| एंडपॉइंट | विवरण |
|----------|-------------|
| `POST /api/mirror` | मिरर जॉब शुरू करें (JSON बॉडी `purls` के साथ) |
| `GET /api/mirror/{id}` | जॉब की स्थिति और प्रगति प्राप्त करें |
| `DELETE /api/mirror/{id}` | चल रहे जॉब को रद्द करें |

### एनरिचमेंट API

प्रॉक्सी पैकेज मेटाडेटा एनरिचमेंट, भेद्यता स्कैनिंग और पुराने संस्करण का पता लगाने के लिए REST एंडपॉइंट्स प्रदान करता है।

| एंडपॉइंट | विवरण |
|----------|-------------|
| `GET /api/package/{ecosystem}/{name}` | पैकेज मेटाडेटा प्राप्त करें |
| `GET /api/package/{ecosystem}/{name}/{version}` | भेद्यताओं के साथ संस्करण मेटाडेटा प्राप्त करें |
| `GET /api/vulns/{ecosystem}/{name}` | किसी पैकेज के लिए सभी भेद्यताएँ प्राप्त करें |
| `GET /api/vulns/{ecosystem}/{name}/{version}` | किसी विशिष्ट संस्करण के लिए भेद्यताएँ प्राप्त करें |
| `POST /api/outdated` | पुराने संस्करणों के लिए कई पैकेजों की जाँच करें |
| `POST /api/bulk` | बल्क पैकेज मेटाडेटा लुकअप |

#### पैकेज मेटाडेटा प्राप्त करें```bash
curl http://localhost:8080/api/package/npm/lodash
```
The `-p` flag is used to specify the port number, and the `-t` flag is used to specify the target IP address. The `-m` flag is used to specify the mode, which can be `tcp`, `udp`, or `icmp`. The `-v` flag is used to enable verbose output, and the `-q` flag is used to enable quiet mode. The `-o` flag is used to specify the output file, and the `-f` flag is used to specify the format of the output file, which can be `txt`, `csv`, or `json`. The `-h` flag is used to display the help message.```json
{
  "ecosystem": "npm",
  "name": "lodash",
  "latest_version": "4.17.21",
  "license": "MIT",
  "license_category": "permissive",
  "description": "Lodash modular utilities",
  "homepage": "https://lodash.com/",
  "repository": "https://github.com/lodash/lodash",
  "registry_url": "https://registry.npmjs.org"
}
```
#### भेद्यताओं के साथ संस्करण प्राप्त करें```bash
curl http://localhost:8080/api/package/npm/lodash/4.17.0
```
यह टूल आपको अपने नेटवर्क पर सक्रिय डिवाइसों की खोज करने और उनके खुले पोर्ट्स की पहचान करने में मदद करता है। यह तेज़ और कुशल स्कैनिंग के लिए समानांतर प्रोसेसिंग का उपयोग करता है, जिससे बड़े नेटवर्कों का विश्लेषण भी कुछ ही सेकंड में पूरा किया जा सकता है।```json
{
  "package": {
    "ecosystem": "npm",
    "name": "lodash",
    "latest_version": "4.17.21",
    "license": "MIT",
    "license_category": "permissive"
  },
  "version": {
    "ecosystem": "npm",
    "name": "lodash",
    "version": "4.17.0",
    "license": "MIT",
    "published_at": "2016-06-17T03:59:56Z",
    "yanked": false,
    "is_outdated": true
  },
  "vulnerabilities": [
    {
      "id": "GHSA-p6mc-m468-83gw",
      "summary": "Prototype Pollution in lodash",
      "severity": "HIGH",
      "cvss_score": 7.4,
      "fixed_version": "4.17.12"
    }
  ],
  "is_outdated": true,
  "license_category": "permissive"
}
```
#### पुराने पैकेज जांचें```bash
curl -X POST http://localhost:8080/api/outdated \
  -H "Content-Type: application/json" \
  -d '{
    "packages": [
      {"ecosystem": "npm", "name": "lodash", "version": "4.17.0"},
      {"ecosystem": "pypi", "name": "requests", "version": "2.25.0"}
    ]
  }'
```
The `-p` flag is used to specify the port number, and the `-t` flag is used to specify the target IP address. The `-m` flag is used to specify the mode, which can be either `tcp` or `udp`. The `-s` flag is used to specify the source IP address, and the `-d` flag is used to specify the destination IP address. The `-c` flag is used to specify the number of packets to send, and the `-i` flag is used to specify the interval between packets. The `-v` flag is used to enable verbose output, and the `-h` flag is used to display the help message.```json
{
  "results": [
    {
      "ecosystem": "npm",
      "name": "lodash",
      "version": "4.17.0",
      "latest_version": "4.17.21",
      "is_outdated": true
    },
    {
      "ecosystem": "pypi",
      "name": "requests",
      "version": "2.25.0",
      "latest_version": "2.31.0",
      "is_outdated": true
    }
  ]
}
```
#### बल्क पैकेज लुकअप```bash
curl -X POST http://localhost:8080/api/bulk \
  -H "Content-Type: application/json" \
  -d '{
    "purls": [
      "pkg:npm/[email protected]",
      "pkg:pypi/[email protected]"
    ]
  }'
```
यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पैकेज नाम, और तकनीकी पहचानकर्ता अपरिवर्तित रखे गए हैं, और सभी Markdown संरचना बिल्कुल वैसी ही बनी हुई है।

---

यहाँ दिए गए चंक का अनुवाद नीचे दिया गया है। ध्यान दें कि कोड, कमांड, फ़ाइल पथ, URL, पै```json
{
  "packages": {
    "pkg:npm/lodash": {
      "ecosystem": "npm",
      "name": "lodash",
      "latest_version": "4.17.21",
      "license": "MIT",
      "license_category": "permissive"
    },
    "pkg:pypi/requests": {
      "ecosystem": "pypi",
      "name": "requests",
      "latest_version": "2.31.0",
      "license": "Apache-2.0",
      "license_category": "permissive"
    }
  }
}
```
### स्टैट्स रिस्पॉन्स (HTTP एंडपॉइंट)```json
{
  "cached_artifacts": 142,
  "total_size_bytes": 523456789,
  "total_size": "499.2 MB",
  "storage_url": "file:///path/to/cache/artifacts",
  "database_path": "./cache/proxy.db"
}
```
## यह कैसे काम करता है

1. पैकेज मैनेजर प्रॉक्सी से पैकेज मेटाडेटा का अनुरोध करता है
2. प्रॉक्सी अपस्ट्रीम से मेटाडेटा प्राप्त करता है, आर्टिफैक्ट URL को प्रॉक्सी की ओर इंगित करने के लिए पुनर्लेखित करता है
3. पैकेज मैनेजर आर्टिफैक्ट (tarball, crate, आदि) का अनुरोध करता है
4. प्रॉक्सी स्थानीय कैश की जाँच करता है:
   - **कैश हिट**: स्थानीय स्टोरेज से परोसें
   - **कैश मिस**: अपस्ट्रीम से प्राप्त करें, स्थानीय रूप से संग्रहीत करें, क्लाइंट को परोसें
5. समान आर्टिफैक्ट के लिए बाद के अनुरोध कैश से परोसे जाते हैं```
┌─────────────┐     ┌─────────┐     ┌──────────┐
│   npm/cargo │────▶│  proxy  │────▶│ upstream │
│   client    │◀────│         │◀────│ registry │
└─────────────┘     └─────────┘     └──────────┘
                         │
                         ▼
                    ┌─────────┐
                    │  cache  │
                    │ storage │
                    └─────────┘
```
## वेब इंटरफ़ेस

प्रॉक्सी `/ui` के अंतर्गत एक वेब UI प्रदान करता है। किसी अलग फ्रंटएंड बिल्ड की आवश्यकता नहीं है — टेम्पलेट और एसेट बाइनरी में एम्बेडेड होते हैं। `GET /` `/ui/` पर रीडायरेक्ट करता है। UI अपने स्वयं के प्रीफ़िक्स के अंतर्गत माउंट किया गया है, ताकि एक रिवर्स प्रॉक्सी पैकेज एंडपॉइंट्स की तुलना में इस पर अलग एक्सेस नियम लागू कर सके (उदाहरण के लिए, `PathPrefix(/ui)` के लिए प्रमाणीकरण की आवश्यकता हो, जबकि `/npm`, `/pypi` आदि बिल्ड मशीनों के लिए खुले रहें)।

- **डैशबोर्ड** (`/ui/`) — कैश आँकड़े, लोकप्रिय पैकेज, हाल ही में कैश किए गए आर्टिफैक्ट, और भेद्यता अवलोकन।
- **इंस्टॉल गाइड** (`/ui/install`) — प्रति-इकोसिस्टम कॉन्फ़िगरेशन निर्देश, ताकि आपको उन्हें यहाँ देखने की आवश्यकता न पड़े।
- **पैकेज ब्राउज़र** (`/ui/packages`) — इकोसिस्टम द्वारा फ़िल्टरिंग और हिट्स, आकार, नाम, या भेद्यता संख्या द्वारा सॉर्टिंग के साथ सभी कैश किए गए पैकेज ब्राउज़ करें।
- **खोज** (`/ui/search?q=...`) — नाम द्वारा कैश किए गए पैकेज खोजें।
- **पैकेज विवरण** (`/ui/package/{ecosystem}/{name}`) — किसी पैकेज के लिए मेटाडेटा, लाइसेंस, भेद्यताएँ, और संस्करण सूची। आप तुलना करने के लिए दो संस्करण चुन सकते हैं।
- **संस्करण विवरण** (`/ui/package/{ecosystem}/{name}/{version}`) — प्रति-संस्करण मेटाडेटा, इंटीग्रिटी हैश, आर्टिफैक्ट कैश स्थिति, और हिट गणनाएँ।
- **स्रोत ब्राउज़र** (`/ui/package/{ecosystem}/{name}/{version}/browse`) — टेक्स्ट फ़ाइलों के लिए सिंटैक्स हाइलाइटिंग और छवि पूर्वावलोकन के साथ कैश किए गए आर्काइव के अंदर फ़ाइलें ब्राउज़ करें।
- **संस्करण अंतर** (`/ui/package/{ecosystem}/{name}/compare/{v1}...{v2}`) — दो कैश किए गए संस्करणों का साइड-बाय-साइड अंतर, जिसमें जोड़ी गई, हटाई गई, और बदली गई फ़ाइलें दिखाई जाती हैं।

## मॉनिटरिंग

प्रॉक्सी `GET /metrics` पर Prometheus मेट्रिक्स उजागर करता है। सभी मेट्रिक नाम `proxy_` प्रीफ़िक्स से शुरू होते हैं।

| मेट्रिक | प्रकार | लेबल | विवरण |
|--------|------|--------|-------------|
| `proxy_requests_total` | counter | `ecosystem`, `status` | पैकेज इकोसिस्टम और HTTP स्थिति द्वारा प्रॉक्सी प्रतिक्रियाएँ |
| `proxy_request_duration_seconds` | histogram | `ecosystem`, `status` | प्रॉक्सी अनुरोध अवधि |
| `proxy_cache_hits_total` | counter | `ecosystem` | कैश हिट्स |
| `proxy_cache_misses_total` | counter | `ecosystem` | कैश मिसेज़ |
| `proxy_cache_size_bytes` | gauge | | कैश किए गए आर्टिफैक्ट का कुल आकार |
| `proxy_cached_artifacts_total` | gauge | | कैश किए गए आर्टिफैक्ट की संख्या |
| `proxy_upstream_fetch_duration_seconds` | histogram | `ecosystem` | अपस्ट्रीम से लाने में बिताया गया समय |
| `proxy_upstream_errors_total` | counter | `ecosystem`, `error_type` | अपस्ट्रीम लाने में विफलताएँ |
| `proxy_storage_operation_duration_seconds` | histogram | `operation` | स्टोरेज रीड/राइट विलंबता |
| `proxy_storage_errors_total` | counter | `operation` | स्टोरेज रीड/राइट विफलताएँ |
| `proxy_active_requests` | gauge | | इन-फ़्लाइट अनुरोध |
| `proxy_health_probe_failures_total` | counter | `step` | विफल चरण (`write`, `size`, `read`, `verify`, `delete`) द्वारा स्टोरेज हेल्थ प्रोब विफलताएँ। |

कैश आकार और आर्टिफैक्ट संख्या हर 60 सेकंड में ताज़ा की जाती है। शेष मेट्रिक्स प्रत्येक अनुरोध पर अपडेट होती हैं।

### स्वास्थ्य जाँच

`/health` सबसिस्टम स्वास्थ्य की एक संरचित JSON रिपोर्ट लौटाता है। यदि सभी जाँचें पास होती हैं तो HTTP 200; यदि कोई भी विफल होती है तो 503।```json
{
  "status": "ok",
  "checks": {
    "database": {"status": "ok"},
    "storage":  {"status": "ok"}
  }
}
```
विफल जाँचों में एक `"error"` फ़ील्ड शामिल होता है। स्टोरेज विफलताओं में एक `"step"` फ़ील्ड भी शामिल होता है जो यह पहचानता है कि कौन सा प्रोब चरण विफल हुआ (`write`, `size`, `read`, `verify`, `delete`)। जब डेटाबेस जाँच विफल होती है, तो स्टोरेज प्रविष्टि `{"status": "skipped"}` रिपोर्ट करती है ताकि प्रतिक्रिया हमेशा समान कुंजी सेट ले जाए।

स्टोरेज प्रोब परिणाम `health.storage_probe_interval` (डिफ़ॉल्ट 30s) के लिए कैश किए जाते हैं ताकि दूरस्थ बैकएंड की जाँच की लागत सीमित रहे। एक प्रोब आंतरिक म्यूटेक्स को 10 सेकंड तक (हार्डकोडेड प्रति-प्रोब टाइमआउट) रोकता है, इसलिए `/health` को Kubernetes **readiness** प्रोब के रूप में इरादा है, न कि liveness प्रोब के रूप में — एक धीमा S3 राउंड-ट्रिप पॉड को रोटेशन से बाहर खींचना चाहिए, उसे पुनः आरंभ नहीं करना चाहिए।

Prometheus के लिए स्क्रेप कॉन्फ़िगरेशन:```yaml
scrape_configs:
  - job_name: git-pkgs-proxy
    static_configs:
      - targets: ["localhost:8080"]
```
## प्रोडक्शन डिप्लॉयमेंट

### Systemd सर्विस

`/etc/systemd/system/proxy.service` बनाएं:```ini
[Unit]
Description=git-pkgs proxy
After=network.target

[Service]
Type=simple
User=proxy
ExecStart=/usr/local/bin/proxy -config /etc/proxy/config.yaml
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
```
Enable और start करें:```bash
sudo systemctl enable proxy
sudo systemctl start proxy
```
### Docker

रिपॉजिटरी में एक Dockerfile शामिल है। बिल्ड और रन करें:```bash
docker build -t proxy .
docker run -p 8080:8080 -v proxy-data:/data proxy
```
Postgres और S3 के साथ:```bash
docker run -p 8080:8080 \
  -e PROXY_DATABASE_DRIVER=postgres \
  -e PROXY_DATABASE_URL=postgres://user:pass@db:5432/proxy \
  -e PROXY_STORAGE_URL=s3://my-bucket?region=us-east-1 \
  -e AWS_ACCESS_KEY_ID=... \
  -e AWS_SECRET_ACCESS_KEY=... \
  proxy
```
### रिवर्स प्रॉक्सी के पीछे

nginx, Apache, या किसी अन्य रिवर्स प्रॉक्सी के पीछे चलाते समय, `base_url` को अपने सार्वजनिक URL पर सेट करें:```yaml
base_url: "https://proxy.example.com"
```
यदि UI पैकेज एंडपॉइंट्स से भिन्न होस्टनाम पर पहुँचा जाता है — उदाहरण के लिए, UI किसी डोमेन पर सार्वजनिक रूप से उजागर होता है जबकि बिल्ड मशीनें Docker नेटवर्क alias का उपयोग करती हैं — तो `ui_base_url` को अलग से सेट करें। `base_url` वह URL है जिसका उपयोग पैकेज मैनेजर और मेटाडेटा रीराइटिंग करते हैं; `ui_base_url` वह URL है जो वेब UI देखने वाले मनुष्यों को विज्ञापित किया जाता है (canonical/`og:url` टैग और इंस्टॉल गाइड बैनर):```yaml
base_url: "http://pkg-proxy:8080"        # internal alias for build machines
ui_base_url: "https://proxy.example.com/ui"  # public UI URL
```
जब अनसेट हो, `ui_base_url` डिफ़ॉल्ट रूप से `base_url` पर सेट होता है।

> **चेतावनी:** प्रॉक्सी UI और पैकेज एंडपॉइंट्स को एक ही लिसनर पर सर्व करता है। `ui_base_url` सेट करने से केवल वह URL बदलता है जो UI मनुष्यों को विज्ञापित करता है; यह पैकेज एंडपॉइंट्स को उसी होस्टनेम और पोर्ट पर पहुंच योग्य होने से नहीं रोकता। जब प्रॉक्सी को सार्वजनिक रिवर्स प्रॉक्सी के सामने रखा जाता है, तो सार्वजनिक रूट को `PathPrefix(/ui)` (या आपके प्रॉक्सी के समकक्ष) तक सीमित करें, अन्यथा `/npm`, `/pypi`, और अन्य पैकेज एंडपॉइंट्स UI के साथ-साथ उजागर रहते हैं।

nginx उदाहरण, सार्वजनिक होस्ट को UI तक सीमित करते हुए पैकेज एंडपॉइंट्स को केवल आंतरिक लिसनर पर पहुंच योग्य छोड़ना:```nginx
server {
    listen 443 ssl;
    server_name proxy.example.com;

    location /ui/ {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_buffering off;
    }

    location / {
        return 404;
    }
}
```
Traefik उदाहरण `PathPrefix(/ui)` का उपयोग करते हुए ताकि सार्वजनिक राउटर केवल UI ट्रैफ़िक से मेल खाए:```yaml
labels:
  traefik.enable: "true"
  traefik.http.services.pkg-proxy.loadbalancer.server.port: "8080"
  traefik.http.routers.pkg-proxy.rule: "Host(`proxy.example.com`) && PathPrefix(`/ui`)"
  traefik.http.routers.pkg-proxy.entrypoints: "websecure"
```
## कैश प्रबंधन

प्रॉक्सी कॉन्फ़िगर किए गए स्टोरेज निर्देशिका में आर्टिफैक्ट्स को इस संरचना के साथ संग्रहीत करता है:```
cache/artifacts/
├── npm/
│   └── lodash/
│       └── 4.17.21/
│           └── lodash-4.17.21.tgz
├── cargo/
│   └── serde/
│       └── 1.0.193/
│           └── serde-1.0.193.crate
├── oci/
│   └── library/nginx/
│       └── sha256:abc123.../
│           └── sha256:abc123...
├── deb/
│   └── nginx/
│       └── 1.18.0-6/
│           └── nginx_1.18.0-6_amd64.deb
└── rpm/
    └── nginx/
        └── 1.24.0-1.fc39/
            └── nginx-1.24.0-1.fc39.x86_64.rpm
```
कैश मेटाडेटा SQLite (डिफ़ॉल्ट) या PostgreSQL में संग्रहीत होता है। स्थानीय कैश साफ़ करने के लिए:```bash
rm -rf ./cache/artifacts/*
rm ./cache/proxy.db
```
प्रॉक्सी अगली बार शुरू होने पर डेटाबेस को फिर से बनाएगा।

## स्रोत से निर्माण

आवश्यकताएँ:

- Go (प्रोजेक्ट संस्करण `go.mod` में घोषित है)```bash
git clone https://github.com/git-pkgs/proxy.git
cd proxy
go build -o proxy ./cmd/proxy
```
परीक्षण चलाएँ:```bash
go test ./...
```
## लाइसेंस

GPL-3.0-or-later

श्रेणियाँ