Takip et

Self-Hosting: Raspberry Pi, GitHub Actions ve Cloudflare Tunnel ile Güvenli CI/CD

Kendi dijital projelerinizi barındırmak, verileriniz üzerinde tam kontrol sahibi olmak ve özgürce geliştirmek mi istiyorsunuz? Raspberry Pi, GitHub Actions ve Cloudflare Tunnel’ın mükemmel birleşimiyle, evinizdeki küçük bir bilgisayarı güçlü ve güvenli bir sunucuya dönüştürerek, otomatik dağıtım süreçlerini adım adım nasıl kuracağınızı keşfedin.

Günümüzde bulut tabanlı hizmetler her ne kadar kolaylık sağlasa da, kişisel verilerin gizliliği, maliyet kontrolü ve sistem üzerindeki tam hakimiyet gibi konularda bazı endişeleri beraberinde getirebilir. İşte tam da bu noktada, kendi sunucunuzu barındırma (self-hosting) fikri devreye giriyor. Kendi sunucunuzu kurmak, verilerinizin nerede saklandığını bilmenizi, güvenlik politikalarınızı tamamen kendinizin belirlemesini ve uzun vadede maliyetleri önemli ölçüde düşürmenizi sağlar. Üstelik, geliştirme ve dağıtım süreçleri üzerinde tam kontrol sahibi olmanız, size benzersiz bir esneklik sunar.

Peki, bu iş için neden Raspberry Pi kullanmalısınız? Raspberry Pi, avuç içi büyüklüğünde, düşük maliyetli ve enerji verimli bir mini bilgisayardır. Bu özellikleri sayesinde, 7/24 çalışacak bir ev sunucusu için ideal bir platform haline gelir. Düşük güç tüketimi, elektrik faturalarınızı minimize ederken, küçük boyutu sayesinde herhangi bir yer kaplama endişesi yaşamazsınız. Ayrıca, Linux tabanlı bir işletim sistemiyle çalıştığı için, geniş bir yazılım desteği ve güçlü bir topluluk arkasında bulunur. Web siteleri, bulut depolama, oyun sunucuları, otomasyon projeleri gibi pek çok farklı uygulamayı Raspberry Pi üzerinde kolayca barındırabilirsiniz. Bu makalede, Raspberry Pi’nin bu potansiyelini modern geliştirme pratikleriyle birleştirerek, projelerinizi otomatik olarak nasıl dağıtabileceğinizi ve dışarıdan güvenli bir şekilde nasıl erişilebileceğini adım adım inceleyeceğiz. Bu sayede, hem uygun maliyetli hem de son derece fonksiyonel bir self-hosting çözümü elde edeceksiniz.

Bu macerada bize eşlik edecek iki temel teknoloji ise GitHub Actions ve Cloudflare Tunnel olacak. GitHub Actions, yazılım geliştirme süreçlerinizi otomatikleştirmenizi sağlayarak, kodunuzu her değiştirdiğinizde otomatik test ve dağıtım yapmanıza olanak tanır. Bu, geliştirme hızınızı artırırken hataları da minimize eder. Diğer yandan, Cloudflare Tunnel, Raspberry Pi’nizin internete güvenli bir şekilde açılmasını sağlayarak, karmaşık ağ yapılandırmaları ve güvenlik duvarı ayarlarıyla uğraşmadan projelerinize dışarıdan erişmenizi mümkün kılar. Bu üçlü kombinasyon, size hem maliyet etkin hem de profesyonel bir self-hosting deneyimi sunarken, projelerinizi daha güvenli ve verimli bir şekilde yönetme imkanı sağlar. Dolayısıyla, bu makale, sıfırdan başlayarak kendi güçlü ve güvenli ev sunucunuzu kurmanız için size kapsamlı bir yol haritası sunacaktır. Projelerinizi kendi kontrolünüzde, güvenle ve kolayca hayata geçirmek için doğru yerdesiniz.

Temel Kavramlar: CI/CD, GitHub Actions ve Cloudflare Tunnel Nedir?

Self-hosting dünyasına adım atarken, özellikle otomasyon ve güvenlik konusunda bazı temel kavramları iyi anlamak, başarılı bir kurulum için kritik öneme sahiptir. Bu bölümde, projenizin yaşam döngüsünü kolaylaştıracak CI/CD, otomasyonu sağlayacak GitHub Actions ve güvenli dış erişimi mümkün kılacak Cloudflare Tunnel’ı detaylıca inceleyeceğiz. Bu teknolojiler birbirini tamamlayarak, Raspberry Pi üzerinde kuracağımız sistemin bel kemiğini oluşturacak.

Sürekli Entegrasyon ve Dağıtım (CI/CD) Neden Hayati?

CI/CD, yani Continuous Integration (Sürekli Entegrasyon) ve Continuous Delivery/Deployment (Sürekli Teslimat/Dağıtım), modern yazılım geliştirme metodolojilerinin ayrılmaz bir parçasıdır. Sürekli Entegrasyon, geliştiricilerin kod değişikliklerini ana depoya sık sık birleştirmelerini ve otomatik olarak test etmelerini ifade eder. Bu, olası çakışmaları ve hataları erken aşamada tespit etmeyi sağlayarak, entegrasyon sürecinin acısız geçmesini sağlar. Öte yandan, Sürekli Teslimat, kodun başarılı bir şekilde test edildikten sonra otomatik olarak üretim ortamına (veya üretime hazır bir ortama) dağıtıma hazır hale getirilmesi sürecidir. Sürekli Dağıtım ise, bu adımı daha da ileriye taşıyarak, kodun otomatik olarak üretim ortamına dağıtılmasını içerir. Bu yaklaşım, geliştirme ekiplerinin daha hızlı, daha güvenilir ve daha sık yazılım yayınlamasına olanak tanır.

