Kendi Online Toplantı Sistemimi Geliştirdim: Toplantı Planlama, E-Posta ve Takvim Daveti
Bu projede kendi sunucum üzerinde çalışan, kullanıcıların online toplantı oluşturabildiği, ileri tarihli toplantı planlayabildiği ve katılımcılara otomatik e-posta ile takvim daveti gönderebildiği bir Online Toplantı Platformu geliştirdim.
Projenin temel amacı; toplantıların üçüncü taraf platformlara bağımlı olmadan kendi altyapım üzerinden gerçekleştirilebilmesi ve toplantı oluşturma sürecinin tek bir sistem üzerinden yönetilebilmesiydi.
Sistemin video konferans altyapısında BigBlueButton, kullanıcı ve oda yönetimi tarafında ise Greenlight altyapısını kullandım. Ancak standart yapıyı olduğu gibi kullanmak yerine ihtiyaçlarıma göre birçok özel geliştirme yaptım.
Projenin Ortaya Çıkış Amacı
Bir online toplantı platformundan beklentim yalnızca görüntülü görüşme yapılabilmesi değildi.
Kullanıcı sisteme giriş yaptığında toplantı odalarını yönetebilmeli, ileri tarihli toplantı oluşturabilmeli, katılımcıları belirleyebilmeli ve sistem toplantı davetlerini otomatik olarak gönderebilmeliydi.
Bu nedenle sistemi aşağıdaki yapı üzerine kurguladım:
- Sesli ve görüntülü toplantı
- Ekran paylaşımı
- Toplantı içi mesajlaşma
- Toplantı odası oluşturma ve yönetme
- İleri tarihli toplantı planlama
- Katılımcı yönetimi
- Otomatik e-posta daveti
- ICS takvim daveti
- Toplantı kayıtları
- Planlanan toplantıların takibi
Kullandığım Altyapı
Video konferans altyapısında açık kaynaklı BigBlueButton kullandım.
BigBlueButton; görüntü, ses, ekran paylaşımı, sohbet ve toplantı kaydı gibi temel konferans özelliklerini sağlıyor.
Kullanıcıların toplantı odalarını yönetebilmesi için ise Greenlight arayüzünü kullandım.
Greenlight'ın açık kaynaklı olması sayesinde React ve Ruby on Rails tarafında doğrudan geliştirmeler yaparak sistemi kendi ihtiyaçlarıma göre genişletebildim.
Arayüzü Baştan Özelleştirdim
İlk kurulumdan sonra karşıma çıkan standart Greenlight giriş ekranını kullanmak istemedim.
Standart arayüzde BigBlueButton ve eğitim/sanal sınıf kullanımına yönelik açıklamalar bulunuyordu. Ben sistemi genel amaçlı bir online toplantı platformu olarak kullanacağım için ana sayfayı yeniden düzenledim.
Ana sayfadaki içerikleri;
- Online toplantı oluşturma
- Toplantı kaydetme
- Toplantı odalarını yönetme
- Tarayıcı üzerinden kolay katılım
gibi doğrudan platformun kullanım amacını anlatan içeriklerle değiştirdim. Gereksiz dış bağlantıları ve standart Greenlight footer alanlarını da kaldırarak daha sade bir yapı oluşturdum.
Toplantı Odaları
Sisteme giriş yapan kullanıcı kendi toplantı odalarını oluşturabiliyor. Her odanın kendisine ait benzersiz bir toplantı bağlantısı bulunuyor.
Kullanıcı toplantıyı başlattığında katılımcılar kendilerine gönderilen bağlantı üzerinden tarayıcı ile toplantıya katılabiliyor.
Katılımcı tarafında ayrıca bir masaüstü uygulamasının kurulmasına ihtiyaç bulunmuyor.
E-Posta ile Toplantı Daveti Özelliği Ekledim
Sisteme eklediğim önemli geliştirmelerden biri e-posta üzerinden toplantı daveti gönderme özelliği oldu.
Kullanıcı toplantı bilgilerini belirlediğinde sistem katılımcılara otomatik olarak HTML formatında hazırlanmış bir toplantı daveti gönderebiliyor.
Gönderilen davette;
- Toplantı başlığı
- Tarih
- Başlangıç saati
- Toplantı süresi
- Toplantıyı oluşturan kullanıcı
- Toplantı notu
- Toplantıya katılım bağlantısı
yer alıyor.
ICS Takvim Daveti
Sadece e-posta göndermek yerine toplantı davetlerine otomatik olarak .ics takvim dosyası da ekledim.
Böylece daveti alan kullanıcı toplantıyı Outlook veya ICS destekleyen diğer takvim uygulamalarına ekleyebiliyor.
Oluşturulan ICS içeriğinin temel yapısı şu şekilde:
BEGIN:VCALENDAR
VERSION:2.0
METHOD:REQUEST
BEGIN:VEVENT
SUMMARY:Toplantı Başlığı
DTSTART:20260901T111000Z
DTEND:20260901T121000Z
LOCATION:Online Toplantı
END:VEVENT
END:VCALENDAR
Böylece sistem yalnızca toplantı bağlantısı gönderen bir yapıdan çıkıp gerçek bir toplantı davet sistemine dönüşmüş oldu.
Toplantı Planlama Modülü Geliştirdim
Projenin sonraki aşamasında Greenlight'ın standart yapısında bulunmayan Planlı Toplantılar modülünü geliştirdim.
Kullanıcı ekranına yeni bir sekme ekleyerek mevcut yapıyı;
Odalar
Planlı Toplantılar
Kayıtlar
şeklinde genişlettim.
Planlı Toplantılar ekranından kullanıcı Toplantı Planla butonuyla yeni bir toplantı oluşturabiliyor.
Toplantı Planlama Ekranı
Geliştirdiğim toplantı planlama ekranında kullanıcıdan şu bilgileri alıyorum:
- Toplantı başlığı
- Kullanılacak toplantı odası
- Toplantı tarihi
- Başlangıç saati
- Toplantı süresi
- Katılımcı e-posta adresleri
- Açıklama / toplantı notu
Birden fazla katılımcı eklenebiliyor ve katılımcılar virgül, noktalı virgül veya yeni satır kullanılarak girilebiliyor.
Planlı Toplantılar İçin Veritabanı Yapısı
Greenlight'ın mevcut tablolarını değiştirmek yerine planlama sistemi için ayrı bir veri modeli oluşturdum.
Toplantıların tutulduğu temel tablo:
scheduled_meetings
id
room_id
user_id
title
scheduled_at
duration
description
status
created_at
updated_at
Toplantı katılımcılarını ise ayrı bir tabloda tutuyorum:
scheduled_meeting_participants
id
scheduled_meeting_id
email
name
invitation_sent_at
created_at
updated_at
Bu tasarım sayesinde tek bir toplantıya birden fazla katılımcı bağlayabiliyorum.
Ayrıca invitation_sent_at alanı sayesinde davetin
katılımcıya ne zaman gönderildiği de takip edilebiliyor.
Ruby on Rails API Katmanı
Planlı toplantıların frontend ve backend arasında yönetilebilmesi için Greenlight'ın Ruby on Rails API yapısını genişlettim.
Planlı toplantılar için REST endpoint'leri oluşturdum:
GET /api/v1/scheduled_meetings
POST /api/v1/scheduled_meetings
GET /api/v1/scheduled_meetings/:id
PATCH /api/v1/scheduled_meetings/:id
DELETE /api/v1/scheduled_meetings/:id
Bunun yanında toplantı iptali ve davetin tekrar gönderilebilmesi için özel endpoint'ler de ekledim:
POST /api/v1/scheduled_meetings/:id/cancel
POST /api/v1/scheduled_meetings/:id/resend_invitation
React Tarafında Planlı Toplantılar
Frontend tarafında React kullanarak yeni bir Planlı Toplantılar bileşeni oluşturdum.
React Query üzerinden API ile haberleşerek toplantıların otomatik yüklenmesini ve yeni toplantı oluşturulduktan sonra listenin yenilenmesini sağladım.
Kullanıcı toplantı oluştururken sayfadan ayrılmak zorunda kalmıyor. Bootstrap Modal içerisinde açılan planlama ekranından tüm bilgiler girilebiliyor.
Toplantı Oluşturulduğunda Ne Oluyor?
Kullanıcı Toplantıyı Planla butonuna bastığında arka tarafta birkaç işlem otomatik olarak gerçekleştiriliyor:
- Toplantının kullanıcıya ait olup olmadığı kontrol ediliyor.
- Planlanan toplantı veritabanına kaydediliyor.
- Katılımcı e-posta adresleri oluşturuluyor.
- Her katılımcı için toplantı daveti hazırlanıyor.
- HTML e-posta gönderiliyor.
- ICS takvim daveti e-postaya ekleniyor.
- Davetin gönderildiği zaman veritabanına kaydediliyor.
- Planlı Toplantılar ekranı otomatik olarak güncelleniyor.
Böylece kullanıcı açısından bütün süreç tek bir Toplantıyı Planla işlemiyle tamamlanıyor.
Saat Dilimi Problemi
Geliştirme sırasında karşılaştığım konulardan biri de saat dilimi oldu.
Örneğin kullanıcı toplantıyı 14:10 olarak planladığında sistem bunu UTC olarak yorumladığı için arayüzde 17:10 olarak gösterebiliyordu.
Bunu frontend'den gönderilen tarih-saat değerine açık şekilde Türkiye saat dilimi offset'ini ekleyerek çözdüm:
const scheduledAt =
`${meetingDate}T${meetingTime}:00+03:00`;
Böylece kullanıcı tarafından seçilen yerel saat doğru şekilde UTC'ye çevriliyor ve tekrar kullanıcıya gösterildiğinde saat kayması oluşmuyor.
Docker ile Kendi Image'ımı Oluşturdum
Greenlight üzerinde yaptığım değişikliklerin kalıcı olması için uygulamanın kendi Docker image'ını oluşturdum.
docker build -t greenlight-custom:3.8.2.4 .
Kod üzerinde yaptığım değişikliklerden sonra yeni image oluşturup container'ı yeniden ayağa kaldırıyorum:
docker compose up -d --force-recreate greenlight-v3
Böylece standart Greenlight image'ından bağımsız olarak kendi geliştirdiğim sürümü kullanabiliyorum.
Sistem Şu Anda Neler Yapabiliyor?
Geldiğim noktada geliştirdiğim online toplantı sistemi şu özellikleri destekliyor:
- Görüntülü ve sesli toplantı
- Ekran paylaşımı
- Toplantı içi sohbet
- Toplantı odası oluşturma
- Özel toplantı bağlantıları
- Toplantı kaydı
- İleri tarihli toplantı planlama
- Birden fazla katılımcı ekleme
- Otomatik HTML toplantı daveti
- ICS takvim daveti
- Toplantı tarihi ve süresi belirleme
- Toplantı notu ekleme
- Planlanan toplantıları listeleme
- Toplantı durumlarını takip etme
- Davet gönderim zamanını takip etme
- Özelleştirilmiş kullanıcı arayüzü
Sonuç
Bu projeye ilk başladığımda hedefim kendi sunucum üzerinde çalışan basit bir görüntülü toplantı sistemi oluşturmaktı.
Ancak BigBlueButton ve Greenlight'ın açık kaynaklı yapısının sağladığı esneklik sayesinde sistemi standart kurulumun ötesine taşıyarak toplantı planlama, katılımcı yönetimi, e-posta davetleri ve takvim entegrasyonu bulunan kendi online toplantı platformuma dönüştürdüm.
En önemli avantajı ise sistemin kendi sunucumda çalışması ve uygulamanın hem backend hem frontend tarafında ihtiyaçlarıma göre geliştirilebilir olması.
Bundan sonraki aşamalarda toplantı hatırlatmaları, yaklaşan toplantılar için otomatik bildirimler, daha gelişmiş toplantı geçmişi ve yönetim raporları gibi özellikleri de sisteme eklemeyi planlıyorum.