검증된 문서입니다
클라우드 서버를 생성하여 이 문서의 명령을 처음부터 끝까지 그대로 실행하고 확인한 문서입니다.
- 운영체제
- Ubuntu 24.04.5 LTS · x86_64
- 설치 버전
- PostgreSQL 18.6 (18.6-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 18을 설치하고, 외부 접속용 사용자와 데이터베이스를 만든 뒤, 내 PC에서만 접속할 수 있게 외부 접속 설정과 방화벽까지 설정합니다.
1. 준비물
- Ubuntu 24.04 LTS 서버 1대 (메모리 1GB 이상 권장)
sudo권한이 있는 계정으로 SSH 접속- 외부에서 접속할 PC의 공인 IP 주소 (예:
203.0.113.10)
서버가 없다면 DigitalOcean의 가장 작은 Droplet(1 vCPU · 1GB)을 생성해 보세요. 이 Droplet으로도 충분히 PostgreSQL 18을 설치할 수 있습니다. 이 문서의 모든 과정은 Droplet(1 vCPU · 1GB 메모리 · 25GB SSD · Ubuntu 24.04 · 싱가포르)으로 서버를 생성해 확인했습니다.
2. PostgreSQL 공식 저장소 추가
Ubuntu 24.04 기본 저장소에는 PostgreSQL 16만 있습니다. PostgreSQL 18은 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 -yThis 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:2 https://apt.postgresql.org/pub/repos/apt noble-pgdg InRelease [189 kB]
Get:5 https://apt.postgresql.org/pub/repos/apt noble-pgdg/main amd64 Packages [897 kB]
You can now start installing packages from apt.postgresql.org.3. PostgreSQL 18 설치
저장소 추가 스크립트가 패키지 목록을 이미 갱신했으므로 바로 설치합니다. 패키지 이름에 버전(18)을 붙여야 PostgreSQL 18이 설치됩니다.
sudo apt install -y postgresql-18Creating new PostgreSQL cluster 18/main ...
/usr/lib/postgresql/18/bin/initdb -D /var/lib/postgresql/18/main --auth-local peer --auth-host scram-sha-256 --no-instructions
Data page checksums are enabled.설치 중에 기본 클러스터를 만드는 출력이 표시됩니다. Data page checksums are enabled.는 데이터 페이지 체크섬이 켜졌다는 뜻입니다. 데이터 페이지 체크섬은 디스크에서 데이터를 읽을 때 저장된 내용이 손상되지 않았는지 검사하는 기능입니다. 같은 방법으로 PostgreSQL 17을 설치하면 Data page checksums are disabled.로 표시되며, 18부터 기본으로 켜집니다.
설치가 끝나면 설치된 버전을 확인합니다. 버전 뒤의 pgdg24.04는 공식 저장소에서 받은 Ubuntu 24.04용 패키지라는 뜻입니다.
psql --versionpsql (PostgreSQL) 18.6 (Ubuntu 18.6-1.pgdg24.04+2)4. 서비스 상태 확인
설치가 끝나면 기본 클러스터 18/main이 자동으로 만들어지고 5432 포트로 실행됩니다.
pg_lsclustersVer Cluster Port Status Owner Data directory Log file
18 main 5432 online postgres /var/lib/postgresql/18/main /var/log/postgresql/postgresql-18-main.logsudo systemctl status postgresql@18-main --no-pager● postgresql@18-main.service - PostgreSQL Cluster 18-main
Loaded: loaded (/usr/lib/systemd/system/postgresql@.service; enabled-runtime; preset: enabled)
Active: active (running) since Fri 2026-10-09 11:56:30 UTC; 10s ago
├─5646 "postgres: 18/main: io worker 0"
├─5647 "postgres: 18/main: io worker 1"
├─5648 "postgres: 18/main: io worker 2"프로세스 목록에 io worker가 3개 보입니다. PostgreSQL 18에 추가된 비동기 I/O 기능의 작업 프로세스입니다. 이 방식은 io_method 설정으로 정해지며, 기본값은 worker입니다.
sudo -u postgres psql -c "SHOW io_method;" io_method
-----------
worker
(1 row)이제 PostgreSQL에 접속되는지 확인합니다. 설치 직후에는 리눅스 계정 postgres로만 접속할 수 있습니다.
sudo -u postgres psql -c "SELECT version();" version
-------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 18.6 (Ubuntu 18.6-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)데이터 페이지 체크섬이 켜져 있는지도 확인합니다.
sudo -u postgres psql -c "SHOW data_checksums;" data_checksums
----------------
on
(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/18/main/pg_hba.conflocal 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-256pg_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:
Connection Information
Parameter | Value
----------------------+------------------------
Database | appdb
Client User | appuser
Host | localhost
Host Address | ::1
Server Port | 5432
Options |
Protocol Version | 3.0
Password Used | true
GSSAPI Authenticated | false
Backend PID | 5979
SSL Connection | true
SSL Library | OpenSSL
SSL Protocol | TLSv1.3
SSL Key Bits | 256
SSL Cipher | TLS_AES_256_GCM_SHA384
SSL Compression | false
ALPN | postgresql
Superuser | off
Hot Standby | off
(19 rows)PostgreSQL 18의 psql은 \conninfo 결과를 표로 보여 줍니다. Password Used가 true이면 비밀번호로 접속한 것이고, SSL Connection이 true이면 접속이 암호화된 것입니다.
7. 외부 접속 허용
기본 설정은 localhost 접속만 허용합니다. 외부 접속을 허용하기 위해서는 두 파일을 고쳐야 합니다.
먼저 postgresql.conf에서 외부 주소로도 접속을 받을 수 있도록 listen_addresses를 바꿉니다. '*'는 서버의 모든 주소에서 접속을 받는다는 뜻입니다.
sudo sed -i "s/^#listen_addresses = 'localhost'/listen_addresses = '*'/" /etc/postgresql/18/main/postgresql.conf
grep -n '^listen_addresses' /etc/postgresql/18/main/postgresql.conf60: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/18/main/pg_hba.conf
sudo systemctl restart postgresqlhost appdb appuser 203.0.113.10/32 scram-sha-2565432 포트가 외부 주소에서도 열렸는지 확인합니다. 0.0.0.0:5432가 보이면 정상입니다.
sudo ss -tlnp | grep 5432LISTEN 0 200 0.0.0.0:5432 0.0.0.0:* users:(("postgres",pid=6112,fd=6))
LISTEN 0 200 [::]:5432 [::]:* users:(("postgres",pid=6112,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 statusStatus: 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:18-alpine psql -h 203.0.113.20 -U appuser -d appdb -c "SELECT current_user, inet_server_port(), ssl FROM pg_stat_ssl WHERE pid = pg_backend_pid();"Password for user appuser:
current_user | inet_server_port | ssl
--------------+------------------+-----
appuser | 5432 | t
(1 row)current_user가 appuser이면 외부 접속이 정상입니다. ssl의 t(true)는 지금 접속이 암호화되었다는 뜻입니다. 공식 저장소의 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/18/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-18 postgresql-client-18 postgresql-common postgresql-client-common
sudo apt autoremove -y
sudo rm -rf /var/lib/postgresql /etc/postgresqlDEBIAN_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 tcpRule deletedPostgreSQL 패키지가 남아 있지 않은지 확인합니다. 0이 표시되면 모두 삭제된 것입니다.
dpkg -l | grep -c postgresql0직접 해 보기
서버가 없다면 아래 업체에서 몇 분이면 Ubuntu 서버를 만들 수 있습니다. 이 문서는 DigitalOcean 에서 검증했습니다.
이 문서가 도움이 됐나요? 틀린 곳이나 바뀐 내용이 있으면 알려 주세요.
내용 정정 요청