- Konu sahibi
- #1
İlk olarak Rails’in gösterdiği hata metnini ayırın: connection refused PostgreSQL sunucusuna ulaşılamadığını, password authentication failed sunucuya ulaşıldığını ancak kimlik doğrulamanın başarısız olduğunu, database does not exist ise veritabanı adının bulunamadığını gösterir. Bu nedenle rastgele ayar değiştirmek yerine önce
Rails uygulamasının geliştirme ortamı için kullandığı dosya genellikle
Buradaki
Parolayı dosyaya yazmak yerine ortam değişkeni kullanıyorsanız değişkenin gerçekten tanımlı olduğunu da kontrol edin. Örneğin
Rails klasöründe değil, bağlantıyı sağlayan makinede aşağıdaki komutu kendi bilgilerinizle çalıştırın:
Komut başarılı olup PostgreSQL istemine geçerse sunucu, port, kullanıcı, parola ve veritabanı birlikte doğrudur. Bu durumda Rails tarafında
PostgreSQL hizmetinin çalıştığını ve Rails’in bağlandığı makineden belirtilen porta erişilebildiğini kontrol edin. Yerel kurulumda
Bağlantı bilgileri doğruysa ancak geliştirme veritabanı henüz yoksa Rails projesinin kök dizininde şu komutları çalıştırın:
İkinci satırdaki başında fazladan
Rails ve PostgreSQL aynı Docker ağı içindeyse
Sorun devam ederse hata metniyle birlikte şu bilgileri toplayın: Rails ortamı,
config/database.yml içindeki host, port, database, username ve password değerlerini PostgreSQL’in gerçek bilgileriyle eşleştirin; ardından bağlantıyı Rails dışında psql ile doğrulayın.Rails bağlantı ayarlarını doğrulayın
Rails uygulamasının geliştirme ortamı için kullandığı dosya genellikle
config/database.yml dosyasıdır. Varsayımsal bir yerel PostgreSQL kurulumu için temel yapı şu şekilde olabilir:
YAML:
development:
adapter: postgresql
encoding: unicode
database: magazam_development
username: postgres
password: "postgres_sifreniz"
host: 127.0.0.1
port: 5432
Buradaki
database değeri mevcut PostgreSQL veritabanının adıyla, username PostgreSQL kullanıcısıyla, password o kullanıcının parolasıyla aynı olmalıdır. PostgreSQL’in varsayılan TCP bağlantı noktası genellikle 5432’dir; ancak kurulumunuz farklı bir port kullanıyorsa Rails’te de aynı port yazılmalıdır. host değeri yerel bağlantıda çoğunlukla 127.0.0.1 veya localhost, Docker gibi ayrı bir servis ortamında ise PostgreSQL servisinin ağ adıdır.Parolayı dosyaya yazmak yerine ortam değişkeni kullanıyorsanız değişkenin gerçekten tanımlı olduğunu da kontrol edin. Örneğin
ENV["DATABASE_PASSWORD"] kullanılıyor ancak bu değişken boşsa Rails doğru kullanıcı adıyla bile bağlanamaz. Paroladaki özel karakterleri YAML içinde tırnak içine almak da ayrıştırma sorunlarını önler.Önce PostgreSQL bağlantısını Rails dışında test edin
Rails klasöründe değil, bağlantıyı sağlayan makinede aşağıdaki komutu kendi bilgilerinizle çalıştırın:
Bash:
PGPASSWORD='PAROLA' psql -h 127.0.0.1 -p 5432 -U postgres -d magazam_development
Komut başarılı olup PostgreSQL istemine geçerse sunucu, port, kullanıcı, parola ve veritabanı birlikte doğrudur. Bu durumda Rails tarafında
database.yml seçimi, ortam adı veya ortam değişkenleri kontrol edilmelidir. Komut başarısız olursa sorun henüz Rails’e özgü değildir; aşağıdaki hata türüne göre PostgreSQL ayarını düzeltin. Parolayı komut satırında kullanmak yalnızca geçici tanılama içindir; işlemden sonra kabuk geçmişinde veya dosyalarda kalmadığından emin olun.Hata metnine göre doğru düzeltmeyi yapın
| Hata | Anlamı | Yapılacak işlem |
|---|---|---|
| connection refused veya could not connect | PostgreSQL çalışmıyor, yanlış host/port kullanılıyor veya sunucu o arayüzü dinlemiyor. | PostgreSQL hizmetini başlatın; host ve portu doğrulayın. Uzak bağlantıda sunucunun listen_addresses ayarını ve ağ erişimini kontrol edin. |
| password authentication failed | Sunucuya ulaşıldı fakat kullanıcı parolası veya kimlik doğrulama yöntemi kabul edilmedi. | Kullanıcı adını ve parolayı doğrulayın; gerekirse PostgreSQL yöneticisiyle parolayı yenileyip Rails ayarını güncelleyin. |
| no pg_hba.conf entry | İstemci adresi, kullanıcı ve veritabanı için uygun erişim kuralı yok. | pg_hba.conf dosyasına yalnızca gerekli istemci ağı için uygun bir kural ekleyin ve PostgreSQL’i yeniden yükleyin. |
| database does not exist | Belirtilen veritabanı adı sunucuda yok. | Veritabanı adını düzeltin veya geliştirme ortamı için rails db:create çalıştırın. |
| role does not exist | Belirtilen PostgreSQL kullanıcısı oluşturulmamış. | Mevcut bir kullanıcı kullanın veya PostgreSQL yöneticisiyle gerekli rolü oluşturun. |
connection refused hatasını çözme
PostgreSQL hizmetinin çalıştığını ve Rails’in bağlandığı makineden belirtilen porta erişilebildiğini kontrol edin. Yerel kurulumda
host: 127.0.0.1 yazıldığı halde PostgreSQL farklı bir portta çalışıyorsa port değerini düzeltin. Uzak sunucuda PostgreSQL’in listen_addresses ayarı yalnızca localhost ise dış makineden gelen bağlantıyı kabul etmez. Bu ayarı genişletmeden önce güvenlik duvarında yalnızca gereken kaynak adresine izin verin; * ile herkese açmak güvenli bir varsayılan değildir.Kimlik doğrulama hatalarını çözme
password authentication failed mesajı PostgreSQL’e ulaşıldığını kanıtlar; ağ bağlantısının bozuk olduğunu göstermez. Önce aynı kullanıcı ve veritabanıyla psql komutunu deneyin. Komut da başarısızsa parola, kullanıcı veya pg_hba.conf içindeki yöntem incelenmelidir. Komut başarılı olduğu halde Rails başarısızsa Rails’in gerçekten hangi ortamı kullandığını ve parola ortam değişkeninin kabukta, servis yöneticisinde veya dağıtım ortamında tanımlı olup olmadığını kontrol edin.Veritabanı ve şema oluşturma
Bağlantı bilgileri doğruysa ancak geliştirme veritabanı henüz yoksa Rails projesinin kök dizininde şu komutları çalıştırın:
Bash:
bin/rails db:create
a bin/rails db:migrate
İkinci satırdaki başında fazladan
a olmamalıdır; doğru komut şöyledir:
Bash:
bin/rails db:migrate
db:create veritabanını oluşturur, db:migrate ise Rails migration dosyalarını uygular. db:create sırasında yine parola veya bağlantı hatası alırsanız migration’a geçmeyin; önce psql testini ve database.yml değerlerini düzeltin. Migration tamamlandığı halde uygulama hata veriyorsa artık temel PostgreSQL bağlantısı kurulmuş demektir; sonraki hata tablo, migration veya uygulama sorgusuyla ilgilidir.Docker veya uzak PostgreSQL kullanırken
Rails ve PostgreSQL aynı Docker ağı içindeyse
host olarak localhost yazmak çoğu durumda yanlıştır; bu değer Rails konteynerinin kendisini ifade eder. Bunun yerine PostgreSQL servisinin Compose dosyasındaki servis adını kullanın. Rails ana makinede, PostgreSQL Docker konteynerindeyse bağlantı adresi ve yayımlanan port farklı olabilir. Bu nedenle psql testini Rails uygulamasının çalıştığı aynı ortamdan yapın; ana makineden başarılı olan bağlantı, konteyner içinden de başarılı olacak anlamına gelmez.Sorun devam ederse hata metniyle birlikte şu bilgileri toplayın: Rails ortamı,
host ve port değerleri, veritabanı adı, kullanıcı adı, kullanılan psql komutu (parolayı çıkartarak), PostgreSQL sürümü ve sunucu günlüğündeki ilgili satır. Parolayı, bağlantı dizesini veya ortam değişkenlerinin değerini paylaşmayın. PostgreSQL belgeleri de kimlik doğrulama hatalarında sunucu günlüğünün istemci mesajından daha ayrıntılı olabileceğini belirtir; özellikle pg_hba.conf kuralı eşleşmiyorsa günlükteki istemci adresi, kullanıcı ve veritabanı bilgisi doğru kuralı belirlemenizi sağlar.