该应用将部署在 Discourse Docker 容器之外,但位于同一台服务器上。如果是这样,是否有人能分享一些具体操作细节,或指引我查阅相关指南或说明?
此外,与使用 DE 插件/API 相比,这样做是否会有什么弊端?
该应用将部署在 Discourse Docker 容器之外,但位于同一台服务器上。如果是这样,是否有人能分享一些具体操作细节,或指引我查阅相关指南或说明?
此外,与使用 DE 插件/API 相比,这样做是否会有什么弊端?
主要缺点在于此类连接可能被用于写入操作。这是否是一项必需要求?
如果您的集成需要数据库的写入权限,建议编写一个插件,仅暴露您所需的操作。
这并非强制要求,不过我接受将其视为一个缺点 ![]()
我开始使用你们的 DE 插件,但不幸的是,我认为我的使用场景可能需要直接连接数据库,因为我为某些页面通过 API 发送了过多的请求(而且这还只是我一个人访问网站的情况)。这些请求大多是自定义查询,所以我不确定这是否造成了影响。不过我仍然很喜欢 DE 插件!
请问,在容器之外直接连接 Postgres 数据库的最佳方式是什么?如果这有帮助的话,论坛和网站都部署在同一台服务器上。
编辑:我想我触发了 DE 插件的速率限制,但我记得 Sam 说过,如果请求来自同一台服务器,则不适用速率限制——这一说法目前仍然有效吗?
虽然可行,但其他应用可能会获取表锁,导致 Discourse 无法正常运行。
您可以选择开发一个新插件,添加您所需的必要 API 端点;或者彻底解决该问题,创建另一个 PostgreSQL 实例来复制您的 Discourse 数据,并将您的应用接入该实例。
谢谢你的信息,Rafael。我将专门使用 SELECT 语句,据我所知这些语句不会加锁,因此我只需担心 Discourse 端的表变更(例如升级时),并可以在必要时暂时关闭另一个应用。这样能否消除加锁方面的顾虑?
关于数据库复制,这似乎是个有趣的选项——能否实时进行,使数据延迟不超过几分钟?(我需要频繁获取最新话题——网站上几乎每个页面都有它们,尽管我会缓存两分钟,但缓存因页面和条件而异,且这类页面数量可能多达数百个。)此外,随着数据库规模增长,这是否可能不再可行?(在我的另一个 Discourse 论坛上,数据库已有几 GB 大小。)
(我认为创建插件在这里并不是一个可行的方案,因为我看不到它比 Data Explorer 插件有什么优势;事实上,DE 插件几乎完美——除了这个问题之外。)
有人知道为什么这不起作用吗?
我参考了 @pfaffman 和 @Nacho_Caballero 在这个主题中的帖子:https://meta.discourse.org/t/how-to-make-the-database-or-part-of-it-accessible-to-a-cloud-data-processor/147915,以及 @mpalmer 在这个主题中的帖子:Accessing to the database from outside the container - #4 by mpalmer
首先,我编辑了 app.yml,添加以下内容:
expose:
- "127.0.0.2:5432:5432"
然后重建容器。在容器内,我为 postgres 用户设置了密码,并可以通过以下命令从容器内部连接:
psql -h localhost -d discourse -U postgres
但是,当我退出容器并尝试连接时,却收到以下错误:
# 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.
我也尝试将端口更改为其他值,但结果相同。我从 docker ps 和检查网络设置中获取了 127 IP(我有三个独立运行的 Discourse 实例)。
如果我更改 IP(改为另一个 Discourse 论坛的 IP),则会收到一个(更直接且)不同的响应/消息,这表明上述操作部分正确:
# 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?
有人知道我在哪里出错了吗?搜索 psql: server closed the connection unexpectedly 似乎表明这是一个网络问题——我是否需要在容器内更改其他设置?
我(从容器外部)解决这个问题是使用 SSH 隧道。我实际上创建了一个新用户,而不是使用 postgres,并且为 SSH 和 postgres 设置了自定义端口,但这应该适用于您的设置:
ssh -L 5432:localhost:5432 EXTERNAL_VPS_IP "psql -U postgres -d discourse -h localhost"
EXTERNAL_VPS_IP 是您用于连接远程服务器的 IP 地址。
如果仍然无法工作,您可能需要尝试在 app.yml 中将暴露的 IP 更改为使用 docker bridge IP,而不是从 docker ps 获取的内部容器 IP。我不确定这是否是必需的,但我是这样设置的:
expose:
- "127.0.0.1:5432:5432"
# 或者如果您使用自定义端口:- "127.0.0.1:自定义端口:5432"
记得之后重新构建容器。
请告诉我结果如何。我花了非常长的时间才让一切正常运行(现在回想起来其实很简单),所以我很乐意提供帮助。
感谢提供的信息 @Nacho_Caballero……尤其是关于 docker 的链接!
看来您(以及其他)帖子中的建议是正确的,您需要:
expose:
- "127.17.0.1:5432:5432"
正如该链接中提到的,Docker 会自动将流量转发到容器的正确 IP(考虑到这些 IP 是动态的,这很合理——这正是我之前疑惑的地方)。我认为对于大多数配置来说,这就足够了。
不过我其实已经尝试过这个了——所以您可能想知道我的问题出在哪里。是我的防火墙!(我觉得 psql: server closed the connection unexpectedly 这个错误很眼熟!)
现在一切正常了——感谢大家 ![]()
很高兴知道!很高兴你解决了这个问题。你的防火墙是 iptables 吗?你是如何开放端口的?
我使用的是 firewalld,但对于 iptables,类似这样的命令应该可以生效:
iptables -A INPUT -p tcp --dport xxxx -j ACCEPT
iptables -A OUTPUT -p tcp --dport xxxx -j ACCEPT