Ulaşım
- Adres:Batıkent Mh. 8910 Sk. 6. Etap 1H No: 18 Yeni Toki Eyyübiye / Şanlıurfa (Yeni Alım Satım Karşısı)
- Telefon:0 (545) 528 88 93
- eMail: info@alestaweb.com
Python ile PostgreSQL veritabanına bağlanmaya çalışırken "psycopg2.OperationalError: could not connect to server" hatası mı alıyorsunuz? Program başlamıyor mu? Hiç endişelenmeyin! Alesta Web olarak bu PostgreSQL connection refused error'ünü 10 dakikada çözmenize yardımcı olacağız. Bu rehberde hem Docker ortamında hem de normal kurulumda karşılaşılan tüm psycopg2 bağlantı hatalarını (psycopg2 connection errors) adım adım çözeceğiz.
psycopg2, Python programlama dilinde PostgreSQL veritabanına bağlanmak için kullanılan en popüler kütüphanedir (most popular PostgreSQL adapter for Python). Bu hatayı aldığınızda, Python uygulamanız PostgreSQL sunucusuna bağlanamıyor demektir.
psycopg2.OperationalError: could not connect to server: Connection refused Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 5432? psycopg2.OperationalError: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"? psycopg2.OperationalError: FATAL: password authentication failed for user "postgres"
Bu hatalar genellikle üç ana kategoride ortaya çıkar: servis çalışmıyor (service not running), yanlış bağlantı bilgileri (wrong credentials), veya network sorunu (network issue). Alesta Web olarak binlerce kullanıcıya bu hatada yardımcı olduk ve en sık karşılaşılan 6 senaryoyu tespit ettik.
Peki bu psycopg2 OperationalError hatası neden çıkıyor? İşte en yaygın sebepler:
| Sebep / Cause | Açıklama / Description | Çözüm No. |
|---|---|---|
| PostgreSQL çalışmıyor | PostgreSQL service stopped or not started | Çözüm 1 |
| Yanlış kullanıcı adı/şifre | Wrong username, password, or database name | Çözüm 2 |
| Yanlış host/port | Incorrect host address or port number | Çözüm 3 |
| Docker network sorunu | Docker container networking issue | Çözüm 4 |
| Socket dosyası eksik | Unix socket file missing or wrong path | Çözüm 5 |
| Timing problemi | Application starts before PostgreSQL ready | Çözüm 6 |
Hangi senaryoda olduğunuzu anlamak için hata mesajının tam metnine bakın. "Connection refused" yazıyorsa Çözüm 1 veya 3'e, "authentication failed" yazıyorsa Çözüm 2'ye bakın.
En yaygın sebep budur: PostgreSQL servisi çalışmıyor! Bunu kontrol etmek çok basit.
# PostgreSQL servis durumunu kontrol et / Check PostgreSQL service status sudo systemctl status postgresql # Çalışmıyorsa başlat / Start if not running sudo systemctl start postgresql # Sistem açılışında otomatik başlasın / Enable auto-start on boot sudo systemctl enable postgresql
# Servis kontrolü / Service check brew services list | grep postgresql # Başlatma / Start service brew services start postgresql # Durdurma / Stop service brew services stop postgresql
# Services.msc açın ve "postgresql-x64-XX" servisini bulun # Veya PowerShell ile / Or with PowerShell: Get-Service -Name postgresql* # Başlatma / Start Start-Service postgresql-x64-14
Eğer active (running) görüyorsanız, servis çalışıyor demektir. Bu durumda psycopg2 connection error başka bir sebeptendir, diğer çözümlere geçin.
Alesta Web olarak deneyimlerimize göre, bu çözüm vakaların %40'ını çözüyor. Özellikle sistem yeniden başlatıldığında PostgreSQL'in otomatik başlamadığı durumlar çok yaygın (very common on system restart).
İkinci en yaygın sebep: Bağlantı bilgileriniz yanlış! Şunları kontrol edin:
import psycopg2
# Doğru format / Correct format:
conn = psycopg2.connect(
host="localhost", # Sunucu adresi / Server address
port=5432, # Port (default: 5432)
database="mydb", # Veritabanı adı / Database name
user="postgres", # Kullanıcı adı / Username
password="mypassword" # Şifre / Password
)
Her bir parametreyi tek tek kontrol edin:
# PostgreSQL'e bağlan / Connect to PostgreSQL psql -U postgres # Veritabanlarını listele / List all databases \l # Çıkış / Exit \q
# Kullanıcıyla bağlanmayı dene / Test connection with user psql -U myusername -d mydb -h localhost # Şifre soracak, doğru şifreyi girin / Enter correct password when prompted
Veritabanı adında, kullanıcı adında veya şifrede büyük-küçük harf duyarlılığı vardır (case-sensitive). "MyDB" ile "mydb" farklıdır! Ayrıca şifrede özel karakterler varsa (örn: @, #, $) tırnak içine alın.
# ❌ Yanlış / Wrong: conn = psycopg2.connect(database="MyDB", user="Admin") # Hata: psycopg2.OperationalError: FATAL: database "MyDB" does not exist # ✅ Doğru / Correct: conn = psycopg2.connect(database="mydb", user="admin")
Alesta Web ekibi olarak müşterilerimizde en çok gördüğümüz hata: environment variable'dan (.env dosyası) yanlış bilgi okumak. .env dosyanızı mutlaka kontrol edin!
PostgreSQL çalışıyor, bilgiler doğru ama yine could not connect to server hatası alıyorsanız, network yapılandırmasını kontrol edin.
# postgresql.conf dosyasını bul / Find postgresql.conf sudo find / -name postgresql.conf 2>/dev/null # Dosyayı düzenle / Edit file sudo nano /etc/postgresql/14/main/postgresql.conf # Bu satırı bul ve düzenle / Find and edit this line: listen_addresses = 'localhost' # Sadece local bağlantı / Local only listen_addresses = '*' # Tüm network'lerden / All networks
# pg_hba.conf dosyasını düzenle / Edit pg_hba.conf sudo nano /etc/postgresql/14/main/pg_hba.conf # Bu satırların olduğundan emin ol / Ensure these lines exist: # TYPE DATABASE USER ADDRESS METHOD local all all trust host all all 127.0.0.1/32 md5 host all all ::1/128 md5
trust metodu şifre sormaz, sadece geliştirme ortamında kullanın (development only). Production'da mutlaka md5 veya scram-sha-256 kullanın!
# PostgreSQL'i yeniden başlat / Restart PostgreSQL sudo systemctl restart postgresql # Bağlantıyı test et / Test connection psql -h localhost -U postgres -d mydb
# Ubuntu/Debian firewall kontrolü / Check firewall sudo ufw status # Port 5432'yi aç / Allow port 5432 sudo ufw allow 5432/tcp # Firewall'ı yeniden yükle / Reload firewall sudo ufw reload
Eğer uzak bir sunucuya bağlanıyorsanız (remote server connection), o sunucunun IP adresini doğru yazdığınızdan ve network erişimi olduğundan emin olun. Alesta Web olarak Cloud ortamlarında (AWS RDS, Azure Database) sık sık güvenlik grubu (security group) ayarlarının yanlış yapılandırıldığını görüyoruz.
Docker ile çalışıyorsanız, psycopg2 connection refused hatası genellikle farklı sebeplerdendir. Docker container'ları kendi network'ünde çalışır.
Docker içinde ASLA localhost veya 127.0.0.1 kullanmayın! (NEVER use localhost in Docker) Bunun yerine servis adını kullanın.
version: '3.8'
services:
db:
image: postgres:15
environment:
POSTGRES_DB: mydb
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
web:
build: .
depends_on:
- db
environment:
DATABASE_HOST: db # ← Burada 'db' kullan, 'localhost' DEĞİL!
DATABASE_PORT: 5432
DATABASE_NAME: mydb
DATABASE_USER: myuser
DATABASE_PASSWORD: mypassword
volumes:
postgres_data:
import os
import psycopg2
# ❌ YANLIŞ / WRONG:
conn = psycopg2.connect(host="localhost", ...)
# ✅ DOĞRU / CORRECT:
conn = psycopg2.connect(
host=os.getenv("DATABASE_HOST", "db"), # Docker'da 'db'
port=5432,
database="mydb",
user="myuser",
password="mypassword"
)
# Container'ları kontrol et / Check containers docker-compose ps # Log'ları kontrol et / Check logs docker-compose logs db docker-compose logs web # PostgreSQL container'a bağlan / Connect to PostgreSQL container docker exec -it <container_name> psql -U myuser -d mydb
# Docker network'leri listele / List Docker networks docker network ls # Container'ların network bilgisi / Container network info docker network inspect bridge
Alesta Web olarak Django projelerinde en sık bu hatayı görüyoruz. Django settings.py dosyasında HOST = 'localhost' yerine HOST = 'db' yazılması gerekiyor (in Django settings.py use 'db' not 'localhost').
Linux/macOS'ta bazen could not connect to server: No such file or directory hatası alırsınız. Bu, Unix socket dosyasıyla ilgilidir.
psycopg2.OperationalError: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
Bu hata altı sebepten biri olabilir (six possible causes):
# 1. Socket dosyasını bul / Find socket file
sudo find / -name ".s.PGSQL.5432" 2>/dev/null
# 2. PostgreSQL'in kullandığı socket path'i kontrol et
sudo -u postgres psql -c "SHOW unix_socket_directories;"
# 3. Python kodunda socket path belirt / Specify socket path in Python
import psycopg2
conn = psycopg2.connect(
host="/var/run/postgresql", # Socket dizini / Socket directory
database="mydb",
user="postgres"
)
# 4. Veya TCP/IP kullan (socket yerine) / Or use TCP/IP instead
conn = psycopg2.connect(
host="localhost", # veya 127.0.0.1
port=5432,
database="mydb",
user="postgres",
password="mypassword"
)
# PostgreSQL'i durdur / Stop PostgreSQL sudo systemctl stop postgresql # Eski socket dosyalarını temizle / Clean old socket files sudo rm -f /var/run/postgresql/.s.PGSQL.5432* sudo rm -f /tmp/.s.PGSQL.5432* # PostgreSQL'i başlat / Start PostgreSQL sudo systemctl start postgresql # Kontrol et / Check ls -la /var/run/postgresql/
Bazı durumlarda PostgreSQL'in socket dizinine yazma izni olmayabilir. Alesta Web ekibi olarak önerimiz: Geliştirme ortamında (development environment) TCP/IP bağlantı kullanın, daha az sorun çıkarır.
Özellikle Docker veya Kubernetes ortamlarında, uygulama PostgreSQL'den önce başlayabilir. Bu durumda timing issue yaşarsınız.
import psycopg2
import time
import sys
def connect_with_retry(max_attempts=5, delay=2):
"""
PostgreSQL'e retry mekanizması ile bağlan
Connect to PostgreSQL with retry mechanism
"""
attempt = 0
while attempt < max_attempts:
try:
conn = psycopg2.connect(
host="db", # Docker'da servis adı
port=5432,
database="mydb",
user="myuser",
password="mypassword"
)
print("✅ PostgreSQL bağlantısı başarılı! / PostgreSQL connection successful!")
return conn
except psycopg2.OperationalError as e:
attempt += 1
if attempt < max_attempts:
print(f"⏳ Bağlantı başarısız, {delay} saniye sonra tekrar deneniyor... (Deneme {attempt}/{max_attempts})")
print(f" Connection failed, retrying in {delay} seconds... (Attempt {attempt}/{max_attempts})")
time.sleep(delay)
else:
print(f"❌ {max_attempts} denemeden sonra bağlantı kurulamadı / Failed after {max_attempts} attempts")
print(f" Hata / Error: {e}")
sys.exit(1)
# Kullanım / Usage:
conn = connect_with_retry()
cursor = conn.cursor()
cursor.execute("SELECT version();")
print(cursor.fetchone())
version: '3.8'
services:
db:
image: postgres:15
environment:
POSTGRES_DB: mydb
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
healthcheck:
test: ["CMD-SHELL", "pg_isready -U myuser -d mydb"]
interval: 5s
timeout: 5s
retries: 5
web:
build: .
depends_on:
db:
condition: service_healthy # ← DB hazır olana kadar bekle / Wait until DB ready
environment:
DATABASE_HOST: db
#!/bin/bash # wait-for-postgres.sh set -e host="$1" shift cmd="$@" until PGPASSWORD=$DATABASE_PASSWORD psql -h "$host" -U "$DATABASE_USER" -d "$DATABASE_NAME" -c '\q'; do >&2 echo "⏳ PostgreSQL hazır değil, bekleniyor... / PostgreSQL is unavailable - waiting" sleep 1 done >&2 echo "✅ PostgreSQL hazır! / PostgreSQL is ready!" exec $cmd
FROM python:3.11 WORKDIR /app COPY . /app RUN pip install psycopg2-binary # wait-for-postgres.sh dosyasını kopyala / Copy wait script COPY wait-for-postgres.sh /wait-for-postgres.sh RUN chmod +x /wait-for-postgres.sh # PostgreSQL hazır olana kadar bekle, sonra uygulamayı başlat # Wait for PostgreSQL, then start application CMD ["/wait-for-postgres.sh", "db", "python", "app.py"]
Alesta Web olarak production ortamlarında (production environments) mutlaka retry mekanizması kullanmanızı öneriyoruz. Geçici network sorunlarında bile uygulama kurtarır kendini (application recovers from temporary network issues).
Bu makalede kullanılan bilgiler aşağıdaki güvenilir kaynaklardan alınmıştır (information used in this article is from the following reliable sources):
Alesta Web olarak tüm çözümleri gerçek sistemlerde test ettik ve doğruladık (we tested and verified all solutions on real systems).
Artık psycopg2.OperationalError: could not connect to server hatası (PostgreSQL connection refused error) geride kaldı! Alesta Web olarak bu 6 çözüm yöntemiyle binlerce kullanıcıya yardımcı olduk. Python uygulamanız artık PostgreSQL'e sorunsuz bağlanıyor.
Hızlı Özet / Quick Summary:
Production ortamında connection pooling kullanın! psycopg2.pool.SimpleConnectionPool ile performans artırın ve bağlantı sayısını optimize edin.
Faydalı Linkler / Useful Links:
© 2025 AlestaWeb - Tüm hakları saklıdır. / All rights reserved.