Decidi dar um passo atrás para ver se consigo me conectar ao banco de dados sem expor nenhuma porta. 
Se eu entrar no container, vejo isso:
# 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
Se eu sair do container e estiver no meu servidor remoto (ainda não no meu computador local), não deveria conseguir me conectar usando isso?
/var/discourse# psql -h localhost -d discourse -U postgres
O problema é que recebo uma solicitação de senha. Como o usuário postgres não tem senha, tentei criar um usuário diferente e atribuir uma senha a ele:
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;
Adicionei uma linha para esse usuário com md5 no pg_hba.conf e reiniciei o PG com service postgresql restart
# Database administrative login by Unix domain socket
local all postgres peer
local all whatever_user md5
No entanto, ao tentar me conectar a partir do servidor remoto, recebo uma falha de autenticação:
# 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"
O que estou esquecendo? Estou tentando, pelo menos, conseguir me conectar ao banco de dados a partir do mesmo servidor. O passo 2 seria fazer o mesmo usando um túnel SSH, mas acho que preciso resolver o passo 1 primeiro. Qualquer ajuda é bem-vinda.