【问题标题】:Heroku - PostgreSQL - How to connect remotely on WindowsHeroku - PostgreSQL - 如何在 Windows 上远程连接
【发布时间】:2019-02-19 11:37:23
【问题描述】:

在我得到否定之前,我知道有很多类似的帖子,但我已经阅读并使用它们来达到这一点,但我认为它们没有回答我的问题。

概述

我正在尝试将我的测试仪 heroku 站点 [编辑:已删除] 连接到我的 PostgreSQL 数据库。我之前尝试过 MS Server,但我在 Windows 上,Heroku 不喜欢 pyodbc。

短版

我很确定我的 PostgreSQL 设置正确,但我试图确定我是否有正确的 PostgreSQL URL 主机名,以及是否需要在允许通过 Windows 防火墙访问方面做更多的事情。

加长版

PostgreSQL


按照接受的答案How to Allow Remote Access to PostgreSQL database 我的postgresql.conflisten_addresses = '*' 和端口5432。我已经添加了一行

host all all 0.0.0.0/0 md5

pg_hba.conf 上获取以下信息

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5
host    all         all         0.0.0.0/0       md5

现在我可以在命令行上执行此操作

C:\etc> psql -U postgres -h 192.XXX.XX.XXX -d ProductionData

192.XXX.XX.XXX 是我的 IPv4 地址(从开始>更改以太网设置>MyCompany.local 中找到)并且一切正常。我知道,因为如果我撤消 pg_hba.conf 上的行,我会得到

(venv) C:\etc> psql -U postgres -h 192.XXX.XX.XXX -d ProductionData
psql: FATAL:  no pg_hba.conf entry for host "192.XXX.XX.XXX", user "postgres", database "ProductionData", SSL off

Heroku


我知道 postgres 需要表单的 URL

postgresql://username:password@hostname/database

postgresql://username:password@hostname:port/database

除了 IP 网络地址之外,我不太了解主机名。我已经尝试过localhost 以及与上述192.XXX.XX.XXX192.XXX.XX.XXX:5432 相同的IPv4 地址。

下面的日志部分包含 netstat、heroku 配置设置、在 git bash 中完成的每次尝试的 postgresql 重新启动,但我得到以下两个 192.XXX.XX.XXX 作为超时。

Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?

Is the server running on host "192.XXX.XX.XXX" and accepting
TCP/IP connections on port 5432?

Windows 防火墙


我已创建入站规则以允许访问...

协议类型 - TCP

本地端口 - 5432

远程端口 - 所有端口

程序 - 本程序 - %ProgramFiles%\PostgreSQL\11\bin\postgres.exe

Heroku 日志


尝试 #1 - localhost,结果错误


$ pg_ctl -D "C:\Program Files\PostgreSQL\11\data" restart
waiting for server to shut down.... done
server stopped
waiting for server to start....2019-02-19 10:09:04.423 GMT [11952] LOG:  listening on IPv6 address "::", port 5432
2019-02-19 10:09:04.423 GMT [11952] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2019-02-19 10:09:04.460 GMT [11952] LOG:  redirecting log output to logging collector process
2019-02-19 10:09:04.460 GMT [11952] HINT:  Future log output will appear in directory "log".
 done
server started

$ netstat -ant | findstr 5432
  TCP    0.0.0.0:5432           0.0.0.0:0              LISTENING       InHost
  TCP    [::]:5432              [::]:0                 LISTENING       InHost

$ heroku restart -a pgtester
Restarting dynos on ? pgtester... done

