Compartir base de datos entre 2 aplicaciones en Heroku

90

Quiero acceder a la base de datos de una aplicación desde otra aplicación Heroku. ¿Es eso posible en la base de datos compartida?

Donald
fuente

Respuestas:

100

ACTUALIZADO

Originalmente, esta respuesta indicaba que, aunque esto era posible con algunos trucos, se desaconsejaba enérgicamente . Esto se basó en los consejos del sitio web de soporte para desarrolladores de Heroku. Sin embargo, recientemente Heroku emitió una comunicación que describe específicamente cómo lograr esto, y ha diluido sus consejos en el sitio del desarrollador. El texto completo de esta sección de su correo electrónico se incluye a continuación:

¿Sabías que las aplicaciones de Heroku pueden compartir una base de datos común? Por ejemplo, puede colocar funciones de análisis en una aplicación separada de su código de cara al usuario.

Simplemente configure la var de configuración DATABASE_URL para varias aplicaciones en el mismo valor. Primero, obtenga la DATABASE_URL para su aplicación existente:

$ heroku config | grep DATABASE_URL  --app sushi DATABASE_URL => postgres://lswlmfdsfos:[email protected]/ldfoiusfsf

Luego, establezca DATABASE_URL para nuevas aplicaciones en este valor:

$ heroku config:add DATABASE_URL=postgres://lswlmfdsfos:[email protected]/ldfoiusfsf --app sushi-analytics
Adding config vars: DATABASE_URL => postgres://lswlm...m/ldfoiusfsf Restarting app... done, v74. That's it

- ahora ambas aplicaciones compartirán una base de datos.

Solo como punto de referencia, el consejo original de Heroku fue crear y usar una API para acceder a los datos de forma remota. Mi opinión personal es que, en general, para muchas situaciones, este es un buen consejo (es decir, mejor que simplemente conectar varias aplicaciones a la misma base de datos), aunque puedo ver situaciones en las que eso sería más problemático de lo que vale la pena.

ACTUALIZAR

Según los comentarios de esta respuesta, vale la pena señalar que Heroku se reserva el derecho de cambiar las URL de la base de datos según sea necesario. Si esto ocurre, sus conexiones secundarias fallarán y deberá actualizar las URL en consecuencia.

Paul Russell
fuente
1
simplemente configure aplicaciones en Heroku para demostrar que es posible: detalles en mi respuesta.
John Beynon
1
Justo, voto en contra se retractó ... ¡El apoyo de Heroku da una respuesta diferente! Pregunta: Si desarrollo dos aplicaciones heroku, ¿pueden acceder a una sola base de datos? La razón por la que pregunto es que tenemos una aplicación rails y una aplicación sinatra, y necesitan compartir una base de datos de Postgres. ¡Preferiría no hacerlo por http! Respuesta del soporte de heroku: Sí, si es necesario, puede hacerlo. Cada aplicación Heroku obtiene una base de datos aprovisionada de forma predeterminada, pero es posible que una aplicación use la base de datos de otra aplicación simplemente copiando la var de configuración DATABASE_URL de una aplicación a otra.
John Beynon
1
Me retracté del voto en contra, pero la respuesta aceptada sigue siendo incorrecta como un FYI.
John Beynon
1
dicen que se reservan el derecho de cambiar la URL de la base de datos de sus aplicaciones, por lo que si eso ocurriera, necesitaría cambiar la URL de la base de datos que estaba usando manualmente.
John Beynon
7
ahora hay una forma oficial heroku de compartir la DATABASE_URL entre aplicaciones. vea la respuesta de @ c360ian a continuación .
mobeets
83

¡Respuesta de última hora a la pregunta pertinente!

Heroku admite oficialmente una solución mejor / elegante a través de su marco complementario ahora. Se describe en su último boletín sobre cómo compartir complementos entre aplicaciones. A continuación se muestran los fragmentos mencionados en el artículo:

$ heroku addons:attach my-sushi-db -a my-sushi-reporting --as MAIN_SUSHI_DB    
  Adding MAIN_SUSHI_DB to my-sushi-reporting... done
  Setting MAIN_SUSHI_DB vars and restarting my-sushi-app-reporting... done, v3

Enlace: expandiendo_el_poder_de_add_ons

c360ian
fuente
¡Muchas gracias !, ¡esta debería ser la respuesta prioritaria!
HLL
2
Esta es la respuesta correcta. Todas las demás respuestas están en desuso, y la mayoría de ellas están duplicadas de todos modos.
jelder
4
El formato del comando que utilicé fueheroku addons:attach originating_app_name::HEROKU_POSTGRESQL_COLOR_URL -a no_db_app_name
Marklar
15

