2015-02-13 2 views
5

Sono confuso su come configurare il DB in un'applicazione Rails 4.2 che utilizza Postgres e Heroku.Configurare correttamente un DB Postgres per un'applicazione Rails 4.2 su Heroku

Seguendo i consigli in this Heroku guide, si otterrà un config/database.yml come questo:

default: &default 
    adapter: postgresql 
    encoding: unicode 
    pool: 5 
    timeout: 5000 

development: 
    <<: *default 
    database: app_name_development 

test: 
    <<: *default 
    database: app_name_test 

production: 
    <<: *default 
    database: app_name_production 

Ma quando ho provato questo, il mio ambiente di sviluppo e di test sono state usando lo stesso DB come l'ambiente di gestione temporanea (notare il file ha nessuna configurazione per la stadiazione). Non va bene.

Questo Heroku guide for connecting to the DB in Ruby menzioni che eventuali applicazioni Rails prima 4.2 avrebbe loro database.yml di file sovrascritti da Heroku. Heroku analizzerà la variabile di ambiente DATABASE_URL e creerà un nuovo file database.yml.

Quindi penso che sia possibile abbandonare la configurazione in database.yml per qualsiasi ambiente che si dispone su Heroku, come la gestione temporanea e la produzione. Il tuo database.yml file could essentially look like Hound's (nota la mancanza di una configurazione di produzione).

development: &default 
    adapter: postgresql 
    encoding: unicode 
    database: app_development 
    pool: 5 

test: 
    <<: *default 
    database: app_test 

Ma dal momento che stiamo usando Rails 4.2, non credo Heroku sovrascrive il file database.yml. In tal caso, devi specificare la configurazione del DB in database.yml per i nostri ambienti su Heroku? O è ancora sicuro lasciarli fuori? Se è necessario specificare la configurazione per gli ambienti Heroku, sarà sufficiente quanto segue?

staging: 
    url: <%= ENV['DATABASE_URL'] %> 

production: 
    url: <%= ENV['DATABASE_URL'] %> 

Sono anche confuso sulla configurazione corretta per gli ambienti di sviluppo e test. Come accennato in precedenza, la prima configurazione mostrata ha quegli ambienti che utilizzano il DB di gestione temporanea su Heroku, anziché un DB locale.

This Heroku guide dice di esportare la variabile di ambiente DATABASE_URL per la connessione dell'app (una volta installato Postgres ed è possibile connettersi ad esso).

Supponendo di esportare l'ambiente DATABASE_URL var come specificato nell'articolo, come deve essere la configurazione per lo sviluppo e il test? Andiamo con la configurazione come mostrato nella prima guida, ad es.

default: &default 
    adapter: postgresql 
    encoding: unicode 
    pool: 5 
    timeout: 5000 

development: 
    <<: *default 
    database: app_name_development 

test: 
    <<: *default 
    database: app_name_test 

o non usiamo una configurazione come mostrato in this Heroku guide (che utilizza host e username)

development: 
    adapter: postgresql 
    host: localhost 
    username: user 
    database: app-dev 

Update 1: Ecco quello che ora so. Una configurazione di staging e produzione non è necessaria in config/database.yml se si distribuisce su Heroku, indipendentemente dalla versione di Rails. Prima della 4.2, Heroku generava il proprio file database.yml in base al valore della variabile di ambiente DATABASE_URL, sovrascrivendo il file di configurazione (se esistente). Dal momento che Rails 4.2, la tua app utilizzerà direttamente la variabile di ambiente DATABASE_URL (ignorando il file database.yml), quindi Heroku non ha bisogno (e non lo farà) di generare un file di configurazione.

Ho anche capito perché i miei ambienti di sviluppo e test utilizzavano il DB di staging remoto dall'app Heroku invece dei DB locali specificati nella loro configurazione database.yml.Era perché il mio file locale .env per lo sviluppo si basa sul mio file di gestione temporanea .env che contiene variabili di ambiente per la connessione al database come DATABASE_URL. Poichéera presente nel file di sviluppo .env, l'app Rails 4.2 lo utilizzava e quindi si connetteva al DB di gestione temporanea. Per risolvere il problema, ho rimosso quelle variabili di ambiente dal file di sviluppo .env e creato i DB locali (e ho eseguito le migrazioni) con bundle exec rake db:setup.

