Home (Cloud) Server Pi5 Upgrade
Raspberry Pi 5 ile ev bulut sunucusu kurulumu: CasaOS, NextCloud, RAID depolama ve Cloudflare Tunnel.
2017’den beri çalışan bir ev sunucum vardı: Raspberry Pi 3 Model B, 2 TB harici disk. Uzun süre yetti. Ama 1 GB RAM, USB 2.0 ve 100 Mbps ağ bağlantısı bir noktada yetmemeye başladı. Hem donanımın hem yazılımın yenilenme zamanı gelmişti. Bu yazı o yükseltme sürecinin belgesi.

Donanım Seçimi
Uzun bir araştırma sürecinden geçtim. Bazı ürünleri Türkiye’ye doğrudan satmadıkları için temin etmek mümkün olmadı — sepeti boşaltıyorlar, başka seçenek yok. Ulaşabildiklerimin içinden fiyat/performans dengesine bakarak şu listeye karar verdim:
Raspberry Pi 5 8 GB ve resmi adaptör: 8 GB belleğin bir süre daha yetmesini bekliyorum. Güç sorunuyla uğraşmak istemediğim için resmi adaptörü seçtim.
SanDisk MicroSDXC UHS-I A2 64 GB: Kısa vadede NVMe SSD takmayı planlamıyorum. Yeterli hız ve kapasiteden emin olmak istedim. Aslında 32 GB A1 bir kart da bu iş için yeterli olabilirdi.
Argon One V3 Case: Aktif soğutma, alüminyum gövde. Birkaç güzelliği daha var.
Archgon MH-3643-JSC: 4 diskli harici disk kutusu. Uygun fiyata kaliteli görünüyor.
Seagate IronWolf NAS HDD 4 TB (x4): 7/24 çalışmak için tasarlanmış bir disk. RAID 10 kurulumunda yedekli 8 TB alan elde ediyorum. SSD düşündüm ama maliyet katlanıyordu.
Donanımları 1-2 saatte bir araya getirdim. Asıl iş yazılım tarafında başlıyor.
İşletim Sistemi Kurulumu
Raspberry Pi Imager ile SD karta işletim sistemi kurmak artık birkaç tıklama meselesi. Cihaz, işletim sistemi ve hedef kart seçilip devam ediliyor.
İşletim sistemi olarak Raspberry Pi OS 64-bit Lite sürümünü tercih ettim. Arayüz içermiyor, 400-500 MB civarında bir Debian tabanlı dağıtım. Sunucu kullanımı için gereksiz yük taşımıyor.
Kurulum sırasında önemli bir nokta: imager “Ayarları Düzenle” sorusunda Services sekmesine girip SSH’ı etkinleştirin. Klavye, fare, monitör bağlamadan SSH üzerinden ilk erişimi yapacaksanız bu zorunlu.
SD kartı takın, gücü verin. İlk açılış 1-2 dakika sürebilir. Router arayüzünden Raspberry Pi’ın aldığı IP adresini öğrendikten sonra:
ssh [pi_username]@[pi_ip_address]
Varsayılan kullanıcı adı pi, şifre raspberry. Hemen değiştirin:
passwd
Statik IP
Yerel ağda sabit bir adrese erişmek için statik IP tanımlamak gerekiyor. Raspberry Pi OS Lite’ın bu sürümünde dhcpcd servisi gelmiyor, interfaces dosyasını doğrudan düzenlemek gerekiyor:
sudo nano /etc/network/interfaces
Ethernet için:
auto eth0
iface eth0 inet static
address 192.168.1.249
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 8.8.8.8 8.8.4.4
Wi-Fi için:
auto wlan0
iface wlan0 inet static
address 192.168.1.249
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 8.8.8.8 8.8.4.4
wpa-ssid "WiFi_Ag_Adi"
wpa-psk "WiFi_Sifresi"
Kaydedip çıkın (CTRL+O, CTRL+X). Ben değişikliği uygulamak için sistemi yeniden başlatmayı tercih ettim:
sudo reboot now
Değişikliği doğrulamak için:
ip a
DNS
Statik IP tanımında nameserver girdik; ama sunucu olarak kullanılacak bir cihazın güçlü ve güvenilir bir DNS kullandığından ayrıca emin olmakta fayda var:
sudo nano /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
Google DNS tercih ettim. Cloudflare DNS da iyi bir alternatif.
Bir sorun var: sistem yeniden başladığında bu dosyayı ezebilir. Bunu önlemek için dosyayı readonly yapıyoruz:
sudo chattr +i /etc/resolv.conf
Dosyayı düzenlemek gerektiğinde:
sudo chattr -i /etc/resolv.conf
Firewall (UFW)
Sunucu olarak kullanılacak bir cihazı firewall olmadan ağa dahil etmek düşünülemez.
sudo apt update
sudo apt install ufw
SSH üzerinden bağlıysanız, kurulum sırasında SSH bağlantısına izin vermek isteyip istemediğinizi soracaktır. Y ile onaylayın.
Önce varsayılan kurallar:
sudo ufw default deny incoming
sudo ufw default allow outgoing
SSH’a izin ver:
sudo ufw allow ssh
sudo ufw allow 22
Web arayüzü olan uygulamalar çalıştıracaksak HTTP ve HTTPS portları da açılmalı:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
UFW’yi etkinleştir:
sudo ufw enable
İhtiyaca göre daha spesifik kurallar da tanımlanabilir. Örneğin yalnızca belirli bir yerel IP’nin belirli bir porta erişmesine izin vermek:
sudo ufw allow from 192.168.1.100 to any port 3306
Mevcut durumu kontrol etmek için:
sudo ufw status verbose
Kural silmek için:
sudo ufw status numbered
sudo ufw delete <KuralNumarası>
Depolama Havuzu: RAID 10
Diskleri sisteme dahil etmeden önce EXT4 ile formatlamak iyi bir başlangıç.
Bağlı diskleri listele:
lsblk
Diskler /dev/sda, /dev/sdb, /dev/sdc, /dev/sdd gibi görünür. Her disk bölümünü tek tek formatla:
sudo mkfs.ext4 /dev/sda1
Disk adı değil, bölüm adı yazıldığına dikkat edin.
Yazılımsal RAID 10 için mdadm kuruluyor:
sudo apt update
sudo apt install mdadm
4 diskli RAID 10 yapısını oluştur:
sudo mdadm --create --verbose /dev/md0 --level=10 --raid-devices=4 /dev/sda /dev/sdb /dev/sdc /dev/sdd
RAID durumunu kontrol et:
cat /proc/mdstat
RAID dizisini EXT4 ile formatla:
sudo mkfs.ext4 /dev/md0
Mount et:
sudo mkdir -p /mnt/raid10
sudo mount /dev/md0 /mnt/raid10
Her açılışta otomatik mount için /etc/fstab dosyasına UUID ile ekleme yapmak gerekiyor. UUID’yi öğren:
sudo blkid /dev/md0
Ardından /etc/fstab dosyasını düzenle:
sudo nano /etc/fstab
UUID=<RAIDin UUIDsi> /mnt/raid10 ext4 defaults 0 0
RAID durumunu düzenli aralıklarla izlemek önemli:
sudo mdadm --detail /dev/md0
İzleme ve uyarı için:
sudo mdadm --monitor --scan --daemonise --mail=root@localhost --delay=300
Ben bu kısmı Python ile bir betik yazarak çözmeyi planlıyorum: her gece çalışacak, SMART ve MDADM verilerini toplayıp analiz edecek ve raporlayacak. Ama bu ayrı bir konunun yazısı.
Disk Arızası Durumunda
RAID 10 bir disk arızasını tolere eder; ama hızlı davranmak gerekiyor. İkinci bir disk daha bozulmadan yeni diski sisteme dahil edemezseniz veri kaybı yaşanabilir.
Arızalı diski tespit et:
sudo mdadm --detail /dev/md0
Failed Devices alanında arızalı disk görünür. State alanında degraded yazıyorsa RAID tam kapasitede değil.
Arızalı diski RAID’den çıkar:
sudo mdadm /dev/md0 --fail /dev/sdc --remove /dev/sdc
Fiziksel diski değiştirdikten sonra yeni diskin adını doğrula:
lsblk
Yeni diski temizle:
sudo wipefs -a /dev/sdc
RAID yapısına ekle:
sudo mdadm /dev/md0 --add /dev/sdc
Senkronizasyon sürecini izle:
cat /proc/mdstat
Tamamlandıktan sonra durumu kontrol et — State alanında clean görünüyorsa yapı tam kapasitede:
sudo mdadm --detail /dev/md0
Son olarak yapılandırmayı güncelle:
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u
Not: Yerel depolama çözümleri yazılımsal, donanımsal ve fiziksel riskler barındırır. Kritik veriler için tek bir yedekleme katmanına güvenmemek gerekiyor.
CasaOS
CasaOS, Docker container’ları üzerinde uygulamaları kolayca kurup yönetebileceğiniz bir ev sunucu arayüzü. Kurulumu tek satır:
sudo apt update && sudo apt upgrade -y
curl -fsSL https://get.casaos.io | sudo bash
Bu komut Docker, Samba gibi bağımlılıkları ve CasaOS web arayüzünü kuruyor. Kurulum tamamlandıktan sonra:
http://[your_server_ip_address]
İlk açılışta yönetici hesabı oluşturuluyor. Giriş yapıldığında Apps bölümünden tek tıkla kurulabilen uygulamaları görebilirsiniz. Listede olmayan herhangi bir Docker uygulaması için Apps ekranının sağ üstündeki “Özel Yükleme” butonu kullanılabilir.
Database (MariaDB)
Her uygulamanın kendi veritabanı çözümü olsa da ben ayrı bir MariaDB instance’ı kurmak istedim — olası bir sorununda veritabanına doğrudan müdahale edebilmek için.
CasaOS arayüzünde Apps içinden MariaDB’yi aratıp “Kur” butonuna tıklamak yeterli.
Firewall’da MySQL portunu aç:
sudo ufw allow 3306/tcp
Varsayılan root şifresi casaos. Hemen değiştirin:
sudo mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY '[rootP@s$WorD]';
casaos kullanıcısının şifresini de aynı şekilde değiştirin.
CasaOS arayüzünde MariaDB uygulamasının ayarlarına girin, ortam değişkenlerinde belirlediğiniz şifreleri girin. /var/lib/mysql yolu için bir volume tanımlamayı unutmayın; aksi hâlde veriler container yeniden başladığında kaybolur.

