12 Days of DigitalOcean (Day 5) – Günlük Tetikleyicilerle Doğum Günü Hatırlatıcılarını Otomatikleştirme
Giriş: Unutulan Doğum Günlerine Son!
Günümüzün hızlı tempolu dünyasında, kişisel ve profesyonel hayatlarımızda birçok detayı akılda tutmak zorlaşabiliyor. Özellikle sevdiklerimizin veya iş arkadaşlarımızın özel günlerini, örneğin doğum günlerini unutmak, istenmeyen durumlara yol açabilir. Bir doğum gününü kaçırmak, sadece küçük bir utanç kaynağı olmakla kalmaz, aynı zamanda ilişkilerdeki değeri ve özeni de sorgulatabilir. Neyse ki, teknoloji sayesinde bu tür unutkanlıkların önüne geçmek, hatta bu süreci tamamen otomatikleştirmek mümkün. DigitalOcean’ın güçlü ve esnek bulut hizmetleri, bu tür otomasyon görevleri için mükemmel bir platform sunar.
“12 Days of DigitalOcean” serisinin beşinci gününde, günlük tetikleyiciler kullanarak doğum günü hatırlatıcılarını nasıl otomatikleştirebileceğimizi derinlemesine inceleyeceğiz. Bu makalede, DigitalOcean Functions (Sunucusuz Fonksiyonlar), Managed Databases (Yönetilen Veritabanları) gibi hizmetleri kullanarak, her gün belirli bir saatte çalışacak, yaklaşan doğum günlerini tespit edecek ve bize otomatik olarak bildirim gönderecek bir sistemin nasıl kurulacağını adım adım ele alacağız. Amacımız, hem teknik bilgi birikiminizi artırmak hem de hayatınızı kolaylaştıracak pratik bir çözüm sunmaktır.
Neden Otomatik Doğum Günü Hatırlatıcıları?
Otomatik doğum günü hatırlatıcıları kurmanın ardında yatan nedenler oldukça çeşitlidir ve hem kişisel hem de profesyonel yaşamda önemli faydalar sunar:
* Kişisel İlişkileri Güçlendirme: Doğum gününü hatırlamak ve kutlamak, birine değer verdiğinizi göstermenin en basit yollarından biridir. Otomatik hatırlatıcılar sayesinde, sevdiklerinizin özel günlerini asla unutmaz, onlara zamanında ve içten bir şekilde kutlama mesajı göndererek ilişkilerinizi daha da güçlendirirsiniz.
* Stres ve Unutkanlığı Azaltma: Doğum günlerini takip etmek için sürekli ajanda kontrol etmek veya zihinsel notlar tutmak stresli olabilir. Otomatik bir sistem, bu yükü üzerinizden alır ve önemli günleri kaçırma endişesini ortadan kaldırır.
* Zaman Tasarrufu: Manuel olarak doğum günü listelerini yönetmek ve kontrol etmek zaman alıcıdır. Otomatik sistem, bu süreci tamamen sıfıra indirerek size daha önemli işlere odaklanma imkanı tanır.
* Profesyonel Bağlamda Kullanım: Müşteri ilişkileri yönetimi (CRM) sistemlerinde olduğu gibi, bu tür bir otomasyonu iş hayatına da uyarlayabilirsiniz. Örneğin, müşterilerinizin doğum günlerini kutlayarak onlarla daha kişisel bir bağ kurabilir, sadakatlerini artırabilir veya özel indirimler sunabilirsiniz.
* Ölçeklenebilirlik ve Güvenilirlik: DigitalOcean gibi bulut platformları üzerinde kurulan sistemler, yüksek ölçeklenebilirlik ve güvenilirlik sunar. İster 10 ister 1000 kişinin doğum gününü takip ediyor olun, sistem sorunsuz bir şekilde çalışmaya devam eder.
Bu faydalar göz önüne alındığında, otomatik doğum günü hatırlatıcılarının sadece bir “kolaylık” olmaktan öte, hayat kalitesini artıran önemli bir araç olduğunu söyleyebiliriz.
Temel Bileşenler ve Mimari Yaklaşım
Otomatik doğum günü hatırlatıcı sistemimizi kurarken, DigitalOcean’ın sunduğu çeşitli hizmetleri ve bazı üçüncü taraf entegrasyonlarını kullanacağız. İşte sistemin temel bileşenleri ve mimari yaklaşımımız:
Sistem Genel Bakışı
Basitçe ifade etmek gerekirse, sistemimiz şu adımları takip edecektir:
1. Veri Depolama: Tüm doğum günü bilgileri güvenli bir veritabanında saklanacak.
2. Zamanlanmış Tetikleyici: Her gün belirli bir saatte bir fonksiyon otomatik olarak çalıştırılacak.
3. İş Mantığı: Çalışan fonksiyon, veritabanını sorgulayarak yaklaşan doğum günlerini tespit edecek.
4. Bildirim: Tespit edilen doğum günleri için önceden belirlenmiş bir kanal (e-posta, SMS vb.) aracılığıyla bildirim gönderilecek.
DigitalOcean’ın Sunduğu Hizmetler
* DigitalOcean Functions (Sunucusuz Fonksiyonlar): Bu, sistemimizin kalbini oluşturacak. Sunucusuz fonksiyonlar, belirli bir olaya (örneğin, zamanlanmış bir tetikleyici) yanıt olarak çalışan küçük, bağımsız kod parçalarıdır. Sunucu yönetimiyle uğraşmadan, sadece kodumuzu yazarak hızlı ve maliyet etkin bir şekilde uygulamalar geliştirmemizi sağlarlar. Günlük tetikleyicilerimiz ve doğum günü kontrol mantığımız burada çalışacak.
* DigitalOcean Managed Databases (Yönetilen Veritabanları): Doğum günü bilgilerini güvenli ve erişilebilir bir şekilde saklamak için yönetilen bir veritabanı hizmeti kullanacağız. DigitalOcean, PostgreSQL, MySQL, Redis gibi popüler veritabanları için yönetilen çözümler sunar. Bu sayede veritabanı kurulumu, bakımı, yedeklemesi gibi operasyonel yüklerden kurtuluruz.
* DigitalOcean App Platform (Uygulama Platformu – İsteğe Bağlı): Eğer sistemimize bir web arayüzü eklemek, doğum günü bilgilerini kolayca yönetmek veya daha karmaşık bir API sunmak istersek, App Platform mükemmel bir seçenektir. Ancak temel hatırlatıcı sistemi için zorunlu değildir.
* DigitalOcean Droplets (Sanal Sunucular – Alternatif): Sunucusuz fonksiyonlar yerine, bir Droplet üzerinde bir cron job kurarak da benzer bir otomasyonu sağlayabiliriz. Ancak Functions, daha az yönetim yükü ve “kullandıkça öde” modeli ile bu tür görevler için genellikle daha uygun maliyetlidir.
Üçüncü Taraf Entegrasyonlar
* E-posta Servisleri (SendGrid, Mailgun vb.): Doğum günü hatırlatıcılarını e-posta olarak göndermek için bu servislerin API’lerini kullanacağız. Genellikle ücretsiz katmanları bulunur ve kolay entegrasyon sağlarlar.
* SMS Servisleri (Twilio vb.): Eğer hatırlatıcıları SMS olarak almak istersek, Twilio gibi SMS API sağlayıcıları kullanılabilir.
* Anlık Mesajlaşma (Slack, Discord Webhooks): Daha çok ekip içi kullanım veya kişisel bildirimler için Slack veya Discord gibi platformların webhook özelliklerini kullanarak mesaj gönderebiliriz.
Veri Depolama: Doğum Günü Bilgilerini Nerede Tutacağız?
Doğum günü hatırlatıcı sistemimizin temelini, doğum günü bilgilerini sakladığımız veritabanı oluşturur. Bu verilerin güvenilir, hızlı erişilebilir ve kolay yönetilebilir olması önemlidir. Bu nedenle, DigitalOcean Managed PostgreSQL veya MySQL gibi ilişkisel bir veritabanı hizmeti tercih etmek en uygunudur.
Gereksinimler:
* Güvenilirlik: Veri kaybını önlemek için otomatik yedekleme ve yüksek erişilebilirlik.
* Erişim Hızı: Fonksiyonumuzun veritabanına hızlı bir şekilde bağlanıp sorgu yapabilmesi.
* Yönetim Kolaylığı: Veritabanı altyapısının DigitalOcean tarafından yönetilmesi, bizim sadece veriye odaklanmamızı sağlamalı.
Veritabanı Şeması Tasarımı:
Aşağıda, bir PostgreSQL veritabanında kullanabileceğimiz basit bir birthdays tablosu için örnek bir şema bulunmaktadır:
CREATE TABLE birthdays (
id SERIAL PRIMARY KEY,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100),
birth_date DATE NOT NULL,
notification_type VARCHAR(50) DEFAULT 'email', -- 'email', 'sms', 'slack'
recipient_email VARCHAR(255),
recipient_phone VARCHAR(20),
slack_webhook_url TEXT,
last_notified_year INT, -- Son hangi yılda bildirim gönderildiği
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
Sütun Açıklamaları:
* id: Her doğum günü kaydı için benzersiz kimlik.
* first_name, last_name: Doğum günü olan kişinin adı ve soyadı.
* birth_date: Kişinin doğum tarihi (yıl, ay, gün). Yıl bilgisi, yaş hesaplamak veya geçmiş yıllara göre bildirim göndermemek için önemlidir.
* notification_type: Hangi kanaldan bildirim gönderileceğini belirler (örn: ’email’, ‘sms’, ‘slack’).
* recipient_email, recipient_phone, slack_webhook_url: Bildirimin gönderileceği e-posta adresi, telefon numarası veya Slack webhook URL’si.
* last_notified_year: Bu alan, her yıl sadece bir kez bildirim gönderilmesini sağlamak için önemlidir. Bildirim gönderildiğinde, bu alan güncel yıla ayarlanır.
* created_at, updated_at: Kaydın oluşturulma ve son güncellenme tarihleri.
Tetikleyici Mekanizması: Her Gün Nasıl Çalışacak?
Sistemimizin her gün otomatik olarak çalışmasını sağlayacak mekanizma, DigitalOcean Functions’ın zamanlanmış tetikleyicileridir. Bu özellik, sunucusuz fonksiyonlarımızı belirli bir cron ifadesine göre düzenli aralıklarla çalıştırmamızı sağlar.
DigitalOcean Functions Zamanlanmış Tetikleyicileri (Cron-like triggers):
Bu, en ideal ve yönetimi en kolay yöntemdir. DigitalOcean, fonksiyonlarınıza doğrudan cron tab benzeri bir ifade tanımlayarak otomatik tetikleme imkanı sunar. Örneğin, her gün sabah 8’de çalışacak bir tetikleyici için 0 8 * (UTC saatiyle) şeklinde bir cron ifadesi kullanabiliriz. Fonksiyon, tanımlanan bu zaman diliminde otomatik olarak çağrılır ve içerisindeki kodu çalıştırır.
Alternatif: Droplet Üzerinde Cron Job:
Eğer sunucusuz mimari yerine daha geleneksel bir yaklaşım tercih ediyorsanız, DigitalOcean Droplet üzerinde bir sanal sunucu oluşturup, bu sunucu üzerinde bir script (örneğin Python veya Node.js) çalıştırabilir ve bu scripti Linux’un cron servisi ile zamanlayabilirsiniz. Ancak bu yaklaşım, sunucu yönetimi (işletim sistemi güncellemeleri, güvenlik yamaları vb.) gibi ek sorumluluklar getirir ve Functions’a göre daha az maliyet etkin olabilir.
İş Mantığı: Kimin Doğum Günü Var?
Zamanlanmış tetikleyici tarafından çağrılan fonksiyonumuzun ana görevi, veritabanından yaklaşan doğum günlerini tespit etmek ve bunlar için bildirim hazırlamaktır.
Fonksiyonun Görevi:
1. Veritabanına bağlan.
2. Bugün veya yarın doğum günü olan kişileri sorgula.
3. Sorgulama yaparken, last_notified_year alanını kontrol ederek, bu yıl için zaten bildirim gönderilip gönderilmediğini kontrol et. (Yıl dönümü geçtiyse veya henüz gelmediyse.)
4. Tespit edilen her kişi için uygun bir hatırlatma mesajı oluştur.
5. Bildirim türüne (e-posta, SMS vb.) göre ilgili API’yi çağırarak bildirimi gönder.
6. Bildirim gönderildikten sonra, ilgili kaydın last_notified_year alanını güncel yıla ayarla.
Veritabanı Sorgulama Mantığı:
Fonksiyonumuzun ana sorgusu, geçerli ay ve güne göre filtreleme yapacaktır.
SELECT *
FROM birthdays
WHERE EXTRACT(MONTH FROM birth_date) = EXTRACT(MONTH FROM CURRENT_DATE)
AND EXTRACT(DAY FROM birth_date) = EXTRACT(DAY FROM CURRENT_DATE)
AND (last_notified_year IS NULL OR last_notified_year != EXTRACT(YEAR FROM CURRENT_DATE));
Bu sorgu, sadece bugünün ay ve gününe uyan ve bu yıl henüz bildirim gönderilmemiş doğum günlerini getirir. İstenirse, yarınki doğum günleri için de benzer bir sorgu eklenebilir.
Bildirim Sistemi: Hatırlatıcıları Nasıl Göndereceğiz?
Doğum günü olan kişileri tespit ettikten sonra, bu bilgiyi kullanıcıya ulaştırmamız gerekir. Bunun için çeşitli bildirim kanalları ve üçüncü taraf servisler kullanabiliriz.
* E-posta (SendGrid, Mailgun): En yaygın ve esnek bildirim yöntemidir. SendGrid veya Mailgun gibi servisler, güçlü API’ler sunarak e-posta gönderme sürecini kolaylaştırır. Fonksiyonumuz, bu servislerin API’lerini kullanarak kişiselleştirilmiş e-postalar gönderebilir. Genellikle ücretsiz veya çok uygun fiyatlı başlangıç katmanları bulunur.
* SMS (Twilio): Acil veya anında ulaşması gereken bildirimler için SMS idealdir. Twilio, dünya genelinde SMS gönderme ve alma hizmetleri sunan popüler bir platformdur. Fonksiyonumuz, Twilio API’sini kullanarak hatırlatıcıları doğrudan telefon numaralarına gönderebilir.
* Anlık Mesajlaşma (Slack, Discord Webhooks): Eğer hatırlatıcıları bir ekip kanalına veya kişisel bir Slack/Discord hesabına göndermek istiyorsanız, bu platformların webhook özelliklerini kullanabilirsiniz. Bir webhook URL’sine basit bir HTTP POST isteği göndererek mesaj göndermek mümkündür.
Her bildirim türü için, fonksiyonumuzun ilgili servis API’sine istek yapacak kodu içermesi ve gerekli kimlik doğrulama bilgilerini (API anahtarları) güvenli bir şekilde yönetmesi gerekecektir.
Adım Adım Uygulama: DigitalOcean Üzerinde Kurulum
Şimdiye kadar teorik altyapıyı ve mimariyi konuştuk. Artık DigitalOcean üzerinde bu sistemi pratik olarak nasıl kuracağımıza dair adımları inceleyelim.
Adım 1: DigitalOcean Managed Database Kurulumu
Öncelikle doğum günü bilgilerini saklayacağımız veritabanını kurmamız gerekiyor.
1. DigitalOcean Hesabınıza Giriş Yapın: DigitalOcean kontrol paneline gidin.
2. Veritabanı Oluşturma: Sol menüden “Databases” seçeneğine tıklayın ve “Create a Database Cluster” butonuna basın.
3. Veritabanı Türü Seçimi: PostgreSQL veya MySQL’i seçin. Bu örnekte PostgreSQL kullanacağız.
4. Plan ve Bölge Seçimi: İhtiyaçlarınıza uygun bir plan (örneğin, başlangıç seviyesi bir plan) ve size en yakın veri merkezi bölgesini seçin.
5. Veritabanı Adı ve Kimlik Bilgileri: Veritabanı kümenize bir isim verin ve varsayılan kullanıcı adı ile parolasını not alın. Bu bilgiler fonksiyonumuzun veritabanına bağlanması için gerekecek.
6. Oluşturma: Veritabanı kümesini oluşturmak için “Create Database Cluster” butonuna tıklayın. Oluşturma işlemi birkaç dakika sürebilir.
7. Bağlantı Bilgilerini Alın: Veritabanı kümeniz hazır olduğunda, “Connection Details” bölümünden bağlantı dizesini (connection string) veya ayrı ayrı host, port, kullanıcı adı, parola, veritabanı adı bilgilerini alın. Bu bilgiler fonksiyonunuzun ortam değişkenlerine eklenecektir.
8. Veritabanı Şeması Oluşturma: Bir SQL istemcisi (DBeaver, pgAdmin veya psql komut satırı aracı) kullanarak veritabanınıza bağlanın ve yukarıda bahsettiğimiz birthdays tablosunu oluşturmak için SQL komutunu çalıştırın:
CREATE TABLE birthdays (
id SERIAL PRIMARY KEY,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100),
birth_date DATE NOT NULL,
notification_type VARCHAR(50) DEFAULT 'email',
recipient_email VARCHAR(255),
recipient_phone VARCHAR(20),
slack_webhook_url TEXT,
last_notified_year INT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
9. Örnek Veri Ekleme: Testleriniz için birkaç örnek doğum günü kaydı ekleyin. Bir kaydın birth_date alanını bugünün veya yarının ay ve günüyle eşleşecek şekilde ayarlayarak test etmeyi unutmayın.
INSERT INTO birthdays (first_name, last_name, birth_date, notification_type, recipient_email) VALUES
('Ayşe', 'Yılmaz', '1990-01-20', 'email', 'ayse.yilmaz@example.com'),
('Mehmet', 'Demir', '1985-01-21', 'email', 'mehmet.demir@example.com');
-- Not: Bugüne veya yarına denk gelen bir tarih seçin.
Adım 2: DigitalOcean Functions Oluşturma
Şimdi sıra, doğum günü kontrolünü yapacak sunucusuz fonksiyonumuzu oluşturmaya geldi. Bu örnekte Node.js kullanacağız, ancak Python veya Go gibi diğer dilleri de tercih edebilirsiniz.
1. Functions Projesi Başlatma:
* DigitalOcean kontrol panelinde “Functions” bölümüne gidin ve “Create Function” veya “Create Project” butonuna tıklayın.
* Yeni bir proje oluşturun ve projenize bir isim verin (örn: birthday-reminders).
* Projenin içine yeni bir fonksiyon (örneğin check-birthdays) oluşturun. Çalışma zamanı olarak “Node.js” seçin.
2. Fonksiyon Kodu (Node.js Örneği):
Aşağıdaki örnek kod, PostgreSQL veritabanına bağlanır, bugün doğum günü olanları sorgular ve SendGrid aracılığıyla e-posta gönderir.
// index.js (DigitalOcean Function kodu)
const { Client } = require('pg'); // PostgreSQL istemcisi
const sgMail = require('@sendgrid/mail'); // SendGrid istemcisi
// Ortam değişkenlerinden SendGrid API anahtarını al
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
exports.main = async (args) => {
const client = new Client({
connectionString: process.env.DATABASE_URL, // Veritabanı bağlantı dizesi
ssl: {
rejectUnauthorized: false // DigitalOcean Managed DB için gerekli olabilir
}
});
try {
await client.connect(); // Veritabanına bağlan
const today = new Date();
const currentMonth = today.getMonth() + 1; // Ay 0'dan başlar
const currentDay = today.getDate();
const currentYear = today.getFullYear();
// Bugün doğum günü olan ve bu yıl henüz bildirim gönderilmemiş kişileri sorgula
const query =
SELECT id, first_name, last_name, birth_date, notification_type, recipient_email, recipient_phone, slack_webhook_url
FROM birthdays
WHERE EXTRACT(MONTH FROM birth_date) = $1
AND EXTRACT(DAY FROM birth_date) = $2
AND (last_notified_year IS NULL OR last_notified_year != $3);
;
const res = await client.query(query, [currentMonth, currentDay, currentYear]);
const birthdaysToday = res.rows;
if (birthdaysToday.length === 0) {
console.log('Bugün doğum günü olan kimse bulunamadı veya zaten bildirim gönderildi.');
return { statusCode: 200, body: 'No birthdays today.' };
}
console.log(Bugün ${birthdaysToday.length} kişinin doğum günü var.);
for (const person of birthdaysToday) {
const fullName = ${person.first_name} ${person.last_name || ''}.trim();
const birthYear = person.birth_date ? new Date(person.birth_date).getFullYear() : null;
const age = birthYear ? currentYear - birthYear : 'bilinmiyor';
let messageBody = '';
if (birthYear) {
messageBody = Bugün ${fullName} adlı kişinin ${age}. doğum günü! Kutlamayı unutmayın.;
} else {
messageBody = Bugün ${fullName} adlı kişinin doğum günü! Kutlamayı unutmayın.;
}
// Bildirim tipine göre işlem yap
if (person.notification_type === 'email' && person.recipient_email) {
const msg = {
to: person.recipient_email,
from: process.env.SENDER_EMAIL, // Gönderen e-posta adresi (SendGrid'de doğrulanmış olmalı)
subject: Doğum Günü Hatırlatıcısı: ${fullName},
html: ${messageBody}
Sevgilerle, Otomatik Hatırlatıcı Sisteminiz
,
};
await sgMail.send(msg);
console.log(E-posta gönderildi: ${person.recipient_email});
}
// SMS veya Slack için benzer if blokları eklenebilir
// else if (person.notification_type === 'sms' && person.recipient_phone) {
// // Twilio API çağrısı
// } else if (person.notification_type === 'slack' && person.slack_webhook_url) {
// // Slack Webhook çağrısı
// }
// last_notified_year alanını güncelle
await client.query(
UPDATE birthdays SET last_notified_year = $1, updated_at = CURRENT_TIMESTAMP WHERE id = $2;,
[currentYear, person.id]
);
console.log('last_notified_year' güncellendi for ${fullName});
}
return { statusCode: 200, body: 'Doğum günü hatırlatıcıları başarıyla gönderildi.' };
} catch (error) {
console.error('Fonksiyon hatası:', error);
return { statusCode: 500, body: Hata: ${error.message} };
} finally {
await client.end(); // Veritabanı bağlantısını kapat
}
};
3. Bağımlılıkları Ekleme:
Fonksiyonunuzun kök dizininde bir package.json dosyası oluşturun ve gerekli bağımlılıkları ekleyin:
{
"name": "check-birthdays",
"version": "1.0.0",
"description": "DigitalOcean Function to check and send birthday reminders.",
"main": "index.js",
"dependencies": {
"pg": "^8.x.x", // PostgreSQL istemcisi
"@sendgrid/mail": "^7.x.x" // SendGrid istemcisi
}
}
DigitalOcean Functions, bu package.json dosyasını kullanarak bağımlılıkları otomatik olarak yükleyecektir.
4. Ortam Değişkenleri Ayarlama:
Hassas bilgileri (veritabanı bağlantı dizesi, API anahtarları) doğrudan kodda saklamak yerine ortam değişkenleri olarak ayarlamak önemlidir.
* Fonksiyonunuzun ayarlar bölümüne gidin.
* “Environment Variables” kısmına aşağıdaki değişkenleri ekleyin:
* DATABASE_URL: DigitalOcean Managed Database’inizden aldığınız bağlantı dizesi.
* SENDGRID_API_KEY: SendGrid’den alacağınız API anahtarı.
* SENDER_EMAIL: SendGrid’de doğrulanmış gönderen e-posta adresiniz.
Adım 3: Bildirim Servisi Entegrasyonu (SendGrid Örneği)
E-posta göndermek için SendGrid’i nasıl entegre edeceğimizi detaylandıralım.
1. SendGrid Hesabı Oluşturma:
* SendGrid web sitesine gidin ve ücretsiz bir hesap oluşturun. Genellikle belirli bir sayıda ücretsiz e-posta göndermenize izin veren bir katman sunarlar.
2. API Anahtarı Alma:
* SendGrid kontrol panelinize giriş yapın.
* “Settings” -> “API Keys” bölümüne gidin.
* “Create API Key” butonuna tıklayın.
* API anahtarınıza bir isim verin ve “Full Access” veya sadece “Mail Send” izinlerini seçin.
* Oluşturulan API anahtarını kopyalayın. Bu anahtarı DigitalOcean Functions’taki SENDGRID_API_KEY ortam değişkenine yapıştıracaksınız.
3. Gönderen Kimliği Doğrulama:
* SendGrid, e-posta gönderebilmeniz için gönderen e-posta adresinizi veya alan adınızı doğrulamanızı ister.
* “Settings” -> “Sender Authentication” bölümüne gidin ve e-posta adresinizi veya alan adınızı doğrulayın. Bu, spam olarak işaretlenme olasılığını azaltır. Doğruladığınız e-posta adresini DigitalOcean Functions’taki SENDER_EMAIL ortam değişkenine ekleyeceksiniz.
4. Fonksiyon İçinde SendGrid Kullanımı:
Yukarıdaki Node.js kod örneğinde sgMail.send(msg) satırı, SendGrid API’sini kullanarak e-posta gönderme işlemini gerçekleştirir. msg objesi, alıcı, gönderen, konu ve e-posta içeriği gibi bilgileri içerir.
Adım 4: Fonksiyonu Zamanlama
Fonksiyonumuzun her gün otomatik olarak çalışmasını sağlamak için bir tetikleyici ayarlamamız gerekiyor.
1. DigitalOcean Functions Tetikleyici Ayarları:
* DigitalOcean kontrol panelinde fonksiyonunuzun (örn: check-birthdays) detay sayfasına gidin.
* “Triggers” sekmesine tıklayın.
* “Add Trigger” butonuna tıklayın.
* Tetikleyici tipi olarak “Scheduled” (Zamanlanmış) seçeneğini seçin.
* Cron Expression: Bu alana fonksiyonunuzun ne zaman çalışacağını belirten bir cron ifadesi girin. Örneğin:
0 8 : Her gün sabah 8:00 UTC’de çalışır.
0 0 : Her gün gece yarısı 0:00 UTC’de çalışır.
0 8 * 1-5: Hafta içi her gün sabah 8:00 UTC’de çalışır.
Doğum günü hatırlatıcıları için genellikle sabah saatleri tercih edilir, böylece kişi gün içinde kutlama yapabilir.
* Tetikleyiciyi kaydedin.
Adım 5: Test ve Hata Ayıklama
Kurulum tamamlandıktan sonra, sistemin doğru çalıştığından emin olmak için test etmeliyiz.
1. Manuel Tetikleme: Fonksiyonunuzun detay sayfasında “Run Function” veya “Invoke” butonunu kullanarak fonksiyonu manuel olarak çalıştırın. Bu, veritabanı bağlantısı ve bildirim gönderme adımlarının doğru çalışıp çalışmadığını kontrol etmenizi sağlar.
2. Log Takibi: Fonksiyon çalıştıktan sonra, “Logs” sekmesinden çıktıları ve olası hataları kontrol edin. Veritabanı bağlantı hataları, API anahtarı sorunları veya SendGrid tarafından reddedilen e-postalar gibi sorunlar burada görünecektir.
3. Veritabanı Kontrolü: Fonksiyon çalıştıktan sonra, last_notified_year alanının güncellenip güncellenmediğini kontrol etmek için veritabanınıza bakın.
4. E-posta Kontrolü: Belirttiğiniz alıcı e-posta adresine hatırlatıcı e-postasının gelip gelmediğini kontrol edin. Spam kutusunu da kontrol etmeyi unutmayın.
5. Hata Durumları Yönetimi: Kodunuzda try-catch blokları kullanarak olası hataları yakalayın ve loglayın. Gerekirse, bir hata durumunda size bildirim gönderecek (örneğin, farklı bir e-posta adresine) ek bir mekanizma düşünebilirsiniz.
Alternatif Yaklaşımlar ve Geliştirmeler
Kurduğumuz temel sistem oldukça işlevsel olsa da, farklı ihtiyaçlara göre çeşitli alternatif yaklaşımlar ve geliştirmeler düşünülebilir.
Droplet Üzerinde Cron Job Kullanımı
Eğer sunucusuz mimari size yabancı geliyorsa veya daha fazla sunucu kontrolüne ihtiyacınız varsa, bir DigitalOcean Droplet üzerinde geleneksel bir cron job kullanabilirsiniz.
* Avantajları: Tam kontrol (işletim sistemi, yazılımlar), tanıdık ortam (Linux kullanıcıları için).
* Dezavantajları: Sunucu yönetimi (güncellemeler, güvenlik, yedekleme), daha yüksek maliyet (sürekli çalışan sunucu), daha az ölçeklenebilirlik (manuel ölçekleme gerektirebilir).
* Kurulum Adımları:
1. Bir Droplet oluşturun (örneğin Ubuntu).
2. İlgili çalışma zamanını (Node.js, Python vb.) ve bağımlılıkları yükleyin.
3. Yukarıdaki fonksiyon kodunu bir script dosyasına (örn: birthday_checker.js) kaydedin.
4. crontab -e komutunu kullanarak cron tab’ı düzenleyin ve şu satırı ekleyin:
0 8 * /usr/bin/node /path/to/your/birthday_checker.js >> /var/log/birthday_checker.log 2>&1
Bu, scripti her gün sabah 8’de çalıştıracak ve çıktıları bir log dosyasına yönlendirecektir.
DigitalOcean App Platform ile Web Arayüzü
Doğum günü bilgilerini veritabanına doğrudan eklemek veya düzenlemek yerine, kullanıcı dostu bir web arayüzü sunmak isterseniz, DigitalOcean App Platform’u kullanabilirsiniz.
* Kullanıcı Arayüzü: Bir web uygulaması (React, Vue, Angular veya sunucu tabanlı bir çerçeve) geliştirerek doğum günü ekleme, düzenleme ve silme işlemleri için bir arayüz sağlayabilirsiniz.
* API Endpointleri: Web arayüzü ile veritabanı arasında iletişim kurmak için bir API (RESTful veya GraphQL) oluşturabilirsiniz. Bu API, App Platform üzerinde barındırılabilir.
* Entegrasyon: Bu web uygulaması, Functions tarafından kullanılan aynı veritabanını paylaşabilir.
Diğer Bildirim Kanalları
E-posta ve SMS’in yanı sıra, farklı platformlara bildirim göndermek de mümkündür:
* Slack/Discord: Ekip içi veya kişisel bildirimler için bu platformların webhook API’leri kullanılabilir. Fonksiyon kodunuzda, notification_type ‘slack’ olduğunda bir HTTP POST isteği ile mesaj gönderebilirsiniz.
* WhatsApp: Twilio gibi bazı servisler, WhatsApp Business API entegrasyonu sunar. Bu, daha karmaşık bir kurulum gerektirse de, WhatsApp üzerinden bildirim gönderme imkanı sağlar.
* Push Bildirimleri: Mobil uygulama geliştiriyorsanız, Firebase Cloud Messaging (FCM) gibi servisleri kullanarak doğrudan cihazlara push bildirimleri gönderebilirsiniz.
Gelişmiş Özellikler
Sisteminizi daha da kullanışlı hale getirecek bazı geliştirmeler:
* Birden Fazla Hatırlatma: Sadece doğum gününde değil, bir hafta önce veya bir gün önce de hatırlatma göndermek isteyebilirsiniz. Fonksiyonunuzun sorgu mantığını, farklı zaman aralıklarını kapsayacak şekilde genişletebilirsiniz.
* Kişiselleştirilmiş Mesaj Şablonları: Farklı kişiler veya gruplar için farklı e-posta veya SMS şablonları kullanabilirsiniz. Bu şablonları veritabanında saklayabilir veya ayrı dosyalarda tutabilirsiniz.
* Hata Bildirimleri: Fonksiyonunuzda bir hata oluştuğunda (örneğin, veritabanı bağlantı hatası, SendGrid API hatası), bu hatayı size bildiren (örneğin, farklı bir e-posta adresine) otomatik bir e-posta gönderecek bir mekanizma ekleyebilirsiniz.
* Doğum Günü Listesi Yönetimi: Web arayüzü ile entegre bir şekilde, doğum günü listesini kolayca içe/dışa aktarma, toplu düzenleme gibi özellikler ekleyebilirsiniz.
Maliyet Analizi ve Optimizasyon
DigitalOcean üzerinde kurduğumuz bu sistemin maliyet etkinliği, özellikle sunucusuz fonksiyonlar sayesinde oldukça yüksektir.
DigitalOcean Functions: Functions, “kullandıkça öde” (pay-as-you-go) modeliyle çalışır. Yani, sadece fonksiyonunuz çalıştığında kaynak tüketir ve ücretlendirilirsiniz. Doğum günü hatırlatıcıları gibi günde sadece bir kez çalışan bir görev için bu model son derece ekonomiktir. Genellikle ilk birkaç yüz bin çağrı ve belirli bir GB-saniye (bellek çalışma süresi) ücretsizdir. Bu da kişisel veya küçük ölçekli kullanımlar için neredeyse sıfır maliyet anlamına gelebilir.
* DigitalOcean Managed Databases: Yönetilen veritabanları, sürekli çalışan kaynaklar olduğu için Functions’tan daha yüksek bir maliyete sahiptir. Ancak, en küçük planlar bile aylık olarak oldukça uygun fiyatlıdır ve veritabanı yönetimi yükünü üzerinizden alır. Küçük bir veritabanı için aylık birkaç dolardan başlayan fiyatlarla hizmet alabilirsiniz.
* Üçüncü Taraf Servisler (SendGrid, Twilio vb.): Çoğu e-posta ve SMS sağlayıcısı, belirli bir limit dahilinde ücretsiz katmanlar sunar. Örneğin, SendGrid ayda binlerce e-posta göndermenize ücretsiz izin verir. Twilio ise deneme bakiyesi veya düşük maliyetli SMS paketleri sunar. Bu da başlangıç maliyetlerini minimumda tutar.
Genel Maliyet Etkinliği:
Bu sistemin toplam maliyeti, kullanılan veritabanı planına ve üçüncü taraf servislerin kullanım miktarına bağlı olacaktır. Ancak, aylık birkaç dolarlık bir bütçeyle (hatta ücretsiz katmanlarla daha da az) oldukça güvenilir ve otomatik bir doğum günü hatırlatıcı sistemine sahip olabilirsiniz. Droplet üzerinde bir cron job çalıştırmak, Droplet’in sürekli çalışması gerektiği için genellikle daha yüksek aylık sabit maliyet anlamına gelir. Functions, bu tür aralıklı görevler için açık ara daha uygun maliyetli bir çözümdür.
Sonuç: Otomasyonla Hayatı Kolaylaştırmak
Bu makalede, DigitalOcean’ın güçlü bulut hizmetlerini kullanarak günlük tetikleyicilerle otomatik doğum günü hatırlatıcıları sisteminin nasıl kurulacağını ayrıntılı bir şekilde inceledik. DigitalOcean Functions, Managed Databases ve üçüncü taraf bildirim servislerinin entegrasyonu sayesinde, kişisel ilişkilerimizi güçlendiren ve hayatımızı kolaylaştıran bir otomasyon örneği oluşturduk.
Gördüğümüz gibi, DigitalOcean’ın sunucusuz mimarisi, bu tür periyodik görevler için son derece uygun maliyetli, ölçeklenebilir ve yönetimi kolay bir çözüm sunuyor. Sunucu yönetimiyle uğraşmadan, sadece kodumuzu yazarak ve basit tetikleyiciler ayarlayarak karmaşık otomasyonları hayata geçirebiliriz. Bu sistem, sadece doğum günleri için değil, aynı zamanda fatura hatırlatıcıları, proje son tarih uyarıları veya günlük rapor özetleri gibi birçok diğer periyodik görev için de temel teşkil edebilir.
Otomasyon, sadece iş süreçlerini hızlandırmakla kalmaz, aynı zamanda günlük hayatımızdaki küçük ama önemli detayları da yönetmemize yardımcı olarak zihinsel yükümüzü azaltır. DigitalOcean’ın esnek ve kapsamlı araç setiyle, yaratıcılığınızın sınırlarını zorlayabilir ve hayatınızı daha verimli hale getirecek sayısız çözümü hayata geçirebilirsiniz. Unutulan doğum günleri artık geçmişte kaldı; gelecekte ise otomasyonun getirdiği huzur ve kolaylık var.
