İçeriğe geç
Muhammet Şafak
Günlük 10 dk okuma

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.

Raspberry Pi 5 (8GB) tek kart bilgisayar

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.

CasaOS arayüzünde MariaDB uygulamasının ayarları

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.

CasaOS'ta NextCloud için volume tanımlama

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önetimDış 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ı

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.

Cloudflare Tunnel ile subdomain ve port yönlendirmesi

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\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:

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.

Etiketler: #Linux
Paylaş:

İlgili Yazılar

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi