본문 바로가기
DBMS

우분투 리눅스에 PostgreSQL 설치하고 원격접속 가능하게 하기

by developer's warehouse 2024. 6. 11.

오늘은 우분투 리눅스에 가장 유명한 오픈소스 RDBMS인 postgresql을 설치하고 DB 생성 및 사용자 생성을 하는 법을 빠르게 알아보도록 하겠습니다.

postgres 사용자 생성

~$ sudo useradd -d /home/postgres postgres
~$ sudo passwd postgres
새 암호:
잘못된 비밀번호: 암호에 사용자 이름이 있습니다
새 암호 다시 입력:
passwd: 암호를 성공적으로 업데이트했습니다
~$ sudo mkdir /home/postgres
~$ sudo chown postgres:postgres /home/postgres
~$ sudo addgroup postgres sudo
'postgres' 사용자를 'sudo' 그룹에 추가 중...
사용자 postgres을(를) sudo 그룹에 등록 중
완료.

 

시스템 업데이트

먼저 시스템을 업데이트합니다. 터미널을 열고 아래 명령을 수행해서 업데이트 하시면 됩니다.

상황에 따라 업데이트에 시간이 좀 걸릴 수 있습니다. 전 30분 넘게 걸린것 같습니다.

 

$ sudo apt update
[sudo] postgres 암호:
받기:1 https://packages.microsoft.com/repos/code stable InRelease [3,590 B]
기존:2 https://dl.winehq.org/wine-builds/ubuntu focal InRelease
받기:3 http://security.ubuntu.com/ubuntu jammy-security InRelease [129 kB]
무시:4 https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 InRelease
기존:5 http://kr.archive.ubuntu.com/ubuntu jammy InRelease
받기:6 http://kr.archive.ubuntu.com/ubuntu jammy-updates InRelease [128 kB]
기존:7 https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 Release
기존:9 https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu jammy InRelease
기존:10 http://kr.archive.ubuntu.com/ubuntu jammy-backports InRelease
받기:11 http://kr.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [1,718 kB]
받기:12 http://kr.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [1,086 kB]
받기:13 http://kr.archive.ubuntu.com/ubuntu jammy-updates/universe i386 Packages [706 kB]
받기:14 http://kr.archive.ubuntu.com/ubuntu jammy-updates/universe Translation-en [250 kB]
내려받기 4,020 k바이트, 소요시간 21초 (195 k바이트/초)
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다... 완료
상태 정보를 읽는 중입니다... 완료
149 패키지를 업그레이드할 수 있습니다. 확인하려면 'apt list --upgradable'를 실행하십시오.
W: https://dl.winehq.org/wine-builds/ubuntu/dists/focal/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(                                  8) for details.
$ sudo apt upgrade

....

gir1.2-gdm-1.0:amd64 (42.0-1ubuntu7.22.04.4) 설정하는 중입니다 ...
gir1.2-mutter-10:amd64 (42.9-0ubuntu8) 설정하는 중입니다 ...##############################################################################################################################################..]
gdm3 (42.0-1ubuntu7.22.04.4) 설정하는 중입니다 ...
Processing triggers for libc-bin (2.35-0ubuntu3.8) ...
$

 

 

 

PostgreSQL 설치

PostgreSQL과 패키지를 설치합니다. 다음의 명령어를 입력하세요

$ sudo apt install postgresql
[sudo] postgres 암호:
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다... 완료
상태 정보를 읽는 중입니다... 완료
다음 패키지가 자동으로 설치되었지만 더 이상 필요하지 않습니다:
  libpcap0.8:i386
'sudo apt autoremove'를 이용하여 제거하십시오.
다음의 추가 패키지가 설치될 것입니다 :
  libcommon-sense-perl libjson-perl libjson-xs-perl libllvm14 libpq5 libtypes-serialiser-perl postgresql-14 postgresql-client-14 postgresql-client-common postgresql-common sysstat
제안하는 패키지:
  postgresql-doc postgresql-doc-14 isag
다음 새 패키지를 설치할 것입니다:
  libcommon-sense-perl libjson-perl libjson-xs-perl libllvm14 libpq5 libtypes-serialiser-perl postgresql postgresql-14 postgresql-client-14 postgresql-client-common postgresql-common sysstat
0개 업그레이드, 12개 새로 설치, 0개 제거 및 3개 업그레이드 안 함.
42.4 M바이트 아카이브를 받아야 합니다.
이 작업 후 161 M바이트의 디스크 공간을 더 사용하게 됩니다.
계속 하시겠습니까? [Y/n] Y
받기:1 http://kr.archive.ubuntu.com/ubuntu jammy/main amd64 libcommon-sense-perl amd64 3.75-2build1 [21.1 kB]
받기:2 http://kr.archive.ubuntu.com/ubuntu jammy/main amd64 libjson-perl all 4.04000-1 [81.8 kB]
받기:3 http://kr.archive.ubuntu.com/ubuntu jammy/main amd64 libtypes-serialiser-perl all 1.01-1 [11.6 kB]
받기:4 http://kr.archive.ubuntu.com/ubuntu jammy/main amd64 libjson-xs-perl amd64 4.030-1build3 [87.2 kB]
...
Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/14/main ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Asia/Seoul
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
update-alternatives: using /usr/share/postgresql/14/man/man1/postmaster.1.gz to provide /usr/share/man/man1/postmaster.1.gz (postmaster.1.gz) in auto mode
postgresql (14+238) 설정하는 중입니다 ...
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for libc-bin (2.35-0ubuntu3.8) ...
$

 

 

