Node-RED

MQTT Projeleri İçin Node-RED'i Docker'da Çalıştırın

Pratik bir Node-RED Docker rehberi: resmi imajı çalıştırın, flow'ları kalıcı bir volume'de tutun, Docker Compose kullanın, ek node'lar kurun, gizli bilgileri ortam değişkenleriyle aktarın ve TLS üzerinden bir MQTT broker'a bağlanın.

Kalıcı veri volume'ü olan ve bir MQTT broker'a bağlanan Node-RED Docker container'ı
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

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, /data iç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

  1. Her güncellemeden önce veri klasörünü veya volume'ü yedekleyin.
  2. docker-compose.yml içindeki imaj etiketini değiştirin, ardından docker compose pull && docker compose up -d çalıştırın.
  3. Güncellemeden sonra yüklenemeyen node'lar için docker logs -f nodered çıktısını izleyin.
  4. Gerekirse önceki etiketi geri yükleyerek geri dönün; veri klasörü değişmez.
  5. Node.js ana sürüm değişikliğinden sonra native kodlu node'ları yeniden derleyin (/data içinde npm rebuild).
  6. .env dosyasını sürüm kontrolünün dışında tutun ve gizli bilgi yöneticinizde saklayın.
  7. 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.

İlgili yazılar

ISA-95 Topic'leriyle Node-RED OPC UA İstemcisinden MQTT'ye

Bir PLC veya simülasyon sunucusundaki OPC UA değişkenlerine node-red-contrib-opcua ile abone olun, node ID'lerini ISA-95 tarzı MQTT topic'lerine eşleyin ve değerleri kalite bilgisi ve zaman damgalarıyla yayınlayın.

8 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.