RHEL 7 은 PGDG 저장소에서 PostgreSQL 16 RPM 을 제공하지 않는다. RHEL 7 용으로 받을 수 있는 최신 계열은 15 이며(글 작성 시점 마이너 15.15), EOL 은 2027 년 11 월이다. 16 이상이 필요하면 OS 를 올리거나 소스 빌드로 가야 한다.
mkdir -p ~/pg15-rpms && cd ~/pg15-rpms
BASE=https://download.postgresql.org/pub/repos/yum/15/redhat/rhel-7-x86_64
PGV=15.15-4PGDG.rhel7
wget ${BASE}/postgresql15-libs-${PGV}.x86_64.rpm
wget ${BASE}/postgresql15-${PGV}.x86_64.rpm
wget ${BASE}/postgresql15-server-${PGV}.x86_64.rpm
wget ${BASE}/postgresql15-contrib-${PGV}.x86_64.rpm
sudo yum localinstall -y postgresql15-libs-*.rpm postgresql15-15.*.rpm \
postgresql15-server-*.rpm postgresql15-contrib-*.rpm
libicu 등 의존성은 RHEL 7.9 기본 저장소에서 끌어온다. 인터넷이 되는 환경이면 PGDG repo RPM 을 설치해 yum install postgresql15-server 로 받는 편이 간단하다.
설치 경로는 다음과 같다.
| 항목 | 경로 |
|---|---|
| 바이너리 | /usr/pgsql-15/bin/ |
| systemd 유닛 | /usr/lib/systemd/system/postgresql-15.service |
| 기본 PGDATA | /var/lib/pgsql/15/data |
sudo mkdir -p /data/pgdata
sudo chown postgres:postgres /data/pgdata
sudo chmod 700 /data/pgdata
sudo mkdir -p /etc/systemd/system/postgresql-15.service.d
sudo tee /etc/systemd/system/postgresql-15.service.d/override.conf > /dev/null <<'EOT'
[Service]
Environment=PGDATA=/data/pgdata
EOT
sudo systemctl daemon-reload
initdb 는 PGSETUP_INITDB_OPTIONS 로 옵션을 넘기는데, sudo 는 기본적으로 환경변수를 전달하지 않으므로 sudo env 를 쓴다.
sudo env PGSETUP_INITDB_OPTIONS="-E UTF8 --locale=en_US.UTF-8 --data-checksums" \
/usr/pgsql-15/bin/postgresql-15-setup initdb
sudo systemctl enable --now postgresql-15
sudo systemctl status postgresql-15
--locale=C.UTF-8 은 RHEL 7 의 glibc 에 없어 실패한다. en_US.UTF-8 또는 ko_KR.UTF-8 을 쓴다. SELinux 가 enforcing 이면 새 경로에 컨텍스트를 붙여야 한다.
sudo semanage fcontext -a -t postgresql_db_t "/data/pgdata(/.*)?"
sudo restorecon -Rv /data/pgdata
sudo -u postgres vi /data/pgdata/postgresql.conf # listen_addresses = '*'
sudo -u postgres vi /data/pgdata/pg_hba.conf # host all all 10.0.0.0/8 md5
sudo systemctl reload postgresql-15
OS 사용자와 PostgreSQL 롤은 별개다. md5 인증은 TCP 접속 시 DB 롤명과 비밀번호로 검증하므로 OS 사용자와 이름이 달라도 된다.
CREATE ROLE app_owner WITH LOGIN;
\password app_owner
CREATE DATABASE appdb OWNER app_owner;
CREATE ROLE app_user WITH LOGIN;
\password app_user
GRANT CONNECT ON DATABASE appdb TO app_user;
\c appdb
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;
CREATE USER ... PASSWORD '...' 는 평문이 로그와 히스토리에 남으므로 \password 메타커맨드를 쓴다.
일반 계정에서 편하게 접속하려면 환경변수와 .pgpass 를 둔다. .pgpass 는 chmod 600 이 아니면 클라이언트가 무시한다.
cat >> ~/.bash_profile <<'EOT'
export PATH=/usr/pgsql-15/bin:$PATH
export PGHOST=127.0.0.1
export PGPORT=5432
export PGUSER=app_owner
export PGDATABASE=appdb
EOT
cat > ~/.pgpass <<'EOT'
127.0.0.1:5432:appdb:app_owner:${PASSWORD}
EOT
chmod 600 ~/.pgpass
psql -c "SELECT current_user, current_database();"
-h 127.0.0.1 을 빼면 Unix 소켓으로 접속하므로 pg_hba.conf 의 local 행 규칙이 적용된다.