Update 2: Questa sezione delle Guide Rails va in maggiori dettagli su come configurare il DB, la pena di leggere: http://guides.rubyonrails.org/configuring.html#configuring-a-database

risposta

2

La maggior parte delle vostre supposizioni sono corrette. Il seguente è un file di configurazione database.yml ragionevole.

default: &default 
    adapter: postgresql 
    encoding: unicode 
    pool: 5 
    timeout: 5000 

development: 
    <<: *default 
    database: app_name_development 

test: 
    <<: *default 
    database: app_name_test 

staging: 
    url: <%= ENV['DATABASE_URL'] %> 

production: 
    url: <%= ENV['DATABASE_URL'] %> 

Assicurarsi che il RAILS_ENV è impostata correttamente su Heroku (sia staging o production), o Rails default development.

Localmente, il test sceglierà l'ambiente test. Per impostazione predefinita, l'app verrà avviata in modalità di sviluppo, utilizzando l'ambiente development.

+0

Simone, si tratta di una buona pratica in questo momento (stesso stack + server di Puma) per mettere 'piscina: <% = ENV [' MAX_THREADS '] || 5%> 'all'opzione di produzione? Il mio database.yml è gitignored al momento, ma per i server con thread heroku suggerisce di impostare il valore del pool per essere uguale a MAX_THREADS nel file database.yml. Sto facendo questa domanda per assicurarmi che non faccia nulla di stupido e perché il fraseggio dei documenti di heroku suona contraddittorio quando si tratta di database.yml. –

1

Heroku non crea un database.yml su rails 4.2 poiché a partire da tale versione i binari rileveranno la presenza di tale variabile d'ambiente e la utilizzeranno per configurare la connessione al database.

Aggiunta

production: 
    url: <%= ENV['DATABASE_URL'] %> 

rende un po 'più evidente ciò che sta accadendo per coloro che potrebbero non essere a conoscenza di esso, ma non cambierà il comportamento. La guida configuring rails ha più informazioni nelle interazioni tra database.yml e DATABASE_URL se ne hai bisogno.

3

In effetti, molti sviluppatori scelgono di ignorare il database.yml nel controllo della versione e non pubblicarlo mai nel repository. Il motivo è che i database possono essere diversi su macchine diverse, questo è un motivo per non mantenere la configurazione comune.

Sto lavorando a un progetto Rails 4.2 in questo momento e Heroku non ha alcun problema con l'assenza di database.yml (entrambi con PostgreSQL e MySQL, abbiamo testato entrambi). Perché? Poiché DATABASE_URL fornisce tutte le informazioni necessarie per accedere al database, , anche il nome dell'adattatore. Come? Ecco la formula:

adapter://username:[email protected]:port/database?options 

A livello locale, sto usando Postgres con l'autenticazione del peer: il server di database assume lo stesso nome utente che sto usando nel mio sistema operativo, username è coperto, password è inutile. La macchina locale viene assunta quando non viene fornito lo host, sebbene non sia possibile stabilire se tenta di comunicare tramite socket di dominio TCP/IP o Unix, quindi sto bene senza host.

Quindi la configurazione a cui si fa riferimento come "mostrato nella prima guida" è ragionevole: contiene una quantità minima di impostazioni e consente di creare più ambienti con estrema facilità.

+0

Non consiglio mai di usare "staging" su Heroku https://devcenter.heroku.com/articles/deploying-to-a-custom-rails-environment – Schneems

0

Per connettersi con ActiveRecord senza Rails (ad es.Sinatra):

url = URI.parse(ENV['DATABASE_URL']) 
ActiveRecord::Base.establish_connection(
    encoding: 'unicode', 
    pool: 5, 
    timeout: 5000, 
    reconnect: true, 
    adapter: url.scheme, 
    host: url.host, 
    database: url.path.sub(%r{^/}, ''), 
    username: url.user, 
    password: url.password 
)