Peki, bu kavramlar Raspberry Pi’de self-hosting yaparken neden önemlidir? Basitçe ifade etmek gerekirse, CI/CD, manuel dağıtım süreçlerinin getirdiği insan hatası riskini ortadan kaldırır. Kodunuzu her değiştirdiğinizde, sistem otomatik olarak testleri çalıştıracak, projeyi oluşturacak ve Raspberry Pi’nize dağıtacaktır. Bu, zaman kazandırmanın yanı sıra, tutarlı ve güvenilir dağıtımlar yapmanızı sağlar. Diyelim ki, bir web uygulamanız var ve yeni bir özellik eklediniz. CI/CD boru hattı sayesinde, kodunuzu GitHub’a gönderdiğiniz anda, sistem otomatik olarak uygulamanızı güncelleyerek canlıya alacak, böylece siz manuel olarak SSH bağlantısı kurup dosyaları kopyalamak zorunda kalmayacaksınız. Bu otomasyon, özellikle tek kişilik projelerde veya küçük ekiplerde verimliliği inanılmaz derecede artırır.

GitHub Actions: Otomatik İş Akışları Nasıl Çalışır?

GitHub Actions, doğrudan GitHub deponuzdan yazılım geliştirme iş akışlarını otomatikleştirmek için tasarlanmış, olay tabanlı bir platformdur. Bir depo üzerinde gerçekleşen herhangi bir olaya (örneğin, bir push, bir pull request açılması veya bir zamanlayıcı) yanıt olarak özel iş akışları oluşturabilirsiniz. Bu iş akışları, genellikle YAML formatında tanımlanan, bir veya daha fazla adımdan (step) oluşan işler (job) içerir. Her adım, belirli bir görevi yerine getiren bir komut veya bir eylem (action) çalıştırabilir.

Raspberry Pi ile self-hosting senaryosunda GitHub Actions’ın rolü çok büyüktür. Kodunuzu GitHub’a her gönderdiğinizde, GitHub Actions tetiklenir ve tanımladığınız iş akışını başlatır. Bu iş akışı, projenizin bağımlılıklarını kurabilir, testleri çalıştırabilir, statik dosyaları derleyebilir veya Docker imajları oluşturabilir. En önemlisi, bu iş akışı, derlenmiş veya hazırlanmış dosyaları Raspberry Pi’nize güvenli bir şekilde dağıtabilir. Örneğin, bir web sitesi projeniz varsa, GitHub Actions, yeni kodunuzu derleyip, SSH üzerinden Raspberry Pi’nize bağlandıktan sonra web sunucunuzun dizinine kopyalayabilir. Böylece, web siteniz otomatik olarak güncellenmiş olur. Bu süreç, “koşucu” (runner) adı verilen bir ortamda gerçekleşir. GitHub tarafından sağlanan sanal makinelerde (Linux, Windows, macOS) çalışabileceği gibi, kendi sunucunuzu (Raspberry Pi gibi) “self-hosted runner” olarak da kullanabilirsiniz, ancak bu senaryoda Raspberry Pi’yi doğrudan hedef olarak kullanmak daha yaygındır.

Cloudflare Tunnel: Güvenli Dış Erişim Nasıl Sağlanır?

Raspberry Pi’nizi ev ağı içinde bir sunucu olarak kullanmak oldukça basittir, ancak projelerinizi dış dünyaya, yani internete açmak genellikle karmaşık ağ yapılandırmaları ve güvenlik endişeleri yaratır. İşte burada Cloudflare Tunnel (eski adıyla Argo Tunnel) devreye girer. Cloudflare Tunnel, Raspberry Pi’niz ile Cloudflare ağı arasında güvenli, şifreli ve kalıcı bir tünel oluşturarak, sunucunuzu dış dünyaya herhangi bir port açmaya veya karmaşık güvenlik duvarı kuralları tanımlamaya gerek kalmadan yayınlamanıza olanak tanır. Bu teknoloji, Zero Trust güvenlik modelinin bir parçasıdır.

Geleneksel olarak, bir sunucuyu internete açmak için modeminize veya router’ınıza port yönlendirme (port forwarding) yapmanız gerekir. Bu işlem, potansiyel güvenlik açıklarına yol açabilir ve ev ağınızı dışarıdan gelen saldırılara karşı savunmasız bırakabilir. Cloudflare Tunnel ise bu riskleri ortadan kaldırır. Raspberry Pi’nize kuracağınız cloudflared istemcisi, Cloudflare ağına doğru giden bir tünel başlatır. Bu tünel, geleneksel sunucu-istemci bağlantılarının aksine, sunucudan dışarı doğru (outbound) bir bağlantı kurar, bu da güvenlik duvarınızın arkasından erişilebilirlik sağlar. Tüm internet trafiği Cloudflare’ın küresel ağı üzerinden geçer, bu da DDoS koruması, Web Uygulama Güvenlik Duvarı (WAF) ve CDN gibi ek güvenlik ve performans avantajlarından yararlanmanızı sağlar. Sonuç olarak, Cloudflare Tunnel, Raspberry Pi üzerindeki projelerinize, ev ağınızın güvenliğini tehlikeye atmadan, güvenli ve kolay bir şekilde erişim sağlamanın en modern ve etkili yollarından biridir.

Adım Adım Kurulum: Raspberry Pi Üzerinde İlk Hazırlıklar Nasıl Yapılır?

Raspberry Pi’nizi self-hosting için hazır hale getirmek, sağlam bir temel oluşturmakla başlar. Bu bölüm, Pi’nizi kutusundan çıkarıp işletim sistemini kurmaktan, gerekli yazılımları yüklemeye kadar tüm adımları detaylandıracaktır. Amacımız, projelerinizi sorunsuz bir şekilde barındırabileceğiniz güvenli ve güncel bir ortam yaratmaktır.

