Gereksinimler ve Ön Hazırlık
Uygulamamızı geliştirmek için bilgisayarınızda Node.js'in 20.x veya daha güncel bir LTS (Long Term Support) sürümünün yüklü olması gerekmektedir. Ayrıca paket yönetimi için npm veya pnpm kullanacağız. Proje dizinini oluşturduktan sonra gerekli bağımlılıkları yükleyerek işe başlayabiliriz.
Terminalinize aşağıdaki komutları girerek çalışma ortamınızı hazırlayın:
mkdir canlı-dosya-paneli
cd canlı-dosya-paneli
npm init -y
npm install express socket.io chokidar
Burada kullandığımız chokidar kütüphanesi, Node.js'in yerleşik fs.watch modülüne kıyasla çok daha kararlı ve platformlar arası uyumlu bir dosya izleme aracıdır. Socket.io ise WebSocket protokolünü kullanarak tarayıcı ve sunucu arasında düşük gecikmeli bir köprü kurmamızı sağlar.
Sunucu Tarafı Yapılandırması ve Socket.io Kurulumu
Uygulamanın kalbi olan sunucu tarafında, Express ile bir HTTP sunucusu oluşturacak ve bu sunucuyu Socket.io ile entegre edeceğiz. Sunucu, dosya sisteminde bir değişiklik olduğunda bunu dinleyecek ve bağlı olan tüm istemcilere bir "dosya_degisti" olayı (event) gönderecektir.
const express = require('express');
const http = require('http');
const { Server } = require('socket.io');
const chokidar = require('chokidar');
const app = express();
const server = http.createServer(app);
const io = new Server(server);
// İzlenecek klasörü belirle
const izlenenKlasor = './dosyalar';
const watcher = chokidar.watch(izlenenKlasor, { persistent: true });
io.on('connection', (socket) => {
console.log('Bir kullanıcı bağlandı:', socket.id);
});
watcher.on('change', (path) => {
console.log(`Dosya değişti: ${path}`);
io.emit('dosya_degisti', { dosya: path, zaman: new Date() });
});
server.listen(3000, () => {
console.log('Sunucu http://localhost:3000 adresinde çalışıyor');
});
Bu kod bloğunda, chokidar ile belirtilen klasörü izlemeye başladık. Bir dosya değiştiğinde io.emit metodunu kullanarak o an bağlı olan tüm istemcilere güncel bilgiyi iletiyoruz.
İstemci Tarafı: Gerçek Zamanlı Arayüz
İstemci tarafında, sunucudan gelen olayları dinleyecek ve arayüzü DOM manipülasyonu ile güncelleyeceğiz. Basit bir HTML dosyası üzerinden Socket.io istemci kütüphanesini dahil ederek bağlantıyı sağlayacağız.
Canlı Dosya Paneli
const socket = io();
const liste = document.getElementById('dosya-listesi');
socket.on('dosya_degisti', (data) => {
const li = document.createElement('li');
li.textContent = `Değişiklik: ${data.dosya} - ${data.zaman}`;
liste.appendChild(li);
});
Bu yapı, sunucudan gelen her mesajı liste öğesi olarak ekrana basar. Gerçek bir uygulamada bu veriyi bir tabloya dönüştürebilir veya dosya içeriğini anlık olarak güncelleyebilirsiniz.
Dosya Sistemi Yönetimi ve Güvenlik Önlemleri
Dosya yönetimi yaparken en kritik konu, kullanıcıların sunucu üzerindeki kritik sistem dosyalarına erişmesini engellemektir. Kullanıcı girdilerini doğrudan dosya yolu olarak kullanmak, "Path Traversal" (yol geçişi) saldırılarına kapı aralar.
Kritik Uyarı: Kullanıcıdan gelen dosya isimlerini veya yollarını asla doğrudanfsmodülüne göndermeyin. Her zamanpath.basename()kullanarak dosya ismini izole edin ve izin verilen dizin dışında işlem yapılmadığından emin olun.
Dosya işlemlerini güvenli hale getirmek için aşağıdaki gibi bir doğrulama fonksiyonu kullanabilirsiniz:
const path = require('path');
function guvenliDosyaYolu(inputPath) {
const bazDizin = path.resolve('./dosyalar');
const hedefDizin = path.resolve(bazDizin, inputPath);
if (!hedefDizin.startsWith(bazDizin)) {
throw new Error('Yetkisiz erişim girişimi!');
}
return hedefDizin;
}
Performans ve Ölçeklenebilirlik Karşılaştırması
Canlı dosya yönetimi sistemlerinde farklı yaklaşımların avantaj ve dezavantajlarını anlamak önemlidir.
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Polling (Düzenli Sorgu) | Basit uygulama | Yüksek sunucu yükü, gecikme |
| Socket.io (Event-based) | Düşük gecikme, gerçek zamanlı | Bağlantı yönetimi gerektirir |
| Webhooks | Sunucudan bağımsız | Kurulumu karmaşık |
Hata Ayıklama ve Yaygın Sorunlar
Socket.io uygulamalarında en sık karşılaşılan sorunlar bağlantı kopmaları ve olayların (events) iletilmemesidir. Tarayıcı konsolunda io is not defined hatası alıyorsanız, Socket.io istemci kütüphanesinin doğru yüklendiğinden emin olun.
Bağlantı durumlarını izlemek için şu kod bloğunu kullanabilirsiniz:
socket.on('connect', () => {
console.log('Sunucuya bağlandı:', socket.id);
});
socket.on('connect_error', (err) => {
console.error('Bağlantı hatası:', err.message);
});
Sıkça Sorulan Sorular
Socket.io yerine neden WebSocket kullanmadım?
Socket.io, otomatik yeniden bağlanma, oda (room) desteği ve WebSocket desteği olmayan tarayıcılar için yedekleme (fallback) mekanizmaları sunduğu için daha güvenli ve pratik bir tercihtir.
Bu sistem binlerce kullanıcıyı kaldırır mı?
Tek bir Node.js sunucusu, Socket.io ile binlerce bağlantıyı yönetebilir. Ancak ölçeklenme durumunda Redis kullanarak "pub/sub" mekanizması ile sunucuları birbirine bağlamanız gerekecektir.
Dosya içeriği nasıl güncellenir?
İstemciden sunucuya bir "dosya_kaydet" olayı göndererek, sunucuda fs.writeFile fonksiyonunu kullanarak dosyayı güncelleyebilir ve ardından değişikliği tüm istemcilere yayabilirsiniz.
Windows ve Linux arasında dosya izleme farkı var mı?
Chokidar kütüphanesi bu farkları sizin yerinize yönetir, ancak dosya sistemi olaylarının (fs events) sınırlı olduğu sistemlerde "polling" moduna geçiş yapabilir.
Güvenlik için başka ne yapılmalı?
Socket.io üzerinde mutlaka "Authentication" (kimlik doğrulama) middleware'i kullanın ve sadece yetkili kullanıcıların dosya işlemlerine erişmesine izin verin.
İleri Düzey Optimizasyon: Büyük Ölçekli Dosya İzleme Stratejileri
Uygulamanız büyüdükçe, fs.watch veya chokidar gibi kütüphanelerin işletim sistemi üzerindeki yükü artabilir. Özellikle binlerce dosyanın bulunduğu bir dizin yapısında, her değişikliği anlık olarak yayınlamak ağ trafiğini tıkayabilir. Bu durumu yönetmek için "Debounce" (gecikmeli tetikleme) mekanizmasını kullanmak en sağlıklı yaklaşımdır.
Aşağıdaki kod örneği, ardışık gelen dosya değişikliklerini belirli bir süre boyunca biriktirerek tek bir güncelleme paketi halinde gönderilmesini sağlar:
const chokidar = require('chokidar');
const _ = require('lodash');
const watcher = chokidar.watch('./data', { persistent: true });
// Değişiklikleri 500ms bekletip tek seferde gönder
const emitChange = _.debounce((path) => {
io.emit('file-updated', { path, timestamp: Date.now() });
}, 500);
watcher.on('change', (path) => {
console.log(`Dosya değişti: ${path}`);
emitChange(path);
});
Üretim Ortamında Deployment ve Süreç Yönetimi
Geliştirme aşamasında node server.js komutu yeterli olsa da, canlı ortamda uygulamanın sürekli ayakta kalması ve hata durumunda otomatik yeniden başlaması gerekir. Bunun için PM2 süreç yöneticisini kullanmak endüstri standardıdır.
Uygulamanızı bir sunucuya deploy ederken şu adımları izlemelisiniz:
- PM2 Kurulumu:
npm install pm2 -gkomutu ile küresel kurulumu yapın. - Süreç Başlatma:
pm2 start server.js --name "dosya-paneli"komutu ile uygulamayı arka plana alın. - Log Yönetimi:
pm2 logskomutu ile canlı dosya sistemi olaylarını ve Socket.io bağlantı hatalarını takip edin. - Çevresel Değişkenler: Hassas verileri (dosya yolları, port numaraları) asla kod içine gömmeyin,
.envdosyası kullanın.
Nginx ile Ters Vekil Sunucu (Reverse Proxy) Yapılandırması
Socket.io bağlantıları için Nginx üzerinde WebSocket desteğini aktif etmeniz gerekir. Aksi takdirde, bağlantı sürekli olarak HTTP polling modunda kalır ve performans düşer.
location /socket.io/ {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}
Bu yapılandırma, istemci ile sunucu arasındaki canlı bağlantının kesintisiz ve düşük gecikmeli (low latency) olmasını garanti eder. Özellikle dosya yükleme veya canlı düzenleme gibi işlemlerde bu katman kritik bir rol oynar.
Sonuç
Bu rehberde, Node.js ve Socket.io kullanarak gerçek zamanlı bir dosya yönetim paneli mimarisini nasıl kuracağınızı öğrendiniz. Chokidar ile dosya sistemi değişikliklerini yakalamayı, Socket.io ile bu değişiklikleri istemcilere anlık olarak yansıtmayı ve temel güvenlik önlemlerini uygulamayı başardınız. Bir sonraki adım olarak, kullanıcıların dosya düzenleme yetkilerini yönetmek için JWT (JSON Web Token) tabanlı bir kimlik doğrulama sistemi ekleyerek projenizi geliştirebilirsiniz.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamına geçmeden önce dosya sistemi izinlerini (permissions), veri doğrulama süreçlerini ve sunucu güvenliğini profesyonel standartlarda yapılandırmanız gerekmektedir.


Yorumlar (0)
Yorum Yaz