CI ortamında tünel istemenin en yaygın nedeni "E2E testimde dünya dev sunucuma erişebilmeli." Cypress / Playwright aynı job'da localhost:3000'a karşı çalışır; ama Stripe, GitHub, Shopify gibi webhook sağlayıcıları ve Lighthouse CI gibi tarayıcılar gerçek bir public URL ister. Bir Nodetonet HTTP tüneli bir workflow içinde yaklaşık üç saniyede açılır ve yarım saniyede kapanır — herhangi bir test bütçesinin çok altında.
Özet: İki curl komutu — bir POST tüneli açmak için, bir DELETE kapatmak için — CI job'u boyunca geçerli, kuruş düzeyinde maliyetli bir HTTPS URL sağlar. Boştaki tüneller ücretsizdir; Nodetonet aylık abonelik olmadan peşin kredi kullanır.
Henüz resmi bir nodetonet/cli-action yayınlamıyoruz; bu yol haritasında. Şimdilik iki curl çağrısı bir action'ın yapacağının %95'ini yapar. REST API kanonik arayüzdür ve her zaman çalışmaya devam edecektir.
CI'da neden tünele ihtiyacınız var?
GitHub tarafından barındırılan runner'lar geçici NAT'ın arkasında oturur — bir dış servisin test sunucunuza doğrudan ulaşması mümkün değildir. Nodetonet tüneli, edge'imizden runner'ınıza kurulan kalıcı bir ters bağlantıdır: açıldığında https://<subdomain>.nodetonet.com'a gelen her istek localhost'unuza iletilir. Port yönlendirmesi, güvenlik duvarı kuralı veya rezerve IP gerekmez.
CI ekiplerinin bugün kullandığı başlıca seçeneklerin karşılaştırması:
| Yöntem | Maliyet modeli | Kurulum | Webhook desteği | Özel alan adı |
|---|---|---|---|---|
| Nodetonet tüneli | Peşin kredi, saniye bazında | İki curl çağrısı | Evet | Evet |
| ngrok ücretsiz plan | Ücretsiz (oturum sınırlı) | Tek ikili indirme | Evet (sınırlı) | Yalnızca ücretli plan |
| Cloudflare Tunnel | Ücretsiz (kalıcı daemon) | Daemon kurulum + DNS | Evet | Evet (kendi alan adınız) |
| Kalıcı staging sunucu | Aylık VPS maliyeti, sürekli açık | Sağlama + bakım | Evet | Evet |
| Statik S3/CDN deploy | Depolama + transfer ücreti | Build pipeline değişikliği | Hayır | Evet |
Nodetonet'in avantajı, tünellerin aynı panelde çalıştırdığınız mobil proxy ve rotating proxy ile bütünleşmesidir — tek peşin bakiye, tek panel, tek API anahtarı. E2E paketinizin giden istekler için temiz bir mobil IP'ye de ihtiyacı varsa ikinci bir satıcıya gerek yoktur. Ayrıntılı karşılaştırma için Nodetonet vs ngrok ve Nodetonet vs Cloudflare Tunnel sayfalarına bakabilirsiniz.
Üç adımda desen
- Job başlangıcında — test sunucusunun portuyla
POST /api/v1/proxies. Dönen URL'i$GITHUB_ENV'e kaydet. - Job sırasında — test aracın
http://localhostkullanacağı her yerde$TUNNEL_URL'i kullan. - Job sonunda — bir
if: always()adımındaDELETE /api/v1/proxies/{id}— testler başarısız olsa bile çalışır.
Üçüncü adım çalışmasa bile (iptal edilen job, ölen runner), Nodetonet trafik olmayan tünelleri 30 dakika sonra otomatik durdurur; durdurulan tüneller ücretsizdir. Sızdırılan bir tünelin sonucu en fazla "fark edene kadar boşta duran bir URL" olur. Tünel sağlığını izleme ve denetim kayıtları hakkında daha fazla bilgi edinin.
Çalışan bir workflow dosyası
Şunu .github/workflows/e2e.yml'e ekleyin. Test sunucunun arka planda başladığını, :3000'i dinlediğini ve testlerin TARGET_URL'a saygı duyduğunu varsayar:
name: Nodetonet tüneli ile E2E
on: [push, pull_request]
jobs:
e2e:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- name: Bağımlılıkları kur
run: npm ci
- name: Test sunucusunu başlat (arka plan)
run: npm run start:test &
env:
PORT: 3000
- name: Sunucuyu bekle
run: npx wait-on http://localhost:3000
- name: Nodetonet tüneli aç
env:
NTN_TOKEN: ${{ secrets.NTN_TOKEN }}
run: |
SUB="ci-${{ github.run_id }}"
RESP=$(curl -fsS -X POST https://nodetonet.com/api/v1/proxies -H "Authorization: Bearer $NTN_TOKEN" -H "Content-Type: application/json" -d "{\"subdomain\":\"$SUB\",\"target_host\":\"127.0.0.1\",\"target_port\":3000}")
echo "TUNNEL_ID=$(echo $RESP | jq -r .id)" >> $GITHUB_ENV
echo "TUNNEL_URL=$(echo $RESP | jq -r .url)" >> $GITHUB_ENV
- name: Public URL'e karşı Playwright çalıştır
env:
TARGET_URL: ${{ env.TUNNEL_URL }}
run: npx playwright test
- name: Nodetonet tünelini kapat
if: always()
env:
NTN_TOKEN: ${{ secrets.NTN_TOKEN }}
run: |
curl -fsS -X DELETE -H "Authorization: Bearer $NTN_TOKEN" https://nodetonet.com/api/v1/proxies/${{ env.TUNNEL_ID }} || true
jq tüm ubuntu-latest runner'larına önceden yüklüdür. Kendi barındırdığınız bir runner kullanıyorsanız ve jq yoksa tünel adımından önce sudo apt-get install -y jq ile kurun.
Webhook testleri — öldürücü kullanım senaryosu
Stripe, GitHub veya Twilio webhook entegrasyonunu test ediyorsanız, sağlayıcının sunucunuza ulaşması gerekir. localhost belli ki yetmez; act gibi lokal runner araçları da yardımcı olmaz çünkü üçüncü taraf servis kendi veri merkezinde.
Akış E2E ile tamamen aynıdır — tünel aç, webhook uç noktasını $TUNNEL_URL/webhooks/stripe olarak kaydet, eventi tetikleyen testi çalıştır, sonucu doğrula. Tek fark, bir koşu yarıda kesilirse temizliği kolaylaştırmak için branş başına öngörülebilir subdomain kullanmak istersiniz. PR job'larında github.head_ref kullanın:
- name: Branş başına tünel aç
env:
NTN_TOKEN: ${{ secrets.NTN_TOKEN }}
run: |
SUB="webhook-$(echo ${{ github.head_ref || github.ref_name }} | tr '/' '-' | tr -cd 'a-z0-9-' | cut -c1-40)"
# ... yukarıdakiyle aynı POST
Nodetonet tünellerinin yaşam döngüsünü daha ayrıntılı anlamak için — TLS sertifikalarının otomatik verilmesi ve özel alan adı kurulumu dahil — bu yazılara bakın.
API token'ını güvenle saklamak
CI token güvenliği için iki kural:
- Hesap token'ı değil, kapsamlı token kullanın. API token'ları ile kişisel token'lar arasındaki farkı okuyun. Panelinizdeki token sayfasından yalnızca
proxies:writekapsamlı bir token üretin — sızdırılan bir CI sırrı fatura bilgilerinizi okuyamaz, kullanıcı davet edemez. - Bir GitHub Actions secret olarak saklayın (Settings → Secrets and variables → Actions) ve
${{ secrets.NTN_TOKEN }}olarak referans verin. Asla workflow dosyasına sabit kodlamayın.
Deployment ortamları kullanıyorsanız (staging, prod), denetim kayıtlarında hangi CI koşusunun hangi tüneli açtığını görmek için ortam başına ayrı bir token kullanın.
Paralel job'lar ve matris build'ler
Bir matris build çalıştırdığınızda her paralel job'un kendi tüneline ihtiyacı vardır. Subdomain yaklaşımı bunu zaten çözer: matris değişkenini subdomaine dahil ederseniz (örn. "ci-${{ github.run_id }}-${{ matrix.node }}") her shard benzersiz bir public URL alır ve çakışma olmaz. if: always()'deki DELETE yalnızca o shard'ın tünelini kapatır.
Kota, iş parçacığı sınırı ve IP izin listeleri gibi istemci başına kontroller gereken büyük filo build'leri için istemci başına kimlik doğrulama ve iş parçacığı sınırları yazılarına bakın — aynı model HTTP tünelleri için de geçerlidir.
Maliyet — bu gerçekten ne kadar tutuyor?
Nodetonet peşin kredi kullanır; aktif tünel süresine göre saniye bazında faturalandırır. On dakikalık bir CI job'u boyunca açık kalan bir tünel, koşu başına kuruşun çok altında bir maliyete sahiptir. Her PR push'unda E2E çalıştıran bir repo (örneğin ayda 150 koşu) tüneller için genellikle aylık bir doların oldukça altında harcar. Binlerce koşu içeren hiperaktif bir monorepo bile ucuz kalır. Aktif trafik olmayan boştaki tüneller hiçbir şey tutmaz.
Sağlayıcılar arası dürüst bir maliyet karşılaştırması için Nodetonet vs ngrok ve Nodetonet vs Cloudflare Tunnel sayfalarımıza bakın.
Yolda: resmi bir GitHub Action
Yukarıdaki desen güvenilir ama uzun. Resmi nodetonet/cli-action@v1 yol haritasında; dört adımı (POST, env yakala, testleri çalıştır, DELETE) tek bir bloğa indirgeyecek:
- uses: nodetonet/cli-action@v1
with:
token: ${{ secrets.NTN_TOKEN }}
port: 3000
# TUNNEL_URL'u otomatik export eder, job sonunda otomatik temizler
- run: npx playwright test
env:
TARGET_URL: ${{ env.TUNNEL_URL }}
Yukarıdaki curl deseni her zaman çalışmaya devam edecek — kanonik REST arayüzü o. Ne zaman yayınlanacağını öğrenmek için destek ekibiyle iletişime geçin veya Discord'a katılın.
Başlayın
Hazır mısınız? Ücretsiz hesap oluşturun, bir API token'ı üretin, yukarıdaki workflow'u yapıştırın ve bir PR açın. Tüneliniz saniyeler içinde açılır. Tam tünel referansı için HTTP tünelleri özellik sayfasını inceleyin ya da proxy denetleyici ile herhangi bir uç noktanızı doğrulayın.