Ubuntu 24.04에 PostgreSQL 17 설치하고 외부 접속 허용하는 방법

Ubuntu 24.04 서버에 PostgreSQL 공식 저장소를 추가해 PostgreSQL 17을 설치하고, 외부 접속용 사용자와 데이터베이스를 만든 뒤, 내 PC에서만 접속할 수 있게 외부 접속 설정과 방화벽까지 …

Ubuntu 24.04PostgreSQL 17x86_64약 16분

검증된 문서입니다

클라우드 서버를 생성하여 이 문서의 명령을 처음부터 끝까지 그대로 실행하고 확인한 문서입니다.

운영체제
Ubuntu 24.04.5 LTS · x86_64
설치 버전
PostgreSQL 17.11 (17.11-1.pgdg24.04+2)
테스트 서버
DigitalOcean · 1 vCPU / 1 GB RAM / 25 GB SSD (s-1vcpu-1gb, sgp1)
마지막 확인
2026-10-09

이 문서에는 제휴 링크가 포함되어 있습니다. 링크를 통해 가입하면 코드샌드가 일정 수수료를 받을 수 있으며, 문서 내용과 평가에는 영향을 주지 않습니다.

Ubuntu 24.04 서버에 PostgreSQL 공식 저장소를 추가해 PostgreSQL 17을 설치하고, 외부 접속용 사용자와 데이터베이스를 만든 뒤, 내 PC에서만 접속할 수 있게 외부 접속 설정과 방화벽까지 설정합니다.

1. 준비물

  • Ubuntu 24.04 LTS 서버 1대 (메모리 1GB 이상 권장)
  • sudo 권한이 있는 계정으로 SSH 접속
  • 외부에서 접속할 PC의 공인 IP 주소 (예: 203.0.113.10)

서버가 없다면 DigitalOcean의 가장 작은 Droplet(1 vCPU · 1GB)을 생성해 보세요. 이 Droplet으로도 충분히 PostgreSQL 17을 설치할 수 있습니다. 이 문서의 모든 과정은 Droplet(1 vCPU · 1GB 메모리 · 25GB SSD · Ubuntu 24.04 · 싱가포르)으로 서버를 생성해 확인했습니다.

2. PostgreSQL 공식 저장소 추가

Ubuntu 24.04 기본 저장소에는 PostgreSQL 16만 있습니다. PostgreSQL 17은 PostgreSQL 공식 저장소(apt.postgresql.org)를 추가해 설치합니다. 먼저 저장소 추가 스크립트가 들어 있는 postgresql-common 패키지를 설치합니다.

sudo apt update
sudo apt install -y postgresql-common

저장소 추가 스크립트를 실행합니다. 스크립트는 저장소 서명 키와 저장소 주소를 등록하고 패키지 목록을 갱신합니다. -y 옵션은 「Press Enter to continue」 확인 질문 없이 진행한다는 뜻입니다.

sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y
This script will enable the PostgreSQL APT repository on apt.postgresql.org on
your system. The distribution codename used will be noble-pgdg.

Using keyring /usr/share/postgresql-common/pgdg/apt.postgresql.org.gpg
Writing /etc/apt/sources.list.d/pgdg.sources ...

Running apt-get update ...
Get:1 https://apt.postgresql.org/pub/repos/apt noble-pgdg InRelease [189 kB]
Get:3 https://apt.postgresql.org/pub/repos/apt noble-pgdg/main amd64 Packages [897 kB]

You can now start installing packages from apt.postgresql.org.

추가된 저장소 설정을 확인합니다.

cat /etc/apt/sources.list.d/pgdg.sources
Types: deb
URIs: https://apt.postgresql.org/pub/repos/apt
Suites: noble-pgdg
Components: main
Signed-By: /usr/share/postgresql-common/pgdg/apt.postgresql.org.gpg

3. PostgreSQL 17 설치

저장소 추가 스크립트가 패키지 목록을 이미 갱신했으므로 바로 설치합니다. 패키지 이름에 버전(17)을 붙여야 PostgreSQL 17이 설치됩니다.

sudo apt install -y postgresql-17

설치가 끝나면 설치된 버전을 확인합니다. 버전 뒤의 pgdg24.04는 공식 저장소에서 받은 Ubuntu 24.04용 패키지라는 뜻입니다.

psql --version
psql (PostgreSQL) 17.11 (Ubuntu 17.11-1.pgdg24.04+2)

4. 서비스 상태 확인

설치가 끝나면 기본 클러스터 17/main이 자동으로 만들어지고 5432 포트로 실행됩니다.

pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
17  main    5432 online postgres /var/lib/postgresql/17/main /var/log/postgresql/postgresql-17-main.log
sudo systemctl status postgresql@17-main --no-pager
● postgresql@17-main.service - PostgreSQL Cluster 17-main
     Loaded: loaded (/usr/lib/systemd/system/postgresql@.service; enabled-runtime; preset: enabled)
     Active: active (running) since Fri 2026-10-09 11:46:32 UTC; 12s ago

