Ev Sunucusu ve Yeni Kurulumlar

Ev Sunucusu ve Yeni Kurulumlar

İlk tek kart bilgisayarlar çıkmaya başladığından beri bu küçük arkadaşları severek kullanıyorum. Raspberry'nin ilk modelleriyle başlayan bu heves zaman içinde akıllı ev sistemlerine bulaşmamla birlikte bir amaç kazandı ve çok uzun süredir evde kullandığım her şeyi bu tek kart bilgisayarlar üstünde çalıştırdım. Geçmiş zamanla konuşuyorum çünkü bu durum artık değişmek üzere.

Tek kart cihazlar çıktıklarından beri bazı büyük avantajlara sahipler. Bir kere rakiplere karşı çok daha ucuzlar, çoğunluğu ARM kullandığı için form faktörlerine nazaran çok hızlılar, yine çoğunluğu aktif bir soğutmaya ihtiyacı olmadığı için yattığınız odada dahi kullanmaya uygunlar. Hal böyle olunca evde her zaman elimin altında bu arkadaşlardan mevcuttu. Bu yazı dizisine başlayana kadar da evin ihtiyacı olan tüm servisleri bir Raspberry PI 400 üzerinde çalıştırıyordum.

Peki ne oldu da çalışan sistemimi değiştirmeye karar verdim. İlk olarak beni rahatsız eden şey bu cihazlarda disk kullanmanın zorluğu oldu. Her ne kadar Raspberry PI 5 modeli ile üstünde NVMe disk takabileceğiniz bir pci express portuyla gelse de bu arkadaşlar kahir ekseriyetle hafıza kartı üzerinden çalışıyorlar. Hafıza kartı dediğimiz cihazlar ya bu kadar gigabyte bu kartın tam neresine sığıyor diye insanı şaşırtsa da hem sürekli bir bilgisayarı çalıştırmak için yapılmamış olmaları hem de rastgele erişimde performans olarak temenni seviyesinde çalışıyor olmaları nedeniyle ağır yükler altında istediğiniz gibi çalışmıyor.

Ben her ne kadar kendi evimde bir SSD cihaz bağlamış olsam dahi bunun da USB üstünden bir disk kutusuyla bağlanıyor olması ve diskin yavaş yavaş bozuluyor olması beni bir cihaz aramaya itti.

Intel vs Arm

İlk etapta yine bir tek kart bilgisayar baksam da bizim Akıllı Evler discord grubu sayesinde bunca yıldan sonra Intel'e dönmeye karar verdim ve Intel'in N100 işlemcisiyle tanışmış oldum. N100 performans olarak ancak bir 6. nesil i5 işlemci kadar performans verse de iki konuda çok ciddi bir avantaj sunuyor. Bunlardan ilki peak performansında 65 yerine 7W tüketmesi ve ikincisi ise dahili iGPU işlemcisiyle hem ufak tefek makine öğrenmesi hem de encoding / decoding işlemlerinde boyunun ötesinde bir performans sergilemesi.

Tabi işlemciye karar verdikten sonra bu işlemciye sahip cihazlara bakmaya geldi sıra. Gerek Hepsiburada'da gerekse farklı platformlarda bu işlemciye sahip çok küçük bilgisayarlar olsa da bunların maliyeti çok yüksek olduğu için yanlarına bile yaklaşamadım.

Tam bu hayalden vazgeçmek üzereyken Amazon üzerinde güzel bir cihaz buldum. 256 GB SSD ve 12 GB LPDDR5 ram ile gelen bu arkadaş avuç içine, sığacak kadar küçüktü. YouYeeToo isimli bir Çin OEM'ine ait olan cihaz BY51 koduyla satılıyordu. Benim de Amazon'da hatrı sayılır bir bakiyem olduğundan paraya kıydım ve yurtdışından sipariş verdim. İlginç bir şekilde satıcı Amazon olmamasına rağmen 5 gün içinde cihaz kapıma geldi.

Fedora'ya Dönüş

Yeni bir ev sunucusu kurmanın en heyecanlı (?) karar anlarından birisi hangi işletim sistemini kuracağınıza karar vermektir. Nedense ben Ubuntu'ya bir türlü ısınamadığım ve senelerce Debian ile dirsek çürüttüğüm için bu sefer Fedora kurmaya karar verdim ve Fedora'nın kurulum anındaki güncel sürümü olan 40'ın sunucu sürümü ile yola çıktım.

Aslında ilk hedefim bir kickstart dosyası hazırlayıp bilgisayarı tamamen headless kurmak olsa da sonradan Anaconda (Fedora kurulum aracı) içinde bir VNC sunucu desteği olduğunu öğrendim. Bu sebeple bir kereye mahsus cihazı bir televizyona ve klavyeye bağlayıp boot ekranında VNC çalışması için gerekli parametreyi girdim ve kurulumu Laptop üzerinden tamamladım. Bu konu ilginizi çekerse buradaki belgeyi takip edebilirsiniz.

Cihazın üstündeki tüm donanımların Linux ile anlaşması süper oldu demek isterdim ama eskiye nazaran 3 milenyum yol alınmış olsa da tam olarak her şey süper olmadı. Fedora'nın ilk çalışması ile birlikte cihaz ciddi manada ısınmaya sonra da soğuma için aktif soğutmasını çalıştırmaya başladı. N100 bir hayal kırılığı mı diye düşünmeye başlarken cihazın bir core'unun sürekli aktif olarak çalıştığını gördüm ve bunun nedenini araştırmaya başladım. Kısa süre içinde de buldum.

