# Ist es möglich, sich direkt von einer separaten App mit der Datenbank zu verbinden?

**URL:** https://meta.discourse.org/t/is-it-possible-to-connect-to-the-database-directly-from-a-separate-app/152695
**Category:** Self-hosting
**Created:** [25. Mai 2020 um 21:52 UTC](https://meta.discourse.org/t/is-it-possible-to-connect-to-the-database-directly-from-a-separate-app/152695 "2020-05-25T21:52:58Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![AstonJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/astonj/32/215041_2.png) [@AstonJ](https://meta.discourse.org/u/AstonJ)
#### Post date: [25. Mai 2020 um 21:52 UTC](https://meta.discourse.org/t/is-it-possible-to-connect-to-the-database-directly-from-a-separate-app/152695/1 "2020-05-25T21:52:58Z")

</div>

Die App würde sich außerhalb des Discourse-Docker-Containers, aber auf demselben Server befinden. Falls ja, könnte jemand bitte einige Details dazu teilen oder mich auf einen Leitfaden oder Anweisungen verweisen?

Gäbe es bei dieser Vorgehensweise im Vergleich zur Nutzung des DE-Plugins bzw. der DE-API auch Nachteile?

---

<div class="post-metadata">

### Author: ![riking](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/riking/32/170938_2.png) [@riking](https://meta.discourse.org/u/riking)
#### Post date: [25. Mai 2020 um 23:29 UTC](https://meta.discourse.org/t/is-it-possible-to-connect-to-the-database-directly-from-a-separate-app/152695/2 "2020-05-25T23:29:55Z")

</div>

Nachteile betreffen vor allem die Tatsache, dass eine solche Verbindung für Schreibzugriffe genutzt werden könnte. Ist das eine Voraussetzung?

Wenn Ihre Integration Schreibzugriff auf die Datenbank benötigt, erwägen Sie die Erstellung eines Plugins, das nur die benötigten Operationen bereitstellt.

---

<div class="post-metadata">

### Author: ![AstonJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/astonj/32/215041_2.png) [@AstonJ](https://meta.discourse.org/u/AstonJ)
#### Post date: [25. Mai 2020 um 23:41 UTC](https://meta.discourse.org/t/is-it-possible-to-connect-to-the-database-directly-from-a-separate-app/152695/3 "2020-05-25T23:41:38Z")

</div>

Es ist keine Voraussetzung, aber ich nehme diesen Nachteil gerne in Kauf 🙂

Ich habe angefangen, dein DE-Plugin zu verwenden, aber leider scheint mein Anwendungsfall eine direkte Verbindung zu erfordern, da ich für einige meiner Seiten zu viele Anfragen über die API sende (und das ist nur mit mir auf der Seite). Es handelt sich größtenteils um benutzerdefinierte Abfragen, daher bin ich mir nicht sicher, ob das einen Einfluss hat. Das DE-Plugin finde ich trotzdem toll!

Weißt du zufällig, wie man am besten direkt außerhalb des Containers auf die Postgres-Datenbank zugreift? Sowohl das Forum als auch die Website befinden sich auf demselben Server, falls das hilft.

* * *

**Edit** : Ich vermute, dass ich beim DE-Plugin ein Rate-Limit erreiche, aber ich bin mir sicher, Sam gesagt zu haben, dass bei Anfragen vom selben Server kein Rate-Limit gilt – gilt das immer noch?

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [26. Mai 2020 um 03:26 UTC](https://meta.discourse.org/t/is-it-possible-to-connect-to-the-database-directly-from-a-separate-app/152695/4 "2020-05-26T03:26:44Z")

</div>

Obwohl möglich, kann die andere App Sperren auf Tabellen erwerben und Discourse daran hindern, wie üblich zu funktionieren.

Entweder Sie entscheiden sich für ein neues Plugin, das die erforderlichen API-Endpunkte hinzufügt, die Sie benötigen, oder Sie gehen vollständig hinein, indem Sie eine weitere PostgreSQL-Instanz erstellen, die Ihr Discourse repliziert und in die Sie Ihre App einbinden können.

---

<div class="post-metadata">

### Author: ![AstonJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/astonj/32/215041_2.png) [@AstonJ](https://meta.discourse.org/u/AstonJ)
#### Post date: [26. Mai 2020 um 07:32 UTC](https://meta.discourse.org/t/is-it-possible-to-connect-to-the-database-directly-from-a-separate-app/152695/5 "2020-05-26T07:32:35Z")

</div>

Danke für die Info, Rafael. Ich werde ausschließlich SELECT-Anweisungen verwenden, und soweit ich weiß, sperren diese nicht. Daher müsste ich mich nur um Tabellenänderungen auf der Discourse-Seite kümmern (z. B. beim Upgrade) und dafür sorgen, dass ich die andere Anwendung vorübergehend ausschalten kann. Würde das die Sorgen bezüglich Sperren beseitigen?

Bezüglich der Datenbankreplikation klingt das wie eine interessante Option – kann das im laufenden Betrieb erfolgen, sodass die Daten maximal ein paar Minuten veraltet sind? (Ich muss häufig die neuesten Themen abrufen – fast jede Seite der Website enthält sie. Zwar cache ich für zwei Minuten, aber dies variiert je nach Seite/Kriterien, und es wird Hunderte solcher Seiten geben.) Außerdem könnte diese Option wegfallen, sobald die Datenbank wächst? (Auf einem anderen Discourse-Forum ist meine Datenbank bereits mehrere Gigabyte groß.)

(Ich glaube nicht, dass das Erstellen eines Plugins hier eine Option wäre, da ich nicht sehe, wie es besser sein könnte als das [Data Explorer](https://meta.discourse.org/t/32566?silent=true)-Plugin. Tatsächlich ist das DE-Plugin fast perfekt – abgesehen von diesem Problem.)

---

<div class="post-metadata">

### Author: ![AstonJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/astonj/32/215041_2.png) [@AstonJ](https://meta.discourse.org/u/AstonJ)
#### Post date: [27. Mai 2020 um 01:56 UTC](https://meta.discourse.org/t/is-it-possible-to-connect-to-the-database-directly-from-a-separate-app/152695/6 "2020-05-27T01:56:00Z")

</div>

Hat jemand eine Idee, warum das nicht funktioniert?

Ich habe einige Beiträge von @pfaffman und @Nacho_Caballero in diesem Thema befolgt: [How to make the database (or part of it) accessible to a cloud data processor?](https://meta.discourse.org/t/how-to-make-the-database-or-part-of-it-accessible-to-a-cloud-data-processor/147915) und den Beitrag von @mpalmer in diesem: [Accessing to the database from outside the container - #4 by mpalmer](https://meta.discourse.org/t/accessing-to-the-database-from-outside-the-container/45257/4?u=astonj).

Zuerst habe ich die app.yml wie folgt bearbeitet:

```plaintext
expose:
  - "127.0.0.2:5432:5432"

```

Dann habe ich den Container neu erstellt. Im Container habe ich ein Passwort für den postgres-Benutzer festgelegt und kann dann von innerhalb des Containers mit folgendem Befehl verbinden:

```plaintext
psql -h localhost -d discourse -U postgres

```

Wenn ich jedoch den Container verlasse und den Versuch einer Verbindung von außen mache, erhalte ich folgende Meldung:

```plaintext
# psql -h 127.0.0.2 -p 5432 -d discourse -U postgres
psql: server closed the connection unexpectedly
	This probably means the server terminated abnormally
	before or while processing the request.

```

Ich habe auch versucht, den Port auf einen anderen Wert zu ändern, aber erhalte dasselbe Ergebnis. Die IP 127 habe ich aus `docker ps` und der Inspektion unter Network Settings erhalten (ich habe drei eigenständige Discourse-Instanzen laufen).

Wenn ich die IP ändere (auf die einer der anderen Discourse-Foren), erhalte ich eine (sofortigere und) andere Antwort/Meldung, was darauf hindeutet, dass das Obige teilweise korrekt ist:

```plaintext
# psql -h 127.0.0.3 -p 5432 -d discourse -U postgres
psql: could not connect to server: Connection refused
	Is the server running on host "127.0.0.3" and accepting
	TCP/IP connections on port 5432?

```

Habt ihr eine Idee, was ich falsch mache? Eine Google-Suche nach `psql: server closed the connection unexpectedly` deutet auf ein Netzwerkproblem hin – muss ich also noch etwas im Container ändern?

---

<div class="post-metadata">

### Author: ![Nacho\_Caballero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nacho_caballero/32/130189_2.png) [@Nacho\_Caballero](https://meta.discourse.org/u/Nacho_Caballero)
#### Post date: [27. Mai 2020 um 08:37 UTC](https://meta.discourse.org/t/is-it-possible-to-connect-to-the-database-directly-from-a-separate-app/152695/7 "2020-05-27T08:37:40Z")

</div>

> [@AstonJ](#):
>
> Wenn ich jedoch den Container verlasse und versuche, eine Verbindung herzustellen, erhalte ich:

Die Methode, mit der ich das von außerhalb des Containers zum Laufen gebracht habe, ist die Verwendung eines SSH-Tunnels. Ich habe tatsächlich einen neuen Benutzer anstelle von postgres erstellt und benutzerdefinierte Ports für SSH und postgres verwendet, aber dies sollte auch für deine Einrichtung funktionieren:

```plaintext
ssh -L 5432:localhost:5432 EXTERNAL_VPS_IP "psql -U postgres -d discourse -h localhost"

```

EXTERNAL\_VPS\_IP ist die IP-Adresse, die du verwendest, um eine Verbindung zu deinem Remote-Server herzustellen.

> [@AstonJ](#):
>
> Die 127-IP habe ich über `docker ps` und die Überprüfung unter Network Settings erhalten.

Wenn es immer noch nicht funktioniert, solltest du versuchen, die freigegebene IP in `app.yml` auf die [docker bridge](https://stackoverflow.com/a/50296284/355567)-IP statt auf die interne Container-IP, die du von `docker ps` erhalten hast, zu ändern. Ich bin mir nicht sicher, ob dies erforderlich ist, aber so habe ich es eingerichtet:

```plaintext
expose:
  - "127.0.0.1:5432:5432"
# oder wenn du einen benutzerdefinierten Port verwendest: - "127.0.0.1:CUSTOM_PORT:5432"

```

Denke daran, den Container anschließend neu zu erstellen.

Lass mich wissen, wie es läuft. Es hat sehr lange gedauert, bis alles funktionierte (und im Nachhinein war es so einfach), daher helfe ich gerne.

---

<div class="post-metadata">

### Author: ![AstonJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/astonj/32/215041_2.png) [@AstonJ](https://meta.discourse.org/u/AstonJ)
#### Post date: [27. Mai 2020 um 17:15 UTC](https://meta.discourse.org/t/is-it-possible-to-connect-to-the-database-directly-from-a-separate-app/152695/8 "2020-05-27T17:15:44Z")

</div>

Danke für die Info @Nacho_Caballero … besonders für den Link zu [docker](https://stackoverflow.com/a/50296284/355567)!

Es scheint, als wären die Ratschläge in deinem (und dem anderen) Thread korrekt gewesen: Du benötigst:

```plaintext
expose:
  - "127.17.0.1:5432:5432"

```

…wie in diesem Link erwähnt, leitet Docker automatisch an die richtige IP für deinen Container weiter (was angesichts der dynamischen IPs sinnvoll ist – etwas, worüber ich mir Gedanken gemacht hatte). Ich denke, das ist für die meisten Setup-Konfigurationen alles, was benötigt wird.

Das hatte ich jedoch bereits versucht – du fragst dich vielleicht, worin mein Problem bestand. Meine Firewall! (Ich dachte, ich hätte den Fehler `psql: server closed the connection unexpectedly` wiedererkannt!)

Jetzt ist alles geklärt – danke an alle 😊

---

<div class="post-metadata">

### Author: ![Nacho\_Caballero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nacho_caballero/32/130189_2.png) [@Nacho\_Caballero](https://meta.discourse.org/u/Nacho_Caballero)
#### Post date: [28. Mai 2020 um 05:30 UTC](https://meta.discourse.org/t/is-it-possible-to-connect-to-the-database-directly-from-a-separate-app/152695/9 "2020-05-28T05:30:25Z")

</div>

> [@AstonJ](#):
>
> Meine Firewall!

Gut zu wissen! Ich freue mich, dass du es herausgefunden hast. Ist deine Firewall `iptables`? Wie hast du den Port geöffnet?

---

<div class="post-metadata">

### Author: ![AstonJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/astonj/32/215041_2.png) [@AstonJ](https://meta.discourse.org/u/AstonJ)
#### Post date: [29. Mai 2020 um 18:01 UTC](https://meta.discourse.org/t/is-it-possible-to-connect-to-the-database-directly-from-a-separate-app/152695/10 "2020-05-29T18:01:26Z")

</div>

Ich verwende firewalld, aber für iptables sollte so etwas funktionieren:

```plaintext
iptables -A INPUT -p tcp --dport xxxx -j ACCEPT
iptables -A OUTPUT -p tcp --dport xxxx -j ACCEPT

```
