Я решил немного отступить и посмотреть, смогу ли я подключиться к базе данных, не открывая никаких портов. 
Если я войду в контейнер, то увижу следующее:
# 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
Если я выйду из контейнера и окажусь на своём удалённом сервере (пока ещё не на локальном компьютере), разве я не должен иметь возможность подключиться с помощью этой команды?
/var/discourse# psql -h localhost -d discourse -U postgres
Проблема в том, что появляется запрос пароля. Поскольку у пользователя postgres пароля нет, я попытался создать другого пользователя и назначить ему пароль:
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;
Я добавил строку для этого пользователя с методом md5 в файл pg_hba.conf и перезапустил PostgreSQL командой service postgresql restart:
# Database administrative login by Unix domain socket
local all postgres peer
local all whatever_user md5
Однако при попытке подключиться с удалённого сервера я получаю ошибку аутентификации:
# 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"
Что я упускаю? Я хотя бы хочу иметь возможность подключаться к базе данных с того же сервера. Шаг 2 — сделать то же самое через SSH-туннель, но, думаю, сначала нужно разобраться с первым шагом. Буду благодарен за любую помощь.