Oracle VM & Sunucu Yönetim Rehberi
Bu kılavuz, Oracle VM sunucusu üzerindeki Docker konteynerlerini, Cloudflare tünellerini, PM2 servislerini ve sunucu bakım rutinlerini adım adım yönetmek, yeni projeler yayınlamak ve olası sorunları (senaryolarla) çözmek amacıyla hazırlanmıştır.
🖥️ 1. Sunucu Genel Bilgileri & SSH Erişimi
- Sunucu IP Adresi:
92.5.112.114(Oracle VM) - Kullanıcı Adı:
ubuntu - SSH Key Konumu:
https://github.com/imhalid/Library.git - SSH Yetkilendirme Anahtarı:
~/ssh-key-2026-06-04.key
🔑 SSH ile Bağlantı Kurma
Yerel makinenizden sunucuya terminal üzerinden güvenli bağlantı kurmak için:
# SSH Anahtarının izinlerini düzenleyin (Sadece bir kez)
chmod 600 ~/ssh-key-2026-06-04.key
# Sunucuya bağlanın
ssh -i ~/ssh-key-2026-06-04.key ubuntu@92.5.112.114🐳 2. Aktif Sunucu Servisleri & Konteyner Listesi
Sunucu üzerinde servislerin büyük bölümü Docker konteynerleri olarak yönetilmektedir. Aktif durumdaki konteynerler, local portları ve Cloudflare tüneliyle eşleşen subdomain yönlendirmeleri aşağıdaki gibidir:
| Konteyner Adı | Servis Portu (Local) | Cloudflare Domain | Açıklama |
|---|---|---|---|
| pa-reader | 8084 -> Container 80 | pa.halid.dev | Pointers & Arrays C Kılavuzu (Bu proje) |
| c-guide-frontend | 8085 -> Container 80 | c.halid.dev | Beej’s Guide to C Programming Rehberi |
| library-frontend | 3000 -> Container 3000 | library.halid.dev | Kütüphane Arayüz Uygulaması |
| library-backend | 3001 -> Container 3001 | - | Kütüphane API Servisi |
| vaultwarden | 8081 -> Container 80 | vault.halid.dev | Bitwarden Uyumlu Şifre Yöneticisi Sunucusu |
| silverbullet-silverbullet-1 | 8083 -> Container 3000 | database.halid.dev | SilverBullet Not Defteri Uygulaması |
| beszel-hub | 8090 -> Container 8090 | status.halid.dev | Beszel Sistem İzleme Paneli (Dashboard) |
| beszel-agent | - | - | Beszel Sunucu Kaynak İzleme Ajanı |
☁️ 3. Cloudflare Tunnel (Argo Tunnel) Yönetimi
Sunucu üzerindeki servisleri doğrudan dış dünyaya port açmadan (firewall arkasında güvenli tutarak) internete çıkarmak için Cloudflare Tunnel kullanılır.
- Tünel ID:
18f495df-1a5f-488d-8fc7-5dbd6d0b53fc - Tünel Servis Yöneticisi:
PM2(tunnel adıyla çalışır) - Yapılandırma Dosyası Konumu:
/home/ubuntu/.cloudflared/config.yml
📝 Aktif config.yml İçeriği
tunnel: 18f495df-1a5f-488d-8fc7-5dbd6d0b53fc
credentials-file: /home/ubuntu/.cloudflared/18f495df-1a5f-488d-8fc7-5dbd6d0b53fc.json
originRequest:
connectTimeout: 30s
keepAliveConnections: 100
keepAliveTimeout: 90s
ingress:
- hostname: library.halid.dev
service: http://localhost:3000
- hostname: vault.halid.dev
service: http://localhost:8081
- hostname: status.halid.dev
service: http://localhost:8090
- hostname: database.halid.dev
service: http://localhost:8083
- hostname: c.halid.dev
service: http://localhost:8085
originRequest:
connectTimeout: 30s
keepAliveConnections: 100
keepAliveTimeout: 90s
- hostname: pa.halid.dev
service: http://localhost:8084
- service: http_status:404🛠️ 4. PM2 Servis Yönetimi
Sunucuda Docker dışında doğrudan Node.js süreciyle veya tünel yönetimi için PM2 kullanılmaktadır:
# PM2 üzerindeki aktif süreçleri listeleyin
pm2 list
# Cloudflare tünel yapılandırması değiştikçe tüneli yeniden başlatın
pm2 restart tunnel
# Tünel loglarını canlı izleyin (Hata tespiti için)
pm2 logs tunnel --lines 50📖 5. Senaryolar ve Sorun Giderme Rehberi
🚨 Senaryo A: “SQLite - Readonly Database” Hatası ve Çözümü
Eğer API uygulamalarında veritabanı yazma hatası (500 Internal Server Error) veya “database is locked/readonly” hatası alırsanız, bu SQLite dosyasının sahiplik izinlerinin sıfırlanmasından kaynaklanır.
Çözüm Adımları: Sunucuya bağlanın ve şu komutları sırasıyla çalıştırın:
# Klasör sahipliğini ubuntu kullanıcısına verin
sudo chown -R ubuntu:ubuntu ~/Library/server
# Yazma ve çalıştırma izinlerini atayın
chmod -R 775 ~/Library/server
chmod 666 ~/Library/server/data.db🚨 Senaryo B: Disk Doluluk Oranının Artması ve Docker Temizliği
Sunucuda disk alanı azaldığında (df -h komutuyla kontrol edin), Docker imaj artıkları ve logları diski doldurmuş olabilir.
Çözüm Adımları:
# Sunucu disk alanını kontrol edin
df -h
# Docker disk kullanım detaylarına bakın
docker system df
# Kullanılmayan tüm konteyner, network ve askıda kalan imajları temizleyin
docker system prune -a --volumes -y
# Büyük docker log dosyalarını sıfırlamak için (Gerekirse):
sudo sh -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'🚨 Senaryo C: Lokal Geliştirme Sonrası Hızlı Canlı Güncelleme (Deploy)
Lokal makinenizde yaptığınız kod değişikliklerini git kullanmadan veya doğrudan sunucuya yansıtmak istediğinizde uygulanacak hızlı deploy adımları.
Çözüm Adımları:
- Lokal makinenizde projeyi derleyin (Build alın):
pnpm run build rsyncile yerel dosyaları sunucudaki ilgili klasöre kopyalayın:rsync -avz --exclude 'node_modules' --exclude '.git' --exclude '.pnpm-store' -e "ssh -o StrictHostKeyChecking=no -i ~/Library/ssh-key-2026-06-04.key" ./ ubuntu@92.5.112.114:~/pa-reader/- Sunucudaki docker konteynerini yeniden build ederek ayağa kaldırın:
ssh -i ~/Library/ssh-key-2026-06-04.key ubuntu@92.5.112.114 "cd ~/pa-reader && docker compose up -d --build"
🚨 Senaryo D: Cloudflare Tüneline Yeni Subdomain / Proje Ekleme
Sunucuya yeni bir docker projesi eklediniz (Örn: Port 8089 üzerinde çalışan test-app) ve bunu test.halid.dev adresiyle yayına almak istiyorsunuz.
Çözüm Adımları:
- Sunucuya bağlanın ve tünel config dosyasını düzenleyin:
nano ~/.cloudflared/config.yml ingressbölümünün altına (en alttaki 404 kuralının üstüne gelecek şekilde) yeni yönlendirmeyi ekleyin:- hostname: test.halid.dev service: http://localhost:8089- Yapılandırma dosyasını doğrulayın:
cloudflared tunnel ingress validate ~/.cloudflared/config.yml - Yeni subdomain için DNS kaydını tünel üzerinden Cloudflare’e bildirin:
cloudflared tunnel route dns 18f495df-1a5f-488d-8fc7-5dbd6d0b53fc test.halid.dev - Tünel servisini PM2 üzerinde yeniden başlatın:
pm2 restart tunnel - Tarayıcıdan
https://test.halid.devadresini test edin.
🚨 Senaryo E: Bir Konteynerin Çökmesi veya Loglarının İncelenmesi
Eğer bir domain üzerinden 502 Bad Gateway veya 504 Gateway Timeout hatası alıyorsanız, o domaine bakan lokal konteyner durmuş veya hata veriyor olabilir.
Çözüm Adımları:
# Tüm konteynerlerin durumlarını listeleyin (STATUS sütununa bakın)
docker ps -a
# Düşen veya çöken konteynerin loglarını inceleyin
docker logs --tail 100 pa-reader
# Konteyneri durdurup temizce yeniden ayağa kaldırın
docker compose -f ~/pa-reader/docker-compose.yml down
docker compose -f ~/pa-reader/docker-compose.yml up -d🐳 6. Sunucu Projelerinin Genel Yapısı
Sunucu üzerindeki tüm ana projeler /home/ubuntu/ dizininde konumlandırılmış ve her biri bağımsız konteyner grupları olarak ayağa kaldırılmıştır. Projelerin genel dosya mimarisi ve özel yapılandırmaları şu şekildedir:
~/pa-reader(Pointers & Arrays C Guide):- Yapı: Svelte 5 / Vite static uygulamasıdır. Yerel olarak build edilen static
dist/çıktıları sunucuya kopyalanarak Nginx Docker konteynerinde servis edilir. - Dosya Yapısı:
Dockerfile,docker-compose.yml,nginx.conf,src/,md/(İngilizce kılavuz),tr/(Türkçe kılavuz).
- Yapı: Svelte 5 / Vite static uygulamasıdır. Yerel olarak build edilen static
~/c-guide(Beej’s Guide to C Programming):- Yapı: Benzer şekilde, Svelte 5 / Vite tabanlı static Nginx Docker konteyneridir.
~/Library(Kütüphane Sistemi):- Yapı:
library-frontend(Svelte/Port 3000) velibrary-backend(Node.js/Port 3001) çiftinden oluşur. SQLite veritabanı dosyası~/Library/server/data.dbkonumundadır.
- Yapı:
~/vaultwarden(Şifre Kasası):- Yapı: Resmi Vaultwarden Docker imajı (
vaultwarden/server) kullanılarak çalışır. Hassas veriler Docker volumes altında saklanır.
- Yapı: Resmi Vaultwarden Docker imajı (
~/silverbullet(Markdown Not Defteri):- Yapı: Silverbullet not tutma platformudur. Localde 8083 portunu kullanır. Not verileri ve döküman alanı
~/silverbullet/spacealtında saklanır ve Git ile senkronize edilir.
- Yapı: Silverbullet not tutma platformudur. Localde 8083 portunu kullanır. Not verileri ve döküman alanı
⏰ 7. Cron Job (Zamanlanmış Görevler) & Eşitleme Otomasyonu
⚙️ Aktif Cron Job Yapılandırması
crontab -l çıktısı:
*/2 * * * * /home/ubuntu/silverbullet-sync.sh >/dev/null 2>&1- Açıklama: Bu görev, her 2 dakikada bir
/home/ubuntu/silverbullet-sync.shscriptini arka planda çalıştırır. Standart çıktı (stdout) ve hata çıktıları (stderr) sistem çöplüğüne (>/dev/null 2>&1) gönderilerek temiz tutulur.
📜 Eşitleme Scripti (/home/ubuntu/silverbullet-sync.sh)
Bu script, Silverbullet not alanı (~/silverbullet/space) ile uzak GitHub deposunu çift yönlü (2-Way Git Sync) otomatik olarak senkronize eder:
- Çalışma Mantığı:
- Tekil Çalışma Güvencesi:
/tmp/silverbullet_sync.lockdosyası üzerinden kilit (flock) kontrolü yaparak, önceki çalışan script bitmeden yenisinin başlamasını engeller. - Yerel Değişiklik Kontrolü:
git status --porcelainile yeni notlar yazılmış mı diye bakar. Değişiklik varsaAuto sync: [Tarih Saat]mesajıyla otomatik commit oluşturur. - Uzak Depo Senkronizasyonu:
git fetch origin mainile uzak sunucuyu çeker. Yerel hash ile uzak hash farklıysa,git pull --rebaseile değişiklikleri yerel ile birleştirir. Eğer rebase hata verirse, otomatik olarak merge işlemi uygulayarakgit pushile uzak depoya (origin main) gönderir. - Log Sınırlaması (Truncate): İşlem logları
/home/ubuntu/silverbullet/sync.logdosyasına yazılır. Log dosyasının boyutu 1MB’ı aşarsa, dosya otomatik olarak kırpılarak sadece son 500 satır saklanır.
- Tekil Çalışma Güvencesi:
📂 Log ve Kilitleme Yolları
- Senkronizasyon Log Dosyası:
/home/ubuntu/silverbullet/sync.log - Süreç Kilitleme Dosyası:
/tmp/silverbullet_sync.lock - Not Alanı Dizin Yolu:
/home/ubuntu/silverbullet/space
🏗️ 8. Kesinlikle Uyulması Gereken Derleme ve Dağıtım Kuralları
Sunucu kararlılığı, kaynak yönetimi ve temiz sürüm kontrolü sağlamak amacıyla geliştirme ve yayına alma (deployment) süreçlerinde aşağıdaki kurallara kesinlikle uyulmalıdır:
- Sunucu Üzerinde Asla Build Alınmamalıdır:
- Oracle VM sunucusunun ana işletim sisteminde (host üzerinde) hiçbir şekilde
npm run build,pnpm buildveya benzeri frontend derleme komutları çalıştırılmamalıdır. - Bu kural sunucu kaynaklarının (CPU/RAM) derleme sırasında tükenmesini ve çakışmaları engellemek için kritiktir.
- Oracle VM sunucusunun ana işletim sisteminde (host üzerinde) hiçbir şekilde
- Veriler Yalnızca GitHub Üzerinden Çekilmelidir:
- Sunucuya (VM) kod veya veri aktarımı, doğrudan yerelden dosya kopyalamak yerine yalnızca GitHub uzak deposundan çekilerek (git pull/fetch) yapılmalıdır.
.gitignorevedistKlasörü Kuralı:- Eğer projede bir derleme (build) işlemi gerekiyorsa, derlenen çıktıların bulunduğu
dist/(veya benzer derleme klasörleri) kesinlikle.gitignoredosyasında yer almalıdır. - Derlenmiş statik dosyalar asla Git deposuna (GitHub’a) commit edilmemeli ve gönderilmemelidir.
- Derleme işlemi, Docker imajı oluşturulurken Docker çok aşamalı derleme (multi-stage build) yöntemiyle doğrudan Docker konteyneri içerisinde gerçekleştirilmelidir. Böylece sunucu üzerinde gereksiz Node/Build araçları çalıştırmaya gerek kalmadan temiz bir dağıtım sağlanır.
- Eğer projede bir derleme (build) işlemi gerekiyorsa, derlenen çıktıların bulunduğu