Takip et

Minimalist ve Hızlı: Google Cloud Run Üzerinde Geliştirici Portfolyom

Günümüzün hızla değişen dijital ortamında, bir geliştiricinin çevrimiçi varlığı, potansiyel işverenler, iş arkadaşları ve topluluk üyeleri…

Minimalist ve Hızlı: Google Cloud Run Üzerinde Geliştirici Portfolyom

Geliştirici olarak dijital dünyadaki varlığımız, bir nevi kartvizitimiz olan portfolyo sitelerimizle şekillenir. Ancak bu sitelerin geliştirilmesi, bakımı ve performansı çoğu zaman göz ardı edilir. Ben de bu makalede, minimalist, hızlı ve maliyet etkin bir geliştirici portfolyosunu Google Cloud Run üzerinde nasıl hayata geçirdiğimi adım adım anlatacağım. Bu yaklaşım, hem geliştirici kimliğimi en iyi şekilde yansıtıyor hem de ziyaretçilerime eşsiz bir kullanıcı deneyimi sunuyor.

Neden Minimalist ve Hızlı Bir Portfolyo?

Günümüzün hızla değişen dijital ortamında, bir geliştiricinin çevrimiçi varlığı, potansiyel işverenler, iş arkadaşları ve topluluk üyeleri üzerinde kalıcı bir ilk izlenim bırakmanın anahtarıdır. Bu bağlamda, portfolyo sitenizin minimalist ve hızlı olması, sadece bir tercih değil, aynı zamanda bir zorunluluktur.

İlk İzlenimin Önemi

Bir web sitesinin yüklenme hızı, ziyaretçinin siteyle etkileşimini doğrudan etkileyen en kritik faktörlerden biridir. Yapılan araştırmalar, kullanıcıların yavaş yüklenen siteleri terk etme eğiliminde olduğunu göstermektedir. Minimalist bir tasarım, gereksiz öğelerden arındırılmış, sade ve anlaşılır bir yapı sunarak ziyaretçinin dikkatini dağıtmaz ve içeriğe odaklanmasını sağlar. Bu, projelerinizi ve yeteneklerinizi net bir şekilde sergilemenize olanak tanır ve profesyonel bir imaj çizer.

Geliştirici Kimliği ve Markalaşma

Bir geliştirici olarak, kendi web sitenizin performansı ve tasarımı, kodlama yeteneklerinizin ve estetik anlayışınızın bir yansımasıdır. Hızlı ve minimalist bir portfolyo, sadece teknik bilginizi değil, aynı zamanda kullanıcı deneyimine verdiğiniz önemi ve temiz kod prensiplerine bağlılığınızı da gösterir. Bu, kişisel markanızı güçlendirir ve sizi diğer adaylardan ayırır.

Maliyet ve Bakım Kolaylığı

Karmaşık ve kaynak yoğun bir portfolyo sitesi, yüksek barındırma maliyetleri ve sürekli bakım gereksinimleri anlamına gelebilir. Minimalist bir yaklaşım, daha az kaynak tüketimiyle daha düşük maliyetler sağlar. Sunucusuz (serverless) mimarilerle birleştiğinde, bakım yükü de önemli ölçüde azalır, böylece geliştirme ve içerik oluşturmaya daha fazla zaman ayırabilirsiniz.

Google Cloud Run: Neden İdeal Çözüm?

Portfolyo sitem için barındırma çözümü arayışımda, ölçeklenebilirlik, maliyet etkinliği ve geliştirici dostu olması gibi kriterler ön plandaydı. Google Cloud Run, bu kriterlerin tamamını fazlasıyla karşılayan bir platform olarak öne çıktı.

Sunucusuz Mimarinin Gücü