Raspberry Pi İşletim Sistemi Kurulumu ve Güvenlik Ayarları

Öncelikle, Raspberry Pi’nizin bir işletim sistemine ihtiyacı var. Raspberry Pi Imager aracını kullanarak, bir MicroSD karta Raspberry Pi OS (eski adıyla Raspbian) yüklemenizi öneririz. Kurulum sırasında, SSH erişimini etkinleştirmeyi ve kullanıcı adınızı/şifrenizi yapılandırmayı unutmayın. Başsız (headless) kurulum, yani monitör, klavye ve fare bağlamadan doğrudan ağ üzerinden erişim, çok daha pratik olacaktır.

  1. MicroSD Kartı Hazırlama: Raspberry Pi Imager’ı bilgisayarınıza indirin ve kurun.
  2. İşletim Sistemi Seçimi: Imager içerisinde “Raspberry Pi OS (64-bit)” seçeneğini tercih edin. Lite sürümü (masaüstü ortamı olmayan), sunucu kullanımı için yeterli ve daha hafif olacaktır.
  3. Gelişmiş Ayarlar: Kurulum ekranında çark simgesine tıklayarak gelişmiş ayarları açın. Buradan:
    • SSH’yi etkinleştirin (Şifre kimlik doğrulaması kullanın).
    • Varsayılan kullanıcı adını ve güçlü bir şifre belirleyin. (Varsayılan ‘pi’ kullanıcısı yerine kendi isminizi veya güvenli bir isim seçin.)
    • Kablosuz ağ ayarlarını yapılandırın (isteğe bağlı, Ethernet tercih edilir).
    • Ülke ayarlarını yapın.
  4. Yazma İşlemi: Hazırladığınız MicroSD kartı seçin ve yazma işlemini başlatın.
  5. İlk Çalıştırma: Yazma işlemi tamamlandıktan sonra MicroSD kartı Raspberry Pi’nize takın ve güç verin. Pi’nizin açılmasını bekleyin.

Açıldıktan sonra, bir terminalden SSH ile bağlanabilirsiniz. Bağlanmak için Pi’nizin IP adresini bilmeniz gerekir. IP adresini router’ınızın arayüzünden veya network tarayıcı uygulamalarıyla bulabilirsiniz. Varsayılan kullanıcı adı ‘pi’ (eğer değiştirmediyseniz) ve belirlediğiniz şifreyi kullanın:


ssh kullanici_adi@raspberry_pi_ip_adresi

Uzman İpucu: SSH anahtar çifti kullanarak şifresiz oturum açmayı ve SSH kimlik doğrulamanızı daha güvenli hale getirmeyi şiddetle tavsiye ederiz. Bunun için ssh-keygen komutuyla bir anahtar oluşturup, açık anahtarınızı Raspberry Pi'ye kopyalayabilirsiniz.

Bağlandıktan sonra, sisteminizi güncelleyelim:


sudo apt update
sudo apt upgrade -y

Gerekli Yazılımların Kurulumu: Git, Docker ve Proje Bağımlılıkları

Şimdi projenizi Raspberry Pi'de barındırmak ve CI/CD süreçlerini desteklemek için gerekli temel yazılımları yükleyelim.

  1. Git Kurulumu: Git, kod versiyonlama ve GitHub ile entegrasyon için vazgeçilmezdir.
  2. 
    sudo apt install git -y
        

  3. Docker Kurulumu: Projelerinizi izole edilmiş konteynerlerde çalıştırmak için Docker kullanmak, yönetimi ve dağıtımı kolaylaştırır. Raspberry Pi için özel bir Docker kurulumu gereklidir.
  4. 
    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    sudo usermod -aG docker kullanici_adi # Kullanıcınızı docker grubuna ekleyin
    sudo reboot # Değişikliklerin etkili olması için yeniden başlatın
        

    Yeniden başlattıktan sonra, Docker'ın doğru çalıştığını kontrol edebilirsiniz:

    
    docker run hello-world
        

  5. Node.js veya Python Kurulumu (Örnek Proje İçin): Projenizin türüne bağlı olarak Node.js, Python gibi çalışma ortamları veya diğer bağımlılıkları yüklemeniz gerekebilir. Örneğin, bir Node.js uygulaması barındıracaksanız:
  6. 
    # Node.js için NVM (Node Version Manager) kullanmak en iyisidir
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
    source ~/.bashrc
    nvm install node # En son Node.js sürümünü kurar
        

    Bir Python uygulaması için pyenv veya doğrudan sudo apt install python3 python3-pip -y kullanabilirsiniz.

Bu adımlarla, Raspberry Pi'niz projelerinizi barındırmaya, Git ile versiyonlamaya ve Docker konteynerlerini çalıştırmaya hazır hale gelmiş olacak. Ayrıca, gerekli bağımlılıkları yükleyerek örnek bir proje için de altyapıyı hazırlamış olduk. Şimdi CI/CD sürecine geçiş yapmaya ve projelerinizi otomatik olarak dağıtmaya başlayabiliriz.

CI/CD İş Akışı Oluşturma: Projenizi GitHub Actions ile Nasıl Otomatikleştirebilirsiniz?

Raspberry Pi'mizin temel kurulumunu tamamladığımıza göre, şimdi projelerimizi otomatik olarak dağıtmak için GitHub Actions'ı devreye sokma zamanı. Bu bölüm, bir GitHub deposu oluşturmaktan, otomatik bir dağıtım iş akışı tanımlamaya kadar tüm süreci kapsayacak ve projelerinizin her kod değişikliğinde nasıl otomatik olarak güncelleneceğini gösterecektir.

GitHub Deposu ve Örnek Proje Oluşturma

İlk adım, projeniz için bir GitHub deposu oluşturmak. Eğer henüz bir deponuz yoksa, GitHub web sitesi üzerinden kolayca yeni bir tane açabilirsiniz. Örnek olarak, basit bir "Hello World" web sayfası barındıran bir proje düşünelim. Bu projenin yapısı şu şekilde olabilir:




    

