# Home (Cloud) Server Pi5 Upgrade

> Raspberry Pi 5 ile ev bulut sunucusu kurulumu: CasaOS, NextCloud, RAID depolama ve Cloudflare Tunnel.

- Yayın: 2024-09-22
- Kategori: Günlük
- Etiketler: Linux
- Okuma süresi: 10 dk okuma
- Kaynak: https://www.muhammetsafak.com.tr/blog/home-cloud-server-pi5-upgrade/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
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.

![Raspberry Pi 5 (8GB) tek kart bilgisayar](/images/423bc-raspberry-pi-5-8gb.jpeg)

## 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](https://www.raspberrypi.com/software/) 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:

```bash
ssh [pi_username]@[pi_ip_address]
```

Varsayılan kullanıcı adı `pi`, şifre `raspberry`. Hemen değiştirin:

```bash
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:

```bash
sudo nano /etc/network/interfaces
```

Ethernet için:

```text
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:

```text
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:

```bash
sudo reboot now
```

Değişikliği doğrulamak için:

```bash
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:

```bash
sudo nano /etc/resolv.conf
```

```text
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:

```bash
sudo chattr +i /etc/resolv.conf
```

Dosyayı düzenlemek gerektiğinde:

```bash
sudo chattr -i /etc/resolv.conf
```

## Firewall (UFW)

Sunucu olarak kullanılacak bir cihazı firewall olmadan ağa dahil etmek düşünülemez.

```bash
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:

```bash
sudo ufw default deny incoming
sudo ufw default allow outgoing
```

SSH'a izin ver:

```bash
sudo ufw allow ssh
sudo ufw allow 22
```

Web arayüzü olan uygulamalar çalıştıracaksak HTTP ve HTTPS portları da açılmalı:

```bash
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
```

UFW'yi etkinleştir:

```bash
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:

```bash
sudo ufw allow from 192.168.1.100 to any port 3306
```

Mevcut durumu kontrol etmek için:

```bash
sudo ufw status verbose
```

Kural silmek için:

```bash
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:

```bash
lsblk
```

Diskler `/dev/sda`, `/dev/sdb`, `/dev/sdc`, `/dev/sdd` gibi görünür. Her disk bölümünü tek tek formatla:

```bash
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:

```bash
sudo apt update
sudo apt install mdadm
```

4 diskli RAID 10 yapısını oluştur:

```bash
sudo mdadm --create --verbose /dev/md0 --level=10 --raid-devices=4 /dev/sda /dev/sdb /dev/sdc /dev/sdd
```

RAID durumunu kontrol et:

```bash
cat /proc/mdstat
```

RAID dizisini EXT4 ile formatla:

```bash
sudo mkfs.ext4 /dev/md0
```

Mount et:

```bash
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:

```bash
sudo blkid /dev/md0
```

Ardından `/etc/fstab` dosyasını düzenle:

```bash
sudo nano /etc/fstab
```

```text
UUID=<RAIDin UUIDsi> /mnt/raid10 ext4 defaults 0 0
```

RAID durumunu düzenli aralıklarla izlemek önemli:

```bash
sudo mdadm --detail /dev/md0
```

İzleme ve uyarı için:

```bash
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:

```bash
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:

```bash
sudo mdadm /dev/md0 --fail /dev/sdc --remove /dev/sdc
```

Fiziksel diski değiştirdikten sonra yeni diskin adını doğrula:

```bash
lsblk
```

Yeni diski temizle:

```bash
sudo wipefs -a /dev/sdc
```

RAID yapısına ekle:

```bash
sudo mdadm /dev/md0 --add /dev/sdc
```

Senkronizasyon sürecini izle:

```bash
cat /proc/mdstat
```

Tamamlandıktan sonra durumu kontrol et — `State` alanında `clean` görünüyorsa yapı tam kapasitede:

```bash
sudo mdadm --detail /dev/md0
```

Son olarak yapılandırmayı güncelle:

```bash
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:

```bash
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:

```text
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ç:

```bash
sudo ufw allow 3306/tcp
```

Varsayılan root şifresi `casaos`. Hemen değiştirin:

```bash
sudo mysql -u root -p
```

```sql
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.

![CasaOS arayüzünde MariaDB uygulamasının ayarları](/images/e09fc-ekran-goruntusu-2024-09-22-103628.png)

## NextCloud

Kişisel bulut depolama için NextCloud. CasaOS üzerinden aratıp kurabilirsiniz. Kurulum sürerken NextCloud'un kullanacağı veritabanını hazırlayın:

```bash
sudo mysql -u root -p
```

```sql
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:

```bash
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:

```bash
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.

![CasaOS'ta NextCloud için volume tanımlama](/images/df75f-ekran-goruntusu-2024-09-22-110442.png)

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.

![NextCloud'a RAID depolama alanının bağlanması](/images/e41f4-ekran-goruntusu-2024-09-22-111741.png)

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](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:

```bash
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.

![Cloudflare Tunnel ile subdomain ve port yönlendirmesi](/images/a6cf5-ekran-goruntusu-2024-09-22-115339.png)

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:

```bash
sudo nano /DATA/AppData/nextcloud/var/www/html/config/config.php
```

`trusted_domains` dizisini bulun ve domain adresinizi ekleyin:

```text
'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:

```bash
sudo smbpasswd -a [user_smb_username]
```

Kendi yapılandırma dosyamı oluşturuyorum:

```bash
sudo nano /etc/samba/smb.home.conf
```

```text
[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\Cloud01` olarak 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şlemler `www-data` adına yürütülür; NextCloud ile dosya sahipliği tutarlı kalır.

Bu yapılandırmayı ana Samba konfigürasyonuna dahil ediyorum:

```bash
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):

```text
	include=/etc/samba/smb.home.conf
```

Samba'yı yeniden başlat:

```bash
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.