이제 PostgreSQL에 접속되는지 확인합니다. 설치 직후에는 리눅스 계정 postgres로만 접속할 수 있습니다.

sudo -u postgres psql -c "SELECT version();"
                                                                version
---------------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 17.11 (Ubuntu 17.11-1.pgdg24.04+2) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0, 64-bit
(1 row)

5. 기본 보안 설정 확인

외부 접속을 열기 전에 비밀번호 저장 방식과 접속 허용 규칙의 기본값을 확인합니다.

sudo -u postgres psql -c "SHOW password_encryption;"
 password_encryption
---------------------
 scram-sha-256
(1 row)

scram-sha-256은 비밀번호를 원문 대신 해시로 저장하고, 접속할 때도 비밀번호를 그대로 보내지 않는 방식입니다. 기본값이 이미 scram-sha-256이므로 바꿀 필요가 없습니다.

sudo grep -v -E '^#|^$' /etc/postgresql/17/main/pg_hba.conf
local   all             postgres                                peer
local   all             all                                     peer
host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             ::1/128                 scram-sha-256
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256

pg_hba.conf는 누가 어디서 접속할 수 있는지 정하는 파일입니다. local 줄은 서버 안의 소켓 접속으로, 리눅스 계정 이름과 DB 사용자 이름이 같아야 하는 peer 인증을 사용합니다. host 줄은 TCP 접속으로, 지금은 서버 자신의 주소(127.0.0.1, ::1)만 비밀번호로 허용합니다. 관리자 계정 postgres는 비밀번호가 없고 peer로만 접속할 수 있으므로 외부에서는 postgres로 접속할 수 없습니다. 이 상태를 유지하고 외부 접속은 아래에서 만드는 전용 사용자에게만 허용합니다.

6. 사용자와 데이터베이스 만들기

애플리케이션에서는 관리자 계정인 postgres 대신 전용 사용자로 접속하는 것이 안전합니다. 사용자 appuser와, 이 사용자가 소유하는 데이터베이스 appdb를 만듭니다. 비밀번호는 반드시 직접 정한 값으로 바꾸세요.

sudo -u postgres psql -c "CREATE ROLE appuser WITH LOGIN PASSWORD 'change-this-password';"
sudo -u postgres psql -c "CREATE DATABASE appdb OWNER appuser;"
CREATE ROLE
CREATE DATABASE

사용자가 만들어졌는지 확인합니다.

sudo -u postgres psql -c "\du"
                             List of roles
 Role name |                         Attributes
-----------+------------------------------------------------------------
 appuser   |
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS

비밀번호로 접속하려면 -h localhost를 붙여야 합니다. 이렇게 하면 TCP로 접속하여 비밀번호를 확인합니다.

psql -h localhost -U appuser -d appdb -c "\conninfo"
Password for user appuser:
You are connected to database "appdb" as user "appuser" on host "localhost" (address "::1") at port "5432".
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off, ALPN: postgresql)

7. 외부 접속 허용

기본 설정은 localhost 접속만 허용합니다. 외부 접속을 허용하기 위해서는 두 파일을 고쳐야 합니다.

먼저 postgresql.conf에서 외부 주소로도 접속을 받을 수 있도록 listen_addresses를 바꿉니다. '*'는 서버의 모든 주소에서 접속을 받는다는 뜻입니다.

sudo sed -i "s/^#listen_addresses = 'localhost'/listen_addresses = '*'/" /etc/postgresql/17/main/postgresql.conf
grep -n '^listen_addresses' /etc/postgresql/17/main/postgresql.conf
60:listen_addresses = '*'		# what IP address(es) to listen on;

다음으로 pg_hba.conf에 접속을 허용할 IP, 사용자, 데이터베이스를 한 줄로 추가합니다. 203.0.113.10은 접속할 PC의 공인 IP로 바꾸세요.

echo 'host    appdb    appuser    203.0.113.10/32    scram-sha-256' | sudo tee -a /etc/postgresql/17/main/pg_hba.conf
sudo systemctl restart postgresql
host    appdb    appuser    203.0.113.10/32    scram-sha-256

5432 포트가 외부 주소에서도 열렸는지 확인합니다. 0.0.0.0:5432가 보이면 정상입니다.

sudo ss -tlnp | grep 5432
LISTEN 0      200          0.0.0.0:5432      0.0.0.0:*    users:(("postgres",pid=6081,fd=6))
LISTEN 0      200             [::]:5432         [::]:*    users:(("postgres",pid=6081,fd=7))

8. 방화벽(ufw) 설정

