npm-registry erişilemez hale geldi - ve proje derlemesi durdu. Kurumsal ağlarda, sınırlı erişim olan bölgelerde veya katı bir güvenlik duvarı üzerinden çalışırken tanıdık bir durum. Bu kılavuzda, aynalara geçişten .npmrc dosyasında proxy ayarlarına kadar tüm çalışır yöntemleri inceleyeceğiz - böylece npm install tekrar hatasız çalışsın.
npm registry neden engelleniyor ve bu durumda ne oluyor
Resmi npm registry adresi https://registry.npmjs.org. Bu küresel bir CDN'dir, ancak birkaç nedenle erişilemez hale gelebilir ve her biri farklı bir yaklaşım gerektirir.
Registry'nin erişilemez olmasının başlıca nedenleri
- Kurumsal güvenlik duvarı - şirket, dış depolara doğrudan istekleri engeller, trafiği yalnızca iç proxy sunucusu üzerinden izin verir. Bu, bankalar, devlet kurumları ve büyük IT şirketlerinde standart bir uygulamadır.
- Coğrafi engelleme veya bölgesel kısıtlamalar - bazı ülkelerde ve bölgelerde npmjs.org'a erişim, internet servis sağlayıcısı veya devlet güvenlik duvarı düzeyinde kısıtlanmıştır.
- İnternete doğrudan çıkışı olmayan ofis ağı - izole ağ segmentlerinde çalışan makineler, dış kaynaklara doğrudan erişim sağlamaz, tüm trafik kurumsal geçit üzerinden geçer.
- Proxy ile zorunlu VPN tüneli - kurumsal VPN, tüm trafiği yönlendirir ve npm doğrudan registry'e erişemez.
- SSL denetimi ile ilgili sorunlar - kurumsal proxy, HTTPS trafiğini yakalar ve sertifikaları değiştirir, bu da
SELF_SIGNED_CERT_IN_CHAINveyaUNABLE_TO_VERIFY_LEAF_SIGNATUREgibi hatalara yol açar.
Engellenmiş registry ile ilgili tipik hatalar
npm ERR! code ECONNREFUSED npm ERR! errno ECONNREFUSED npm ERR! network request to https://registry.npmjs.org/react failed npm ERR! code ETIMEDOUT npm ERR! network This is a problem related to network connectivity. npm ERR! code CERT_HAS_EXPIRED npm ERR! code SELF_SIGNED_CERT_IN_CHAIN
Bu hata kodlarının her biri farklı bir sorunu gösterir: ECONNREFUSED - bağlantı güvenlik duvarı tarafından reddedildi, ETIMEDOUT - istek yanıtsız kalıyor (engellenmiş), sertifika hataları - SSL denetimi sorunu. Sorunun nedenini anlamak, çözüm yelpazesini daraltır.
npm registry aynaları: proxy olmadan hızlı bir geçiş
Engeli aşmanın en basit yolu, npm'i alternatif bir registry aynasına geçirmektir. Ayna, resmi registry ile aynı paketleri içerir, ancak farklı sunucularda ve alan adlarında bulunmaktadır. Bu, yalnızca registry.npmjs.org alanı engellendiğinde işe yarar, tüm HTTPS trafiği değil.
Popüler npm aynaları
| Ayna | URL | Özellikler |
|---|---|---|
| Taobao / npmmirror | https://registry.npmmirror.com |
Her 10 dakikada bir senkronizasyon, Asya'dan iyi hız |
| Yarn Berry ayna | https://registry.yarnpkg.com |
Yarn ekibi tarafından desteklenir, npm istemcisi ile uyumludur |
| Verdaccio (kendi barındırdığınız) | http://localhost:4873 |
Önbellek ile kendi registry, izole ağlarda çalışır |
| Nexus Repository | http://nexus.company.local/npm |
Kurumsal çözüm, paketleri proxy'ler ve önbelleğe alır |
| JFrog Artifactory | https://artifactory.company.com/npm |
Kurumsal düzey, bağımlılık denetimi, erişim kontrolü |
Registry nasıl değiştirilir
Tek bir komut için geçiş (küresel ayarları değiştirmeden):
# Alternatif registry üzerinden tek seferlik kurulum npm install react --registry https://registry.npmmirror.com # Mevcut kullanıcı için küresel olarak kur npm config set registry https://registry.npmmirror.com # Mevcut registry'yi kontrol et npm config get registry # Resmi registry'ye geri dön npm config set registry https://registry.npmjs.org
Önemli bir nokta: Eğer bir projede ayna kullanıyorsanız, bunu .npmrc dosyasına kaydetmek daha iyidir, böylece tüm ekip üyeleri projeyi klonladıklarında doğru yapılandırmayı otomatik olarak alırlar.
# Proje kökünde .npmrc registry=https://registry.npmmirror.com
.npmrc üzerinden proxy ayarı: tam sözdizimi
Ayna işe yaramadığında (örneğin, tüm dış HTTPS trafiği engellendiğinde), npm'e proxy sunucusunun adresini açıkça belirtmek gerekir. .npmrc dosyası, npm'in ana yapılandırma dosyasıdır ve proxy ayarları burada saklanır.
.npmrc dosyalarının konumu
npm, yapılandırmayı birkaç yerde arar - öncelik sırasına göre (en yüksekten en düşüğe):
- Proje -
/path/to/project/.npmrc- yalnızca bu projeye uygulanır - Kullanıcı -
~/.npmrc- sistemdeki mevcut kullanıcı için uygulanır - Küresel -
$PREFIX/etc/npmrc- tüm npm kurulumuna uygulanır - Yerleşik -
/path/to/npm/npmrc- npm'in varsayılan ayarları
.npmrc dosyasında proxy ayarlarının sözdizimi
# HTTP trafiği için proxy proxy=http://proxy.example.com:8080 # HTTPS trafiği için proxy (registry'e yapılan çoğu istek için kullanılır) https-proxy=http://proxy.example.com:8080 # Kimlik doğrulamalı proxy (kullanıcı:şifre URL içinde) proxy=http://username:[email protected]:8080 https-proxy=http://username:[email protected]:8080 # İstisnalar - proxy'yi atlayan adresler noproxy=localhost,127.0.0.1,internal.company.com
⚠️ HTTPS-proxy hakkında önemli bilgi
Dikkat: https-proxy parametresi, npm'in HTTPS isteklerini yapacağı proxy sunucusunun adresini belirtir. Proxy adresi http:// ile başlayabilir - bu normaldir. Çoğu kurumsal proxy, HTTP üzerinden bağlantıları kabul eder, ancak HTTPS'i CONNECT yöntemi ile tünelleme yeteneğine sahiptir.
npm config komutları ile proxy ayarlama
Dosyayı manuel olarak düzenlemeye alternatif olarak, npm config set komutunu kullanabilirsiniz. Bu, ayarları otomatik olarak kullanıcı ~/.npmrc dosyasına kaydedecektir:
# Proxy ayarlamak npm config set proxy http://proxy.example.com:8080 npm config set https-proxy http://proxy.example.com:8080 # Mevcut proxy ayarlarını kontrol et npm config get proxy npm config get https-proxy # Proxy ayarlarını sil (doğrudan bağlantıya geri dön) npm config delete proxy npm config delete https-proxy # Tüm npm yapılandırmasını görüntüle npm config list
npm için ortam değişkenleri ile proxy
npm, proxy için standart sistem ortam değişkenlerini otomatik olarak okur. Bu, CI/CD boru hatlarında, Docker konteynerlerinde ve yapılandırmanın ortam düzeyinde, dosya yerine ayarlandığı sistemlerde kullanışlıdır.
Standart ortam değişkenleri
# Linux / macOS - mevcut oturumda ayarlama export HTTP_PROXY=http://proxy.example.com:8080 export HTTPS_PROXY=http://proxy.example.com:8080 export NO_PROXY=localhost,127.0.0.1 # Küçük harfli versiyonlar (npm her ikisini de anlar) export http_proxy=http://proxy.example.com:8080 export https_proxy=http://proxy.example.com:8080 # Windows (Komut İstemi) set HTTP_PROXY=http://proxy.example.com:8080 set HTTPS_PROXY=http://proxy.example.com:8080 # Windows (PowerShell) $env:HTTP_PROXY = "http://proxy.example.com:8080" $env:HTTPS_PROXY = "http://proxy.example.com:8080"
npm yapılandırma önceliği
npm'in proxy'yi belirlerken kullandığı öncelik sırasını anlamak önemlidir (en yüksekten en düşüğe):
- Komut satırı bayrakları:
--proxy http://... npm_config_ile başlayan ortam değişkenleri: örneğin,npm_config_proxy- Proje
.npmrc - Kullanıcı
~/.npmrc - Küresel
$PREFIX/etc/npmrc - Standart ortam değişkenleri
HTTP_PROXY/HTTPS_PROXY
Eğer .npmrc dosyasında proxy ayarlanmışsa, ancak ortam değişkeni farklı bir adres gösteriyorsa - .npmrc kazanır. Bu, CI/CD sistemlerinde sıkça kafa karışıklığına neden olur.
CI/CD'de yapılandırma (GitHub Actions, GitLab CI)
# GitHub Actions - job veya step bölümüne ekleyin
jobs:
build:
runs-on: ubuntu-latest
env:
HTTP_PROXY: http://proxy.example.com:8080
HTTPS_PROXY: http://proxy.example.com:8080
NO_PROXY: localhost,127.0.0.1
steps:
- uses: actions/checkout@v3
- run: npm install
# GitLab CI - proje değişkenlerinde veya .gitlab-ci.yml içinde
variables:
HTTP_PROXY: "http://proxy.example.com:8080"
HTTPS_PROXY: "http://proxy.example.com:8080"
Kimlik doğrulama ve SSL denetimi ile kurumsal proxy
Kurumsal proxy sunucuları en karmaşık durumdur. Sadece trafiği yönlendirmekle kalmaz, aynı zamanda kimlik doğrulama gerektirir ve çoğu zaman SSL denetimi gerçekleştirir (HTTPS trafiğini yakalama ve çözme). Bu, npm'in kutudan çıktığında başa çıkamadığı belirli sertifika hatalarına yol açar.
NTLM/Basic kimlik doğrulamalı proxy
Eğer kurumsal proxy, kullanıcı adı ve şifre (Basic Auth) gerektiriyorsa, bunları doğrudan URL içinde iletebilirsiniz. Ancak NTLM kimlik doğrulaması (Windows alanı) ile işler daha karmaşıktır - npm NTLM'i yerel olarak desteklemez. Bu durumda, bir ara araç kullanılır.
# Basic Auth - URL içinde kullanıcı adı ve şifre npm config set proxy http://user:[email protected]:8080 npm config set https-proxy http://user:[email protected]:8080 # Eğer şifre özel karakterler içeriyorsa - bunları URL ile kodlamanız gerekir # @ → %40, # → %23, : → %3A # Örnek: şifre "p@ss#word" → "p%40ss%23word" npm config set proxy http://user:p%40ss%[email protected]:8080
NTLM kimlik doğrulaması için cntlm aracı kullanılır - bu, yerel olarak çalışır, normal HTTP isteklerini kabul eder ve kurumsal proxy ile NTLM el sıkışmasını gerçekleştirir. npm için bu, kimlik doğrulaması olmayan sıradan bir proxy gibi görünür:
# cntlm ayarlandıktan sonra localhost:3128 üzerinde dinler npm config set proxy http://localhost:3128 npm config set https-proxy http://localhost:3128
SSL denetimi sorununu çözme
SSL denetimi ile kurumsal proxy'ler, sitelerin sertifikalarını kendi kurumsal sertifikaları ile değiştirir. npm, güven zincirini kontrol eder ve bu tür sertifikaları reddeder. Üç yaklaşım vardır:
Yöntem 1 (önerilir): kurumsal CA sertifikasını güvenilirler listesine eklemek
# Kurumsal sertifikayı IT departmanından alın (crt veya pem dosyası) # npm yapılandırmasında belirtin npm config set cafile /path/to/corporate-ca.crt # Veya birden fazla sertifikayı cafile üzerinden ekleyin # Birkaç CA'yı bir PEM dosyasında birleştirebilirsiniz
Yöntem 2 (geçici, güvensiz): SSL kontrolünü devre dışı bırakmak
# Sadece teşhis için geçici bir çözüm olarak kullanın! npm config set strict-ssl false # Veya tek bir komut için npm install --legacy-peer-deps --no-strict-ssl
⚠️ Güvenlik uyarısı
strict-ssl false parametresi, SSL sertifikalarının kontrolünü tamamen devre dışı bırakır. Bu, bağlantıyı MITM türü saldırılara karşı savunmasız hale getirir. Bu yöntemi yalnızca teşhis için, üretimde ve sürekli olarak kullanmayın. Doğru çözüm, kurumsal CA sertifikasını cafile aracılığıyla eklemektir.
npm için SOCKS5 proxy: yardımcı araçlar ile ayarlama
npm yalnızca HTTP/HTTPS proxy'lerini yerel olarak destekler. Eğer bir SOCKS5 proxy'niz varsa (örneğin, rezidans proxy'leri sağlayıcısından), bunu npm yapılandırmasında doğrudan belirtemezsiniz. Bir ara katman gereklidir - npm'den gelen HTTP isteklerini kabul eden ve bunları SOCKS5 üzerinden yönlendiren bir araç.
Yöntem 1: proxychains (Linux/macOS)
# proxychains kurulumu # Ubuntu/Debian: sudo apt-get install proxychains4 # macOS: brew install proxychains-ng # /etc/proxychains4.conf yapılandırması [ProxyList] socks5 proxy.example.com 1080 username password # npm'i proxychains üzerinden çalıştırma proxychains4 npm install
Yöntem 2: yerel HTTP'den SOCKS5'e dönüştürücü
privoxy veya polipo aracı, trafiği SOCKS5 üzerinden tünelleyen yerel bir HTTP proxy'si oluşturur. Çalıştırıldıktan sonra npm, localhost üzerinde normal bir HTTP proxy'si görür:
# privoxy kurulumu sudo apt-get install privoxy # Ubuntu/Debian brew install privoxy # macOS # /etc/privoxy/config dosyasına ekleyin: forward-socks5 / proxy.example.com:1080 . # Privoxy varsayılan olarak localhost:8118 üzerinde dinler # npm'in bu adresi kullanmasını belirtin: npm config set proxy http://localhost:8118 npm config set https-proxy http://localhost:8118
Yöntem 3: SOCKS5 proxy olarak SSH tüneli
Eğer açık internete erişimi olan bir uzak sunucuya erişiminiz varsa, bir SSH SOCKS5 tüneli oluşturabilir ve npm trafiğini bunun üzerinden yönlendirebilirsiniz. Bu, özellikle sınırlı erişime sahip kurumsal ağlardan çalışırken kullanışlıdır:
# Yerel 1080 portunda bir SSH SOCKS5 tüneli oluşturun ssh -D 1080 -f -C -q -N [email protected] # Daha sonra privoxy veya proxychains kullanarak HTTP'ye dönüştürün # Veya doğrudan ortam değişkeni üzerinden (Node.js bazı kütüphanelerle SOCKS'ı anlar) # Alternatif - testi curl ile yapın: curl --socks5 localhost:1080 https://registry.npmjs.org/react/latest
Kendi özel registry'niz proxy alternatif olarak
Kurumsal ve izole ortamlarda, her geliştirici için proxy ayarlamak yerine, ağ içinde kendi npm-registry'nizi dağıtmak genellikle en iyi çözümdür. Bu tür bir registry, npmjs.org'dan paketleri önbelleğe alır ve bunları iç ağdan sunar. Geliştiricilerin internete erişimi gerekmez - her şey yerel registry üzerinden çalışır.
Verdaccio: 10 dakikada hızlı başlangıç
Verdaccio, proxy ve önbellekleme desteği olan açık kaynaklı bir npm-registry'dir. npm paketi olarak kurulur, ayrı bir hizmet olarak çalışır:
# Verdaccio'yu küresel olarak kur npm install -g verdaccio # Başlatma (varsayılan olarak http://localhost:4873 üzerinde dinler) verdaccio # npm'i yerel registry kullanacak şekilde yapılandırma npm config set registry http://localhost:4873 # Paketleri yerel registry'e yayınlama npm adduser --registry http://localhost:4873 npm publish --registry http://localhost:4873
Verdaccio yapılandırması (~/.config/verdaccio/config.yaml) npmjs.org'dan paketleri yüklemek için dış proxy üzerinden proxy ayarlarını yapılandırmanıza olanak tanır:
# config.yaml - proxy ile uplink ayarı
uplinks:
npmjs:
url: https://registry.npmjs.org/
# Eğer Verdaccio kendisi bir proxy arkasındaysa:
agent_options:
http_proxy: http://proxy.company.com:8080
https_proxy: http://proxy.company.com:8080
no_proxy: localhost,127.0.0.1
packages:
'@*/*':
access: $all
publish: $authenticated
proxy: npmjs
'**':
access: $all
publish: $authenticated
proxy: npmjs
İzole ortamlarda çözümlerin karşılaştırılması
| Çözüm | Zorluk | Önbellekleme | Uygun olduğu yerler |
|---|---|---|---|
| Ayna (npmmirror) | Düşük | Hayır | Coğrafi engelleme, npmjs.org'a yavaş erişim |
| .npmrc'de HTTP proxy | Düşük | Hayır | Kurumsal ağda HTTP proxy |
| SOCKS5 + proxychains | Orta | Hayır | Rezidans/mobil proxy, VPN |
| Verdaccio | Orta | Evet | Ekipler, izole ağlar, CI/CD |
| Nexus / Artifactory | Yüksek | Evet | Kurumsal, bağımlılık denetimi |
Tipik hataların teşhisi ve giderilmesi
Doğru proxy ayarlarından sonra bile sorunlar ortaya çıkabilir. İşte teşhis için sistematik bir yaklaşım ve en sık karşılaşılan hataların çözüm listesi.
Adım 1: Mevcut npm yapılandırmasını kontrol et
# Tüm npm ayarlarını göster (proxy dahil) npm config list # Sadece proxy ayarlarını göster npm config get proxy npm config get https-proxy npm config get registry npm config get strict-ssl # Teşhis için ayrıntılı çıktıyı etkinleştir npm install react --verbose npm install react --loglevel verbose
Adım 2: Registry'nin doğrudan erişilebilirliğini kontrol et
# curl ile registry'nin erişilebilirliğini kontrol et curl -v https://registry.npmjs.org/react/latest # Proxy üzerinden kontrol et curl -v --proxy http://proxy.example.com:8080 https://registry.npmjs.org/react/latest # ping kontrolü (her zaman HTTPS için bilgilendirici değildir) ping registry.npmjs.org # DNS çözümlemesini kontrol et nslookup registry.npmjs.org
Tipik hatalar ve çözümleri
| Hata | Neden | Çözüm |
|---|---|---|
| ECONNREFUSED | Proxy bağlantıları kabul etmiyor veya yanlış port | Proxy adresini ve portunu kontrol edin, proxy sunucusunun erişilebilirliğini kontrol edin |
| ETIMEDOUT | İstek, yanıt olmadan güvenlik duvarı tarafından engelleniyor | Proxy'yi yapılandırın veya aynaya geçin |
| SELF_SIGNED_CERT | Kurumsal proxy'nin SSL denetimi | Kurumsal CA'yı cafile ile ekleyin |
| 407 Proxy Auth | Proxy kimlik doğrulama gerektiriyor | Proxy URL'sine kullanıcı adı:şifre ekleyin |
| ENOTFOUND | DNS registry veya proxy adını çözmüyor | DNS ayarlarını kontrol edin, adı yerine IP kullanın |
| E403 Forbidden | Proxy, npmjs.org'a istekleri engelliyor | Aynayı kullanın veya ağ yöneticisine başvurun |
Tüm proxy ayarlarını sıfırlama
# Kullanıcı yapılandırma dosyasından tüm proxy ayarlarını sil npm config delete proxy npm config delete https-proxy npm config delete noproxy # Registry'yi resmi olanına geri döndür npm config set registry https://registry.npmjs.org # strict-ssl'yi geri yükle (eğer devre dışı bıraktıysanız) npm config set strict-ssl true # Nihai yapılandırmayı kontrol et npm config list
Engellenmiş registry ile pnpm ve Yarn ile çalışma
Alternatif paket yöneticileri kullanıyorsanız, proxy ayarı benzer şekilde görünür, ancak sözdizimi biraz farklıdır:
# pnpm - npm ile aynı .npmrc dosyasını kullanır # Ek olarak pnpm config ile ayarlayabilirsiniz: pnpm config set proxy http://proxy.example.com:8080 pnpm config set https-proxy http://proxy.example.com:8080 pnpm config set registry https://registry.npmmirror.com # Yarn Classic (v1) - kendi .yarnrc dosyası yarn config set proxy http://proxy.example.com:8080 yarn config set https-proxy http://proxy.example.com:8080 yarn config set registry https://registry.npmmirror.com # Yarn Berry (v2+) - .yarnrc.yml dosyası # httpProxy: "http://proxy.example.com:8080" # httpsProxy: "http://proxy.example.com:8080" # npmRegistryServer: "https://registry.npmmirror.com"
Belirli scoped paketler için proxy ayarlama
Bazen farklı paketler için farklı registry'ler kullanmak gerekir: örneğin, genel paketleri resmi npmjs.org'dan almak, ancak kurumsal @company/* paketlerini içsel Nexus'tan almak. Bu, .npmrc dosyasında scope-specific registry ile yapılandırılır:
# .npmrc - farklı scope'lar için farklı registry'ler registry=https://registry.npmjs.org # Kurumsal paketler @company içsel Nexus üzerinden @company:registry=http://nexus.company.local/repository/npm-hosted/ # @myorg paketleri Verdaccio üzerinden @myorg:registry=http://localhost:4873/ # Belirli bir registry için kimlik doğrulama //nexus.company.local/repository/npm-hosted/:_authToken=YOUR_TOKEN_HERE
Sonuç ve nihai öneriler
npm registry'ye erişim sorunlarıyla başa çıkmak için yukarıda belirtilen yöntemleri kullanarak, geliştiricilerin sorunsuz bir şekilde çalışmasını sağlamak mümkündür. Proxy ayarları ve alternatif registry'ler hakkında bilgi sahibi olmak, projelerinizi daha verimli bir şekilde yönetmenize yardımcı olacaktır.
```