Merhaba Raspberry Pi ve CI/CD Dünyası!

Bu sayfa GitHub Actions ile otomatik olarak dağıtıldı.

Bu dosyayı projenizin kök dizinine kaydedin ve GitHub deponuza gönderin:


git init
git add .
git commit -m "İlk commit: Hello World sayfası"
git branch -M main
git remote add origin https://github.com/KULLANICI_ADINIZ/REPO_ADINIZ.git
git push -u origin main

GitHub Actions İş Akışı Tanımlama: main.yml

Şimdi projenizi her güncellediğinizde otomatik dağıtım yapacak GitHub Actions iş akışını oluşturalım. İş akışları, deponuzun kök dizinindeki .github/workflows/ klasöründe YAML dosyaları olarak tanımlanır. Yeni bir dosya oluşturalım: .github/workflows/deploy.yml.


# .github/workflows/deploy.yml
name: Raspberry Pi Dağıtımı

on:
  push:
    branches:
      - main # main branch'ine yapılan her push'ta tetiklenir

jobs:
  deploy:
    runs-on: ubuntu-latest # İş, GitHub'ın sağladığı Ubuntu ortamında çalışır
    steps:
    - name: Depoyu Çek
      uses: actions/checkout@v3 # GitHub Actions'ın depoyu çekmesini sağlar

    - name: SSH Anahtarını Kur
      uses: shimataro/ssh-key-action@v2
      with:
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        known_hosts: ${{ secrets.KNOWN_HOSTS }}

    - name: Dosyaları Raspberry Pi'ye Kopyala
      run: |
        ssh -o StrictHostKeyChecking=no ${{ secrets.SSH_USER }}@${{ secrets.RPI_HOST }} "mkdir -p /var/www/html/my_project" # Hedef dizini oluştur (varsa atlar)
        rsync -avz --delete ./ ${{ secrets.SSH_USER }}@${{ secrets.RPI_HOST }}:/var/www/html/my_project/

Bu iş akışı, main branch'ine yapılan her push işleminde tetiklenir ve aşağıdaki adımları gerçekleştirir:

  1. Depoyu Çek: Projenizin kodunu GitHub Actions çalışma alanına çeker.
  2. SSH Anahtarını Kur: Raspberry Pi'nize SSH ile bağlanmak için gerekli özel anahtarı ve bilinen hostları kurar.
  3. Dosyaları Raspberry Pi'ye Kopyala: rsync komutunu kullanarak, yerel depodaki tüm dosyaları Raspberry Pi üzerindeki belirtilen dizine kopyalar. --delete parametresi sayesinde, Raspberry Pi'deki eski dosyalar silinerek yeni versiyonla senkronize edilir.