PostgreSQL 설정과 별도로 방화벽에서도 내 PC의 IP만 5432 포트에 접속할 수 있게 허용합니다. 방화벽을 켜기 전에 반드시 SSH를 먼저 허용하세요. SSH를 허용하지 않고 방화벽을 켜면 서버 접속이 끊어집니다. --force는 확인 질문 없이 방화벽을 켜는 옵션입니다.

sudo ufw allow OpenSSH
sudo ufw allow from 203.0.113.10 to any port 5432 proto tcp
sudo ufw --force enable
sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
5432/tcp                   ALLOW       203.0.113.10
OpenSSH (v6)               ALLOW       Anywhere (v6)

9. 내 PC에서 접속 확인

PC에 psql이 없다면 Docker로 PostgreSQL 클라이언트를 실행해 접속할 수 있습니다. 203.0.113.20은 서버의 IP로 바꾸세요. --rm 옵션을 붙였기 때문에 접속을 끝내면 컨테이너는 자동으로 삭제됩니다. -it는 비밀번호를 입력할 수 있도록 터미널을 연결하는 옵션입니다.

docker run --rm -it postgres:17-alpine psql -h 203.0.113.20 -U appuser -d appdb -c "\conninfo"
Password for user appuser:
You are connected to database "appdb" as user "appuser" on host "203.0.113.20" at port "5432".
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off, ALPN: postgresql)

출력의 SSL connection (protocol: TLSv1.3 …)은 접속이 암호화되었다는 뜻입니다. 공식 저장소의 PostgreSQL 패키지도 설치할 때 자체 서명 인증서로 SSL을 기본으로 켜 둡니다.

10. 문제 해결

FATAL: Peer authentication failed for user "appuser"

-h 없이 접속하면 peer 인증을 사용하기 때문에 이 오류가 납니다. psql -h localhost -U appuser -d appdb처럼 -h localhost를 붙이면 비밀번호로 접속할 수 있습니다.

connection to server at "203.0.113.20", port 5432 failed: Connection refused

PostgreSQL이 외부 주소에서 접속을 받지 않고 있다는 뜻입니다. listen_addresses를 바꾸기 전에 외부에서 접속하면 이 오류가 납니다. grep -n '^listen_addresses' /etc/postgresql/17/main/postgresql.conf로 '*'인지 확인하고, 바꾼 뒤에 sudo systemctl restart postgresql을 실행했는지 확인하세요.

FATAL: no pg_hba.conf entry for host "203.0.113.10", user "postgres", database "appdb", SSL encryption

접속한 IP, 사용자, 데이터베이스 조합이 pg_hba.conf에 없다는 뜻입니다. 이 문서에서는 appuser가 appdb에 접속하는 것만 허용했기 때문에, postgres로 외부에서 접속하면 이 오류가 나는 것이 정상입니다. 같은 오류가 SSL encryption과 no encryption으로 두 번 표시되는 것은 클라이언트가 암호화 접속이 거부되자 암호화 없이 한 번 더 시도했기 때문입니다.

FATAL: password authentication failed for user "appuser"

비밀번호가 틀렸다는 뜻입니다. 6단계에서 CREATE ROLE에 적은 비밀번호를 입력했는지 확인하세요.

11. 삭제하기

PostgreSQL과 데이터를 모두 삭제하려면 아래 명령을 실행합니다. 데이터베이스 파일까지 모두 삭제되므로 필요한 데이터는 먼저 pg_dump로 백업하세요.

sudo DEBIAN_FRONTEND=noninteractive apt purge -y postgresql-17 postgresql-client-17 postgresql-common postgresql-client-common
sudo apt autoremove -y
sudo rm -rf /var/lib/postgresql /etc/postgresql

DEBIAN_FRONTEND=noninteractive는 패키지를 삭제하는 동안 설정 질문을 표시하지 않고 기본값으로 진행하는 옵션입니다. 이 옵션 없이 실행하면 Remove PostgreSQL directories when package is purged?라는 질문이 표시됩니다. 데이터 디렉터리는 다음 줄의 rm -rf로 삭제합니다.

2단계에서 추가한 공식 저장소도 삭제하고 패키지 목록을 갱신합니다.

sudo rm /etc/apt/sources.list.d/pgdg.sources
sudo apt update

방화벽에 추가한 5432 포트 규칙도 삭제합니다.

sudo ufw delete allow from 203.0.113.10 to any port 5432 proto tcp
Rule deleted

PostgreSQL 패키지가 남아 있지 않은지 확인합니다. 0이 표시되면 모두 삭제된 것입니다.

dpkg -l | grep -c postgresql
0

직접 해 보기

서버가 없다면 아래 업체에서 몇 분이면 Ubuntu 서버를 만들 수 있습니다. 이 문서는 DigitalOcean 에서 검증했습니다.