ntcp (nettransfer)
İki sunucu arasında dosya ve klasörleri hızlı, güvenli ve kaldığı yerden devam ederek taşıyan tek dosyalık Go aracı.
nettransfer, iki sunucu arasında dosya ve klasör aktarmak için geliştirdiğim bir komut satırı aracı. Komutun adı ntcp. Aktarım TLS 1.3 ile şifreleniyor, yarıda kesilirse kaldığı yerden devam ediyor ve daha önce eksiksiz gönderilmiş dosyaları tekrar göndermiyor. Araç Go ile, yalnızca standart kütüphane kullanılarak tek bir çalıştırılabilir dosya olarak yazıldı.
Amaç
Sunucular arasında dosya taşımak için genellikle scp veya SSH üzerinden rsync kullanılıyor. Bu araçlar iyi çalışıyor, ancak karşı sunucuda SSH erişimi gerektiriyorlar. Bir derleme sunucusuna ya da bir CI hattına yalnızca dosya bırakma yetkisi vermek istediğimde SSH hesabı açmak bana fazla geliyordu. scp ise yarıda kalan bir aktarımı kaldığı yerden sürdüremiyor.
ntcp'yi bu boşluğu doldurmak için yazdım. Amacım, alıcı tarafta servis olarak çalışan, SSH yerine süreli ya da kalıcı bir anahtarla (token) yetkilendirilen, kesintiye dayanıklı ve kurulumu tek komutla biten bir aktarım aracı yapmaktı.
Nasıl çalışır
Alıcı sunucuda ntcp install komutu aracı bir servis olarak kuruyor ve ilk token'ı üretip ekrana bir kez yazdırıyor. ntcp init ile token'ların kalıcı mı yoksa belirli bir süre sonra geçersiz mi olacağı seçiliyor. Gönderen makinede ise yerel yol, sunucu adresi, token ve isteğe bağlı olarak hedef dizin verilerek gönderim yapılıyor.
Bağlantı kurulduğunda istemci önce bir manifest, yani gönderilecek dosyaların listesini, boyutlarını ve son değişiklik zamanlarını içeren bir özet yolluyor. Sunucu her dosya için üç cevaptan birini veriyor: dosya zaten eksiksiz duruyor, dosya hiç yok ya da dosya yarım kalmış. Yarım kalmış dosyalar için sunucu, hangi blokların daha önce alındığını gösteren bir bit haritası gönderiyor. İstemci yalnızca eksik blokları yolluyor.
Veri 4 MiB'lık sabit bloklar halinde aktarılıyor. Her blok, dosya numarası, konum, uzunluk ve CRC32C sağlama değerinden oluşan 20 baytlık bir başlıkla gidiyor. Sağlama değeri, verinin yolda bozulup bozulmadığını anlamak için kullanılıyor. Yarım kalan aktarımın durumu sunucuda .emr ve .emr.bm uzantılı ara dosyalarda tutuluyor. Aynı komut yeniden çalıştırıldığında aktarım bu dosyalardan devam ediyor.
Hedef yol kuralları rsync'e benziyor. Yerel yolun sonunda eğik çizgi varsa yalnızca klasörün içeriği, yoksa klasörün kendisi gönderiliyor. Göreli bir hedef verildiğinde dosyalar sunucunun veri dizininin altına yazılıyor. Mutlak bir hedef verildiğinde ise servisin yazma izni olan herhangi bir yere yazılabiliyor.
Öne çıkan özellikler
- Yarıda kalan aktarım, aynı komut tekrar çalıştırıldığında blok düzeyinde kaldığı yerden devam ediyor.
- Boyutu ve değişiklik zamanı aynı olan dosyalar atlanıyor, içeriği değişen dosyalar yeniden gönderiliyor.
- Bağlantılar TLS 1.3 ile şifreleniyor ve sunucu sertifikası TOFU yöntemiyle sabitleniyor. TOFU, ilk bağlantıda görülen sertifikanın parmak izini kaydedip sonraki bağlantılarda farklı bir sertifika gelirse bağlantıyı reddetmek anlamına geliyor.
- CI ortamları için beklenen sertifika parmak izi bir ortam değişkeniyle önceden verilebiliyor.
- Token'lar 32 baytlık rastgele değerlerden üretiliyor ve sunucuda yalnızca SHA-256 özetleri saklanıyor.
- Token doğrulaması sabit zamanlı karşılaştırmayla yapılıyor; bu, yanıt süresinden bilgi sızdırılmasını önlüyor.
- Süreli token'ların süresi dolduğunda servis bunları her 10 dakikada bir otomatik olarak temizliyor.
- Yeni üretilen token'lar servisi yeniden başlatmadan geçerli oluyor.
- IP başına dakikada 60 deneme sınırı ve en fazla 100 eşzamanlı bağlantı sınırı uygulanıyor.
- Hem gönderen hem alan tarafta
..içeren yollar reddediliyor. - İsteğe bağlı
--delete-afterseçeneği, aktarım başarıyla bittikten sonra yerel kaynağı siliyor. - Terminal destekliyorsa renkli bir arayüz ve hareketli ilerleme çubuğu gösteriliyor.
Teknik altyapı
ntcp, Go ile ve hiçbir dış bağımlılık olmadan yalnızca standart kütüphane kullanılarak yazıldı. Tüm kod tek bir kaynak dosyada duruyor. TCP bağlantılarında keep-alive, gecikme azaltma (NoDelay) ve 2 MiB'lık tampon ayarları kullanılıyor. Sunucu kendi kendine imzalı bir sertifika üretiyor; sertifika, özel anahtar ve token dosyası yalnızca sahibinin okuyabileceği izinlerle saklanıyor.
Servis Linux'ta systemd, macOS'ta launchd, Windows'ta ise Windows hizmet yöneticisi ile kuruluyor. Linux'taki systemd birimi sistem dizinlerini korumaya alan ve yetki yükseltmeyi engelleyen sıkılaştırma ayarlarıyla geliyor. Araç Linux, macOS ve Windows için toplam altı platforma derleniyor. GitHub Actions üzerinde her değişiklikte doğrulama ve derleme yapılıyor, sürüm etiketi atıldığında tüm platformlar için derlenmiş dosyalar otomatik olarak yayınlanıyor. Linux ve macOS için kabuk, Windows için PowerShell kurulum betikleri var. Proje MIT lisanslı.
Kullanım alanları
- Bir web sitesinin derlenmiş dosyalarını sunucudaki yayın dizinine göndermek için kullanılabilir.
- Veritabanı yedeklerini başka bir sunucuya taşıyıp gönderim tamamlanınca yerel kopyayı silmek için uygundur.
- CI/CD hatlarında, SSH hesabı açmadan yalnızca token ile sunucuya dosya bırakmak için kullanılabilir.
- Onlarca gigabaytlık büyük dosyaların bağlantı kopmalarına rağmen eksiksiz aktarılması gereken durumlarda işe yarar.
- Değişen tek bir dosyayı, örneğin bir stil dosyasını, sunucudaki yerine hızlıca yeniden göndermek için kullanılabilir.
Durum
İlk sürümü 2026'da yayınladım ve aynı gün içinde 0.4.0 sürümüne kadar geliştirdim. Son sürümde mutlak hedef yolları, rsync'e benzer eğik çizgi kuralı ve aktarım sonrası yerel kaynağı silme seçeneği eklendi.
- Kategori
- Ağ, sunucu ve altyapı
- Yıl
- 2026
Teknolojiler
- Go
- TLS 1.3
- CLI
- Open Source
Bağlantılar
- GitHub https://github.com/muslu/nettransfer