Wie man die Datenbank (oder einen Teil davon) für einen Cloud-Datenprozessor zugänglich macht

Ich war daran interessiert, ETL-Dienste wie Stitch Data oder Skyvia zu nutzen, um verschiedene Datenquellen (einschließlich meiner Discourse-Datenbank) zu integrieren. Mir wurde jedoch von jemandem bei Skyvia mitgeteilt, dass dies nicht möglich ist:

Skyvia kann über SSH eine Verbindung zu PostgreSQL herstellen. Es ist jedoch nicht möglich, eine Verbindung herzustellen, wenn sich die Datenbank in einem Docker-Container befindet und der SSH-Server nicht im Container, sondern davor liegt.

Dies sind ihre Anforderungen für die Verbindung zu PostgreSQL.

Gibt es eine offensichtliche Lösung?

Sie könnten SSH im Discourse-Container aktivieren (auf einem nicht standardmäßigen Port) und dann zulassen, dass sich Nutzer dort verbinden. Ich glaube, es gibt ein Beispiel im samples-Verzeichnis von Discourse_docker.

3 „Gefällt mir“

Danke, Jay. Ich habe mich schließlich für docker-ssh mit Public-Key-Authentifizierung entschieden. :+1:

2 „Gefällt mir“

Es scheint, als würde mir ein Schlüsselkonzept fehlen, da ich mich über SSH mit dem benutzerdefinierten Port verbinden und dann su postgres -c 'psql discourse' ohne Probleme ausführen kann. Bei diesem Zwei-Schritte-Ansatz funktioniert alles einwandfrei, aber ich vermute, dass ich für eine direkte Verbindung über pgAdmin (zum Beispiel) etwas anderes benötige.

Dies ist der Befehl, den ich verwende, um einen benutzerdefinierten Port freizugeben:

