Bir eğitim kurumuna hizmet verecek bir videokonferans sistemi kurmayı hedefliyorsanız, BigBlueButton sunucularının önüne yük dağıtıcı olarak Scalelite kurulumu yapmalısınız.
Covid-19 salgınıyla birlikte uzaktan öğrenim kavramı hayatımızda çok daha fazla yer etmeye başladı. Eğitim kurumlarının ihtiyaç ve taleplerinde ani bir yükseliş yaşandı. Onların ihtiyaçlarına cevap verebilecek çözümlerse gitgide popülerleşmekte. BigBlueButton da bu amaçla tasarlanmış, web tabanlı bir telekonferans uygulaması. Barındırdığı gerçek-zamanlı ses, görüntü, sunum ve ekran paylaşımının yanı sıra akıllı tahta, not paylaşımı ve anket gibi özelliklerle uçtan uca bir eğitim çözümü sunuyor. Üstelik hazırladıkları betik sayesinde tek bir komutla 15 dakikada kurulum yapmanız mümkün.
Scalelite, BigBlueButton API’lerini ölçeklendirmeyi sağlayan bir yük dağıtım aracı. Bu araç sayesinde, istenilen sayıda BigBlueButton sunucusu merkezi bir havuzdan yönetilebiliyor. Böylece çok sayıda öğrenciye kesintisiz eğitimi ulaştırmak çok daha kolay. Bu yazıda da DigitalOcean altyapısını baz alarak; 4 çekirdek, 8 GB RAM ve 160 GB disk içeren Ubuntu 18.04 yüklü bir makinada Scalelite kurulumundan bahsedeceğim. Bu yazıyı hazırlarken Scalelite’ın kendi belgelendirmesini baz aldım.
Scalelite kurulumu için bir sunucunun yanı sıra, PostgreSQL veritabanı, Redis cache ve paylaşımlı volume’e ihtiyaç var. Her birinin minimum gereksinimlerine buradan ulaşabilirsiniz. Scalelite uygulamaları konteynerler olarak çalıştığından, kurulum yapacağınız makinada Docker’ın yüklü olmasını gereksinmekte. Ubuntu üzerinde Docker kurulumunun nasıl yapılacağına buradan ulaşabilirsiniz. API’nizi SSL ile güvenceye almak isterseniz, bu yazıda referans aldığımız gibi Let’s Encrypt ile sertifikanızı ücretsiz bir şekilde edinebilirsiniz.
Hazırsanız, başlayalım.
1) Volume Kurulumu
İlk olarak, sunucumuza eklediğimiz volume’u mount edeceğiz. DigitalOcean arayüzünde Droplet’in içine girdikten sonra, Volumes → More → Config Instructions bize bunun için gereken komutları gösteriyor.
Burada, mnt dizininin altına mount edeceğimiz volume’un adını ‘scalelite-recordings’ olarak değiştirmemiz gerekiyor. Bu durumda görseldeki komutları şu şekilde girmemiz gerekecek:
mkdir -p /mnt/scalelite-recordings mount -o discard,defaults,noatime /dev/disk/by-id/scsi-0DO_Volume_volume-fra1-01 /mnt/scalelite-recordings echo '/dev/disk/by-id/scsi-0DO_Volume_volume-fra1-01 /mnt/scalelite-recordings ext4 defaults,nofail,discard 0 0' | sudo tee -a /etc/fstab
Volume için kullanılan yazma izinlerinin kontrolünde kullanıcı veya grup ismi yerine, user id ve group id kullanılıyor. İzinlerle ilgili istikrarı sağlamak için her BigBlueButton sunucusunda 2000 id’li bir kullanıcı grubu oluşturuyoruz:
groupadd -g 2000 scalelite-spool usermod -a -G scalelite-spool bigbluebutton
Şimdi sıra Scalelite uygulamalarının volume ile konuşabilmesi için gereken dizin yapısını ve izinleri oluşturmaya geldi. Scalelite sunucunda aşağıdaki komutları çalıştırıyoruz:
mkdir -p /mnt/scalelite-recordings/var/bigbluebutton/spool chown 1000:2000 /mnt/scalelite-recordings/var/bigbluebutton/spool chmod 0775 /mnt/scalelite-recordings/var/bigbluebutton/spool mkdir -p /mnt/scalelite-recordings/var/bigbluebutton/recording/scalelite chown 1000:1000 /mnt/scalelite-recordings/var/bigbluebutton/recording/scalelite chmod 0775 /mnt/scalelite-recordings/var/bigbluebutton/recording/scalelite mkdir -p /mnt/scalelite-recordings/var/bigbluebutton/published chown 1000:1000 /mnt/scalelite-recordings/var/bigbluebutton/published chmod 0775 /mnt/scalelite-recordings/var/bigbluebutton/published mkdir -p /mnt/scalelite-recordings/var/bigbluebutton/unpublished chown 1000:1000 /mnt/scalelite-recordings/var/bigbluebutton/unpublished chmod 0775 /mnt/scalelite-recordings/var/bigbluebutton/unpublished
Yayımlanmış kayıtların ilgili BigBlueButton sunucusundan, Scalelite’ın kullandığı merkezi volume’e transferi için iki tane script yüklememiz gerekiyor.
Her bir BigBlueButton sunucumuzda, scalelite_post_publish.rb ve scalelite.yml dosyalarını, sırasıyla /usr/local/bigbluebutton/core/scripts/post_publish ve /usr/local/bigbluebutton/core/scripts dizinlerine yüklememiz gerekiyor. Burada önemli bir nokta, scalelite.yml dosyasının içindeki spool_dir değerini /mnt/scalelite-recordings/var/bigbluebutton/spool ile değiştirmek.
Dosyaların transferi rsync aracılığıyla gerçekleşeceği için, BigBlueButton sunucularının Scalelite ile SSH protokolü üzerinden konuşabilmesi gerekiyor. Bunu sağlamak için öncelikle BigBlueButton kullanıcısına geçerek SSH key üreteceğiz:
su - bigbluebutton -s /bin/bash mkdir -p ~/.ssh ; chown 0600 ~/.ssh ssh-keygen -t ed25519 -N '' -f ~/.ssh/scalelite
Şimdi ~/.ssh/scalelite.pub yolunda bir public key dosyası oluşmuş olmalı. Bu key’i Scalelite sunucumuzdaki authorized_keys dosyasına ekliyoruz. Ardından BigBlueButton sunucumuzda ~/.ssh dizininde config isimli bir dosya oluşturup kullanıcıyı ve kullanması gereken key’i listeliyoruz:
Host scalelite.artistanbul.io User scalelite-spool IdentityFile ~/.ssh/scalelite
Artık BigBlueButton sunucusu üzerinden SSH bağlantısı yapabiliyor olmalıyız.
ssh scalelite.artistanbul.io
2) Scalelite uygulamalarının kurulumu
Sıra nihayet Scalelite uygulamalarının kurulumuna geldi. Öncelikle, uygulamaların ortaklaşa kullanacağı environment dosyasını, etc/default/ dizininin altına Scalelite adıyla oluşturmamız gerekiyor. Dosyada yer alacak değişkenlere tek tek göz atalım:
- URL_HOST: Scalelite uygulamanızın erişileceği hostname
- SECRET_KEY_BASE: Rails uygulamasının kullandığı secret key. ‘openssl rand -hex 64’ ile üretebilirsiniz.
- LOADBALANCER_SECRET: Uygulamaların BigBlueButton servislerini kullanırken kullandıkları paylaşımlı secret key. ‘openssl rand -hex 32’ ile üretebilirsiniz.
- DATABASE_URL: PostgreSQL bağlantısı için kullanılan connection string. Url formatı postgresql://kullanıcı-adı:şifre//url:port/veritabanı-adı şeklinde olmalıdır.
- REDIS_URL: Redis bağlantısı için kullanılan connection string. URL formatı rediss://kullanıcı-adı:şifre@url:port şeklinde olmalıdır.
- SCALELITE_TAG: Scalelite uygulamalarının sürümü. Değerinin ‘v1’ olması gerekiyor.
- SCALELITE_RECORDING_DIR: Yayımlanmış BigBlueButton kayıtlarının depolanacağı dizin.
- NGINX_SSL: Uygulamayı SSL ile sunup sunmadığımızı kontrol eden flag.
- SCALELITE_NGINX_EXTRA_OPTS: Uygulamayı SSL ile sunmamız durumunda sertifikalarımızı mount etmemizi sağlayan seçenek.
Scalelite, kendi konteynerlerinin systemd ile yönetimini salık veriyor. Biz de öyle yapacağız. Bunun için, öncelikle, uygulamaların birbirleriyle iletişim kuracakları docker ağını oluşturuyoruz:
docker network create scalelite
Devamında, Scalelite konteynerlerinin tamamını aynı anda durdurup başlatmamıza yardımcı olacak scalelite.target dosyasını etc/systemd/system/ dizininin altında oluşturup aktifleştiriyoruz.
systemctl enable scalelite.target
Web Frontend (scalelite-api ve scalelite-nginx)
Scalelite-api konteyneri, gelen BigBlueButton API isteklerine cevap verme yükünü üstlenir. Scalelite-nginx ise SSL Termination (SSL ile şifrelenmiş veri trafiğinin çözülmesi işlemi) ve volume’deki kayıtlı dosyaların sunulmasından sorumludur. Bu iki konteyner mutlaka aynı sunucuda barınmalıdır.
Uygulamaları çalışmaya hazır hale getirmek için scalelite-api.service ve scalelite-nginx.service dosyalarını /etc/systemd/system/ dizininin altına oluşturup aktifleştiriyoruz:
systemctl enable scalelite-api.service systemctl enable scalelite-nginx.service
Şimdi tüm Scalelite servislerini yeniden başlatarak uygulamaların durumunu kontrol edebiliriz:
systemctl restart scalelite.target systemctl status scalelite-*
PostgreSQL servisine veritabanı şemasını yükleyip, Scalelite servislerini yeniden başlatmamız gerekiyor:
docker exec -it scalelite-api bin/rake db:setup
Görüşme durum takipçisi (scalelite-poller)
scalelite-poller konteyneri, BigBlueButton sunucularının erişilebilirliğini ve yükünü periyodik olarak saptayan ve sona eren görüşmeleri tespit eden bir işlem yürütmekle yükümlü.
scalelite-poller.service dosyasını /etc/systemd/system/ dizininin altına oluşturup aktifleştiriyoruz:
systemctl enable scalelite-poller.service systemctl restart scalelite.target
Uygulamamızın statüsünü kontrol edelim:
systemctl status scalelite-poller.service
Eğer uygulamamızın statüsü ‘failed’ olarak görünüyorsa, Redis bağlantısında bir sorun yaşıyor olabilir. Bu sorunun nedeni, bazı Redis hizmet sağlayıcılarının (DigitalOcean gibi) yapılan bağlantıların TLS üzerinden olmasını şart koşmalarına karşın Scalelite’ın kullandığı Redis istemcisinin böyle bir öntanımlamaya sahip olmamasıdır. Çözüm için, Redis sunucumuzla yaptığımız bağlantıları şifreleyecek bir kapsayıcı araç kullanacağız: Stunnel.
Redis istemcisi bağlantı isteğini stunnel’a iletecek; o da isteği şifreleyip sunucuyla haberleşecek. Scalelite uygulamaları bir “docker özel ağı” içinde haberleştiğinden, aynı sunucuda çalışan stunnel adresine localhost üzerinden erişemezler. Bunu aşmak içinse, stunnel uygulamasını, aynı ağın içinde çalışacak şekilde konteynerize etmemiz gerekecek. Örnek bir konteyneri burada bulabilir; çözümün entegrasyonu içinse içerisindeki kılavuza başvurabilirsiniz.
Kayıt yükleyicisi (scalelite-recording-importer):
scalelite-recording-importer konteyneri, yeni kayıtların BigBlueButton sunucularından spool dizinine aktarımını takip eder. Aktarılan kayıtları ayıklama, kayıt bilgilerini Scalelite veritabanına ekleme ve dosyaları, scalelite-nginx’in sunabilmesi için doğru dizinlere yerleştirme işlerinden sorumludur.
scalelite-recording-importer.service dosyasını /etc/systemd/system/ dizininin altına ekleyip aktifleştirelim:
systemctl enable scalelite-recording-importer.service systemctl restart scalelite.target
Ardından, uygulamanın statüsünü kontrol ederek kurulumu tamamlayalım:
systemctl status scalelite-recording-importer.service
3) Sunucu yönetimi
Uygulamaların kurulumunu tamamlamanın ardından, artık Scalelite ile BigBlueButton sunucularını yönetebiliriz. Aşağıda verdiğim yönetim komutlarını çalıştırmadan önce, scalelite-api konteynerine giriş yapmanız gerekiyor:
docker exec -it scalelite-api /bin/sh
Sunucuların detaylarını görüntüleme
./bin/rake servers
Bu komut, bağlı bulunan sunucularla ilgili ayrıntıları listeler:
Sunucu ekleme
./bin/rake servers:add[url, secret]
Url değeri olarak, BigBlueButton API adresinin tam url’ini yazmanız gerekiyor. Değerinin sonunun /api ile bitmesi şart. BigBlueButton sunucusunun url ve secret key’ini, BigBlueButton sunucusunun içinde bbb-conf –secret komutunu çalıştırarak öğrenebilirsiniz.
Sunucu kaldırma
./bin/rake servers:remove[id]
Kaldırma komutunu çalıştırmadan önce, sunucunun içinde süren tüm görüşmelerin bittiğinden emin olun. Aksi halde veritabanını ‘tutarsız durumda’ bırakabilirsiniz. Görüşmelerin bitmesini beklemek istemiyorsanız, panik fonksiyonuna başvurabilirsiniz.
Sunucu pasifleştirme
./bin/rake servers:disable[id]
Bir sunucu pasif hale getirildiğinde, yeni görüşmeleri kabul edemiyor duruma geçer. Halihazırda başlamış görüşmeler sonlandırılmaz. Durum takip işlemi, pasif hale gelmiş sunucularda, ‘online’ durumunu güncellemek ve sonlanmış görüşmeleri tespit etmek için çalışmaya devam eder.
Sunucu etkinleştirme
./bin/rake servers:enable[id]
Sunucuyu etkin hale getirir; ancak sunucunun durumu, bir sonraki durum takip işlemi çalışana kadar değişmeyecektir.
Sunucu panikleme
./bin/rake servers:panic[id]
Sunucuyu pasifleştirip, görüşme verilerini sıfırlamayı sağlar. Bunu, çökmüş bir BigBlueButton sunucusunu kurtarmak için kullanabilirsiniz. Görüşme verisinin sıfırlanmasının ardından, daha önce bu sunucuda bulunan bir görüşmeye katılmaya çalışan herkes, başka bir sunucuya yönlendirilecektir.
Tüm sunucularda durum takip işlemini çalıştırma
./bin/rake poll:all
Bir sunucuyu havuza eklediğinizde, Scalelite’ın o sunucuyu “online” olarak işaretlemesi 60 saniyeyi bulabilir. Bu komutu çalıştırarak, beklemeden durum takip işleminin gerçekleşmesini sağlayabilirsiniz.
Sunucuların durumlarını kontrol etme
./bin/rake status
Bu komutla, bütün sunucuları ve onlarla ilgili temel istatistikleri bir tablo halinde görüntüleyebilirsiniz.
Scalelite kurulumu ve BigBlueButton sunucularının yönetimine dair yapılacakları tamamladık. Artık frontend kodunuza Scalelite API adresini ekleyerek, BigBlueButton servisinizi daha çok öğrenciyle buluşturabilirsiniz.
Son söz
Artistanbul olarak BigBlueButton ve Scalelite kurulumu dışında; bakım, barındırma, 3. taraf LMS ve eğitim araçlarıyla entegrasyon, geliştirme, destek ve optimizasyon (Asıl iş bence bu, aksi takdirde sunucuya kat ve kat daha fazla para ödersiniz!) hizmetleri sağlıyoruz. BigBlueButton’ı kullanmaya karar verdiyseniz, bizi arayın derim 🙂
Sela
Thanks so much. Your instructions were a step in the right direction for me. I’ve tried to work on a script to automate this process but it’s a pity I can’t share it since it was for a client. Keep up the good work.
Uncel
Dear
My DATABASE config is not problem username/password in /etc/default/scalelite
But when create database for `scalelite-api` it’s allway `Connection refused`
Any recommend for that
This is full log: https://paste.cloud365.vn/?ad4ff5b74b00ba8c#P/movqtlfpKLVYGcltbEhv1op78H3KdIw/4AEf4f628=
Ahmet Demir
Bence bu konuda videolu bir anlatımda yapılsa çok iyi olur.