Google Cloud Run, sunucusuz bir platformdur. Bu, altyapı yönetimiyle uğraşmak zorunda kalmayacağınız anlamına gelir. Sanal makineler, işletim sistemleri veya sunucu konfigürasyonları hakkında endişelenmenize gerek kalmaz. Sadece uygulamanızı Docker konteyneri olarak paketler ve Cloud Run’a dağıtırsınız. Cloud Run, uygulamanızı otomatik olarak ölçeklendirir ve sadece kullanıldığı zaman ücretlendirir. Bu “kullandığın kadar öde” modeli, özellikle düşük trafikli portfolyo siteleri için oldukça maliyet avantajlıdır.

Ölçeklenebilirlik ve Esneklik

Cloud Run, talebe göre otomatik olarak sıfırdan yüzlerce örneğe kadar ölçeklenebilir. Portfolyo siteniz bir anda yüksek trafik alsa bile, Cloud Run bu yükü sorunsuz bir şekilde karşılar. Esnekliği sayesinde, herhangi bir dilde yazılmış ve herhangi bir bağımlılığı olan uygulamaları barındırabilirsiniz, yeter ki bir Docker konteyneri içinde çalışabilsin.

Basit Dağıtım Süreci

Uygulamanızı Cloud Run’a dağıtmak oldukça basittir. Bir Dockerfile oluşturur, uygulamanızı bir konteyner imajına dönüştürür ve bu imajı Google Container Registry (GCR) veya Artifact Registry’ye yüklersiniz. Ardından, tek bir gcloud komutuyla veya Google Cloud konsolu üzerinden uygulamanızı Cloud Run’a dağıtabilirsiniz. Bu basitlik, geliştirme ve dağıtım döngüsünü hızlandırır.

Örnek Dağıtım Komutu:

gcloud run deploy my-portfolio-app \
  --image gcr.io/my-project-id/my-portfolio-image \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated

Maliyet Etkinliği

Cloud Run'ın en cazip özelliklerinden biri maliyet modelidir. Uygulamanız sadece gelen istekleri işlerken ücretlendirilir. Uygulamanızda trafik yoksa, Cloud Run otomatik olarak sıfıra ölçeklenir ve hiçbir ücret ödemezsiniz. Bu, özellikle kişisel projeler ve portfolyo siteleri için bütçe dostu bir çözümdür.

Portfolyo Uygulamasının Teknik Mimarisi

Minimalist ve hızlı bir portfolyo için teknik mimariyi tasarlarken, gereksiz karmaşıklıktan kaçınmaya ve performansı ön planda tutmaya özen gösterdim. Bu yaklaşım, basit ama güçlü bir yapı oluşturmamı sağladı.

Frontend Seçimi: Next.js (Statik Export)

Portfolyo sitemin kullanıcı arayüzü için Next.js'i tercih ettim. Next.js, React tabanlı bir framework olup, hem sunucu tarafında render (SSR) hem de statik site üretimi (SSG) yetenekleri sunar. Benim durumumda, portfolyo içeriği büyük ölçüde statik olduğu için, Next.js'in statik export özelliğini kullandım. Bu, tüm HTML, CSS ve JavaScript dosyalarını derleme zamanında oluşturarak, sunucuya bağımlılığı ortadan kaldırır ve inanılmaz derecede hızlı yükleme süreleri sağlar.

Next.js Statik Export Yapılandırması (next.config.js):

/** @type {import('next').NextConfig} */
const nextConfig = {
  output: 'export',
  distDir: 'build', // veya 'out'
};

module.exports = nextConfig;

Backend İhtiyacı ve Çözümü

Minimalist bir portfolyo sitesinde genellikle karmaşık bir backend ihtiyacı olmaz. Benim durumumda da doğrudan bir veritabanı veya sunucu tarafı işleme gereksinimi bulunmuyor. Ancak, statik olarak üretilen dosyaların bir HTTP sunucu tarafından servis edilmesi gerekiyor. Bu noktada, küçük bir Node.js uygulaması veya Nginx gibi hafif bir web sunucusu içeren bir Docker imajı kullanmak en mantıklı çözüm oluyor. Ben, statik dosyaları servis etmek için çok basit bir Node.js Express sunucusu tercih ettim.

Basit Node.js Sunucusu (server.js):

