Evde Küçük Bir DevOps ve AI Lab Kurdum
Neden böyle bir şeye ihtiyaç duydum?
Yaklaşık dört ay önce evde küçük bir Linux sunucu kurmaya karar verdim.
Linux cihazlar benim için yeni değil. İşte geliştirdiğimiz uygulamaları sık sık müşterilerimizdeki Linux cihazlara kuruyoruz. SSH ile bağlanmak, servisleri kontrol etmek, log okumak ve ağ sorunlarını çözmek işimin bir parçası.
Full-stack geliştirici olarak çalışıyorum ama yaptığım iş frontend ve backend ile sınırlı kalmıyor. Uygulamaların kurulumu ve çalışmaya devam etmesiyle de ilgileniyorum.
Bir yandan da küçük LLM'leri kendi ortamımda denemek istiyordum. Her fikir için uzaktaki bir servise bağlanmadan modelin nasıl davrandığını, ne kadar kaynak kullandığını ve basit bir uygulamaya nasıl bağlanacağını görmek istedim.
Bu yüzden evde hem uygulamalarımı kurup bozabileceğim hem de yerel AI denemeleri yapabileceğim küçük bir ortam hazırladım.
Linux çalıştıran küçük bir cihazım vardı. Sessizdi, az elektrik harcıyordu ve sürekli açık kalabiliyordu. Başlangıç için yeterliydi.
İlk kurulum
İlk yüklediğim Linux imajı beklediğim gibi çalışmadı. Monitör ve grafik arayüz istiyordu. Ben ise cihazı tamamen uzaktan yönetmek istiyordum.
Daha sade bir imaj yükledim. Cihazı yerel ağa bağladım ve SSH üzerinden ilk bağlantıyı yaptım. O andan sonra monitör veya klavye kullanmadım.
Sistemi güncelledim. Kullanıcı ve erişim ayarlarını yaptım. Ardından küçük uygulamalarımı taşımaya başladım.
İlk başta amacım birkaç servisi çalıştırmaktı. Sonra küçük yerel modelleri ve onlara bağlanan uygulamaları da aynı ortamda denemeye başladım.
En çok uğraştıran konu Wi-Fi oldu
Cihaz açıkken Wi-Fi çalışıyordu. Yeniden başlattığımda ise bazen geri gelmiyordu.
Bir kaç kez sorunu çözdüğümü düşündüm. Sonra Ethernet kablosunu çıkarıp cihazı tamamen kapalı durumdan yeniden açtım. Wi-Fi yine gelmedi.
Sorunun önemli bir kısmı test şeklimdi. Ethernet bağlıyken oluşan ağ olayı Wi-Fi bağlantısını da tetikliyordu. Ben de son yaptığım ayarın işe yaradığını sanıyordum.
Gerçek cold boot testi farklı bir sonuç gösterdi.
Bağlantıyı takip eden küçük bir watchdog hazırladım. Wi-Fi düşerse yeniden tarama yapıyor ve bağlantıyı tekrar kurmayı deniyor.
Son testi Ethernet olmadan yaptım. Cihaz yeniden açıldı ve bağlantı kendi geldi.
Bu sorunda asıl hatam doğru koşulda test yapmamaktı. Konfigürasyonun doğru görünmesi tek başına yeterli değildi.
Küçük sorunlar, gerçek deneyimler
Kurulum sırasında beklemediğim başka sorunlar da çıktı.
Bir gün paket kurarken sertifika ve imza hataları almaya başladım. Sorun ağda veya paketlerde değildi. Cihazın sistem saati yanlıştı.
Başka bir gün güvenlik ayarlarını değiştirirken SSH bağlantısını kaybettim. Cihaz yanımdaydı ve yeniden erişim sağlayabildim. Aynı hatayı uzaktaki bir production cihazında yapmak çok daha stresli olurdu.
Depolama tarafında da küçük cihazların sınırlarını gördüm. Yoğun veri yazan bir servis çalışınca SD kart darboğaz oluşturmaya başladı. Model dosyaları da küçük sayılmazdı. Hangi veriyi nerede tuttuğum önemli hale geldi.
Veriyi daha uygun bir depolama alanına taşıdım. Sonra yalnızca servisin açıldığını değil, reboot sonrasında da düzgün çalıştığını kontrol ettim.
Bu sorunlar bana yabancı değildi. Fakat evdeki cihazda bütün sistemi kendim kurduğum için sorunun hangi katmanda olduğunu baştan sona takip edebildim.
Uygulamalarımı nasıl çalıştırıyorum?
Kullandığım yöntem projeye göre değişiyor.
Bazı küçük servisleri doğrudan systemd ile yönetiyorum. Bazı projeleri ise Docker image olarak hazırlayıp container içinde çalıştırıyorum.
Basit bir servis için systemd yeterli olabiliyor. Birden fazla bağımlılığı olan veya aynı ortamı tekrar kurmak istediğim projelerde Docker daha rahat oluyor.
Servislerin durumunu health check'lerle kontrol ediyorum. Logları inceliyorum. Cihaz yeniden başladığında uygulamaların geri gelip gelmediğini test ediyorum.
Self-hosting yaparken kodu deploy etmekle işin bitmediğini gördüm. Uygulamanın günlerce açık kalması ve bir hata sonrasında tekrar ayağa kalkması da gerekiyor.
Küçük yerel modelleri denemek
Bu ortamın benim için önemli taraflarından biri yerel LLM denemeleri oldu.
Cihazda güçlü bir GPU yok. Bu yüzden büyük modeller çalıştırmaya uğraşmıyorum. Daha küçük ve quantized modelleri deniyorum. Buradaki amacım en hızlı cevabı almak değil. Sınırlı CPU ve bellekle neyin mümkün olduğunu görmek.
Bir modeli ayağa kaldırıp local bir API üzerinden kendi uygulamalarıma bağlıyorum. Prompt davranışını, cevap süresini ve bellek kullanımını izliyorum. Bazen model beklentimin altında kalıyor. Bazen de küçük bir iş için gayet yeterli oluyor.
Verinin cihazdan çıkmaması da ayrı bir avantaj. Kişisel dosyalarla küçük RAG denemeleri veya basit agent akışları hazırlarken bütün süreci yerelde tutabiliyorum.
Bu cihaz bulut servislerinin yerine geçmiyor. Zaten böyle bir hedefim yok. Benim için hızlıca fikir deneyebildiğim ve model seçiminin altyapı tarafını görebildiğim küçük bir AI lab.
Güvenli dış erişim
Ev ağındaki servisleri doğrudan internete açmak istemedim.
Modem üzerinde port açmak yerine Cloudflare Tunnel kullandım. Bağlantı evdeki cihazdan dışarı doğru kuruluyor. Yönetim ekranlarını da erişim kontrolü arkasında tutuyorum.
İçerideki trafiği Nginx karşılıyor ve isteği doğru uygulamaya gönderiyor. Böylece domain, TLS, reverse proxy ve erişim kontrolü gibi konuları gerçek bir ortamda deneme fırsatım oldu.
Detaylarda kaybolmak kolay. Nginx ayarındaki küçücük bir /, çalışan servisin dışarıdan 404 dönmesine yetebiliyor. Bazen saatlerce aradığım hata gerçekten tek karakter oluyor.
Codex'i nasıl kullandım?
Codex'i yalnızca komut yazdırmak için kullanmadım.
Bir sorun çıktığında logları beraber inceledik. Olası nedenleri sıraladık. Küçük testler hazırladık ve sonuçlara göre ilerledik.
Codex; Linux loglarını yorumlama, ağ sorunlarını araştırma, Docker ve servis ayarlarını hazırlama, yerel model denemelerini düzenleme ve yaptığımız değişiklikleri dokümante etme konularında işimi kolaylaştırdı.
Her zaman ilk tahmin doğru çıkmadı.
Wi-Fi sorununda birkaç farklı teori denedik. Bazıları mantıklı görünüyordu ama gerçek testte işe yaramadı. Benim cihazda gördüğüm davranış ile Codex'in loglardan çıkardığı bilgiler birleşince doğru testi kurabildik.
Codex en çok araştırma ve test sırasında işimi kolaylaştırdı. Bir model denemesinde de altyapı sorununda da önceki adımları kaybetmeden devam edebildik.
Son kontrol yine bende. Bir değişiklikten sonra loglara bakıyorum. Servisi test ediyorum. Gerekirse cihazı yeniden başlatıyorum. “Çalışması lazım” demekle yetinmiyorum.
Codex benim yerime sistemi yönetmiyor. Araştırmayı hızlandırıyor ve gözden kaçırdığım noktaları gösteriyor.
Bu proje bana ne kattı?
Profesyonel işlerimde Linux cihazlara deploy yapmaya zaten aşinaydım.
Evde olduğu için bu sistemi rahatça değiştirip yeniden kurabildim. Ağdan depolamaya, container'lardan servis yönetimine kadar farklı katmanlarla doğrudan ilgilendim.
Yaklaşık dört ay içinde Linux, Docker, systemd, ağ yönetimi, güvenli tüneller, yerel inference ve uygulama operasyonları konusunda bolca pratik yaptım.
Deploy'un işin son adımı olmadığını tekrar gördüm.
Ağ düşebilir. Disk yavaşlayabilir. Container kapanabilir. Model belleğe sığabilir ama kullanılabilir hızda çalışmayabilir. Servis açılır ama istek alamaz. Bazen de gerçekten herşey yolunda gider.
Masamın köşesinde duran küçük Linux cihazı artık yalnızca bir sunucu değil. Kendi uygulamalarımı çalıştırdığım, küçük modelleri denediğim ve bozduğum sistemi tekrar ayağa kaldırdığım bir DevOps ve AI lab.
Benim için işin eğlenceli kısmı da sistemi bozup tekrar çalıştırmak oldu.