Udostępniaj bazę danych między 2 aplikacjami w Heroku


90

Chcę uzyskać dostęp do bazy danych aplikacji z innej aplikacji Heroku. Czy to możliwe we wspólnej bazie danych?

Odpowiedzi:


100

AKTUALIZACJA

Oryginalnie ta odpowiedź stwierdzała, że ​​chociaż było to możliwe za pomocą kilku sztuczek, zdecydowanie odradzano. Zostało to oparte na poradach na stronie wsparcia dla programistów Heroku. Jednak ostatnio Heroku wydało komunikat szczegółowo opisujący, jak to osiągnąć, i rozwodniło ich porady w witrynie programistów. Pełny tekst tej sekcji ich wiadomości e-mail znajduje się poniżej:

Czy wiesz, że aplikacje Heroku mogą współużytkować wspólną bazę danych? Na przykład możesz umieścić funkcje analityczne w oddzielnej aplikacji niż kod widoczny dla użytkownika.

Po prostu ustaw zmienną konfiguracyjną DATABASE_URL dla kilku aplikacji na tę samą wartość. Najpierw pobierz DATABASE_URL dla swojej istniejącej aplikacji:

$ heroku config | grep DATABASE_URL  --app sushi DATABASE_URL => postgres://lswlmfdsfos:5FSLVUSLLT123@ec2-123-456-78-90.compute1.amazonaws.com/ldfoiusfsf

Następnie ustaw DATABASE_URL dla nowych aplikacji na tę wartość:

$ heroku config:add DATABASE_URL=postgres://lswlmfdsfos:5FSLVUSLLT123@ec2-123-456-78-90.compute-1.amazonaws.com/ldfoiusfsf --app sushi-analytics
Adding config vars: DATABASE_URL => postgres://lswlm...m/ldfoiusfsf Restarting app... done, v74. That's it

- teraz obie aplikacje będą współdzielić jedną bazę danych.

Jako punkt odniesienia, oryginalna rada Heroku polegała na stworzeniu i używaniu API do zdalnego dostępu do danych. Osobiście uważam, że ogólnie rzecz biorąc, w wielu sytuacjach jest to dobra rada uważam, (tj. Lepsza niż zwykłe podłączanie wielu aplikacji do tej samej bazy danych), chociaż widzę sytuacje, w których byłoby to bardziej kłopotliwe niż warte.

AKTUALIZACJA

Zgodnie z komentarzami do tej odpowiedzi, warto zauważyć, że Heroku zastrzega sobie prawo do zmiany adresów URL bazy danych zgodnie z wymaganiami. W takim przypadku spowoduje to awarię połączeń pomocniczych i konieczne będzie odpowiednie zaktualizowanie adresów URL.


1
po prostu skonfiguruj aplikacje na Heroku, aby udowodnić, że jest to możliwe - szczegóły w mojej odpowiedzi.
John Beynon

1
W porządku, głos w dół wycofany ... Wsparcie Heroku daje inną odpowiedź! Pytanie: Jeśli opracuję dwie aplikacje heroku, czy będą one miały dostęp do jednej bazy danych? Pytam o to, że mamy aplikację railsową i aplikację sinatra, a one muszą udostępniać bazę danych postgres. Wolałbym tego nie robić przez http! Odpowiedź ze strony wsparcia Heroku: Tak, jeśli potrzebujesz, możesz. Każda aplikacja Heroku ma domyślnie udostępnioną bazę danych, ale jedna aplikacja może korzystać z bazy danych innej aplikacji, po prostu kopiując zmienną konfigurację DATABASE_URL z jednej aplikacji do drugiej.
John Beynon

1
Wycofałem głos przeciwny, ale zaakceptowana odpowiedź jest nadal nieprawidłowa, tak jak do Twojej wiadomości.
John Beynon

1
twierdzą, że zastrzegają sobie prawo do zmiany adresu URL bazy danych aplikacji, więc gdyby tak się stało, należałoby ręcznie zmienić używany adres URL bazy danych.
John Beynon

7
istnieje teraz oficjalny sposób heroku na udostępnianie DATABASE_URL między aplikacjami. zobacz odpowiedź @ c360ian poniżej .
mobeets

83

Późna odpowiedź na stosowne pytanie!

Heroku oficjalnie wspiera teraz lepsze / wdzięczne rozwiązanie dzięki ich frameworkowi dodatków. W ich najnowszym biuletynie opisano, jak udostępniać dodatki między aplikacjami. Poniżej znajdują się fragmenty wspomniane w artykule:

$ 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

Link: expanding_the_power_of_add_ons


Wielkie dzięki !, to powinna być priorytetowa odpowiedź!
HLL

2
To jest właściwa odpowiedź. Wszystkie inne odpowiedzi są przestarzałe, a większość z nich i tak jest duplikatami.
jelder

4
Format polecenia, którego użyłem, toheroku addons:attach originating_app_name::HEROKU_POSTGRESQL_COLOR_URL -a no_db_app_name
Marklar

15