Uzman İpucu: Güvenlik nedeniyle, hassas bilgileri (SSH özel anahtarı, kullanıcı adı, IP adresi) doğrudan YAML dosyasında tutmak yerine GitHub Secrets olarak saklamalısınız. Deponuzun ayarlarından "Settings > Security > Secrets and variables > Actions" yolunu izleyerek yeni secret'lar ekleyebilirsiniz. SSH_PRIVATE_KEY, KNOWN_HOSTS (Pi'nizin SSH parmak izi), SSH_USER ve RPI_HOST (Pi'nizin IP adresi) adında secret'lar oluşturun.

KNOWN_HOSTS değerini almak için, bir kez SSH ile Pi'nize bağlandığınızda oluşan ~/.ssh/known_hosts dosyasındaki Pi'nize ait satırı kopyalayabilirsiniz.

Dağıtımın Tetiklenmesi ve Gözlemlenmesi

deploy.yml dosyasını oluşturup deponuza push ettikten ve gerekli secret'ları GitHub'a ekledikten sonra, projenizdeki herhangi bir değişikliği main branch'ine push ettiğinizde, GitHub Actions otomatik olarak çalışmaya başlayacaktır.


git add .github/workflows/deploy.yml
git commit -m "GitHub Actions dağıtım iş akışı eklendi"
git push origin main

GitHub deponuzda "Actions" sekmesine giderek, iş akışınızın durumunu canlı olarak takip edebilirsiniz. Başarılı bir dağıtımın ardından, Raspberry Pi'nizin /var/www/html/my_project/ dizininde projenizin güncel halini bulmalısınız. Eğer bir web sunucusu (örneğin Nginx veya Apache) kurduysanız, Pi'nizin yerel IP adresinden projenize erişebilmeniz gerekir. Örneğin, Nginx yüklüyse ve /var/www/html/my_project dizinini serve ediyorsa, tarayıcınızdan http://RPI_IP_ADRESI/my_project adresine giderek sayfanızı görebilirsiniz.

Bu aşama, projelerinizin geliştirme ve dağıtım süreçlerini büyük ölçüde hızlandıran otomatik bir köprü oluşturmanızı sağlar. Artık manuel FTP yüklemeleri veya SSH kopyalamaları yerine, sadece kodunuzu GitHub'a göndererek projenizin canlıda güncellendiğini izleyebilirsiniz. Bu otomasyon, özellikle sürekli güncellenen projeler için inanılmaz bir zaman ve emek tasarrufu sağlar.

Güvenli Dış Erişim: Cloudflare Tunnel (Zero Trust) Nasıl Kurulur ve Yapılandırılır?

Raspberry Pi'nizdeki projemiz artık GitHub Actions ile otomatik olarak dağıtılabiliyor. Ancak, bu projelere dışarıdan, yani internet üzerinden güvenli bir şekilde erişebilmemiz için bir sonraki kritik adım Cloudflare Tunnel'ı yapılandırmaktır. Cloudflare Tunnel, ev ağınızdaki güvenlik duvarınızı açmadan, Pi'nizin projelerini internete güvenli bir şekilde sunmanızı sağlar.

Cloudflare Hesabı ve Alan Adı Hazırlığı

  1. Cloudflare Hesabı Oluşturma: Eğer henüz bir Cloudflare hesabınız yoksa, Cloudflare web sitesinden ücretsiz bir hesap oluşturun.
  2. Alan Adı Ekleme: Hesabınıza bir alan adı (domain) ekleyin ve DNS sunucularınızı Cloudflare'a yönlendirin. Bu işlem genellikle birkaç dakika ile birkaç saat arasında sürebilir.
  3. Zero Trust Dashboard Erişimi: Cloudflare kontrol panelinizden "Zero Trust" sekmesine gidin ve Zero Trust dashboard'a erişin. Bu, tünel oluşturma ve yönetme için kullanacağımız ana arayüzdür.

Cloudflared Kurulumu ve Tünel Oluşturma

Cloudflare Tunnel'ı kullanmak için Raspberry Pi'nize cloudflared daemon'unu kurmanız gerekir. Bu yazılım, Pi'nizden Cloudflare ağına doğru güvenli tüneli oluşturan ana bileşendir.

  1. Cloudflared Kurulumu (Raspberry Pi Üzerinde): Raspberry Pi'nize SSH ile bağlanın ve aşağıdaki komutları çalıştırın.
  2. 
    # mimariyi kontrol et
    dpkg --print-architecture 
    
    # genellikle arm64 veya armhf olacaktır.
    # arm64 için (Raspberry Pi 3, 4, 5 modelleri)
    wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64 -O cloudflared
    
    # armhf için (eski modeller veya 32-bit OS)
    # wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm -O cloudflared
    
    chmod +x cloudflared
    sudo mv cloudflared /usr/local/bin/
    
    cloudflared -v # Versiyon kontrolü
        

  3. Tünel Oluşturma ve Yetkilendirme: Şimdi Zero Trust dashboard'da "Access > Tunnels" bölümüne gidin ve "Create a tunnel" butonuna tıklayın. Tünelinize bir isim verin (örn. my-rpi-tunnel). Dashboard size cloudflared login komutunu verecek. Bu komutu Raspberry Pi'nizde çalıştırın:
  4. 
    cloudflared tunnel login
        

    Bu komut, bir tarayıcı penceresi açacak ve Cloudflare hesabınıza giriş yapmanızı isteyecektir. Giriş yaptıktan sonra, Pi'niz Cloudflare ile yetkilendirilecek ve Pi'nizin ev dizininde (örneğin ~/.cloudflared/) bir sertifika dosyası oluşturulacaktır.

  5. Tüneli Oluşturma ve Yapılandırma: Zero Trust dashboard'daki adımlara devam ederek, tünel için bir config dosyası oluşturmanız gerekecek. Tünelinize bir isim verin (örn. my-rpi-tunnel). Dashboard size bir tünel ID'si ve konfigürasyon komutları sunacaktır. Bu komutu Raspberry Pi'nizde çalıştırarak bir yapılandırma dosyası oluşturun:
  6. 
    cloudflared tunnel create my-rpi-tunnel
        

    Bu komut, ~/.cloudflared/.json dosyasını oluşturacaktır. Ardından, Pi'nizdeki ~/.cloudflared/config.yml dosyasını aşağıdaki gibi düzenleyin (veya yeni oluşturun):

    
    # ~/.cloudflared/config.yml
    tunnel:  # Yukarıdaki komuttan aldığınız tünel ID'si
    credentials-file: /home/kullanici_adi/.cloudflared/.json
    
    ingress:
      - hostname: myproject.alanadiniz.com
        service: http://localhost:8080 # veya projenizin çalıştığı port
      - hostname: ssh.alanadiniz.com
        service: ssh://localhost:22 # SSH erişimi için
      - service: http_status:404 # Tanımsız istekler için 404 döndür
        

    myproject.alanadiniz.com ve ssh.alanadiniz.com yerine kendi alan adınızı ve istediğiniz alt alan adlarını kullanın. localhost:8080 yerine, web uygulamanızın çalıştığı portu (örn. Nginx veya Apache 80, Node.js 3000, Python 5000) yazmalısınız.

  7. Tüneli Sistem Servisi Olarak Çalıştırma: Tünelin kalıcı olarak çalışması için bir sistem servisi olarak yapılandıralım:
  8. 
    sudo cloudflared tunnel run my-rpi-tunnel
        

    Bu komutu çalıştırmak yerine, kalıcı bir servis olarak kurmak daha iyidir:

    
    sudo cloudflared --config ~/.cloudflared/config.yml service install
    sudo systemctl enable cloudflared
    sudo systemctl start cloudflared
    sudo systemctl status cloudflared
        

Yönlendirme (Routing) ve Erişim Politikaları

Zero Trust dashboard'da tünel kurulumunu tamamladıktan sonra, "Public Hostnames" bölümünde belirlediğiniz alt alan adları (örn. myproject.alanadiniz.com) için yönlendirme kurallarını göreceksiniz. Bu adım, Cloudflare'ın alan adınızı tünele bağlamasını sağlar. Ayrıca, "Access > Applications" bölümünden özel erişim politikaları (Zero Trust Access Policies) oluşturarak, sadece belirli kullanıcıların veya IP adreslerinin tünel üzerinden Pi'nize erişmesine izin verebilirsiniz. Bu, ekstra bir güvenlik katmanı sağlar ve Pi'nizi sadece yetkili kişilere açar.



Trafik Akışı:

  • Kullanıcı, tarayıcısından myproject.alanadiniz.com adresine gider.
  • İstek, Cloudflare'ın global ağına ulaşır.
  • Cloudflare, Zero Trust politikalarını uygular (varsa).
  • İstek, Raspberry Pi'nizden Cloudflare'a doğru açılmış güvenli tünel üzerinden Pi'nize yönlendirilir.
  • Pi'deki web sunucunuz (örn. Nginx) isteği karşılar ve yanıtı tünel üzerinden geri gönderir.

Artık Raspberry Pi'nizdeki projenize, karmaşık ağ ayarları yapmadan, Cloudflare'ın sağladığı güvenlik ve performans avantajlarıyla, belirlediğiniz alan adları üzerinden güvenle erişebilirsiniz. Bu kurulum, ev ağınızın güvenliğini sağlarken, projelerinizi tüm dünyaya açmanın en modern ve etkili yolunu sunar.

Gerçek Dünya Senaryosu: Bir Web Uygulamasının Otomatik Dağıtımı

Şimdiye kadar Raspberry Pi'mizin kurulumunu, GitHub Actions ile CI/CD iş akışını ve Cloudflare Tunnel ile güvenli dış erişimi yapılandırdık. Bu bölümde, tüm bu parçaları bir araya getirerek, basit bir Node.js (Express.js) web uygulamasının geliştirilmesinden, GitHub'a push edilmesine, otomatik olarak Raspberry Pi'ye Docker konteyneri olarak dağıtılmasına ve Cloudflare Tunnel üzerinden erişilmesine kadar olan gerçek dünya senaryosunu inceleyeceğiz.

Uygulama Geliştirme ve Dockerize Etme

Öncelikle, basit bir Node.js Express uygulaması oluşturalım. Proje yapımız şöyle olacak:


my-express-app/
├── index.js
├── package.json
└── Dockerfile

package.json:


{
  "name": "my-express-app",
  "version": "1.0.0",
  "description": "Simple Express app on Raspberry Pi",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "^4.17.1"
  }
}

