Node-RED'i Docker'da çalıştırmak size güncellemesi, yedeklemesi ve makineler arasında taşıması kolay, tekrarlanabilir bir kurulum sağlar. Bu eğitimde resmi Node-RED Docker imajını başlatacak, flow'larınızı kalıcı bir volume'de tutacak, Docker Compose ile yönetecek, ek node'lar ekleyecek, gizli bilgileri güvenle aktaracak ve container'ı TLS üzerinden bir MQTT broker'a bağlayacaksınız.
Node-RED'i Neden Docker'da Çalıştırmalı?
Node-RED'i doğrudan npm ile kurmak sorunsuz çalışır; Node-RED kurulumu rehberimiz bu yolu ele alır. Container'lar, bir flow gerçek iş yapmaya başladığında önem kazanan birkaç avantaj ekler:
- Sabitlenmiş sürümler. İmaj etiketiyle tam Node-RED ve Node.js sürümünü seçersiniz; böylece bir güncelleme bilinçli bir değişiklik olur.
- Temiz ayrım. Node-RED'in yazdığı her şey, volume olarak bağladığınız tek bir dizinde,
/dataiçinde yaşar. O tek klasörü yedeklediğinizde her şeye sahip olursunuz. - Kolay geri dönüş. Bir güncelleme katkıda bulunulan bir node'u bozarsa önceki etikete geri dönün.
- Her yerde aynı kurulum. Bir Compose dosyası dizüstü bilgisayarda, 64 bit işletim sistemli bir Raspberry Pi'de veya bir bulut sanal makinesinde aynı şekilde çalışır.
Resmi imaj Docker Hub'daki nodered/node-red'dir. latest, 4.0.9 gibi belirli bir sürüm veya belirli bir Node.js sürümüne sahip varyantlar gibi etiketler, ne kadar sıkı sabitleyeceğinizi seçmenizi sağlar. Üretimde latest yerine bir sürüm etiketi sabitleyin.
docker run ile Hızlı Başlangıç
Docker'ın kurulu olduğundan emin olun, ardından şunu çalıştırın:
docker volume create node_red_data
docker run -d \
--name nodered \
--restart unless-stopped \
-p 1880:1880 \
-e TZ=Europe/Istanbul \
-v node_red_data:/data \
nodered/node-red:latest
http://localhost:1880 adresini açın; çalışan bir editörünüz var. Önemli bayrak -v node_red_data:/data'dır. O olmadan flow'lar, kurulu node'lar ve kimlik bilgileri container'ın yazılabilir katmanında yaşar ve container'ı kaldırdığınızda veya yeniden oluşturduğunuzda kaybolur. TZ saat dilimini ayarlar; böylece zaman damgaları ve inject zamanlamaları yerel saatinizle eşleşir.
Günlük kullanışlı komutlar:
docker logs -f nodered # Node-RED log'unu izle
docker exec -it nodered bash # container içinde shell
docker restart nodered # settings.js düzenlendikten sonra yeniden başlat
--restart unless-stopped politikası, bir çökme veya sunucu yeniden başlatmasından sonra Node-RED'i otomatik olarak geri getirir, ancak bilinçli olarak durdurduğunuzda getirmez. Bu MQTT flow'ları için önemlidir: container yeniden başladığında broker node'u kendi kendine yeniden bağlanır ve abonelikler flow'dan geri yüklenir; böylece elektriği kesilen bir gateway kimse dokunmadan kendini toparlar. Yeniden başladığı flow'ların deploy ettiğiniz flow'lar olması için bunu bir sonraki bölümde anlatılan kalıcı depolamayla birleştirin.
Adlandırılmış Volume mu, Bind Mount mu?
Yukarıdaki gibi adlandırılmış bir volume ya da bir sunucu klasörü bağlayabilirsiniz:
mkdir -p ~/node-red-data
sudo chown -R 1000:1000 ~/node-red-data
docker run -d --name nodered -p 1880:1880 -v ~/node-red-data:/data nodered/node-red:latest
Bind mount, settings.js ve flows.json dosyalarını sunucudan düzenlemeyi ve yedeklemeyi kolaylaştırır. Püf noktası izinlerdir: container, Node-RED'i UID 1000'e sahip bir kullanıcı olarak çalıştırır. Sunucu klasörü root'a veya başka bir kullanıcıya aitse Node-RED yazamaz ve log'da EACCES hataları görürsünüz. Yukarıdaki chown bunu önler.
| Adlandırılmış volume | Bind mount | |
|---|---|---|
| Kurulum | Hazırlanacak bir şey yok | Klasör UID 1000 tarafından yazılabilir olmalı |
| settings.js düzenleme | docker exec veya yardımcı bir container ile |
Doğrudan sunucuda |
| Yedekler | tar ile docker run --rm -v node_red_data:/data ... |
Herhangi bir dosya yedekleme aracı |
| Taşınabilirlik | Docker tarafından yönetilir | Görünür sunucu yolu |
Üretime Hazır Bir Docker Compose Dosyası
Uzun ömürlü her şey için container'ı Compose ile tanımlayın. Bu dosya imajı sabitler, verileri kalıcı kılar, saat dilimini ayarlar ve gizli bilgileri bir ortam dosyası aracılığıyla aktarır:
# docker-compose.yml
services:
nodered:
image: nodered/node-red:4.0.9
container_name: nodered
restart: unless-stopped
ports:
- "127.0.0.1:1880:1880"
environment:
- TZ=Europe/Istanbul
- NODE_RED_CREDENTIAL_SECRET=${NODE_RED_CREDENTIAL_SECRET}
volumes:
- ./data:/data
# .env (aynı klasör, bu dosyayı asla commit etmeyin)
NODE_RED_CREDENTIAL_SECRET=change-me-to-a-long-random-string
mkdir -p data && sudo chown -R 1000:1000 data
docker compose up -d
İki ayrıntıya dikkat çekmek gerekir. Birincisi, port yalnızca 127.0.0.1 üzerinde yayınlanır; böylece editöre sunucudan erişilebilir ama ağdan erişilemez. Uzaktan erişime ihtiyacınız varsa önüne HTTPS'li bir reverse proxy koyun ve dışarıya açmadan önce Node-RED nasıl güvenceye alınır yazısını okuyun. İkincisi, kimlik bilgisi anahtarı ortamdan okunur. data/settings.js dosyasını düzenleyin ve şunu ayarlayın:
// data/settings.js
credentialSecret: process.env.NODE_RED_CREDENTIAL_SECRET,
Bu anahtar flows_cred.json dosyasını şifreler. Ayarlamazsanız Node-RED bir anahtar oluşturup veri klasörünün içinde saklar; bu çalışır ama kimlik bilgilerinizi o tek kopyaya bağlar. Açık bir anahtarla container'ı herhangi bir yerde yeniden oluşturup broker parolalarınızın şifresini yine de çözebilirsiniz.
Container'a Ek Node'lar Kurmak
Editörde her zamanki gibi Manage palette seçeneğini kullanın; node'lar /data/node_modules içine kurulur ve /data bir volume olduğu için container yeniden oluşturulduğunda korunur. Bunun yerine betikle yapmak için:
docker exec -it nodered bash -c "cd /data && npm install @flowfuse/node-red-dashboard"
docker restart nodered
Tamamen tekrarlanabilir imajlar için node'ları derleme zamanında kuran kendi imajınızı oluşturun:
# Dockerfile
FROM nodered/node-red:4.0.9
RUN npm install --no-audit --no-fund @flowfuse/node-red-dashboard node-red-contrib-modbus
Native kod derleyen node'lar derleme araçlarına ihtiyaç duyabilir; nodered.org üzerindeki imaj belgeleri mevcut varyantları ve bunların nasıl ekleneceğini açıklar.
Container'ı Bir MQTT Broker'a Bağlayın
Sık yapılan bir Node-RED Docker hatası, MQTT node'unu localhost'a yönlendirmektir. Container içinde localhost sunucunuz değil, container'ın kendisidir. Gerçek bir hostname kullanın: bir bulut broker'ı, aynı Compose ağındaki bir servis adı veya Docker Desktop'ta host.docker.internal.
İlk test için ücretsiz herkese açık MQTT broker'ı kullanın. Broker config node'unda sunucuyu broker.connectmq.com, portu 1883 ve client ID'yi nr-docker-4d2f gibi benzersiz bir değer olarak ayarlayın. connectmq/demo/4d2f/# topic'ine subscribe olun ve sunucunuzdan publish edin:
mosquitto_pub -h broker.connectmq.com -p 1883 -i demo-host-4d2f \
-t "connectmq/demo/4d2f/docker/test" -m '{"hello":"from host"}'
Üretim için TLS'li özel broker'ınıza geçin. Sunucuyu ConnectMQ broker host'unuz, portu 8883 olarak ayarlayın, Use TLS kutusunu işaretleyin ve portaldaki kullanıcı adı, parola ve client ID'yi girin. İmaj standart CA sertifikalarını içerdiği için Let's Encrypt sertifikasına ek yapılandırma olmadan güvenilir. TLS'nin tam anlatımı Node-RED MQTT TLS yazısındadır.
Bu kimlik bilgilerini editöre yalnızca bir kez yazarsınız. Node-RED bunları flows.json içinde asla düz metin olarak değil, yukarıda ayarladığınız kimlik bilgisi anahtarıyla şifrelenmiş olarak flows_cred.json dosyasında saklar; böylece broker parolanızı sızdırmadan flow dosyasını paylaşabilir veya commit edebilirsiniz.
Güncellemeler ve Yedekler Kontrol Listesi
- Her güncellemeden önce veri klasörünü veya volume'ü yedekleyin.
docker-compose.ymliçindeki imaj etiketini değiştirin, ardındandocker compose pull && docker compose up -dçalıştırın.- Güncellemeden sonra yüklenemeyen node'lar için
docker logs -f noderedçıktısını izleyin. - Gerekirse önceki etiketi geri yükleyerek geri dönün; veri klasörü değişmez.
- Node.js ana sürüm değişikliğinden sonra native kodlu node'ları yeniden derleyin (
/dataiçindenpm rebuild). .envdosyasını sürüm kontrolünün dışında tutun ve gizli bilgi yöneticinizde saklayın.- Ara sıra geri yüklemeyi test edin; hiç geri yüklemediğiniz bir yedek yalnızca bir tahmindir.
Bu adımlardan herhangi birinden sonra MQTT node'u "connecting" gösteriyorsa Node-RED MQTT bağlanmıyor rehberi container'larda yaygın olan DNS, port, TLS ve client ID sorunlarını adım adım ele alır.
Docker'daki Node-RED'inizi ConnectMQ ile Çalıştırın
Container'lar Node-RED'i halleder; barındırılan bir MQTT broker ise mesajlaşma katmanını halleder, böylece bir broker container'ını da çalıştırıp yamamak zorunda kalmazsınız. ConnectMQ; TCP 1883, TLS 8883 ve güvenli WebSocket 8084, MQTT 3.1.1 ve 5.0 ile container'ınızın ne publish ettiğini kontrol etmek için canlı topic gezgini içeren bir portal sunar. Kredi kartı gerektirmeyen ücretsiz Serverless plan için app.connectmq.com adresinden kaydolun ve oluşturulan kimlik bilgilerini broker node'una yapıştırın. Barındırma seçeneklerine daha geniş bir bakış için bulut MQTT broker rehberimize, ilk flow'larınızı oluşturmak için Node-RED MQTT eğitimine göz atın.
Sık Sorulan Sorular
Node-RED Docker'da verileri nerede saklar?
Flow'lar, kimlik bilgileri, settings.js, context ve kurulu node'lar dahil her şey container içindeki /data dizininde yaşar. Container yeniden oluşturulduğunda korunması için onu bir volume veya bind mount olarak bağlayın.
Node-RED container'ım neden localhost'taki bir MQTT broker'a bağlanamıyor?
Container içinde localhost, container'ın kendisini ifade eder. Broker'ın gerçek hostname'ini, bir Compose servis adını veya Docker Desktop'ta host.docker.internal kullanın.
Bind mount ile izin reddedildi (permission denied) hatalarını nasıl düzeltirim?
Container, Node-RED'i UID 1000 olarak çalıştırır. Sunucu klasörünün sahipliğini sudo chown -R 1000:1000 <folder> ile değiştirin ve container'ı yeniden başlatın.
Node-RED'i bir Raspberry Pi'de Docker ile çalıştırabilir miyim?
Evet. Resmi imaj ARM mimarileri için yayınlanır; bu yüzden aynı komutlar ve Compose dosyası desteklenen bir işletim sistemi çalıştıran Raspberry Pi'de de çalışır.



