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.
- MicroSD Kartı Hazırlama: Raspberry Pi Imager’ı bilgisayarınıza indirin ve kurun.
- İş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.
- 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.
- Yazma İşlemi: Hazırladığınız MicroSD kartı seçin ve yazma işlemini başlatın.
- İ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
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.
- Git Kurulumu: Git, kod versiyonlama ve GitHub ile entegrasyon için vazgeçilmezdir.
- 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.
- 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:
sudo apt install git -y
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
# 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:
- Depoyu Çek: Projenizin kodunu GitHub Actions çalışma alanına çeker.
- SSH Anahtarını Kur: Raspberry Pi'nize SSH ile bağlanmak için gerekli özel anahtarı ve bilinen hostları kurar.
- Dosyaları Raspberry Pi'ye Kopyala:
rsynckomutunu kullanarak, yerel depodaki tüm dosyaları Raspberry Pi üzerindeki belirtilen dizine kopyalar.--deleteparametresi sayesinde, Raspberry Pi'deki eski dosyalar silinerek yeni versiyonla senkronize edilir.
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ığı
- Cloudflare Hesabı Oluşturma: Eğer henüz bir Cloudflare hesabınız yoksa, Cloudflare web sitesinden ücretsiz bir hesap oluşturun.
- 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.
- 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.
- Cloudflared Kurulumu (Raspberry Pi Üzerinde): Raspberry Pi'nize SSH ile bağlanın ve aşağıdaki komutları çalıştırın.
- 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 sizecloudflared loginkomutunu verecek. Bu komutu Raspberry Pi'nizde çalıştırın: - 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: - 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:
# 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ü
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.
cloudflared tunnel create my-rpi-tunnel
Bu komut, ~/.cloudflared/ 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.
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ışı:
- Depoyu çeker.
- Docker imajını Raspberry Pi'nin mimarisine (
linux/arm64) uygun şekilde oluşturur. - Oluşturulan imajı bir
.tardosyasına kaydeder. - SSH anahtarlarını kurar.
.tardosyasını Raspberry Pi'ye kopyalar.- SSH üzerinden Pi'ye bağlanır ve:
- İmajı yükler.
- Mevcut
my-express-appkonteynerini durdurur ve siler. - Yeni imajdan yeni bir konteyner başlatır ve 3000 portunu dışarıya açar.
- Aktarılan
.tardosyasını temizler.
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:
- 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). - 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.
- 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.
- 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.
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.
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Performans Optimizasyonu
Raspberry Pi'nin sınırlı kaynaklarını en verimli şekilde kullanmak önemlidir:
- Hafif Uygulamalar ve Docker İmajları: Uygulamalarınızı mümkün olduğunca hafif tutun. Docker imajları için
-slimveya-alpinetabanlı imajlar kullanarak disk alanı ve RAM tüketimini azaltın. - Kaynak İzleme:
htop,glancesveya 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. - 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.
- 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.
# 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:
- 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.
- 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.
- Yapılandırma Dosyalarını Versiyonlama: Tüm kritik yapılandırma dosyalarınızı (örneğin Nginx yapılandırması,
cloudflaredconfig.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.