Yapay zeka, geliştirici ve araştırmacılar için hazır veri setleri satışa açıldı. → İncele

Eski Bir MacBook'u Ev Sunucusuna Dönüştürmek: Docker Yolculuğu

Bir gün atıl kalan eski bir MacBook’a baktım ve şunu düşündüm: “Bu makine hâlâ çalışıyor, neden boşta beklesin?” İşte o andan itibaren başlayan ve beni beklenmedik bir öğrenme yolculuğuna sürükleyen süreç, bu yazının konusu.

Başlangıç: Eski Donanım, Yeni Ufuklar

2017 model bir MacBook Pro ile yola çıktım. Intel işlemci, 8 GB RAM, macOS Ventura. İlk engel hemen karşıma çıktı: güncel Docker Desktop artık bu donanımı desteklemiyordu.

Ama her kısıtlama yeni bir çözümü beraberinde getirir.

Çözüm: Colima + MacPorts

MacPorts ile Docker araçlarını kurdum, Docker Desktop’ın yaptığı işi ise Colima üstlendi. Colima, arka planda hafif bir Linux VM çalıştırarak Docker daemon’u ayağa kaldırıyor. Sonuç? Docker Desktop olmadan tam işlevsel bir Docker ortamı.

Kurulum mantığım netti:

  • brew → sadece GUI uygulamalar
  • MacPorts → CLI araçları ve servisler

Bu ayrım, sistemi düzenli tutmanın en kolay yolu oldu.

Portainer: Docker’ı Görselleştirmek

Terminal komutlarıyla container yönetmek başlangıçta karmaşık gelebilir. Portainer bu sorunu çözdü — Docker’ın üstünde çalışan, tarayıcıdan erişilen bir yönetim arayüzü.

Container başlatmak, durdurmak, log görmek, volume yönetmek… Hepsi birkaç tıkla. Üstelik Portainer’ın kendisi de bir Docker container’ı olarak çalışıyor.

Öğrenilen Kritik Kavramlar

Container vs Stack: Tek başına çalışan servisler için container yeterli. Birden fazla servisi birlikte çalıştırman gerekiyorsa — örneğin bir uygulama + veritabanı + cache — Stack kullanmak gerekiyor. Stack’ler docker-compose.yml mantığıyla çalışıyor.

Restart Policy: Her container’ı Always restart politikasıyla kurmak, sistemi yeniden başlattığında her şeyin otomatik ayağa kalkmasını sağlıyor. Bunu öğrenmeden önce her seferinde container’ları tek tek başlatmak zorunda kaldım.

Volume vs Bind Mount: Container silindiğinde veriler de gidebilir. Verinin kalıcı olması için ya named volume ya da host’taki bir klasörü bağlamak (bind mount) şart.

Hazır Şablonlar: Hızlı Kurulumun Gücü

Portainer’ın App Templates özelliği, popüler uygulamaları form doldurup “Deploy” diyerek kurmaya yarıyor. Topluluk tarafından hazırlanmış şablon listeleri ekleyince yüzlerce uygulama tek tıkla erişilebilir hale geliyor.

Elbette dikkatli olmak gerekiyor: şablonlar resmi değil. Port ayarlarını, volume path’lerini kendi sistemine göre düzenlemek şart.

Tek Dizin Felsefesi: Her Şey Bir Arada

Birkaç container kurduktan sonra kaos başladı. Config dosyaları nerede? Veriler nerede?

Çözüm basitti: tek bir dizin altında her şeyi toplamak.

~/Documents/docker/
├── jellyfin/
│   ├── config/
│   └── media/
├── navidrome/
│   ├── config/
│   └── music/
├── kavita/
│   ├── config/
│   └── books/
└── nextcloud/
    ├── config/
    └── data/

Bu yapı sayesinde:

  • Finder’dan kolayca erişebiliyorum
  • Yedek almak tek komut
  • Hangi verinin nerede olduğunu biliyorum

Her servis kendi klasöründe, config ve data ayrı. Basit ama etkili.

Tailscale: Kendi Özel Ağın

Evdeki tüm servislere dışarıdan güvenle erişmek istiyordum. Port açmak istemiyordum, statik IP yoktu. Tailscale her şeyi çözdü.

Tailscale, cihazların arasında şifreli bir VPN ağı oluşturuyor. MacBook, iPhone, iPad, başka bilgisayar — hepsi sanki aynı ağdaymış gibi birbirine bağlanıyor.

MagicDNS özelliğiyle IP adresi ezberlemek de tarihe karıştı. http://macbook.tailnet.ts.net:8096 gibi anlamlı adreslerle tüm servislere ulaşabiliyorum.

Tailscale’in güzelliği: kurulum beş dakika, sonrasında sıfır bakım.

Neler Kurdum: Kendi Ekosistemim

Bu süreçte kurduğum servislerin bir kısmı:

Medya

  • Jellyfin → kişisel Netflix, video ve müzik
  • Navidrome → müzik sunucusu, iOS uygulamasıyla offline dinleme
  • Kavita → e-kitap okuyucu, EPUB ve PDF desteği

Üretkenlik

  • FreshRSS → RSS okuyucu, içerik takibi
  • Linkding → bookmark yöneticisi
  • Memos → hızlı not alma
  • Nextcloud → kişisel bulut depolama

Araçlar

  • Stirling PDF → PDF düzenleme
  • MeTube → YouTube indirici
  • LibreTranslate → çeviri servisi
  • SearXNG → gizlilik odaklı arama motoru

Dashboard

  • Homepage → tüm servislerin tek ekranda görüntülendiği başlangıç sayfası

Her şey kendi container’ında, birbirinden izole, tek bir arayüzden yönetilebilir.

Geliştirme Ortamı: Docker ile Kod Yazmak

Docker sadece hazır uygulamalar için değil, kendi projelerini geliştirmek için de ideal.

PHP + SQLite ile basit bir web uygulaması geliştirmek için yaptığım şey şuydu:

services:
  proje:
    image: php:8.2-apache
    ports:
      - 8085:80
    volumes:
      - /Users/kullanici/Documents/www/proje:/var/www/html

Bind mount sayesinde Mac’te kod editöründe dosyayı kaydettiğimde, tarayıcıyı yenilediğimde değişiklik anında görünüyor. Yeniden build gerekmez, container’ı restart etmek gerekmez.

Birden fazla proje? Her biri farklı portta, birbirinden tamamen izole. PHP 8.2 kullanan bir proje, Python kullanan başka bir proje — hiç çakışma yok.

Cron işleri için de container içine cron daemon kurarak kalıcı zamanlama işleri tanımladım. Container yeniden başlasa bile cron konfigürasyonu Dockerfile’da olduğu için kaybolmuyor.

Cloudflare Tunnel: Dışarıya Açılmak

Tailscale ile kişisel erişim çözüldü. Peki ya projeleri dünyaya açmak?

Cloudflare Tunnel burada devreye girdi. Router ayarı yok, port açma yok, statik IP yok. Sadece bir Docker container çalıştırıyorsun ve Cloudflare kendi altyapısı üzerinden trafiği yönlendiriyor.

Kullanıcı → Cloudflare CDN → Tunnel → MacBook → Docker Container

Üstelik HTTPS otomatik geliyor. Sertifika yönetimi, SSL kurulumu — bunların hiçbiriyle uğraşmak yok.

Tek bir Cloudflare Tunnel container’ı ile birden fazla domain ve subdomain yönetilebiliyor. Yeni bir proje için sadece Cloudflare panelinden yeni bir “Public Hostname” ekliyorsun.

Zero Trust ile Güvenlik Katmanı

Cloudflare Zero Trust, servislerin önüne bir kimlik doğrulama katmanı ekliyor. Google hesabıyla giriş zorunluluğu, IP kısıtlamaları, oturum süreleri…

Bir test sitesini herkese açık tutmak yerine sadece belirli kişilerin erişebileceği şekilde kilitlemek birkaç tıkla mümkün. Şirket VPN’lerine alternatif, ev kullanıcısı için ise ekstra bir güvenlik kalkanı.

Öğrendiklerim

Bu yolculukta teknik bilginin ötesinde bazı temel prensipler oturdu kafamda:

Organizasyon her şeydir. İlk başta gelişigüzel kurulan container’lar zamanla kaosa döndü. Tek dizin, tutarlı isimlendirme ve her servis için ayrı klasör — bunlar sonradan düzeltilmesi zor alışkanlıklar.

Basit başla, karmaşıklaştırma. Her şeyi bir anda kurmaya çalışmak yerine bir servisi tam anlamıyla anlamak, sonrakini daha hızlı kurmayı sağladı.

Log okumayı öğren. Bir şey çalışmadığında docker logs container_adı komutu her zaman cevabı veriyor. Hata mesajını okumak, çözümün yarısı.

Yedek alma alışkanlığı edin. Tüm config ve data tek bir dizinde olduğunda yedek almak tek komut: klasörü kopyala, bitti.

Sonuç

Atıl bir MacBook, artık 7/24 çalışan kişisel bir sunucu. Medya sunucusu, müzik akışı, not alma, RSS okuyucu, kişisel bulut, geliştirme ortamı — hepsi tek bir makinede, tek bir ekosistemde.

Docker öğrenmek başlangıçta göz korkutucu görünüyor. Container nedir, image nedir, volume nedir… Ama bir kez oturunca, hiçbir şeyi eski yönteme dönüp kurmak istemiyorsun.

Eski bir MacBook varsa ve Docker merakın varsa: hemen başla. En kötü ihtimalle yeni bir şey öğrenirsin.