o ile wiem, że jest to możliwe - musisz spojrzeć na zmienne konfiguracyjne heroku dla swojej aplikacji z bazą danych, a następnie ustawić database_url w aplikacji, która chce udostępniać bazę danych na tę samą wartość. Jednak trochę poza ścieżką i nie wiem, jak jest obsługiwany.

EDYTOWAĆ Żeby uspokoić umysł, stworzyłem na Heroku dwie aplikacje - prosty „post” na rusztowaniu z tytułem.

http://evening-spring-734.heroku.com/posts jest mistrzem

http://electric-galaxy-230.heroku.com/posts - jest niewolnikiem

Więc posty utworzone na którymkolwiek z nich będą zapisywane na adres URL bazy danych wieczór-wiosna-734.

Wszystko, co zrobiłem, to użyć konfiguracji heroku, aby uzyskać DATABASE_URL z wieczór-wiosna-734, a następnie ustawić tę samą wartość w DATABASE_URL w electric-galaxy-230.

Możesz skończyć z pewnymi owocowymi warunkami wyścigu DB, ale zdecydowanie jest to możliwe.

Magia, co?


+1: Uważam, że jest to bardzo przydatne do tworzenia krótkich lub zwięzłych adresów URL ... tak jak myapp.me/iwasrobbed (aplikacja Heroku nr 1) przekierowuje do myapp.com/users/1 (aplikacja Heroku nr 2), ponieważ teraz mogę przechowywać nazwa skrócona w standardowej bazie danych użytkownika. Dzięki John!
iwasrobbed

1
heroku pg: promot DATABASE_URL --app nazwa_aplikacji jest obsługiwanym sposobem ustawiania tej zmiennej.
Neil Middleton

mój jedyny komentarz dotyczy warunków wyścigu. Pracownicy i instancja internetowa byłyby takie same, jak pracownicy zdalni, tacy jak hutnik lub kolejka.
baash05,

12

Niedawno otrzymałem to w biuletynie Heroku. Wysyłam im e-maile, aby dowiedzieć się, czy rzeczywiście jest to zatwierdzone użycie.

CZY WIEDZIAŁEŚ?

Udostępnianie jednej bazy danych wielu aplikacjom

Czy wiesz, że aplikacje Heroku mogą współużytkować wspólną bazę danych? Na przykład możesz umieścić funkcje analityczne w oddzielnej aplikacji niż kod widoczny dla użytkownika.

Po prostu ustaw DATABASE_URL zmienną konfiguracyjną dla kilku aplikacji na tę samą wartość. Najpierw pobierz DATABASE_URLdla swojej istniejącej aplikacji:

$ heroku config | grep DATABASE_URL  --app sushi
DATABASE_URL   => postgres://lswlmfdsfos:5FSLVUSLLT123@ec2-123-456-78-90.compute-1.amazonaws.com/ldfoiusfsf

Następnie ustaw DATABASE_URLdla nowych aplikacji tę wartość:

$ heroku config:add DATABASE_URL=postgres://lswlmfdsfos:5FSLVUSLLT123@ec2-123-456-78-90.compute-1.amazonaws.com/ldfoiusfsf --app sushi-analytics
Adding config vars: DATABASE_URL => postgres://lswlm...m/ldfoiusfsf
Restarting app... done, v74.

To wszystko - teraz obie aplikacje będą współdzielić jedną bazę danych.


4
Poprosiłem Heroku o skorzystanie z tej metody, aby uzyskać zarówno darmową hamownię internetową, jak i darmową hamownię Worker. Oto ich odpowiedź. >> „Josh - odradzamy robienie tego, ale dodatkowo wystąpiłyby problemy z bezczynnością pracownika. Gdyby był bezczynny, przestałby wykonywać jakąkolwiek pracę i nie mając nic do„ obudzenia ”go jak żądania internetowego, byłoby bezużyteczne jako pracownik. ”<< Wygląda więc na to, że możesz używać wielu aplikacji w tej samej bazie danych, ale nie jest to zbyt przydatne za darmo.
JoshRivers,

Używam go do celów programistycznych, mam już tysiące wierszy w mojej aplikacji na żywo, a nowy wygląd jest opracowywany w innej mniejszej aplikacji Heroku, więc możliwość udostępniania danych jest fajna, mogę rozwijać i oglądać nowy wygląd dzięki te same dane
Dvid Silva

7

Wtyczka Amazon RDS działa dobrze w tym celu. Wiele aplikacji może współużytkować tę samą instancję RDS.

Masz swobodę współdzielenia tabel lub unikania kolizji nazw tabel przy użyciu przedrostka active_record.table_name_prefix.


1

Zobacz odniesienie do Heroku: https://devcenter.heroku.com/categories/heroku-postgres

P: Czy wiele aplikacji Heroku może łączyć się z jedną bazą danych?

Tak. Możesz skonfigurować wiele aplikacji działających w Heroku do łączenia się z pojedynczą bazą danych, pod warunkiem, że masz poświadczenia bazy danych. Po prostu nadpisz DATABASE_URL aplikacji, z którymi chcesz się połączyć, używając polecenia heroku config: add DATABASE_URL = ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.