검증된 문서입니다
클라우드 서버를 생성하여 이 문서의 명령을 처음부터 끝까지 그대로 실행하고 확인한 문서입니다.
- 운영체제
- Ubuntu 24.04.5 LTS · x86_64
- 설치 버전
- PostgreSQL 16.15 (16.15-0ubuntu0.24.04.1)
- 테스트 서버
- DigitalOcean · 1 vCPU / 1 GB RAM / 25 GB SSD (s-1vcpu-1gb, sgp1)
- 마지막 확인
- 2026-10-09
이 문서에는 제휴 링크가 포함되어 있습니다. 링크를 통해 가입하면 코드샌드가 일정 수수료를 받을 수 있으며, 문서 내용과 평가에는 영향을 주지 않습니다.
Ubuntu 24.04 서버에 PostgreSQL 16을 설치하고, 외부 접속용 사용자와 데이터베이스를 만든 뒤, 내 PC에서만 접속할 수 있게 외부 접속 설정과 방화벽까지 설정합니다.
1. 준비물
- Ubuntu 24.04 LTS 서버 1대 (메모리 1GB 이상 권장)
sudo권한이 있는 계정으로 SSH 접속- 외부에서 접속할 PC의 공인 IP 주소 (예:
203.0.113.10)
서버가 없다면 DigitalOcean의 가장 작은 Droplet(1 vCPU · 1GB)을 생성해 보세요. 이 Droplet으로도 충분히 PostgreSQL 16을 설치할 수 있습니다. 이 문서의 모든 과정은 Droplet(1 vCPU · 1GB 메모리 · 25GB SSD · Ubuntu 24.04 · 싱가포르)으로 서버를 생성해 확인했습니다.
2. PostgreSQL 설치
Ubuntu 24.04 기본 저장소에는 PostgreSQL 16이 포함되어 있습니다. 패키지 목록을 갱신한 뒤 설치합니다.
sudo apt update
sudo apt install -y postgresql postgresql-contrib설치가 끝나면 설치된 버전을 확인합니다.
psql --versionpsql (PostgreSQL) 16.15 (Ubuntu 16.15-0ubuntu0.24.04.1)3. 서비스 상태 확인
설치가 끝나면 기본 클러스터 16/main이 자동으로 만들어지고 5432 포트로 실행됩니다.
pg_lsclustersVer Cluster Port Status Owner Data directory Log file
16 main 5432 online postgres /var/lib/postgresql/16/main /var/log/postgresql/postgresql-16-main.logsudo systemctl status postgresql@16-main --no-pager● postgresql@16-main.service - PostgreSQL Cluster 16-main
Loaded: loaded (/usr/lib/systemd/system/postgresql@.service; enabled-runtime; preset: enabled)
Active: active (running) since Fri 2026-10-09 10:42:19 UTC; 20s ago이제 PostgreSQL에 접속되는지 확인합니다. 설치 직후에는 리눅스 계정 postgres로만 접속할 수 있습니다.
sudo -u postgres psql -c "SELECT version();" version
------------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 16.15 (Ubuntu 16.15-0ubuntu0.24.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0, 64-bit
(1 row)4. 사용자와 데이터베이스 만들기
애플리케이션에서는 관리자 계정인 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 RLS5. 서버에서 접속 확인
비밀번호로 접속하려면 -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)6. 외부 접속 허용
기본 설정은 localhost 접속만 허용합니다. 모든 외부접속을 허용하기 위해서는 두 파일을 고쳐야 합니다.
먼저 postgresql.conf에서 외부 주소로도 접속을 받을 수 있도록 listen_addresses를 바꿉니다.
sudo sed -i "s/^#listen_addresses = 'localhost'/listen_addresses = '*'/" /etc/postgresql/16/main/postgresql.conf
grep -n '^listen_addresses' /etc/postgresql/16/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/16/main/pg_hba.conf
sudo systemctl restart postgresql5432 포트가 외부 주소에서도 열렸는지 확인합니다. 0.0.0.0:5432가 보이면 정상입니다.
sudo ss -tlnp | grep 5432LISTEN 0 200 0.0.0.0:5432 0.0.0.0:* users:(("postgres",pid=4188,fd=6))
LISTEN 0 200 [::]:5432 [::]:* users:(("postgres",pid=4188,fd=7))7. 방화벽(ufw) 설정
PostgreSQL 설정과 별도로 방화벽에서도 내 PC의 IP만 5432 포트에 접속할 수 있게 허용합니다. 방화벽을 켜기 전에 반드시 SSH를 먼저 허용하세요. SSH를 허용하지 않고 방화벽을 켜면 서버 접속이 끊어집니다.
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)8. 내 PC에서 접속 확인
PC에 psql이 설치되어 있다면 서버의 공인 IP로 접속합니다. 203.0.113.20은 서버의 IP로 바꾸세요.
psql -h 203.0.113.20 -U appuser -d appdb -c "\conninfo"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)PC에 psql이 없다면 Docker로 PostgreSQL 클라이언트를 실행해 접속할 수 있습니다. --rm 옵션을 붙였기 때문에 접속을 끝내면 컨테이너는 자동으로 삭제됩니다.
docker run --rm -it postgres:16-alpine psql -h 203.0.113.20 -U appuser -d appdb출력의 SSL connection (protocol: TLSv1.3 …)은 접속이 암호화되었다는 뜻입니다. Ubuntu의 PostgreSQL 패키지는 설치할 때 자체 서명 인증서로 SSL을 기본으로 켜 둡니다.
9. 문제 해결
E: Could not get lock /var/lib/apt/lists/lock. It is held by process … (apt-get)
서버를 만든 지 얼마 안 되었다면 cloud-init과 자동 업데이트가 apt를 사용 중이라 이 오류가 납니다. cloud-init status --wait로 작업이 끝날 때까지 기다린 뒤 다시 실행하세요. 잠금 파일을 직접 지우면 패키지 데이터베이스가 손상될 수 있으니 지우지 마세요.
FATAL: Peer authentication failed for user "appuser"
-h 없이 접속하면 peer 인증을 사용하기 때문에 이 오류가 납니다. psql -h localhost -U appuser -d appdb처럼 -h localhost를 붙이면 비밀번호로 접속할 수 있습니다.
FATAL: no pg_hba.conf entry for host "203.0.113.10", user "postgres", database "appdb"
접속한 IP, 사용자, 데이터베이스 조합이 pg_hba.conf에 없다는 뜻입니다. 이 문서에서는 appuser가 appdb에 접속하는 것만 허용했기 때문에, postgres로 외부에서 접속하면 이 오류가 나는 것이 정상입니다. 다른 사용자나 데이터베이스도 허용하려면 pg_hba.conf에 줄을 추가하고 sudo systemctl reload postgresql을 실행하세요.
외부에서 접속하면 응답 없이 시간 초과(timeout)가 납니다
방화벽에서 접속을 막고 있는 경우입니다. sudo ufw status에 내 PC의 IP가 있는지, 집이나 회사의 공인 IP가 바뀌지 않았는지 확인하세요. 클라우드 업체의 방화벽(DigitalOcean Cloud Firewall, AWS 보안 그룹 등)을 함께 사용한다면 그곳에서도 5432 포트를 허용해야 합니다.
10. 삭제하기
PostgreSQL과 데이터를 모두 삭제하려면 아래 명령을 실행합니다. 데이터베이스 파일까지 모두 삭제되므로 필요한 데이터는 먼저 pg_dump로 백업하세요.
sudo apt purge -y 'postgresql*'
sudo rm -rf /var/lib/postgresql /etc/postgresql
sudo ufw delete allow from 203.0.113.10 to any port 5432 proto tcp직접 해 보기
서버가 없다면 아래 업체에서 몇 분이면 Ubuntu 서버를 만들 수 있습니다. 이 문서는 DigitalOcean 에서 검증했습니다.
이 문서가 도움이 됐나요? 틀린 곳이나 바뀐 내용이 있으면 알려 주세요.
내용 정정 요청