어떤 핵심 개념을 놓치고 있는 것 같습니다. 커스텀 포트를 통해 ssh로 연결한 뒤 su postgres -c 'psql discourse'를 실행하면 아무 문제 없이 작동하기 때문입니다. 이 2단계 방식은 모두 정상적으로 작동하지만, pgAdmin과 같은 도구를 통해 직접 연결하려면 약간 다른 설정이 필요할 것 같습니다.
app.yml 파일의 상단 근처에서 80번과 443번 포트가 열려 있는 것을 볼 수 있습니다. PostgreSQL용 5432 포트에 대한 한 줄을 더 추가할 수 있습니다.
그러나 이는 대부분 매우 나쁜 아이디어입니다. 데이터베이스가 로컬 연결만 허용하던 것에서 인터넷 전체에 노출되게 됩니다.
가끔씩 보고서를 작성할 필요가 있다면, Data Explorer에서 몇 가지 CSV 파일을 다운로드하여 좋아하는 도구에 로드하는 것만으로 충분할 수 있습니다. Discourse 백업(업로드 제외)을 다운로드할 수도 있으며, 이는 표준 PostgreSQL 덤프 형식입니다. 이를 손에 넣으면 로컬 PostgreSQL 인스턴스로 복원하여 분석할 수 있습니다.
네, 앱 도커 컨테이너에서 연결하는 데는 문제가 없습니다. 제 문제는 로컬 머신에서(예를 들어 pgAdmin을 사용하려고 할 때) 또는 Stitch와 같은 클라우드 데이터 프로세서에서 PostgreSQL DB에 직접 연결하는 것입니다. 이 두 가지 모두 호스트 IP 주소와 SSH 자격 증명을 요구하지만, 작동하게 만드는 데 실패했습니다(위에서 보여 드린 오류가 발생합니다).
제가 할 수 있는 유일한 방법은 docker-ssh를 사용하여 로컬 컴퓨터에서 launcher enter app을 실행하지 않고도 공개 키(publicKey)를 통해 앱 도커 컨테이너에 직접 접근하는 것입니다. 하지만 여전히 DB에 접근하려면 su postgres 'psql discourse'를 실행해야 하며, 이것이 pgAdmin/Stitch의 문제라고 추정합니다. 이 도구들은 직접 연결을 기대하기 때문입니다.
문제는 비밀번호 프롬프트가 표시된다는 것입니다. 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;
pg_hba.conf 파일에 해당 사용자를 위한 md5 인증 라인을 추가하고 service postgresql restart 명령으로 PG를 재시작했습니다.
# 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"
무엇을 놓치고 있는 걸까요? 우선 같은 서버에서 DB에 연결할 수 있도록 하는 것이 목표입니다. 다음 단계로는 SSH 터널을 사용하여 동일한 작업을 수행할 계획이지만, 먼저 1단계부터 해결해야 할 것 같습니다. 도움이 주시면 감사하겠습니다.
포트가 이미 사용 중이라는 오류가 발생해서 다음과 같이 변경했어요: - "127.0.0.1:5433:5432"
컨테이너를 다시 빌드하고 포트가 실제로 열려 있는지 확인했습니다:
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
whatever_id local_discourse/app "/sbin/boot" 20 minutes ago Up 20 minutes 127.0.0.1:5433->5432/tcp app
이제 SSH 터널을 생성하고 비밀번호가 있는 사용자로 원격 서버에서 연결할 수 있습니다:
# 터널 생성 (ssh -f 옵션을 사용하면 백그라운드에서 실행할 수도 있습니다)
ssh -v -N -L 5433:localhost:5433 SERVER_IP_ADDRESS
# 다른 탭에서 연결하고 비밀번호 입력
psql -h localhost -d discourse -U whatever_user -p 5433