L’app sarebbe al di fuori del contenitore Docker di Discourse ma sullo stesso server. In tal caso, qualcuno potrebbe condividere alcuni dettagli su come farlo o indicarmi una guida o delle istruzioni, per favore?
Ci sarebbero anche degli svantaggi nel farlo rispetto all’uso del plugin/API DE?
Gli svantaggi riguardano principalmente il fatto che tale connessione potrebbe essere utilizzata per l’accesso in scrittura. È un requisito?
Se la tua integrazione necessita di accesso in scrittura al database, valuta la possibilità di scrivere un plugin che esponga solo le operazioni di cui hai bisogno.
Non è un requisito, ma per me va bene come svantaggio
Ho iniziato a usare il tuo plugin DE, ma purtroppo penso che il mio caso d’uso richiederà una connessione diretta, dato che sto inviando troppe richieste tramite API per alcune delle mie pagine (e questo succede anche solo con me sul sito). Si tratta principalmente di query personalizzate, quindi non sono sicuro che ciò abbia un impatto. Comunque, adoro ancora il plugin DE!
Sapresti dirmi qual è il modo migliore per connettersi direttamente al database Postgres al di fuori del contenitore? Sia il forum che il sito sono sullo stesso server, nel caso possa essere utile.
Modifica: Penso di aver raggiunto il limite di richieste con il plugin DE, ma sono certo di aver letto che Sam ha detto che se le richieste provengono dallo stesso server non si applica alcun limite di velocità. È ancora così?
Sebbene sia possibile, l’altra applicazione può acquisire lock sulle tabelle e impedire a Discourse di funzionare normalmente.
Opta per un nuovo plugin che aggiunga gli endpoint API necessari di cui hai bisogno, oppure vai a fondo creando un’altra istanza di PostgreSQL che replica il tuo Discourse, dove potrai integrare la tua applicazione.
Grazie per le informazioni, Rafael. Userò esclusivamente le istruzioni SELECT e, per quanto ne so, queste non bloccano nulla, quindi dovrei preoccuparmi solo delle modifiche alle tabelle sul lato Discourse (cioè durante gli aggiornamenti) e di quando posso disattivare temporaneamente l’altra applicazione. Questo eliminerebbe le preoccupazioni relative ai blocchi?
Per quanto riguarda la replica del database, sembra un’opzione interessante: può essere eseguita in tempo reale, in modo che i dati siano al massimo pochi minuti obsoleti? (Devo recuperare gli argomenti più recenti frequentemente: quasi ogni pagina del sito li contiene, anche se effettuo la cache per due minuti, ma questa varia in base alla pagina/criterio e ci saranno centinaia di pagine di questo tipo). Inoltre, questa opzione potrebbe diventare non praticabile quando il database crescerà? (In un altro forum Discourse il mio database è già di alcuni gigabyte.)
(Non credo che creare un plugin sia un’opzione valida qui, poiché non vedo come potrebbe essere migliore del plugin Data Explorer; in realtà, il plugin DE è quasi perfetto, tranne per questo problema.)
Ho ricompilato il container. All’interno del container ho impostato una password per l’utente postgres e riesco quindi a connettermi con il seguente comando dall’interno del container:
psql -h localhost -d discourse -U postgres
Tuttavia, quando escono dal container e provo a connettermi, ottengo:
# psql -h 127.0.0.2 -p 5432 -d discourse -U postgres
psql: server ha chiuso la connessione inaspettatamente
Questo probabilmente significa che il server si è interrotto in modo anomalo
prima o durante l'elaborazione della richiesta.
Ho anche provato a cambiare la porta con un’altra, ma ottengo lo stesso risultato. Ho ottenuto l’IP 127 da docker ps e ispezionando le impostazioni di rete (ho tre istanze Discourse standalone in esecuzione).
Se cambio l’IP (con quello di uno degli altri forum Discourse), ottengo una risposta/messaggio diverso (più immediato), quindi quanto sopra sembra essere parzialmente corretto:
# psql -h 127.0.0.3 -p 5432 -d discourse -U postgres
psql: impossibile connettersi al server: Connessione rifiutata
Il server è in esecuzione sull'host "127.0.0.3" e accetta
connessioni TCP/IP sulla porta 5432?
Qualche idea su cosa sto sbagliando? Cercando su Google psql: server ha chiuso la connessione inaspettatamente sembra suggerire un problema di rete: devo quindi modificare qualcos’altro all’interno del container?
Il metodo che ho usato per farlo funzionare (da fuori il contenitore) è utilizzare un tunnel SSH. In realtà ho creato un nuovo utente invece di usare postgres e ho porte personalizzate per SSH e postgres, ma questo dovrebbe funzionare anche per la tua configurazione:
EXTERNAL_VPS_IP è l’indirizzo IP che usi per connetterti al tuo server remoto.
Se non funziona ancora, potresti provare a cambiare l’IP esposto in app.yml per usare l’IP del docker bridge invece dell’IP interno del contenitore ottenuto da docker ps. Non sono sicuro che sia necessario, ma è così che l’ho configurato io:
expose:
- "127.0.0.1:5432:5432"
# o se usi una porta personalizzata: - "127.0.0.1:CUSTOM_PORT:5432"
Ricordati di ricostruire il contenitore dopo.
Fammi sapere come va. Mi ci è voluto MOLTO TEMPO per far funzionare tutto (ed era così semplice a posteriori), quindi sono felice di aiutare.
Sembra che il consiglio nel tuo (e negli altri) thread fosse corretto, serve:
expose:
- "127.17.0.1:5432:5432"
…come menzionato in quel link, Docker inoltrerà automaticamente alla corretta IP per il tuo container (ha senso dato che quegli IP sono dinamici - qualcosa che mi chiedevo). Penso che questo sia tutto ciò che serve per la maggior parte delle configurazioni.
L’avevo già provato, quindi potresti chiederti qual era il mio problema. Il mio firewall! (Pensavo di aver riconosciuto l’errore psql: server closed the connection unexpectedly!)