Cihazdaki pci express portlarından birisi sürekli bir hata üretiyor bu hata sürekli loglanıyor bu hata yüzünden ölen processler de sürekli tekrar canlanmaya başlıyordu. Hızlı bir internet araması beni tam kernel'i bir de şöyle derlediniz mi sonucuna yaklaştırıyordu ki köprüden önce son çıkışta Kernel'deki mmconfig özelliğini kapattım ve cihaz bir anda sustu. Dolayısıyla eğer evrenin bir köşesinde bu cihaza sahipseniz ve cihazınız ısınıp ses yapıyorsa aşağıdaki komutu çalıştırabilirsiniz.

sudo grubby --update-kernel ALL --args pci=nommconf

Bu config'den ve biraz ince ayardan sonra cihazın üstündeki yük ve ram kullanımı aşağıdaki gibi oldu

Her şey Docker (öhöm Podman)

Aslında Eren'in kafamıza vura vura öğrettiği gibi gereksiz karmaşadan kaçmak ve kullancağım tüm servisleri cihaza kurmak gibi bir fikrim olsa da sonra Onur ile biraz fikir alışverişi yaptık ve her şeyi Docker (öhöm Podman) ile kurmaya karar verdim. Böyle yapmanın temelde iki avantajı olacaktı. İlki paket ve sürüm uyumsuzlukları için takla atmak zorunda kalmayacaktım ve ikincisi de configlerimi ve docker compose dosyalarımı sürüm kontrol sisteminde taşıyabilecektim.

Kararımı verince ev sahibi sistemdeki kullanıcım altında üç tane dizin yarattım. Bunları şu şekilde özetleyelim

$HOME/docker/<servis_adı>: Bu yolda her bir servisin adıyla bir dizin ve docker compose dosyası var.
$HOME/config/<servis_adı>: Bu yolda her bir servisin konteynerde ilgili dizinine bağlanan ve ayarları içeren klasörler var.
$HOME/logs/<servis_adı>: Destekleyen servislerde log çıktısını ayardan ayırmak için bu yolu kullandım.

Yaptığım diğer şeylerden biri özellikle ev sahibi sistemdeki dosyaları okuyacak ve yazacak konteynerlere, host sistemdeki kullanıcımın UID ve GID'ini paslamak oldu. Böylece dosya izinleri konusunu daha az dert etmeme gerek olacak diye umuyorum.

Son olarak docker ve config klasörlerini birer git deposuna çevirdim ve bunları da private bir repo olarak github'da konumlandırdım. Kimsenin işine yarayacağını sanmıyorum ama sonrasında compose dosyalarını ayrıca bir public repo'ya da koyacağım. Tabi önce compose dosyaları içindeki olası secret'ları düzgün bir şekilde dışarıya aldığımdan emin olmalıyım.

Bu sayede evde Rpi 400 üzerinden sunduğum servisleri düzgünce aktarabileceğim bir baz edinmiş oldum ve sıra geldi servisleri taşımaya.

Çok servis çok karışıklık...

Bir evde kaç servis olabilir ki dediğinizi duyar gibiyim ama gerçekten evde kullandığım pek çok servis var ve bunlar farklı portlarda çalıştığı için istediğiniz servise gitmek ve aradığınızı bulmak kimi zaman gereğinden fazla bilişsel bir yük yaratıyor.

Toprağım bu servisleri kurmasan bu yükü de çekmezsin olmayan yüke çözüm buluyorsun dediğinizi duyar gibi olsam da yolumdan sapmıyorum ve ne yaptığımız yazmaya devam ediyorum.

Home Page

Hah ne diyorduk? Evet... Bize evdeki tüm servislere gidebileceğimiz bir giriş noktası gerekiyor. Her ne kadar daha eski zamanlarda nginx reverse proxy ile bunu yapmış olsam da geçen zaman içinde bir sürü tatlı program çıktı bunun için ve ben de yine Onur sağolsun Home Page'e şans verdim. Bunun temel nedeni de home page için ayrıca config yazmanıza gerek olmaması ve kendisinin docker'a verdiğiniz label'lara bakarak otomatik servis keşfi yapabiliyor olması.

Dolayısıyla önce gethomepage.dev adresinden homepage'i kurarak işe başladım. Burada dikkate edilmesi gereken yegane şey homepage'in servis keşfini yapabilmesi için docker soketine erişmesi gereği. Bunun sağlamak için eğer bu yazılımı yine bir konteynerde ayağa kaldıracaksanız ev sahibi sisteminizdeki docker soketine erişebilecek bir kullanıcının pid ya da gid değerini içeriye paslamanız gerekiyor.

Örneğin benim için bu durum aşağıdaki gibi oldu

(...)
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      PUID: 1000
      PGID: 987

Her yerden makineye erişmenin kolay yolu

Evde sabit IP kullanmama rağmen port yönlendirmek vs uğraştırıcı şeyler. Dolayısıyla bilgisayara ulaşmam gereken herhangi bir yerde daha yaratıcı bir çözüm kullanmam gerekiyordu. Bunun sağlamanın en iyi yolu benim için Tailscale oldu. Hali hazırda bir Tailscale hesabım var ve bu hesap içerisinde cep telefonum, mobil cihazım, evdeki rpi ve bir exit node olarak izahtan vareste nedenlerden mütevellit yurt dışındaki sunucum yaşıyor.

Tailscale'in kurulum scriptini takip ederek hızlıca servisi kurdum ve komut satırından beni yönlendirmesiyle bu cihazı da aynı network'e dahil ettim. Burada dikkat etmeniz gereken tek şey ara ara yeniden token almamak için Tailscale web arayüzünden ilgili cihaz için anahtar zaman aşımını kapatmak olacaktır.

Göç ettirmem gereken çok servis var eh yazı da uzuyor iyice okunmaz bir hale geldi. Dolayısıyla bu yazıyı şimdilik burada bırakalım. Bir sonraki yazıda yeni servislerle burada olacağız.