// server.js
const express = require('express');
const path = require('path');
const app = express();
const port = process.env.PORT || 8080;

// Statik dosyaları servis et
app.use(express.static(path.join(__dirname, 'build'))); // Next.js 'build' klasörü

// Tüm diğer istekleri index.html'e yönlendir (SPA için)
app.get('*', (req, res) => {
  res.sendFile(path.join(__dirname, 'build', 'index.html'));
});

app.listen(port, () => {
  console.log(Portfolio app listening at http://localhost:${port});
});

Veritabanı ve Depolama

Statik bir portfolyo için veritabanına ihtiyaç duyulmaz. Tüm içerik, derleme zamanında HTML dosyalarına gömülüdür. Resimler, PDF'ler gibi statik varlıklar için ise Google Cloud Storage gibi bir nesne depolama hizmeti kullanılabilir. Bu, CDN ile entegre edilerek global ölçekte hızlı erişim sağlar. Ancak benim yaklaşımımda, tüm statik varlıklar Docker imajının içinde paketlenerek Cloud Run tarafından servis ediliyor.

Docker ve Konteynerleşme

Cloud Run'ın temel çalışma prensibi konteynerlerdir. Uygulamamı Docker konteyneri içine almak, bağımlılıkları izole etmemi, farklı ortamlarda tutarlı bir şekilde çalışmasını sağlamamı ve dağıtım sürecini basitleştirmemi sağladı. Dockerfile, uygulamanın nasıl derleneceğini ve çalıştırılacağını tanımlayan bir tarif gibidir.

Geliştirme ve Dockerfile Oluşturma Süreci

Uygulamamın geliştirme süreci, Next.js ile statik içeriğin oluşturulması ve ardından bu içeriği sunacak hafif bir Node.js sunucusunun hazırlanması adımlarını içerdi. En kritik adım ise bu yapıyı Cloud Run'a uygun bir Docker imajına dönüştürmekti.

Temel Uygulama Yapısı

Next.js projesi standart bir yapıya sahipti: pages klasöründe sayfalar, components klasöründe yeniden kullanılabilir bileşenler ve public klasöründe statik varlıklar. Projeyi npm run build komutuyla derlediğimde, build (veya out) klasöründe tüm statik HTML, CSS ve JS dosyaları oluştu. Ardından, bu statik dosyaları servis edecek yukarıda bahsedilen server.js dosyasını projemin kök dizinine ekledim.

Dockerfile Adım Adım

Dockerfile, uygulamanın konteynerleştirilmesi için gerekli talimatları içerir. Aşağıdaki Dockerfile, Next.js uygulamasını derleyip statik olarak dışa aktarır ve ardından bu statik dosyaları basit bir Node.js Express sunucusu ile servis eder.

# 1. Aşama: Next.js uygulamasını derle
FROM node:18-alpine AS builder

WORKDIR /app

COPY package.json package-lock.json ./
RUN npm install

COPY . .

# Next.js uygulamasını statik olarak derle
# 'output: export' ve 'distDir: build' ayarları ile
RUN npm run build

# 2. Aşama: Hafif bir çalışma zamanı imajı oluştur
FROM node:18-alpine

WORKDIR /app

# Sadece statik dosyaları ve server.js'i kopyala
COPY --from=builder /app/build ./build
COPY server.js .
COPY package.json package-lock.json ./

# Sadece üretim bağımlılıklarını yükle
RUN npm install --production

# Cloud Run'ın varsayılan portu olan 8080'i dinle
ENV PORT 8080
EXPOSE 8080

CMD ["node", "server.js"]

Bu Dockerfile, iki aşamalı bir derleme (multi-stage build) kullanır. İlk aşamada, Next.js uygulaması derlenir ve statik dosyalar oluşturulur. İkinci aşamada ise, sadece bu statik dosyalar ve bunları servis edecek Node.js sunucusu kopyalanarak çok daha küçük ve güvenli bir nihai imaj elde edilir.

Yerel Testler

Dockerfile oluşturulduktan sonra, imajı yerel olarak derleyip test etmek önemlidir:

docker build -t my-portfolio-image .
docker run -p 8080:8080 my-portfolio-image

Tarayıcınızda http://localhost:8080 adresine giderek uygulamanızın beklediğiniz gibi çalıştığından emin olabilirsiniz.

Google Cloud Run Üzerinde Dağıtım ve Yönetim

Uygulama hazır ve Docker imajı oluşturulduktan sonra, sıra onu Google Cloud Run'a dağıtmaya ve yönetmeye gelir. Bu süreç, birkaç basit adımı içerir ve otomasyon için Cloud Build ile entegre edilebilir.

Google Cloud Projesi Oluşturma ve Ayarlama

Öncelikle, Google Cloud konsolunda yeni bir proje oluşturmanız veya mevcut bir projeyi kullanmanız gerekir. Ardından, Cloud Run, Cloud Build ve Container Registry (veya Artifact Registry) API'lerinin etkinleştirildiğinden emin olun.

Cloud Build ile Otomatik Dağıtım

Her kod değişikliğinde manuel olarak dağıtım yapmak yerine, Cloud Build kullanarak CI/CD (Sürekli Entegrasyon/Sürekli Dağıtım) hattı oluşturabiliriz. Bu, her Git push işleminde uygulamanın otomatik olarak derlenmesini, Docker imajının oluşturulmasını ve Cloud Run'a dağıtılmasını sağlar.

cloudbuild.yaml Örneği:

steps:
  # Docker imajını derle
  - name: 'gcr.io/cloud-builders/docker'
    args: ['build', '-t', 'gcr.io/$PROJECT_ID/my-portfolio-image:$COMMIT_SHA', '.']
  # Docker imajını Container Registry'ye gönder
  - name: 'gcr.io/cloud-builders/docker'
    args: ['push', 'gcr.io/$PROJECT_ID/my-portfolio-image:$COMMIT_SHA']
  # Cloud Run'a dağıt
  - name: 'gcr.io/cloud-builders/gcloud'
    args:
      - 'run'
      - 'deploy'
      - 'my-portfolio-app'
      - '--image'
      - 'gcr.io/$PROJECT_ID/my-portfolio-image:$COMMIT_SHA'
      - '--platform'
      - 'managed'
      - '--region'
      - 'us-central1'
      - '--allow-unauthenticated'
      - '--set-env-vars=NODE_ENV=production' # Ortam değişkeni örneği
    id: Deploy
images:
  - 'gcr.io/$PROJECT_ID/my-portfolio-image:$COMMIT_SHA'

Bu yapılandırma ile, kodunuzu GitHub, GitLab veya Bitbucket gibi bir depoya her gönderdiğinizde, Cloud Build tetiklenir ve uygulamanız otomatik olarak güncellenir.

Özel Alan Adı ve SSL Yapılandırması

Cloud Run, dağıtılan her hizmet için otomatik olarak bir URL sağlar. Ancak profesyonel bir portfolyo için özel bir alan adı kullanmak önemlidir. Cloud Run, özel alan adı eşleştirmeyi ve ücretsiz SSL sertifikalarını (Google-managed certificates) kolayca yapılandırmanıza olanak tanır. Bu sayede siteniz HTTPS üzerinden güvenli bir şekilde yayınlanır.

  1. Google Cloud konsolunda Cloud Run hizmetinize gidin.
  2. "Custom domains" (Özel alan adları) sekmesine tıklayın.
  3. "Add custom domain" (Özel alan adı ekle) seçeneğini seçin ve alan adınızı girin.
  4. Verilen DNS kayıtlarını (CNAME ve/veya A kayıtları) alan adı sağlayıcınızın kontrol panelinde yapılandırın.

Cloud Run, DNS doğrulaması tamamlandıktan sonra otomatik olarak bir SSL sertifikası temin eder ve yönetir.

Ortam Değişkenleri ve Güvenlik

Hassas bilgiler (API anahtarları, veritabanı kimlik bilgileri vb.) doğrudan Docker imajına gömülmemelidir. Cloud Run, ortam değişkenleri aracılığıyla bu tür bilgileri güvenli bir şekilde uygulamanıza sağlamanıza olanak tanır. Konsol üzerinden veya gcloud run deploy komutuyla --set-env-vars bayrağını kullanarak ortam değişkenlerini tanımlayabilirsiniz. Güvenlik için, Cloud IAM ile hizmetinize erişimi kısıtlamak ve Cloud Run'ın sağladığı diğer güvenlik özelliklerini kullanmak önemlidir.

Performans, Güvenlik ve İleri Optimizasyonlar

Portfolyo sitemin sadece çalışması değil, aynı zamanda en iyi performansı sunması ve güvenli olması da kritikti. Bu nedenle, bazı ek optimizasyonlar ve güvenlik önlemleri uyguladım.

CDN Kullanımı (Cloud CDN)

Next.js ile statik olarak dışa aktarılan dosyalar, zaten hızlı bir şekilde sunulur. Ancak global bir kitleye hitap ediyorsanız, bir İçerik Dağıtım Ağı (CDN) kullanmak, içeriğinizi kullanıcılara coğrafi olarak daha yakın sunarak yükleme sürelerini daha da hızlandırır. Google Cloud Run'ın önünde doğrudan bir Cloud CDN katmanı bulunmamakla birlikte, Cloud Load Balancing ve Cloud CDN entegrasyonu ile bu mümkündür. Alternatif olarak, statik varlıkları Cloud Storage'da barındırıp Cloud CDN ile servis edebilir ve Cloud Run'ı sadece API veya dinamik içerik için kullanabilirsiniz.

Resim Optimizasyonu

Web sitelerindeki performans sorunlarının büyük bir kısmı genellikle optimize edilmemiş resimlerden kaynaklanır. Portfolyomdaki tüm resimleri WebP veya AVIF gibi modern formatlara dönüştürdüm ve boyutlarını sıkıştırdım. Ayrıca, tarayıcının sadece görünür alandaki resimleri yüklemesini sağlayan "lazy loading" (tembel yükleme) tekniklerini uyguladım.

Önbellekleme Stratejileri

Tarayıcı önbellekleme, tekrarlayan ziyaretlerde sayfa yükleme sürelerini önemli ölçüde azaltır. HTTP önbellekleme başlıklarını (Cache-Control, ETag) doğru şekilde ayarlamak, tarayıcıların statik varlıkları yerel olarak saklamasını sağlar. Cloud Run'da servis ettiğim statik dosyalar için Node.js Express sunucumda bu başlıkları ayarladım.

Express ile Önbellekleme Başlıkları:

app.use(express.static(path.join(__dirname, 'build'), {
  maxAge: '1y', // 1 yıl önbellekte tut
  immutable: true // Dosyaların değişmediğini belirt
}));

Güvenlik İpuçları

  • Bağımlılık Güncellemeleri: Kullanılan kütüphanelerin ve framework'lerin düzenli olarak güncel tutulması, bilinen güvenlik açıklarının kapatılması için kritiktir.
  • Minimum Ayrıcalık Prensibi: Cloud IAM'de, hizmet hesaplarına ve kullanıcılara yalnızca ihtiyaç duydukları minimum izinleri verin.
  • İstek Limitleme: Aşırı istekleri önlemek ve olası DDoS saldırılarına karşı koruma sağlamak için Cloud Load Balancing veya API Gateway gibi hizmetlerle istek limitleme uygulayabilirsiniz.
  • Güvenlik Başlıkları: HTTP güvenlik başlıklarını (X-Content-Type-Options, X-Frame-Options, Content-Security-Policy vb.) kullanarak tarayıcı tabanlı saldırıları azaltın.

Sonuç ve Gelecek Planları

Google Cloud Run üzerinde minimalist ve hızlı bir geliştirici portfolyosu oluşturma yolculuğum, beklentilerimin üzerinde bir başarıyla sonuçlandı. Bu yaklaşım, sadece teknik yeteneklerimi sergilemekle kalmadı, aynı zamanda kullanıcı deneyimini ve maliyet etkinliğini de en üst düzeye çıkardı.

Elde ettiğim en büyük avantajlar şunlardır:

  • Yüksek Performans: Statik site üretimi ve Cloud Run'ın hızlı ölçeklenebilirliği sayesinde neredeyse anında yüklenen bir site.
  • Maliyet Etkinliği: "Kullandığın kadar öde" modeli sayesinde, kişisel bir proje için minimum barındırma maliyeti.
  • Basit Bakım: Sunucusuz mimari ve Docker konteynerleşme sayesinde altyapı yönetimi yükünün ortadan kalkması.
  • Geliştirici Odaklılık: Kod yazmaya ve içerik oluşturmaya odaklanma imkanı.

Gelecek planlarım arasında, portfolyoma bir blog bölümü eklemek ve bu blogu Cloud Firestore gibi sunucusuz bir veritabanıyla beslemek yer alıyor. Ayrıca, iletişim formu için Google Cloud Functions kullanarak tamamen sunucusuz bir çözüm entegre etmeyi düşünüyorum. Bu sayede, portfolyomun dinamik özelliklerini artırırken, minimalist ve hızlı yapısından ödün vermeyeceğim.

SSS (Sık Sorulan Sorular)

Bu bölüm, Google Cloud Run üzerinde geliştirici portfolyosu oluşturmak isteyenlerin sıkça sorduğu soruları yanıtlamaktadır.

1. Google Cloud Run portfolyo sitesi için maliyetli mi?

Hayır, aksine oldukça maliyet etkindir. Cloud Run'ın "kullandığın kadar öde" modeli sayesinde, sitenizde trafik yokken hiçbir ücret ödemezsiniz. Düşük ve orta trafikli kişisel portfolyo siteleri için genellikle ücretsiz katman limitleri içinde kalır veya çok cüzi miktarlar ödersiniz.

2. Neden statik hosting yerine Cloud Run tercih ettiniz?

Statik hosting (örn. Netlify, Vercel) de harika bir seçenektir. Ancak Cloud Run, gelecekte portfolyoma dinamik özellikler (API'ler, veritabanı entegrasyonları) eklemek istediğimde bana daha fazla esneklik sunuyor. Ayrıca, Docker konteynerleri sayesinde kendi çalışma ortamımı tamamen kontrol edebiliyorum.

3. Portfolyo sitemde bir iletişim formu olsaydı nasıl entegre ederdim?

İletişim formu için Google Cloud Functions veya Cloud Run üzerinde çalışan küçük bir API hizmeti kullanabilirsiniz. Bu hizmet, form verilerini alıp bir e-posta gönderebilir (SendGrid, Mailgun gibi servislerle) veya Cloud Firestore gibi bir veritabanına kaydedebilir.

4. SEO performansı Cloud Run'dan nasıl etkilenir?

Cloud Run, uygulamanızın hızlı bir şekilde yanıt vermesini sağladığı için SEO üzerinde olumlu bir etkiye sahiptir. Hızlı yüklenen siteler, arama motorları tarafından daha çok tercih edilir. Ayrıca, özel alan adı ve SSL sertifikası kullanımı da SEO için önemlidir ve Cloud Run bunları kolayca destekler.

5. Cloud Run'da sıfıra ölçeklenme (scale-to-zero) ne anlama geliyor?

Sıfıra ölçeklenme, uygulamanızda hiçbir trafik olmadığında Cloud Run'ın tüm konteyner örneklerini kapatması anlamına gelir. Bu durumda uygulamanız kaynak tüketmez ve size maliyet yansıtmaz. Yeni bir istek geldiğinde, Cloud Run uygulamanızı hızlıca başlatır (cold start) ve isteği işler. Bu, kişisel projeler için büyük bir maliyet avantajı sağlar.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.