NextCloud
Kişisel bulut depolama için NextCloud. CasaOS üzerinden aratıp kurabilirsiniz. Kurulum sürerken NextCloud’un kullanacağı veritabanını hazırlayın:
sudo mysql -u root -p
CREATE DATABASE nextcloud_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'nextcloud_user'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON nextcloud_db.* TO 'nextcloud_user'@'%';
FLUSH PRIVILEGES;
quit
Kurulum tamamlandıktan sonra NextCloud web arayüzüne erişmeye çalıştığınızda firewall duruyorsa adres satırından hangi portu kullandığını öğrenin ve izin verin:
sudo ufw allow 10081/tcp
Önemli bir detay: NextCloud dosya sistemine varsayılan olarak www-data kullanıcısıyla erişiyor. Bu bilgiyi aklınızda tutun; ileride lazım olacak.
RAID üzerinde NextCloud’un kullanacağı dizini oluşturun:
sudo mkdir /mnt/raid10/Cloud
sudo chown www-data:www-data /mnt/raid10/Cloud
sudo chmod -R 755 /mnt/raid10/Cloud
CasaOS’ta NextCloud ayarlarından Hacimler kısmına girip bu dizini container’a bağlayın. Ben /media/Disk01 olarak tanımladım — ileride birden fazla disk bağlayabilirim diye.