index.js:


const express = require('express');
const app = express();
const port = 3000; // Uygulama 3000 portunda çalışacak

app.get('/', (req, res) => {
  res.send('

Merhaba Raspberry Pi!

Bu uygulama Docker ile dağıtıldı ve Cloudflare Tunnel üzerinden erişilebilir.

Uygulama versiyonu: 1.0.0

'); }); app.listen(port, () => { console.log(Uygulama http://localhost:${port} adresinde çalışıyor); });

Şimdi bu uygulamayı Dockerize edelim. Dockerfile:


# Dockerfile
# Raspberry Pi için uygun Node.js ARM imajını kullan
FROM arm64v8/node:18-slim-bullseye 

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000 # Uygulamanın çalıştığı port

CMD [ "npm", "start" ]

Projenizi GitHub deponuza yükleyin.

GitHub Actions ile Docker İmajı Oluşturma ve Dağıtma

Önceki deploy.yml dosyamızı Docker ile dağıtımı destekleyecek şekilde güncelleyelim. Bu senaryoda, uygulamayı doğrudan Raspberry Pi'ye kopyalamak yerine, bir Docker imajı oluşturup Pi üzerinde çalıştırmayı tercih edeceğiz. GitHub Actions, Docker imajını oluşturacak, sonra SSH üzerinden Pi'ye bağlanıp imajı çekmesini (pull) ve eski konteyneri durdurup yenisini başlatmasını söyleyecek.


# .github/workflows/deploy.yml
name: Express Uygulamasını Raspberry Pi'ye Dağıt

on:
  push:
    branches:
      - main

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Depoyu Çek
      uses: actions/checkout@v3

    - name: Docker İmajı Oluştur
      uses: docker/build-push-action@v4
      with:
        context: .
        push: false # Bu örnekte doğrudan push yapmıyoruz, ancak bir Docker kayıt defterine gönderebilirsiniz
        tags: my-express-app:latest
        platforms: linux/arm64 # Raspberry Pi için mimariyi belirt

    - name: Docker İmajını Kaydet (Tar olarak)
      run: docker save my-express-app:latest -o my-express-app.tar

    - name: SSH Anahtarını Kur
      uses: shimataro/ssh-key-action@v2
      with:
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        known_hosts: ${{ secrets.KNOWN_HOSTS }}

    - name: İmajı Raspberry Pi'ye Aktar ve Dağıt
      run: |
        scp -o StrictHostKeyChecking=no my-express-app.tar ${{ secrets.SSH_USER }}@${{ secrets.RPI_HOST }}:/tmp/my-express-app.tar
        ssh -o StrictHostKeyChecking=no ${{ secrets.SSH_USER }}@${{ secrets.RPI_HOST }} << 'EOF'
          docker load -i /tmp/my-express-app.tar
          docker stop my-express-app || true # Eski konteyneri durdur, yoksa hata vermez
          docker rm my-express-app || true   # Eski konteyneri sil
          docker run -d --name my-express-app -p 3000:3000 my-express-app:latest
          rm /tmp/my-express-app.tar # Aktarılan tar dosyasını sil
        EOF

Bu iş akışı:

  1. Depoyu çeker.
  2. Docker imajını Raspberry Pi'nin mimarisine (linux/arm64) uygun şekilde oluşturur.
  3. Oluşturulan imajı bir .tar dosyasına kaydeder.
  4. SSH anahtarlarını kurar.
  5. .tar dosyasını Raspberry Pi'ye kopyalar.
  6. SSH üzerinden Pi'ye bağlanır ve:
    • İmajı yükler.
    • Mevcut my-express-app konteynerini durdurur ve siler.
    • Yeni imajdan yeni bir konteyner başlatır ve 3000 portunu dışarıya açar.
    • Aktarılan .tar dosyasını temizler.
Uzman İpucu: Daha ileri seviye senaryolar için, Docker Hub gibi özel bir Docker kayıt defterine imajı push edip, Raspberry Pi'nin sadece imajı çekmesini sağlayabilirsiniz. Bu, büyük imajlar için scp yerine daha verimli bir yöntemdir.

Cloudflare Tunnel ile Erişimi Yapılandırma

Uygulamamız artık Raspberry Pi'de Docker konteyneri olarak 3000 portunda çalışıyor. Cloudflare Tunnel'ın yapılandırma dosyasını (~/.cloudflared/config.yml) güncelleyerek bu porta yönlendirme yapmalıyız:


# ~/.cloudflared/config.yml
tunnel: 
credentials-file: /home/kullanici_adi/.cloudflared/.json

ingress:
  - hostname: app.alanadiniz.com
    service: http://localhost:3000 # Express uygulamamız 3000 portunda çalışıyor
  - hostname: ssh.alanadiniz.com
    service: ssh://localhost:22
  - service: http_status:404

Bu değişikliği yaptıktan sonra cloudflared servisini yeniden başlatın:


sudo systemctl restart cloudflared

Artık app.alanadiniz.com adresine giderek, Raspberry Pi üzerindeki Node.js uygulamanıza Cloudflare Tunnel üzerinden güvenli bir şekilde erişebilirsiniz. Kodunuzda bir değişiklik yaptığınızda, GitHub'a push yapmanız yeterli olacak ve GitHub Actions, uygulamanızın yeni versiyonunu otomatik olarak Raspberry Pi'nize dağıtacaktır. Bu, modern, verimli ve güvenli bir self-hosting deneyimi için eksiksiz bir CI/CD boru hattıdır.

İleri Düzey İpuçları ve En İyi Uygulamalar: Güvenlikten Performansa

Raspberry Pi üzerinde kurduğumuz bu güçlü CI/CD ve güvenli erişim altyapısını daha da iyileştirmek ve profesyonel bir seviyeye taşımak için bazı ileri düzey ipuçları ve en iyi uygulamaları gözden geçirelim. Bu öneriler, sisteminizin güvenliğini artırırken, performansını optimize etmenize ve daha sürdürülebilir bir yapıya kavuşmanıza yardımcı olacaktır.

Güvenlik Önlemleri

Raspberry Pi'nizin ve ev ağınızın güvenliği her zaman öncelik olmalıdır:

  1. SSH Anahtar Yönetimi: Şifre tabanlı SSH kimlik doğrulaması yerine her zaman SSH anahtar çiftleri kullanın ve şifrenizi (passphrase) belirleyin. Ayrıca, SSH servisini sadece anahtarla erişime izin verecek şekilde yapılandırın (PasswordAuthentication no).
  2. Güvenlik Duvarı (UFW): Raspberry Pi'nizde bir güvenlik duvarı (örneğin UFW - Uncomplicated Firewall) kurarak sadece Cloudflare Tunnel için gerekli olan çıkış bağlantılarına ve içeriden gelen isteklere izin verin. Gelen tüm bağlantıları varsayılan olarak reddedin.
  3. 
    sudo apt install ufw -y
    sudo ufw default deny incoming
    sudo ufw default allow outgoing
    sudo ufw enable # Güvenlik duvarını etkinleştir
        

    Cloudflare Tunnel, Raspberry Pi'den dışarıya doğru bağlantı kurduğu için, gelen bağlantılara izin vermenize gerek kalmaz.

  4. Fail2Ban: SSH bağlantılarına yönelik kaba kuvvet saldırılarını önlemek için Fail2Ban kurun. Bu araç, başarısız oturum açma girişimlerini izler ve belirli sayıda başarısız denemeden sonra IP adreslerini otomatik olarak yasaklar.
  5. 
    sudo apt install fail2ban -y
    sudo systemctl enable fail2ban
    sudo systemctl start fail2ban
        

  6. Cloudflare Access Politikaları: Cloudflare Tunnel'a ek olarak, Zero Trust Access politikaları oluşturarak uygulamanıza erişimi daha da kısıtlayabilirsiniz. Örneğin, sadece belirli e-posta adreslerine sahip kişilerin veya belirli ülkelerden gelen IP adreslerinin erişimine izin verebilirsiniz.
Uzman İpucu: Raspberry Pi'nizin işletim sistemini ve kullandığınız tüm yazılımları düzenli olarak güncel tutmak, bilinen güvenlik açıklarına karşı korunmanın en basit ve en etkili yoludur.

Performans Optimizasyonu

Raspberry Pi'nin sınırlı kaynaklarını en verimli şekilde kullanmak önemlidir:

  1. Hafif Uygulamalar ve Docker İmajları: Uygulamalarınızı mümkün olduğunca hafif tutun. Docker imajları için -slim veya -alpine tabanlı imajlar kullanarak disk alanı ve RAM tüketimini azaltın.
  2. Kaynak İzleme: htop, glances veya Prometheus/Grafana gibi araçlarla Raspberry Pi'nizin CPU, RAM ve disk kullanımını izleyin. Bu, performans darboğazlarını tespit etmenize yardımcı olur.
  3. Cloudflare CDN Kullanımı: Cloudflare, web sitenizin statik içeriklerini (resimler, CSS, JS) önbelleğe alarak CDN (İçerik Dağıtım Ağı) olarak görev yapar. Bu, Raspberry Pi üzerindeki yükü azaltır ve son kullanıcılar için web sitenizin yüklenme hızını artırır.
  4. Swap Alanı Yönetimi: Yetersiz RAM durumunda Raspberry Pi, takas alanı (swap space) kullanarak diski RAM gibi kullanmaya çalışır. Bu performansı ciddi şekilde düşürür. Eğer uygulamalarınız çok fazla RAM kullanıyorsa, swap dosyanızın boyutunu artırabilirsiniz, ancak bu bir geçici çözümdür ve SSD veya daha fazla RAM'e sahip bir Pi modeli düşünmek daha iyi olabilir.
  5. 
    # Swap dosyasının boyutunu 2GB'a çıkarmak için (varsayılan 100MB'dır)
    sudo sed -i 's/CONF_SWAPSIZE=.*/CONF_SWAPSIZE=2048/' /etc/dphys-swapfile
    sudo systemctl restart dphys-swapfile
        

Yedekleme ve Kurtarma Stratejileri

Veri kaybını önlemek için düzenli yedeklemeler hayati öneme sahiptir:

  1. MicroSD Kart Yedeklemesi: Raspberry Pi'nizin tüm MicroSD kartının düzenli imaj yedeklerini alın. Bir problem durumunda, bu imajı yeni bir karta yazarak sisteminizi hızlıca geri yükleyebilirsiniz.
  2. Veritabanı Yedeklemeleri: Eğer bir veritabanı (örneğin SQLite, PostgreSQL, MySQL) kullanıyorsanız, veritabanı yedeğini düzenli olarak ayrı bir depolama alanına (örneğin bir bulut depolama hizmetine veya başka bir harici diske) aktarın. GitHub Actions iş akışınıza, veritabanı yedeğini alıp depolayan bir adım ekleyebilirsiniz.
  3. Yapılandırma Dosyalarını Versiyonlama: Tüm kritik yapılandırma dosyalarınızı (örneğin Nginx yapılandırması, cloudflared config.yml) Git ile versiyonlayın ve özel bir depoda saklayın. Bu, sisteminizi yeniden kurmanız gerektiğinde hızlıca yapılandırmanızı sağlar.

Bu ileri düzey ipuçları ve en iyi uygulamalar, Raspberry Pi üzerindeki self-hosting ortamınızı daha güvenli, daha performanslı ve daha dayanıklı hale getirecektir. Unutmayın, herhangi bir sunucu ortamında sürekli öğrenme ve iyileştirme, projenizin uzun ömürlü ve başarılı olmasını sağlar.

Sıkça Sorulan Sorular (SSS)

Raspberry Pi, GitHub Actions ve Cloudflare Tunnel üçlüsüyle kendi sunucunuzu barındırmak, hem heyecan verici hem de bazen akla yeni sorular getiren bir süreçtir. İşte bu konuda sıkça karşılaşılan bazı sorular ve yanıtları:

1. Raspberry Pi'm sürekli internete bağlı kalmak zorunda mı?

Evet, Cloudflare Tunnel'ın çalışabilmesi için Raspberry Pi'nizin sürekli internete bağlı olması gerekir. Tunnel, Pi'nizden Cloudflare ağına doğru sürekli bir dışa bağlantı kurar. Eğer internet bağlantısı kesilirse, dışarıdan erişim de kesilecektir. Ayrıca, GitHub Actions'tan dağıtım yapabilmek için de Pi'nizin SSH ile erişilebilir olması veya Docker imajlarını çekebilmesi gerekir ki bu da internet bağlantısı gerektirir.

2. Cloudflare Tunnel kullanmak güvenli mi? Ev ağım risk altında mı?

Cloudflare Tunnel, ev ağınız için geleneksel port yönlendirmelerinden çok daha güvenlidir. Çünkü:

  • Dışarıdan doğrudan Pi'nize gelen hiçbir port açılmaz. Tüm trafik, Pi'nizin başlattığı giden güvenli tünel üzerinden geçer.
  • İnternet trafiği Cloudflare'ın global ağı üzerinden yönlendirildiği için DDoS koruması, SSL/TLS şifreleme ve isteğe bağlı Web Uygulama Güvenlik Duvarı (WAF) gibi ek güvenlik katmanlarından yararlanırsınız.

Doğru yapılandırıldığında, Cloudflare Tunnel ev ağınızın güvenliğini önemli ölçüde artırır.

3. GitHub Actions ile dağıtım yaparken hassas verilerimi nasıl koruyabilirim?

Hassas verileri (SSH özel anahtarları, API anahtarları, veritabanı şifreleri vb.) doğrudan iş akışı YAML dosyasında tutmak yerine, GitHub Secrets özelliğini kullanmalısınız. Bu secret'lar şifrelenir ve iş akışınız çalışırken güvenli bir şekilde değişken olarak kullanılabilir. Asla özel anahtarlarınızı doğrudan deponuza commit etmeyin.

4. Raspberry Pi'min performansı birden fazla uygulamayı çalıştırmak için yeterli mi?

Raspberry Pi'nin performansı, kullandığınız modele ve çalıştırmak istediğiniz uygulamaların kaynak gereksinimlerine bağlıdır. Genellikle Raspberry Pi 4 veya 5 gibi yeni modeller, web sunucuları, küçük veritabanları ve hafif uygulamalar için yeterli performansı sunar. Ancak, çok sayıda eşzamanlı istek alan yoğun web uygulamaları veya kaynak yoğun arka plan işlemleri için yetersiz kalabilir. Performansı optimize etmek için Dockerize edilmiş, hafif uygulamalar kullanmaya, gereksiz servisleri kapatmaya ve Cloudflare CDN'den yararlanmaya özen gösterin.

5. Yaptığım bir dağıtım başarısız olursa ne yapmalıyım?

Eğer bir dağıtım başarısız olursa, ilk olarak GitHub Actions sekmesindeki iş akışı çıktısını kontrol edin. Hata mesajları genellikle sorunun kaynağı hakkında size bilgi verecektir (örneğin, SSH bağlantı hatası, Docker imajı oluşturma hatası, komut çalıştırma hatası). Gerekirse, Raspberry Pi'nize SSH ile bağlanarak manuel olarak sorun giderme adımları uygulayabilir ve hatanın nedenini daha derinlemesine araştırabilirsiniz. Başarısız dağıtımları hızla düzeltmek için geri alma (rollback) stratejileri düşünmek de iyi bir uygulamadır, örneğin eski bir Docker imajına geçiş yapmak gibi.

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.