0% found this document useful (0 votes)
2 views7 pages

PostgreSQL

Uploaded by

burcineeren
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views7 pages

PostgreSQL

Uploaded by

burcineeren
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

1. Neden PostgreSQL?

PostgreSQL, açık kaynaklı ve kurumsal düzeyde bir ilişkisel veritabanıdır.

Örneğin bir Strapi projesinde şu tablolar olabilir:

●​ users
●​ articles
●​ categories
●​ comments

media

Strapi bunları otomatik oluşturur.

JSON desteği
PostgreSQL'in en büyük avantajlarından biri JSONB tipidir.

Örneğin ürün özelliklerini her zaman aynı kolonlarda tutmak istemeyebilirsin.

Normal tablo:

n c s we
i
g
h
t

Ama her ürünün farklı özellikleri varsa:

●​ {
●​ "screen": "15 inch",
●​ "cpu": "M4",
●​ "ram": "32 GB"

PostgreSQL bunu doğrudan saklayabilir.

●​ CREATE TABLE products (


●​ id SERIAL,
●​ name TEXT,
●​ attributes JSONB

);

Sonra sorgulayabilirsin.

●​ SELECT *
●​ FROM products

WHERE attributes->>'cpu' = 'M4';

Bu yüzden Strapi gibi dinamik içerik sistemlerinde PostgreSQL çok avantajlıdır.

2. Docker Volume nedir?


Docker Container silinirse içindeki veriler de silinir.

Bu yüzden disk üzerinde bir klasör bağlanır.

Örneğin:

●​ services:
●​ db:
●​ volumes:

- postgres:/var/lib/postgresql

Burada:

●​ Docker Volume
●​
●​ ↓
●​

/var/lib/postgresql

bağlanır.

Veriler artık container dışında saklanır.

Eski kullanım
Yıllardır çoğu örnekte şöyle yazılırdı:

●​ volumes:

- postgres:/var/lib/postgresql/data

Çünkü eski PostgreSQL Docker imajlarında veritabanı burada tutuluyordu.

/var/lib/postgresql/data

PostgreSQL 18'de ne değişti?


PostgreSQL 18 Docker imajlarında veri dizini yönetimi değiştirildi.

Artık giriş (entrypoint) script'leri ve varsayılan veri yolu farklı şekilde ele alınıyor.

Bu nedenle eski örnekleri kopyalarsan:

●​ volumes:

- postgres:/var/lib/postgresql/data

başlatma sırasında beklenmeyen izin veya dizin başlatma problemleri yaşayabilirsin.

Sonuç:

●​ Container
●​
●​ ↓
●​
●​ Başlıyor
●​
●​ ↓
●​
●​ Postgres açılamıyor
●​
●​ ↓
●​
●​ Container kapanıyor
●​
●​ ↓
●​
●​ Docker tekrar başlatıyor
●​
●​ ↓
●​
●​ Tekrar çöküyor
●​
●​ ↓
●​

Crash Loop

Crash Loop nedir?


Docker'ın politikası şöyledir:

●​ Container başladı
●​
●​ ↓
●​
●​ Hata oluştu
●​
●​ ↓
●​
●​ Container kapandı
●​
●​ ↓
●​
●​ restart: always
●​
●​ ↓
●​
●​ Tekrar başlat
●​
●​ ↓
●​
●​ Yine hata
●​
●​ ↓
●​
●​ Tekrar başlat
●​
●​ ↓
●​

...

Sürekli yeniden başlar.

Loglarda şöyle görünür:


●​ Starting PostgreSQL...
●​
●​ database directory is invalid
●​
●​ Stopping...
●​

Restarting...

veya

initdb: directory exists but is not empty

Neden /var/lib/postgresql?
Yeni PostgreSQL imajları bu dizin yapısını daha doğru yönetebiliyor.

Compose dosyasında:

●​ services:
●​ db:
●​ image: postgres:18-alpine
●​
●​ volumes:

- postgres:/var/lib/postgresql

olduğunda container kendi alt dizinlerini oluşturabiliyor.

Yani:

●​ /var/lib/postgresql
●​
●​ data
●​
●​ pg_wal
●​

...

gibi yapıyı kendisi yönetiyor.


Alpine neden seçilmiş?
image: postgres:18-alpine

Alpine Linux tabanlıdır.

Avantajları:

●​ Daha küçük imaj (~100–150 MB civarı)


●​ Daha hızlı indirme
●​ Daha düşük RAM kullanımı
●​ Daha az saldırı yüzeyi

Senior'ın dikkat ettiği nokta


Buradaki "Senior her zaman güncel imajların spesifik gereksinimlerini takip etmelidir."
cümlesinin vermek istediği mesaj şudur:

Bir senior geliştirici:

●​ Eski blog yazılarındaki örnekleri doğrudan kopyalamaz.


●​ Kullandığı Docker imajının sürüm notlarını ve resmi dokümantasyonunu kontrol eder.
●​ Büyük sürüm geçişlerinde (örneğin PostgreSQL 17 → 18) davranış değişikliklerini
araştırır.
●​ Veri dizini, izinler ve volume yapısındaki değişiklikleri doğrular.

Ancak burada önemli bir teknik not var: "/var/lib/postgresql/data kullanmak


PostgreSQL 18'de her durumda crash loop'a neden olur" şeklinde genel bir kural
doğru değildir. Resmî postgres:18 Docker imajı hâlâ PGDATA varsayılanını
/var/lib/postgresql/data olarak kullanır ve bu yol doğru yapılandırıldığında normal
şekilde çalışır. Crash loop'lar çoğunlukla şu nedenlerden kaynaklanır:

●​ Yanlış PGDATA ayarı,


●​ Eski bir volume'un yeni sürümle uyumsuz kullanılması,
●​ Dosya izinleri (permission) sorunları,
●​ Volume'un yanlış dizine bağlanması veya içinde beklenmeyen dosyalar bulunması,
●​ Yanlış Compose yapılandırması.

Dolayısıyla bu açıklamadaki asıl çıkarım, "Sürüm yükseltmelerinde veri dizini ve Docker


yapılandırmasını dikkatle doğrulamak gerekir" olmalıdır; yoksa
/var/lib/postgresql/data yolunun PostgreSQL 18'de genel olarak hatalı olduğu
sonucu çıkarılmamalıdır.

●​

You might also like