Kaydedip yeniden başlatın. NextCloud kurulum ekranında kullanıcı adı ve şifre belirledikten sonra, “Install” butonuna basmadan önce Storage & Database alanını açın, MySQL/MariaDB seçin ve veritabanı bilgilerini girin.
Giriş yaptıktan sonra sağ üstten Yönetim Ayarları → sol menüde Yönetim → Dış Depolama bağlantısına tıklayın. Buradan container’a bağladığınız RAID depolamasını NextCloud’a ekleyebilirsiniz.

Yerel ağda kişisel bir bulut hazır.
Cloudflare Tunnel
Yerel ağdaki bir cihaza dışarıdan erişmenin geleneksel yöntemi, modemdeki portu internete açmak. Statik IP ya da DDNS gerektirir, güvenlik yönetimi ciddi iş, bir de üstüne ISP sizi CGNAT havuzuna dahil etmişse zaten mümkün olmuyor.
Cloudflare Tunnel bu problemi farklı bir açıdan çözüyor: cihazınız Cloudflare sunucularına bir bağlantı açıyor, dış trafik bu bağlantı üzerinden içeri giriyor. Siz portu açmıyorsunuz; Cloudflare tüneli sağlıyor.
Başlamadan önce nameserver’ları Cloudflare’a yönlendirilmiş bir alan adı gerekiyor.
https://dash.cloudflare.com adresine girip sol menüden Zero Trust’a tıklayın. (İlk kullanımda kayıt gerekiyor; kişisel kullanım için Free plan yeterli.)
Networks → Tunnels → Create a Tunnel. “Cloudflared” seçili şekilde devam edin, tünele bir isim verin ve kaydedin. “Choose your environment” adımında Docker seçin.
Size bir komut verecek. Ben bu komutu biraz düzenledim:
docker run -d --name cloudflare_tunnel --restart always cloudflare/cloudflared:latest tunnel run --token [TOKEN]
--no-autoupdate seçeneğini kaldırıp -d --name cloudflare_tunnel --restart always ekledim. Token bilgisini içerdiği için bu komutu paylaşmayın.
Container ayağa kalktığında Cloudflare arayüzünde “Connectors” altında cihazınız görünecek. Bir sonraki adımda bir subdomain’i yerel IP ve port ile eşleştirip “Save Tunnel” butonuna basmanız yeterli.

Birden fazla domain’i tek tünel üzerinden geçirebilirsiniz. Bunun için Zero Trust → Networks → Tunnels sayfasından tünelin yanındaki “Configure”a tıklayın, Public Hostname sekmesinde Add a public hostname ile yeni eşleştirmeler ekleyebilirsiniz.
NextCloud’u Dışarıya Açmak
Cloudflare tünelinde NextCloud için bir public hostname tanımladınız ama bu domain’e erişmeye çalıştığınızda NextCloud güvenilmeyen domain hatası verecek. Bunu çözmek için NextCloud’un güvenilir domain listesine bu adresi eklemek gerekiyor:
sudo nano /DATA/AppData/nextcloud/var/www/html/config/config.php
trusted_domains dizisini bulun ve domain adresinizi ekleyin:
'trusted_domains' => array(
0 => '192.168.1.249',
1 => 'nextcloud.muhammetsafak.com.tr'
),
Dosyayı kaydedin (CTRL+O, CTRL+X) ve CasaOS üzerinden NextCloud’u yeniden başlatın. Artık dışarıdan da erişebilirsiniz.
Samba
CasaOS kurulumla birlikte Samba’yı zaten kuruyor. Web arayüzü üzerinden dosya paylaşımı 1-2 tıklama; ama bir sorunu var: tüm yerel ağa public olarak paylaşıyor. Ben bunu istemediğim için Samba yapılandırmasını elle yönetiyorum — hem CasaOS’un kendi yapılandırmasını bozmamak hem de kendi ayarlarımın CasaOS güncellemelerinden etkilenmemesi için ayrı bir dosya kullanıyorum.
Önce Samba kullanıcısı oluştur:
sudo smbpasswd -a [user_smb_username]
Kendi yapılandırma dosyamı oluşturuyorum:
sudo nano /etc/samba/smb.home.conf
[Cloud01]
comment = Home Cloud 01
path = /mnt/raid10/Cloud
browseable = Yes
read only = No
guest ok = No
public = No
valid users = [user_smb_username]
create mask = 0777
directory mask = 0777
force user = www-data
Bu yapılandırmada birkaç önemli alan:
[Cloud01]: Paylaşım adı.\\192.168.1.249\Cloud01olarak erişilebilir.path: Paylaşılacak dizin.read only = No: Kullanıcılar okuma, yazma ve silme yapabilir.guest ok = No/public = No: Yalnızca tanımlı kullanıcı erişebilir.valid users: Erişime izin verilen Samba kullanıcıları.force user = www-data: Tüm işlemlerwww-dataadına yürütülür; NextCloud ile dosya sahipliği tutarlı kalır.
Bu yapılandırmayı ana Samba konfigürasyonuna dahil ediyorum:
sudo nano /etc/samba/smb.conf
Dosyanın en altına, bir TAB içeri girerek ekleyin (kendi yapılandırmamın da [global] altında kalması için):
include=/etc/samba/smb.home.conf
Samba’yı yeniden başlat:
sudo systemctl restart smbd
Kurulum tamamlandı. CasaOS üzerinde ek uygulamalar (download manager, reklam engelleyici DNS, vb.) tek tıkla kurulabiliyor. Donanımı bir araya getirmek 1,5 saatimi aldı; yazmak iki günümü. Umarım sizin için bu oranı tersine çevirir.