PostgreSQL, açık kaynak dünyasının en olgun ve en yetenekli ilişkisel veritabanı sunucularından biridir. Standartlara sıkı bağlılığı, JSON desteğinden coğrafi verilere kadar uzanan zengin veri tipleri, güçlü işlem (transaction) yönetimi ve devasa veri kümelerinde bile kararlı performansıyla hem küçük bir web uygulamasının hem de kurumsal bir sistemin altında rahatça çalışır. Yıllarca farklı veritabanı sunucuları yönettikten sonra şunu söyleyebilirim: bir kez düzgün kurup rol ve erişim düzenini temiz kurguladığınızda, PostgreSQL sizi yıllarca yormadan taşır.
Bu rehberde Ubuntu Server üzerinde PostgreSQL'i sıfırdan kurmayı, kurulumla birlikte gelen postgres sistem kullanıcısının ne işe yaradığını, ilk veritabanınızı ve rolünüzü hem komut satırı araçlarıyla hem de psql içinden nasıl oluşturacağınızı, yetkileri nasıl vereceğinizi ve en önemlisi uzaktan bağlantıyı listen_addresses ile pg_hba.conf üzerinden güvenli biçimde nasıl açacağınızı adım adım göreceksiniz. Örnek komutları kendi sunucunuzda birebir çalıştırabilir, alan adınıza ve IP aralığınıza göre uyarlayabilirsiniz. Amaç sadece "çalışan" bir kurulum değil; neyi neden yaptığınızı bilerek bıraktığınız, güvenli ve yönetilebilir bir sistem.
PostgreSQL Nedir ve Neden Tercih Edilir?#
PostgreSQL, verilerinizi tablolar halinde saklayan, SQL diliyle sorgulanan ve ACID garantileri sunan nesne-ilişkisel bir veritabanı yönetim sistemidir. Onu benzerlerinden ayıran en belirgin özellik, standartlara olan titiz bağlılığı ve genişletilebilir mimarisidir. JSONB ile belge tabanlı veriyi, PostGIS eklentisiyle coğrafi veriyi, tam metin arama motoruyla arama işlevlerini tek bir çatı altında toplayabilirsiniz. Bu yönüyle çoğu projede ayrı ayrı araç kurmak yerine tek bir sistemle işi bitirmenizi sağlar.
MySQL/MariaDB ile karşılaştırdığınızda PostgreSQL, karmaşık sorgularda, eşzamanlı yazma yoğun iş yüklerinde ve veri bütünlüğü kritik uygulamalarda genellikle öne çıkar. MySQL tarafını da merak ediyorsanız MySQL veritabanı yönetimi rehberimizde o dünyanın araçlarını bulabilirsiniz. Aşağıdaki tablo iki sistemin pratikte nasıl konumlandığını özetliyor.
| Özellik | PostgreSQL | MySQL / MariaDB |
|---|---|---|
| Yaklaşım | Nesne-ilişkisel, standart odaklı | İlişkisel, hız odaklı |
| JSON desteği | JSONB ile güçlü, indekslenebilir | JSON tipi mevcut, daha sınırlı |
| Eşzamanlı yazma | MVCC ile çok güçlü | InnoDB ile iyi |
| Kimlik doğrulama | Rol tabanlı, SCRAM | Kullanıcı tabanlı |
| Tipik kullanım | Analitik, coğrafi, karmaşık veri | Web/CMS, yüksek okuma |
Kısacası hangisinin "daha iyi" olduğu değil, projenizin ne istediği önemlidir. Karmaşık veri modelleri ve güçlü bütünlük garantileri arıyorsanız PostgreSQL çoğunlukla doğru seçimdir.
Kurulum Öncesi Hazırlık#
Kuruluma geçmeden önce sunucunuza sudo yetkili bir kullanıcıyla SSH üzerinden bağlanın ve paket listelerini güncelleyin. Güncel bir sistem hem bilinen güvenlik açıklarını kapatır hem de paket çakışmalarını baştan eler. Ubuntu, paket yönetimini apt ile yapar; bu konuda ayrıntı isterseniz apt paket yönetimi rehberimize bakabilirsiniz.
sudo apt update && sudo apt upgrade -y
PostgreSQL varsayılan olarak 5432 numaralı TCP portunu dinler. Kuruluma başlamadan önce sunucunuzun donanım kaynaklarını kabaca gözden geçirmenizde fayda var; küçük bir uygulama için 1 GB RAM yeterliyken, yoğun bir veritabanı için daha fazlasını planlamalısınız. Ayrıca veritabanı sunucusunu mümkünse web sunucusundan ayrı bir makinede tutmak, hem güvenlik hem de performans açısından iyi bir alışkanlıktır. Kendi yönetiminizde bir sunucuya ihtiyacınız varsa VDS sunucu veya sanal sunucu seçenekleri bu iş için oldukça uygundur.
Ubuntu'da PostgreSQL Kurulumu#
Ubuntu'nun resmi depolarında PostgreSQL zaten paketli gelir ve çoğu senaryo için bu sürüm fazlasıyla yeterlidir. Tek komutla sunucuyu ve yardımcı istemci araçlarını kurabilirsiniz. postgresql-contrib paketi, ek fonksiyonlar ve eklentiler (örneğin pgcrypto) içerdiği için birlikte kurmanızı öneririm.
sudo apt install postgresql postgresql-contrib -y
Kurulum bittiğinde servis otomatik olarak başlatılır ve sistem açılışına eklenir. Durumu doğrulamak için servisi kontrol edin:
systemctl status postgresql
Çıktıda active (running) ifadesini görmelisiniz. Kurulu sürümü ve servisin gerçekten 5432 portunu dinleyip dinlemediğini de teyit edebilirsiniz:
psql --version
sudo ss -tlnp | grep 5432
Eğer daha yeni bir sürüme (örneğin en güncel ana sürüme) ihtiyacınız varsa, PostgreSQL projesinin kendi resmi deposunu (PGDG) ekleyebilirsiniz. Çoğu web uygulaması için depo sürümü yeterli olduğundan, özel bir gereksiniminiz yoksa Ubuntu'nun kendi paketiyle devam etmeniz bakımı kolaylaştırır.
postgres Kullanıcısı ve psql'e İlk Giriş#
PostgreSQL kurulduğunda, işletim sistemi tarafında postgres adında özel bir sistem kullanıcısı ve veritabanı tarafında yine postgres adında bir süper kullanıcı (rol) oluşturulur. Varsayılan kimlik doğrulama yöntemi olan peer, yerel bağlantılarda işletim sistemi kullanıcı adını veritabanı rol adıyla eşleştirir. Bu yüzden ilk bağlantıyı postgres sistem kullanıcısına geçerek yaparsınız.
Veritabanı kabuğu olan psql'e girmenin en temiz yolu şudur:
sudo -u postgres psql
Bu komut sizi postgres=# istemine düşürür; artık SQL komutlarınızı buradan çalıştırabilirsiniz. psql içinde işinize yarayacak birkaç temel meta-komut var: \l mevcut veritabanlarını listeler, \du rolleri gösterir, \c veritabani_adi başka bir veritabanına bağlanır, \dt tabloları listeler ve \q kabuktan çıkar. Bu komutlar SQL değil psql kısayolu olduğu için sonlarına noktalı virgül koymanıza gerek yoktur.
İlk iş olarak postgres süper kullanıcısının parolasını belirlemenizi öneririm. Uzaktan veya parola tabanlı bağlantı açacaksanız bu adım şarttır:
ALTER USER postgres WITH PASSWORD 'guclu-bir-parola';
Buradaki parolayı gerçekten güçlü seçin; postgres rolü her şeye yetkilidir ve bu hesabın ele geçmesi tüm veritabanlarınızın ele geçmesi demektir.
Veritabanı ve Rol Oluşturma#
PostgreSQL'de her uygulama için ayrı bir veritabanı ve o veritabanına özel bir rol oluşturmak en sağlıklı yaklaşımdır. Böylece bir uygulamanın erişim bilgisi sızsa bile diğer veritabanlarınız korunur. Rol ve veritabanı oluşturmanın iki yolu vardır: kabuktan çalışan yardımcı araçlar (createuser, createdb) veya psql içinden çalıştırılan SQL komutları. İkisini de bilmekte fayda var.
Kabuk tarafında, postgres kullanıcısı olarak hızlıca bir rol ve veritabanı oluşturabilirsiniz. createuser komutunu etkileşimli çalıştırdığınızda size rolün süper kullanıcı olup olmayacağını, veritabanı yaratıp yaratamayacağını sorar:
sudo -u postgres createuser --interactive --pwprompt
sudo -u postgres createdb blogdb --owner=blogadmin
Aynı işi psql içinden SQL ile yapmayı ise ben daha çok tercih ederim, çünkü hangi yetkileri verdiğinizi tek tek görürsünüz. Aşağıdaki blok bir rol oluşturur, ona bir veritabanı atar ve gerekli yetkileri verir:
-- Yeni bir rol (kullanıcı) oluştur
CREATE ROLE blogadmin WITH LOGIN PASSWORD 'uygulama-parolasi';
-- Bu role ait bir veritabanı oluştur
CREATE DATABASE blogdb OWNER blogadmin;
-- Veritabanı düzeyinde tüm yetkileri role ver
GRANT ALL PRIVILEGES ON DATABASE blogdb TO blogadmin;
PostgreSQL'de "kullanıcı" ve "rol" aslında aynı nesnedir; LOGIN yetkisi olan bir role halk arasında kullanıcı denir. Bir rolü sadece yetki grubu olarak kullanıp başka rollere de atayabilirsiniz. Uygulama rolünüzü asla süper kullanıcı yapmayın; ona yalnızca ihtiyaç duyduğu veritabanının üzerinde yetki verin. Bu, en az yetki ilkesinin veritabanı tarafındaki en önemli karşılığıdır.
Şema düzeyinde de yetki gerekebilir. Yeni PostgreSQL sürümlerinde public şemasına yazma yetkisi varsayılan olarak kısıtlı geldiği için, uygulama rolünüzün tablo oluşturabilmesi adına şu adımı da eklemeniz gerekebilir:
\c blogdb
GRANT ALL ON SCHEMA public TO blogadmin;
Uzaktan Bağlantıyı Açmak (listen_addresses ve pg_hba.conf)#
Varsayılan kurulumda PostgreSQL yalnızca localhost üzerinden bağlantı kabul eder; bu, güvenlik açısından iyi bir başlangıç noktasıdır. Ancak veritabanı sunucusu ile uygulama sunucusu ayrı makinelerdeyse, uzaktan bağlantıyı bilinçli biçimde açmanız gerekir. Bu iki ayarla kontrol edilir: postgresql.conf içindeki listen_addresses (sunucunun hangi ağ arayüzlerini dinleyeceği) ve pg_hba.conf içindeki erişim kuralları (kimin, nereden, nasıl bağlanacağı).
Önce ana yapılandırma dosyasını açın. Dosya yolundaki sürüm numarasını (16 gibi) kendi kurulumunuza göre değiştirin:
sudo nano /etc/postgresql/16/main/postgresql.conf
listen_addresses satırını bulup açın ve dinlenecek adresi belirleyin. Tüm arayüzleri dinlemek için '*' yazabilirsiniz, ancak daha güvenli olanı yalnızca ilgili özel ağ IP'sini yazmaktır:
listen_addresses = '10.0.0.5'
port = 5432
Ardından erişim kurallarını tutan pg_hba.conf dosyasını düzenleyin. Buradaki her satır bir kuraldır; alanlar sırasıyla bağlantı tipi, veritabanı, kullanıcı, kaynak adres ve kimlik doğrulama yöntemidir. Yalnızca uygulama sunucunuzun IP'sinden, belirli bir veritabanına, SCRAM parolasıyla bağlanmaya izin veren bir kural şöyle görünür:
sudo nano /etc/postgresql/16/main/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
host blogdb blogadmin 10.0.0.10/32 scram-sha-256
Buradaki 10.0.0.10/32 yalnızca tek bir sunucuya izin verir; bir alt ağın tamamına açmak isterseniz 10.0.0.0/24 gibi bir aralık yazabilirsiniz. Ne yaparsanız yapın, 0.0.0.0/0 yazıp tüm internete açmaktan kaçının. Değişikliklerin geçerli olması için servisi yeniden yükleyin:
sudo systemctl restart postgresql
Son olarak sunucunun güvenlik duvarında 5432 portunu yalnızca güvendiğiniz kaynağa açın. Herkese açmak yerine kaynak IP'yi kısıtlamak kritik önemdedir:
sudo ufw allow from 10.0.0.10 to any port 5432 proto tcp
Uzaktan bağlantıyı başka bir makineden test etmek için psql'in istemci tarafını kullanabilirsiniz:
psql -h 10.0.0.5 -U blogadmin -d blogdb
SCRAM Parola Doğrulaması ve Güvenli Varsayılanlar#
Güncel PostgreSQL sürümleri, parola doğrulamada varsayılan olarak scram-sha-256 yöntemini kullanır ve bu doğru olandır. Eski md5 yöntemine göre SCRAM, parolayı ağ üzerinde çok daha güvenli taşır ve kaba kuvvet saldırılarına karşı belirgin biçimde dirençlidir. Yapılandırmanızda hâlâ md5 görüyorsanız, önce şifreleme yöntemini SCRAM'e çevirip ardından ilgili rollerin parolalarını yeniden ayarlamanız gerekir; çünkü parolalar oluşturuldukları yönteme göre saklanır.
postgresql.conf içinde şu satırın etkin olduğundan emin olun:
password_encryption = scram-sha-256
Bu değişiklikten sonra parolaların yeni yöntemle saklanması için rollerin parolasını tekrar belirleyin:
ALTER ROLE blogadmin WITH PASSWORD 'uygulama-parolasi';
Güvenli bir PostgreSQL kurulumu için birkaç temel alışkanlığı baştan yerleştirin. Aşağıdaki tablo, sık karşılaştığım yanlışları ve doğru varsayılanları özetliyor.
| Konu | Riskli Varsayılan | Güvenli Yaklaşım |
|---|---|---|
| Dinleme adresi | listen_addresses = '*' | Yalnızca özel ağ IP'si |
| Erişim kuralı | 0.0.0.0/0 ile herkese açık | Tek IP veya /24 alt ağ |
| Parola yöntemi | md5 | scram-sha-256 |
| Uygulama rolü | Süper kullanıcı | Sadece kendi veritabanına yetkili |
| Güvenlik duvarı | 5432 herkese açık | Kaynak IP kısıtlı |
Bunlara ek olarak, veritabanı trafiğini genel internet üzerinden taşıyorsanız SSL'i etkinleştirmenizi güçlü biçimde öneririm. PostgreSQL kendi içinde SSL bağlantısını destekler ve uygun bir sertifikayla veritabanı ile uygulama arasındaki trafiği şifreleyebilirsiniz. Sunucularınızın genel güvenliğini profesyonellere bırakmak isterseniz sunucu yönetimi hizmetimiz bu tür sıkılaştırmaları sizin adınıza üstlenir. Web trafiği için ayrıca SSL sertifikası ve saldırılara karşı WAF çözümlerimize de göz atabilirsiniz.
Yedekleme ve Bakım İpuçları#
Bir veritabanı ne kadar iyi yapılandırılırsa yapılandırılsın, yedeklenmiyorsa er ya da geç sizi üzer. PostgreSQL, mantıksal yedekleme için pg_dump ve pg_dumpall araçlarını sunar. Tek bir veritabanını yedeklemek için şu komut yeterlidir; çıktıyı sıkıştırılmış tutmak disk alanından tasarruf sağlar:
sudo -u postgres pg_dump blogdb | gzip > /yedek/blogdb_$(date +%F).sql.gz
Bu yedeği geri yüklemek de oldukça basittir. Önce boş bir hedef veritabanı oluşturur, ardından dökümü içine aktarırsınız:
sudo -u postgres createdb blogdb_restore
gunzip -c /yedek/blogdb_2026-07-10.sql.gz | sudo -u postgres psql blogdb_restore
Bu yedekleme komutunu bir zamanlanmış görev (cron) ile her gece çalıştırıp, yedekleri sunucu dışında bir alanda saklamanızı öneririm; çünkü sunucu ile aynı diskteki yedek, disk çökünce yedek olmaktan çıkar. Otomatik ve dış konumlu yedekleme için yedekleme hizmetimiz işinizi kolaylaştırır. Rutin bakım tarafında ise PostgreSQL'in otomatik VACUUM mekanizması çoğu işi kendisi halleder, ancak yoğun tablolarda periyodik olarak VACUUM ANALYZE çalıştırmak sorgu planlayıcısını taze istatistiklerle besler ve performansı korur.
Sıkça Sorulan Sorular#
PostgreSQL varsayılan olarak hangi portu kullanır?#
PostgreSQL varsayılan olarak 5432 numaralı TCP portunu dinler. Bu portu postgresql.conf içindeki port satırından değiştirebilirsiniz, ancak özel bir gerekçeniz yoksa varsayılanda bırakmanız araç ve kütüphane uyumu açısından daha pratiktir. Portu uzaktan açacaksanız güvenlik duvarında yalnızca güvendiğiniz kaynak IP'ye izin verin.
postgres kullanıcısının parolasını nasıl belirlerim?#
Önce sudo -u postgres psql komutuyla veritabanı kabuğuna girin, ardından ALTER USER postgres WITH PASSWORD 'yeni-parola'; komutunu çalıştırın. Bu rol tüm veritabanlarına tam yetkili olduğu için parolayı mutlaka güçlü seçin ve mümkünse bu hesapla uzaktan bağlanmayın; uzaktan bağlantılar için ayrı ve sınırlı yetkili roller oluşturmak çok daha güvenlidir.
Uzaktan bağlanmaya çalışıyorum ama bağlantı reddediliyor, neden?#
Bu sorunun neredeyse tamamı iki dosyadan kaynaklanır. Öncelikle postgresql.conf içindeki listen_addresses değerinin sunucunun ilgili IP'sini içerdiğinden, ardından pg_hba.conf içinde kaynak IP'nizi ve veritabanınızı kapsayan bir host satırının bulunduğundan emin olun. Değişiklikten sonra servisi yeniden başlatmayı ve güvenlik duvarında 5432 portunun kaynak IP'nize açık olduğunu kontrol etmeyi unutmayın.
createdb ile psql'deki CREATE DATABASE arasındaki fark nedir?#
İşlevsel olarak ikisi de aynı sonucu üretir; createdb, aslında arka planda CREATE DATABASE SQL komutunu çalıştıran bir kabuk yardımcı aracıdır. createdb ve createuser komutlarını doğrudan terminalden, script içinde kullanmak pratiktir. psql içindeki SQL komutları ise sahiplik, şema yetkileri gibi ince ayarları tek tek görerek yönetmenizi sağladığı için daha kontrollü kurulumlarda tercih edilir.
md5 yerine SCRAM'e geçmek zorunda mıyım?#
Zorunlu değil ama kesinlikle önerilir. scram-sha-256, parolayı ağ üzerinde çok daha güvenli taşır ve saldırılara karşı md5'ten belirgin biçimde dayanıklıdır. Geçiş için postgresql.conf içinde password_encryption = scram-sha-256 yapıp, pg_hba.conf içindeki yöntemi scram-sha-256 olarak güncelledikten sonra ilgili rollerin parolalarını ALTER ROLE ... WITH PASSWORD ile yeniden belirlemeniz yeterlidir.
PostgreSQL veritabanımı nasıl yedeklerim?#
Tek bir veritabanı için pg_dump, tüm sunucu için pg_dumpall aracını kullanabilirsiniz. Örneğin sudo -u postgres pg_dump blogdb | gzip > blogdb.sql.gz komutu sıkıştırılmış mantıksal bir yedek üretir. Bu komutu bir cron görevi ile düzenli çalıştırıp yedeği sunucu dışında bir konumda saklamanız en doğrusudur; aynı diskte tuttuğunuz yedek, disk arızasında sizi kurtarmaz.
Kapanış#
PostgreSQL kurulumu ilk bakışta çok adımlı görünse de mantığını kavradığınızda oldukça öngörülebilir bir süreçtir: paket yöneticisiyle kur, postgres kullanıcısıyla psql'e gir, her uygulama için ayrı bir veritabanı ve sınırlı yetkili bir rol oluştur, uzaktan erişimi listen_addresses ve pg_hba.conf ile bilinçli aç, SCRAM parolayla ve güvenlik duvarıyla kilitle, sonra da düzenli yedekle. Bu adımları temiz kurduğunuzda, üzerine yıllarca sorunsuz uygulama ekleyebileceğiniz sağlam bir temele sahip olursunuz.
Bu kurulumu barındıracak sağlam ve yönetilebilir bir altyapı arıyorsanız Clou.TR yanınızda. Kendi kontrolünüzde bir ortam için VDS sunucu ve sanal sunucu seçeneklerimize, kurulum ve sıkılaştırmayı bize bırakmak isterseniz sunucu yönetimi hizmetimize göz atın. Veritabanı odaklı web projeleriniz için web hosting paketlerimiz, verilerinizi korumak için ise yedekleme çözümlerimiz her an hazır. Sorularınız olursa uzman ekibimiz size yol göstermekten memnuniyet duyar.