Heroku - PostgreSQL - Как удаленно подключиться к Windows - PullRequest
0 голосов
/ 19 февраля 2019

До того, как я получу ссылки, я знаю, что есть много похожих сообщений, но я прочитал их и использовал их, чтобы добраться до этой точки, но я не думаю, что они отвечают на мой вопрос.

Обзор

Я пытаюсь подключить свой сайт Heroku тестера [EDIT: удален] к моей базе данных PostgreSQL.Ранее я пробовал MS Server, но у меня Windows, и Heroku не понравился pyodbc.

Короткая версия

Я почти уверен, что мой PostgreSQL настроен правильно, но я пытаюсь определить,У меня есть правильное имя хоста для URL-адреса PostgreSQL, и если мне нужно сделать что-то еще с точки зрения разрешения доступа через брандмауэр Windows.

Длинная версия

PostgreSQL


После принятого ответа Как разрешить удаленный доступ к базе данных PostgreSQL my postgresql.conf имеет listen_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-адрес (найден при запуске> поменяй настройки Ethernet> 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 и тот же IPv4-адрес, что и выше 192.XXX.XX.XXX и 192.XXX.XX.XXX:5432.

В разделе «Журналы» ниже приведены настройки netstat, heroku, перезапуски postgresql для каждой из этих попыток, выполняемых в git bash, но я получаю следующее с двумя 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 Logs


Попытка № 1 - локальный хост, ошибка результата


$ 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)

1 Ответ

0 голосов
/ 20 февраля 2019

Сеть - это большая тема, но, вообще говоря,

  • большие сети (например, Интернет) состоят из небольших сетей (например, вашей локальной сети)
  • устройств в небольших сетяхобычно не доступны извне этих сетей¹
  • IP-адрес, который вы частично показали, начинается с 192, и я уверен, что следующий октет будет 168, что означает, что это частная сеть и, следовательно, не могут быть доступны из Интернета (например, есть много машин с адресом 192.168.1.10 - это может существовать в любой частной сети)
  • , если вам нужно что-то раскрытьв вашей локальной сети, например, с IP-адресом 192.168.1.10, вы должны проделать дополнительную работу²

Вот несколько вариантов:

  • Разместите вашу базу данных воблако, например, с использованием службы Heroku PostgreSQL
  • Внутреннее размещение веб-службы, чтобы она могла подключаться к вашей базе данных с использованием своего внутреннего 192.168.x.y адреса
  • Hos• внутренне, как в предыдущем варианте, и доступ к локальному веб-приложению в Интернете, чтобы пользователи могли получить к нему доступ из-за пределов вашей сети.
  • Арендуйте VPS, чтобы вы могли размещаться за пределами вашей сети, но при этом сохраняли контроль над тем, какВаши данные хранятся (и примите административные накладные расходы и ответственность, которые с этим связаны)

Я не предложит оставить веб-приложение вне вашей сети, вашу базу данных внутри вашей сетии выставление базы данных в Интернет.Делать это очень мало, особенно если учесть, что IP-адреса Heroku регулярно меняются , поэтому вы не можете легко заблокировать доступ к своему приложению.В лучшем случае у вас будет общедоступная база данных, доступная только через SSL (именно то, что может предложить Heroku и другие провайдеры), которую вам придется администрировать самостоятельно.

Исходящие соединения относительно просты, например, если вы хотелиподключить веб-сервис, работающий в вашей локальной сети, к базе данных в облаке, но я не думаю, что это поможет вам.


¹Это Good Thing ™, поскольку он обеспечивает уровень защиты отпрямые атаки на ваши личные устройства.Разве это не было бы ужасно, если бы ваша машина была взломана каждый раз, когда вы ждали несколько дней, чтобы установить обновления для Windows?

«Например, можно настроить переадресацию портов на публичный IP-адрес вашей сети, скажем, 123.123.123.123такие, что запросы к 123.123.123.123:1234 направляются на определенный IP-адрес и порт вашей внутренней сети, например 192.168.1.10:5432.

...