docker run -d -p 2222:22 \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -v ~/.ssh/authorized_keys:/authorized_keys \
        --name my-sshd \
        -e FILTERS={\"name\":[\"^/app$\"]} -e AUTH_MECHANISM=publicKey \
        -e AUTHORIZED_KEYS=/authorized_keys \
        jeroenpeeters/docker-ssh

Dies ermöglicht es mir, später dies direkt auszuführen (ohne den Docker-Container über launcher enter app zu starten):

ssh whatever@host -p 2222
su postgres -c 'psql discourse'

Ich habe mehrere Dinge ausprobiert, jedoch ohne Erfolg. Ich habe das Gefühl, dass es einen Weg geben sollte, ssh whatever@host -p XXXX auszuführen und sich direkt mit der Datenbank zu verbinden (was wahrscheinlich das ist, was pgAdmin erwartet).

Verbindest du dich nicht oder hast du ein Berechtigungsproblem?

Ich kann über die Befehlszeile per SSH und dann mit psql eine Verbindung herstellen. Eine Verbindung über pgAdmin ist mir jedoch nicht möglich.

1 „Gefällt mir“

Sie müssen den PostgreSQL-Port direkt freigeben, um eine Verbindung über pgAdmin herstellen zu können.

In der app.yml sehen Sie oben die Ports 80 und 443 geöffnet. Sie können eine weitere Zeile für den Port 5432 für PostgreSQL hinzufügen.

Das ist jedoch mit sehr hoher Wahrscheinlichkeit eine sehr schlechte Idee. Die Datenbank hat sich von der Akzeptanz nur lokaler Verbindungen hin zur Offenlegung gegenüber dem gesamten Internet verändert.

Wenn Sie nur gelegentlich Berichte benötigen, reicht es möglicherweise aus, einige CSV-Dateien aus dem Data Explorer herunterzuladen und diese in Ihrem bevorzugten Tool zu laden. Sie können auch Discourse-Backups (ohne Uploads) herunterladen; diese liegen im Standard-PostgreSQL-Dump-Format vor. Damit können Sie sie auf eine lokale PostgreSQL-Instanz für die Analyse wiederherstellen.

1 „Gefällt mir“

Danke, Rafael

Ich habe das getan und den Container neu erstellt. Aber das funktioniert immer noch nicht (ich habe die echte IP-Adresse statt XX.XX.XX.XX)

Und im Reiter SSH-Tunnel:

Das ist der Fehler, den ich erhalte:

Dazu: Ich verstehe, dass dies eine Schutzschicht weniger bedeutet, aber es wird doch immer noch der private SSH-Schlüssel benötigt, oder?

Wenn Sie 5432 in der app.yml hinzufügen, wird der Port direkt exponiert, ohne dass ein SSH-Tunnel erforderlich ist.

Ich kann keine Ratschläge zum pgAdmin-SSH-Tunnel geben, da ich diesen noch nie verwendet habe. Ich gehe davon aus, dass er erwartet, dass der Port lokale Verbindungen annimmt, sodass er nicht dem Internet exponiert werden muss.

Versuchen Sie Folgendes:

expose:
  - "80:80"
  - "443:443"
  - "5432"
1 „Gefällt mir“

Aber es gibt kein Postgres-Passwort, da Superuser-Rechte erforderlich sind: Die Datei pg_hba.conf hat die Berechtigungen für „local“-Verbindungen auf „peer“ gesetzt, sodass dies vom UNIX-Benutzer abhängt, was eine Anmeldung über SSH erfordert, oder?

Dies funktioniert nicht: psql -h XX.XX.XX.XX -p 5432 -U postgres -d discourse

Sie können sich als Superuser mit psql verbinden

./launcher enter app
su postgres
psql

und den erforderlichen Benutzer mit den notwendigen Berechtigungen für Ihre Berichte erstellen.

Richtig, ich habe keine Probleme, eine Verbindung vom App-Docker-Container aus herzustellen. Mein Problem besteht darin, direkt von meinem lokalen Rechner (um pgAdmin nutzen zu können) oder von einem Cloud-Datenprozessor wie Stitch aus eine Verbindung zur PostgreSQL-Datenbank herzustellen. Beide erwarten eine Host-IP-Adresse und SSH-Anmeldedaten, doch ich konnte sie nicht zum Laufen bringen (ich erhalte den oben gezeigten Fehler).

Das Einzige, was ich bisher geschafft habe, ist, docker-ssh zu verwenden, um direkt (über einen öffentlichen Schlüssel) von meinem lokalen Computer auf den App-Docker-Container zuzugreifen (ohne launcher enter app auszuführen). Dennoch muss ich su postgres 'psql discourse' ausführen, um auf die Datenbank zuzugreifen. Ich vermute, das ist das Problem mit pgAdmin/Stitch – diese erwarten eine direkte Verbindung.

Hast du versucht, ein neues PostgreSQL mit einem Passwort zu erstellen und dieses deinem Dienst bereitzustellen?

Ja, sie haben ein ziemlich aufwendiges Verfahren.

Aber ich habe das gleiche Problem, wenn ich pgAdmin einfach von meinem lokalen Computer aus verwende.

Ich glaube, dass die Anleitung Wie man von einem eigenständigen Container zu separaten Web- und Datencontainern wechselt Anweisungen zum Festlegen eines Passworts enthält.

Außerdem könnte man den Postgres-Port nur an 127.0.0.1 binden.

expose:
  - "80:80"
  - "443:443"
  - "127.0.0.1:5432:5432"
1 „Gefällt mir“

Ich habe mich entschlossen, einen Schritt zurückzutreten, um zu prüfen, ob ich eine Verbindung zur Datenbank herstellen kann, ohne Ports freizugeben. :grin:

Wenn ich in den Container eintrete, sehe ich Folgendes:

# netstat -lp | grep postgres
tcp        0      0 0.0.0.0:postgresql      0.0.0.0:*               LISTEN      -
tcp6       0      0 [::]:postgresql         [::]:*                  LISTEN      -
unix  2      [ ACC ]     STREAM     LISTENING     263612292 -                    /var/run/postgresql/.s.PGSQL.5432

Wenn ich den Container verlasse und mich auf meinem Remote-Server befinde (noch nicht auf meinem lokalen Computer), sollte ich dann nicht eine Verbindung wie folgt herstellen können?

/var/discourse# psql -h localhost -d discourse -U postgres

Das Problem ist, dass ich nach einem Passwort gefragt werde. Da der postgres-Benutzer keines hat, habe ich versucht, einen anderen Benutzer zu erstellen und ihm ein Passwort zuzuweisen:

CREATE USER whatever_user WITH ENCRYPTED PASSWORD '<whatever password>';
GRANT CONNECT ON DATABASE discourse TO whatever_user;
GRANT USAGE ON SCHEMA public TO whatever_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO whatever_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO whatever_user;

Ich habe eine Zeile für diesen Benutzer mit md5 in pg_hba.conf hinzugefügt und PG mit service postgresql restart neu gestartet.

# Database administrative login by Unix domain socket
local   all             postgres                                peer
local   all             whatever_user                      md5

Wenn ich jedoch vom Remote-Server aus eine Verbindung versuche, erhalte ich einen Authentifizierungsfehler:

# psql -h localhost -d discourse -U whatever_user
Password for user whatever_user:
psql: FATAL:  password authentication failed for user "whatever_user"
FATAL:  password authentication failed for user "whatever_user"

Was übersehe ich? Ich möchte zumindest in der Lage sein, eine Verbindung zur Datenbank vom selben Server aus herzustellen. Schritt 2 wäre, dasselbe über einen SSH-Tunnel zu tun, aber ich muss vermutlich zuerst Schritt 1 erledigen. Jegliche Hilfe wird geschätzt.

Ok. Ich habe es endlich herausgefunden :tada:

Ich habe dies:

in dies geändert: - "127.0.0.1:5433:5432", da ich eine Fehlermeldung erhielt, dass der Port bereits verwendet wird.

Ich habe den Container neu erstellt und überprüft, dass der Port tatsächlich offen ist:

$ sudo docker ps
CONTAINER ID        IMAGE                           COMMAND             CREATED             STATUS              PORTS                      NAMES
whatever_id        local_discourse/app             "/sbin/boot"        20 minutes ago      Up 20 minutes       127.0.0.1:5433->5432/tcp   app

Ich kann jetzt einen SSH-Tunnel erstellen und mich von meinem Remote-Server aus mit einem Benutzer und Passwort verbinden:

# Tunnel erstellen (man könnte auch ssh -f verwenden, um ihn im Hintergrund auszuführen)
ssh -v -N -L 5433:localhost:5433 SERVER_IP_ADDRESS

# In einem anderen Tab verbinden und das Passwort eingeben
psql -h localhost -d discourse -U whatever_user -p 5433

Wenn jemand versucht, dies zu tun und auf Probleme stößt, lass es mich bitte wissen.

4 „Gefällt mir“