Por lo que sé, es posible: tendrá que mirar las variables de configuración de heroku para su aplicación con la base de datos y luego establecer database_url en la aplicación que quiere compartir la base de datos con el mismo valor. Sin embargo, un poco fuera de lugar y en cuanto a qué tan apoyado es, no lo sé.

EDITAR Solo para tranquilizarme, he creado dos aplicaciones en Heroku: una simple 'publicación' de andamio con un título.

http://evening-spring-734.heroku.com/posts es el maestro

http://electric-galaxy-230.heroku.com/posts - es el esclavo

Por lo tanto, las publicaciones creadas en cualquiera de ellos se escribirán en la URL de la base de datos de evening-spring-734.

Todo lo que he hecho es usar heroku config para obtener DATABASE_URL de evening-spring-734 y luego establecer el mismo valor en DATABASE_URL de electric-galaxy-230.

Podrías terminar con algunas condiciones de carrera de DB afrutadas, pero definitivamente es posible hacerlo.

Magia, ¿eh?

John Beynon
fuente
+1: Veo esto como muy útil para hacer URL cortas o vanity .. como myapp.me/iwasrobbed (aplicación Heroku # 1) redirecciona a myapp.com/users/1 (aplicación Heroku # 2) ya que ahora puedo almacenar el nombre personalizado en la base de datos de usuario estándar. ¡Gracias John!
Fui robado el
1
heroku pg: promueve DATABASE_URL --app your_app_name es la forma admitida de configurar esta variable.
Neil Middleton
mi único comentario es sobre las condiciones de la carrera. Los trabajadores y la instancia web serían los mismos, al igual que los trabajadores remotos como iron worker o resqueue.
baash05
12

Recibí esto en el boletín de Heroku recientemente. Les envío un correo electrónico para averiguar si realmente es un uso aprobado.

¿SABÍAS?

Compartiendo una base de datos con muchas aplicaciones

¿Sabías que las aplicaciones de Heroku pueden compartir una base de datos común? Por ejemplo, puede colocar funciones de análisis en una aplicación separada de su código de cara al usuario.

Simplemente configure la DATABASE_URL var de configuración para varias aplicaciones con el mismo valor. Primero, obtenga el DATABASE_URLpara su aplicación existente:

$ heroku config | grep DATABASE_URL  --app sushi
DATABASE_URL   => postgres://lswlmfdsfos:[email protected]/ldfoiusfsf

Luego, establezca DATABASE_URLpara nuevas aplicaciones en este valor:

$ heroku config:add DATABASE_URL=postgres://lswlmfdsfos:[email protected]/ldfoiusfsf --app sushi-analytics
Adding config vars: DATABASE_URL => postgres://lswlm...m/ldfoiusfsf
Restarting app... done, v74.

Eso es todo, ahora ambas aplicaciones compartirán una base de datos.

JoshRivers
fuente
4
Le pregunté a Heroku sobre el uso de este método para obtener un dinamómetro web gratuito y un dinamómetro Worker gratuito. Aquí está su respuesta. >> "Josh - desaconsejamos hacer esto, pero además habría problemas con el trabajador inactivo. Una vez inactivo, dejaría de hacer cualquier trabajo y sin nada que lo 'despertara' como una solicitud web, sería inútil como trabajador ". << Entonces, parece que puede usar varias aplicaciones en la misma base de datos, pero no es muy útil de forma gratuita.
JoshRivers
Lo estoy usando para propósitos de desarrollo, ya tengo miles de filas en mi aplicación en vivo, y la nueva apariencia se está desarrollando en otra aplicación heroku más pequeña, por lo que poder compartir datos es genial, puedo desarrollar y ver las nuevas apariencias con el mismos datos
Dvid Silva
7

El complemento de Amazon RDS funciona bien para esto. Varias aplicaciones pueden compartir la misma instancia de RDS.

Tiene la flexibilidad de hacer que compartan tablas o evitar la colisión de nombres de tablas utilizando active_record.table_name_prefix.

Steve Wilhelm
fuente
1

Consulte la referencia de Heroku: https://devcenter.heroku.com/categories/heroku-postgres

P: ¿Se pueden conectar varias aplicaciones Heroku a una sola base de datos?

Si. Puede configurar varias aplicaciones que se ejecutan en Heroku para conectarse a una sola base de datos, siempre que tenga las credenciales de la base de datos. Simplemente anule el DATABASE_URL de las aplicaciones que desea conectar usando el comando heroku config: add DATABASE_URL = ....

jmk
fuente