설치 확인

설치가 완료되면 PostgreSQL 서비스가 자동으로 시작됩니다. psql 도구를 사용하여 PostgreSQL 데이터베이스 서버에 연결하고 서버 버전을 출력하여 설치를 확인합니다.

다음과 같은 명령을 수행해 보고 결과를 확인하시면 됩니다.

$ psql
psql (14.12 (Ubuntu 14.12-0ubuntu0.22.04.1))
Type "help" for help.

postgres=# select version();
                                                                version
----------------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 14.12 (Ubuntu 14.12-0ubuntu0.22.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit
(1 row)

postgres=#

 

사용자 및 데이터베이스 생성

PostgreSQL 사용자 및 데이터베이스를 생성합니다. createuser와 createdb는 PostgreSQL을 설치할 때 함께 설치된 유틸리티이므로, 쉘에서 바로 명령을 수행하시면 됩니다. psql에서 수행하는 것이 아니니 주의하세요.

postgres=# quit
$ which createuser
/usr/bin/createuser
$ createuser test
$ createdb testdb

 

데이터베이스의 사용자에게 사용 권한 부여

앞에서 만든 데이터베이스의 사용자에게 사용 권한을 부여합니다. test 사용자에게 testdb의 모든 권한을 부여하기 위해서 psql에 접속하고, 다음의 명령어를 입력하시면 됩니다.

$ psql
psql (14.12 (Ubuntu 14.12-0ubuntu0.22.04.1))
Type "help" for help.

postgres=# GRANT ALL PRIVILEGES ON DATABASE testdb to test;
GRANT
postgres=#

 

PostgreSQL 서버에 대한 원격 액세스 활성화

PostgreSQL 서버는 기본적으로 로컬 인터페이스 (127.0.0.1)에서만 수신 대기합니다. PostgreSQL Server에서 구성 파일 postgresql.conf를 열고 CONNECTIONS AND AUTHENTICATION 섹션에서 listen_addresses = '*'을 입력하셔야 원격 접속이 가능합니다.

일반적으로 우분투에서 패키지 설치를 하게되면 보통 /etc/postgresql/버전/main/postgresql.conf 경로에 위치합니다. 여기서 '버전’은 설치된 PostgreSQL의 버전을 나타냅니다.

저의경우 14버전이 설치되어 아래와 같이 파일이 존재합니다.

$ ls /etc/postgresql/14/main/
conf.d  environment  pg_ctl.conf  pg_hba.conf  pg_ident.conf  postgresql.conf  start.conf

 

여기서 postgresql.conf를 vi로 열어서 다음과 같이 편집합니다.

# - Connection Settings -

#listen_addresses = 'localhost'         # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5432                             # (change requires restart)
max_connections = 100                   # (change requires restart)
#superuser_reserved_connections = 3     # (change requires restart)
unix_socket_directories = '/var/run/postgresql' # comma-separated list of directories
                                        # (change requires restart)
#unix_socket_group = ''                 # (change requires restart)

 

위의 내용을 아래와 같이 수정합니다.

# - Connection Settings -

listen_addresses = '*'                  # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5432                             # (change requires restart)
max_connections = 100                   # (change requires restart)
#superuser_reserved_connections = 3     # (change requires restart)
unix_socket_directories = '/var/run/postgresql' # comma-separated list of directories
                                        # (change requires restart)
#unix_socket_group = ''                 # (change requires restart)

 

파일을 저장하고 PostgreSQL 서비스를 다시 시작하기 위해서 다음의 명령어를 수행합니다.

$ sudo service postgresql restart
[sudo] postgres 암호:
$

 

새로 생성한 계정 접속

위에서 생성한 test 계정으로 처음 접속하면 아래와 같이 에러가 발생합니다. 이 에러는 PostgreSQL에서 “test” 사용자로의 접속이 Peer 인증에 실패했음을 나타냅니다. Peer 인증은 클라이언트 프로세스가 데이터베이스에 연결하려는 사용자의 운영 체제 사용자 이름이 데이터베이스 사용자 이름과 일치하는지 확인하는 방법으로 기본 설정입니다.

$ psql -U test
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL:  Peer authentication failed for user "test"

 

이 문제를 해결하려면, PostgreSQL의 인증 설정 파일인 pg_hba.conf를 수정해야 합니다. pg_hba.conf의 경로도 앞서 설명드린 것처럼 /etc/postgresql/버전/main/ 디렉토리에 위치해 있습니다.

아래와 같이 pg_hba.conf를 vi로 열어서 local 커넥션 보다 이전 라인에 local all test trust의 한 줄을 입력해 줍니다. trust는 암호 없이 연결을 허용하는 연결 메소드 입니다.

md5로 바꾸시면 기본 password를 물어보고 접속을 허용합니다.

$ vi /etc/postgresql/14/main/pg_hba.conf
## pg_hba.conf 파일
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             test                                    trust
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
# IPv6 local connections:
host    all             all             ::1/128                 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer

 

자 이제 설정을 바꿨으면 재시작 한번 해주시고요, 아래 명령을 통해서 앞에서 만든 testdb에 test 계정으로 접속하고 버전을 확인해 보실 수 있습니다.

$ sudo service postgresql restart
$ psql -U test -d testdb
psql (14.12 (Ubuntu 14.12-0ubuntu0.22.04.1))
Type "help" for help.

testdb=> select * from version();
                                                                version
----------------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 14.12 (Ubuntu 14.12-0ubuntu0.22.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit
(1 row)

testdb=>
facebook twitter kakaoTalk kakaostory naver band shareLink