$ heroku logs -t -a pgtester
...lots of stack errors...
2019-02-19T09:52:25.731597+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 437, in connect
2019-02-19T09:52:25.731599+00:00 app[web.1]: return self.dbapi.connect(*cargs, **cparams)
2019-02-19T09:52:25.731600+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect
2019-02-19T09:52:25.731602+00:00 app[web.1]: conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
2019-02-19T09:52:25.731604+00:00 app[web.1]: sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection refused
2019-02-19T09:52:25.731606+00:00 app[web.1]: Is the server running on host "localhost" (127.0.0.1) and accepting
2019-02-19T09:52:25.731607+00:00 app[web.1]: TCP/IP connections on port 5432?
2019-02-19T09:52:25.731646+00:00 app[web.1]: (Background on this error at: http://sqlalche.me/e/e3q8)

尝试 #2 - 192.XXX.XX.XXX,结果超时


$ heroku config:set DEV_DATABASE_URL=postgresql://postgres:mysecretpassword@192.XXX.XX.XXX/ProductionData
Setting DEV_DATABASE_URL and restarting ? pgtester... done, v47
DEV_DATABASE_URL: postgresql://postgres:mysecretpassword@192.XXX.XX.XXX/ProductionData

$ heroku restart -a pgtester
Restarting dynos on ? pgtester... done

$ netstat -ant | findstr 5432
  TCP    0.0.0.0:5432           0.0.0.0:0              LISTENING       InHost
  TCP    [::]:5432              [::]:0                 LISTENING       InHost

$ heroku logs -t -a pgtester
...lots of stack errors...
2019-02-19T10:00:57.273592+00:00 app[api]: Set DEV_DATABASE_URL config vars by user email@example.com
2019-02-19T10:00:57.273592+00:00 app[api]: Release v47 created by user email@example.com
2019-02-19T10:01:05.401378+00:00 heroku[web.1]: Starting process with command `waitress-serve --port=44666 flasky:app`
2019-02-19T10:01:05.672789+00:00 heroku[web.1]: Restarting
2019-02-19T10:01:08.193167+00:00 app[web.1]: [heroku-exec] Starting
2019-02-19T10:01:10.388293+00:00 app[web.1]: postgresql://postgres:mysecretpassword@192.XXX.XX.XXX/ProductionData
2019-02-19T10:01:10.897113+00:00 app[web.1]: Serving on http://0.0.0.0:44666
2019-02-19T10:01:12.089984+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2019-02-19T10:01:12.196052+00:00 heroku[web.1]: Process exited with status 143
2019-02-19T10:01:12.358184+00:00 heroku[web.1]: Starting process with command `waitress-serve --port=18540 flasky:app`
2019-02-19T10:01:16.133191+00:00 app[web.1]: [heroku-exec] Starting
2019-02-19T10:01:18.520615+00:00 app[web.1]: postgresql://postgres:mysecretpassword@192.XXX.XX.XXX/ProductionData
2019-02-19T10:01:19.161158+00:00 app[web.1]: Serving on http://0.0.0.0:18540
2019-02-19T10:01:19.687131+00:00 heroku[web.1]: State changed from starting to up
2019-02-19T10:01:33.125392+00:00 heroku[router]: at=info method=GET path="/" host=pgtester.herokuapp.com request_id=7e65dc99-b99f-4b81-8bbe-a4b98adebd91 fwd="185.16.227.58" dyno=web.1 connect=1ms service=231ms status=200 bytes=2077 protocol=https
2019-02-19T10:02:11.389923+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/" host=pgtester.herokuapp.com request_id=6837dbb0-b2e4-44ee-a67c-2f79a1c7c1b6 fwd="185.16.227.58" dyno=web.1 connect=1ms service=30000ms status=503 bytes=0 protocol=https

尝试 #3 - 192.XXX.XX.XXX:5432,结果超时


$ pg_ctl -D "C:\Program Files\PostgreSQL\11\data" restart
waiting for server to shut down.... done
server stopped
waiting for server to start....2019-02-19 10:09:04.423 GMT [11952] LOG:  listening on IPv6 address "::", port 5432
2019-02-19 10:09:04.423 GMT [11952] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2019-02-19 10:09:04.460 GMT [11952] LOG:  redirecting log output to logging collector process
2019-02-19 10:09:04.460 GMT [11952] HINT:  Future log output will appear in directory "log".
 done
server started

$ netstat -ant | findstr 5432
  TCP    0.0.0.0:5432           0.0.0.0:0              LISTENING       InHost
  TCP    [::]:5432              [::]:0                 LISTENING       InHost

$ heroku config:set DEV_DATABASE_URL=postgresql://postgres:mysecretpassword@192.XXX.XX.XXX:5432/ProductionData
Setting DEV_DATABASE_URL and restarting ? pgtester... done, v48
DEV_DATABASE_URL: postgresql://postgres:mysecretpassword@192.XXX.XX.XXX:5432/ProductionData

$ netstat -ant | findstr 5432
  TCP    0.0.0.0:5432           0.0.0.0:0              LISTENING       InHost
  TCP    [::]:5432              [::]:0                 LISTENING       InHost

$ heroku restart -a pgtester
Restarting dynos on ? pgtester... done

$ heroku logs -t -a pgtester
...lots of stack errors...
2019-02-19T10:11:10.352241+00:00 app[api]: Release v48 created by user email@example.com
2019-02-19T10:11:10.352241+00:00 app[api]: Set DEV_DATABASE_URL config vars by user email@example.com
2019-02-19T10:11:17.316331+00:00 heroku[web.1]: Starting process with command `waitress-serve --port=56616 flasky:app`
2019-02-19T10:11:20.998316+00:00 app[web.1]: [heroku-exec] Starting
2019-02-19T10:11:21.724624+00:00 heroku[web.1]: Restarting
2019-02-19T10:11:25.043993+00:00 app[web.1]: postgresql://postgres:mysecretpassword@192.XXX.XX.XXX:5432/ProductionData
2019-02-19T10:11:25.797589+00:00 app[web.1]: Serving on http://0.0.0.0:56616
2019-02-19T10:11:26.872124+00:00 heroku[web.1]: Starting process with command `waitress-serve --port=51247 flasky:app`
2019-02-19T10:11:27.101119+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2019-02-19T10:11:27.211928+00:00 heroku[web.1]: Process exited with status 143
2019-02-19T10:11:29.033774+00:00 app[web.1]: [heroku-exec] Starting
2019-02-19T10:11:30.261042+00:00 app[web.1]: postgresql://postgres:mysecretpassword@192.XXX.XX.XXX:5432/ProductionData
2019-02-19T10:11:30.570976+00:00 app[web.1]: Serving on http://0.0.0.0:51247
2019-02-19T10:11:31.054334+00:00 heroku[web.1]: State changed from starting to up
2019-02-19T10:11:34.448659+00:00 heroku[router]: at=info method=GET path="/" host=pgtester.herokuapp.com request_id=7498e3a1-5a09-419b-8038-fc4bf3ddd642 fwd="185.16.227.58" dyno=web.1 connect=1ms service=170ms status=200 bytes=2077 protocol=https
...lots of stack errors...
2019-02-19T10:16:14.079101+00:00 app[web.1]: sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection timed out
2019-02-19T10:16:14.079102+00:00 app[web.1]: Is the server running on host "192.168.10.162" and accepting
2019-02-19T10:16:14.079104+00:00 app[web.1]: TCP/IP connections on port 5432?
2019-02-19T10:16:14.079144+00:00 app[web.1]: (Background on this error at: http://sqlalche.me/e/e3q8)

【问题讨论】:

  • 您正试图让您的应用程序在 Heroku 上运行并连接到 本地 运行的 Postgres 数据库?我可以问为什么吗? Heroku 提供了its own hosted Postgres service that works out of the box,如果你因为某种原因不喜欢那个plenty of otheroptions
  • 无论如何,您将无法使用192.x.y.z IP 地址从网络外部连接到本地计算机。那是网络本地的。如果您确实有充分的理由这样做,您将需要一个静态 IP 地址或动态 DNS 域和端口转发或类似的。
  • 我正在努力降低成本,而且我对将公司信息放在云端感到不舒服。也许我很天真,但我认为将数据发送到数据库会很简单,即用其他东西替换 localhost badaboombadabing 嘿,它可以工作。什么是静态 IP 地址、动态 DNS 域、端口转发或类似的......我对这些一无所知,就像我在 OP 中所说的那样。你能指出任何关于这些的好资料或书籍吗?
  • 网络是一个很大的话题。基本上,您在问题中部分隐藏的 IP 地址在本地网络之外是不可见的。建立从本地网络到云端的传出连接相对容易,但反过来要复杂得多。从技术角度来看,在本地托管应用程序和在云中托管数据库会容易得多,但如果您不想这样做并且不希望云中的数据,我建议您在本地托管应用程序本身和您的数据库。但是您的用户也必须是本地用户。
  • @JeJe 我最终选择了 Heroku,而 Firebase 则用于其他一些应用程序,例如基于云的应用程序。走最多的路更容易。我听说有更便宜的替代品——digitalocean,但我还没有探索过。祝你好运

标签: postgresql heroku remote-access windows-firewall


【解决方案1】:

网络是一个很大的话题,但一般来说

  • 大型网络(如互联网)由较小的网络(如您的本地网络)组成
  • 通常无法从这些网络外部访问较小网络上的设备¹
  • 您部分显示的 IP 地址以 192 开头,我敢打赌下一个八位字节是 168,这意味着它是 private network,因此无法从 Internet 访问(例如,有那里有许多地址为192.168.1.10 的机器——这可以存在于任何专用网络上)
  • 如果您需要在本地网络上公开某些内容,例如 IP 地址为 192.168.1.10 的内容,您必须做一些额外的工作²

这里有一些选项:

  • 在云中托管您的数据库,例如使用Heroku's PostgreSQL service
  • 在内部托管您的 Web 服务,以便它可以使用其内部 192.168.x.y 地址连接到您的数据库
  • 与上一个选项一样在内部托管并将您的本地 Web 应用程序公开到 Internet,以便用户可以从您的网络外部访问它
  • 租用 VPS,以便您可以在网络之外进行托管,但对数据的存储方式保持一定程度的控制(并承担随之而来的管理开销和责任)

不会建议将 Web 应用程序留在网络之外,将数据库留在网络中,并将数据库暴露在 Internet 上。这样做没有什么价值,特别是因为Heroku's IP addresses change regularly 所以你不能轻易地锁定对你的应用程序的访问。最好的情况是,您将拥有一个只能通过 SSL 访问的公开数据库(这正是 Heroku 和其他提供商可以提供的),您必须自己管理。

传出连接相对容易,例如如果您想将本地网络上运行的 Web 服务连接到云中的数据库,但我认为这对您没有帮助。


¹This is a Good Thing™,因为它提供了一层保护,防止对您的个人设备的直接攻击。如果每次您等待几天在 Windows 上安装更新时,您的机器都被黑了,那不是很糟糕吗?

²例如在您的网络的公共 IP 地址上设置端口转发,例如 123.123.123.123,这样对 123.123.123.123:1234 的请求将被路由到您内部网络上的特定 IP 地址和端口,例如 192.168.1.10:5432 .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 2016-07-13
    • 2013-03-29
    • 2014-12-07
    • 1970-01-01
    • 2011-05-27
    • 2017-10-17
    相关资源
    最近更新 更多