Development Artist

[웹 서비스 A-Z][Deployment] #19 Database 본문

Project_Personal

[웹 서비스 A-Z][Deployment] #19 Database

JMcunst 2023. 3. 28. 20:27
728x90
반응형

Django를 배포하기 전, DB 설치를 먼저 해주겠습니다.

우리는 Django와 잘 어울리는 Postgresql을 사용하겠습니다.

Django 서버가 배포 될 EC2(’jmcunst-depl-django’)에서 진행하겠습니다.

아래 링크를 통해 Centos 7 환경에서 Postgresql을 설치해주도록 하겠습니다.

https://jmcunst.tistory.com/300

 

[Centos 7, Postgresql 15] 설치. ( version 11 or later )

Docker 컨테이너 환경에서 Postgresql을 올리려고 하면 버전 11 이상을 쓰라고 권고를 하고 있다. 그도 그럴게, Postgresql 버전 정책을 찾아보면, 아래와 같이 Version 11 이상을 지원하는 것을 확인할 수

jmcunst.tistory.com

버전은 11로 하겠습니다.

/usr/pgsql-11/bin/postgresql-11-setup initdb

systemctl enable --now postgresql-11
systemctl status postgresql-11

이후 Django 서버와 연동하기 위해 우리는 아래의 정보를 확인 할 필요가 있습니다.

  • NAME - Database Name
  • USER
  • PASSWORD
  • HOST
  • PORT

먼저 postgresql 접속을 해보겠습니다.

[root@django-server ~]# su postgres
bash-4.2$ psql

그리고 데이터베이스를 확인합니다.

# 데이터베이스 확인
postgres-# \\l

다음은 사용자를 확인하구요,

# 사용자 확인
postgres-# \\du

다음은 비밀번호를 변경해주겠습니다. 원래 psql 명령어 입력시 비밀번호를 물어봅니다. 하지만, 지금 비밀번호가 설정이 안되어 있어서 바로 접속이 가능했던 것입니다.

postgres-# alter user postgres with password [PASSWORD]

필요한 정보들을 확인했습니다.

  • NAME : postgres
  • USER : postgres
  • PASSWORD : 1q2w3e4r
  • HOST : 10.0.140.203
  • PORT : 5432

다음 시간에는 Django에서 DB를 연동하고 배포를 위한 이미지를 만들어 보도록 하겠습니다.

Addtional

Postgresql 을 설치하고 접속하기 위해서 우리는 su 라는 명령어를 입력했는데요, Switch User의 약자로, 사용자 변경을 위한 명령어 입니다. 현재 우리는 root 사용자로 작업을 하고 있는데, psql 명령어를 통해 DB에 접속하기 위해서는 postgres로 변경을 해줘야 합니다.

/etc/passwd 는 시스템에 등록되어 있는 사용자들에 대한 정보가 들어있습니다. postgresql을 설치하게 되면 postgres라는 기본 사용자가 생성이 됩니다. 제일 아래 부분에 있음을 확인할 수 있습니다.

cat /etc/passwd

따라서 postgres로 변경이 가능하게 되고 DB에 접속도 할 수 있게 됩니다.

 

postgresql 설정 파일은 어디서 확인할 수 있을까요?

바로 ‘/var/lib/pgsql/[version]/data’ 아래에 있습니다. pg_hba.conf 와 postgresql.conf를 앞으로 자주 보시게 될텐데요, 몇가지를 살펴보도록 하겠습니다.

먼저 postgresql.conf 입니다.

[root@django-server data]# cat postgresql.conf | egrep -v '^[[:space:]]*(#.*)?$'
max_connections = 100                   # (change requires restart)
shared_buffers = 128MB                  # min 128kB
dynamic_shared_memory_type = posix      # the default is the first option
max_wal_size = 1GB
min_wal_size = 80MB
log_destination = 'stderr'              # Valid values are combinations of
logging_collector = on                  # Enable capturing of stderr and csvlog
log_directory = 'log'                   # directory where log files are written,
log_filename = 'postgresql-%a.log'      # log file name pattern,
log_truncate_on_rotation = on           # If on, an existing log file with the
log_rotation_age = 1d                   # Automatic rotation of logfiles will
log_rotation_size = 0                   # Automatic rotation of logfiles will
log_line_prefix = '%m [%p] '            # special values:
log_timezone = 'UTC'
datestyle = 'iso, mdy'
timezone = 'UTC'
lc_messages = 'en_US.UTF-8'                     # locale for system error message
lc_monetary = 'en_US.UTF-8'                     # locale for monetary formatting
lc_numeric = 'en_US.UTF-8'                      # locale for number formatting
lc_time = 'en_US.UTF-8'                         # locale for time formatting
default_text_search_config = 'pg_catalog.english'

다음과 같이 기본적으로 설정이 되어 있습니다.

listen_address 부분을 수정해줄 건데요, 아래의 명령을 통해 모든 host로 부터 듣도록 합니다.

sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/" /var/lib/pgsql/11/data/postgresql.conf
systemctl restart postgresql-11

다음은 pg_hba.conf 입니다.

[root@django-server data]# cat pg_hba.conf | egrep -v '^[[:space:]]*(#.*)?$'
# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     peer
host    all             all             127.0.0.1/32            ident
host    all             all             ::1/128                 ident
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            ident
host    replication     all             ::1/128                 ident

이 파일에서는 클라이언트의 주소와 역할을 지정하고 어떤 데이터베이스에 연결을 허용할지 정합니다.

사용할 수 있는 method 옵션 입니다.

설정값 설명

trust 무조건 연결을 허용합니다. 이 방법을 사용하면 PostgreSQL 데이터베이스 서버 에 연결할 수 있는 모든 사람이 암호나 다른 인증 없이 원하는 PostgreSQL 사용자 로 로그인할 수 있습니다.
reject 무조건 연결을 거부합니다. 이는 그룹에서 특정 호스트를 " 필터링 "reject 하는 데 유용합니다. 예를 들어 회선은 특정 호스트의 연결을 차단할 수 있는 반면 나중 회선은 특정 네트워크의 나머지 호스트가 연결할 수 있도록 허용합니다.
scram-sha-256 SCRAM-SHA-256 인증을 수행하여 사용자 암호를 확인합니다. 암호 인증 가장 안전하지만 일부 클라이언트에서 지원되지 않습니다.
md5 SCRAM-SHA-256 또는 MD5 인증을 수행하여 사용자 암호를 확인합니다.
password 인증을 위해 클라이언트가 암호화되지 않은 암호(평문)를 제공하도록 요구합니다. 암호는 네트워크를 통해 일반 텍스트로 전송되므로 신뢰할 수 없는 네트워크에서 사용하면 안 됩니다.
gss GSSAPI를 사용하여 사용자를 인증합니다. 이것은 TCP/IP 연결에만 사용할 수 있습니다.
sspi SSPI를 사용하여 사용자를 인증합니다. 이것은 Windows에서만 사용할 수 있습니다.
ident 클라이언트의 ident 서버에 접속하여 클라이언트의 운영 체제 사용자 이름을 얻고 요청된 데이터베이스 사용자 이름과 일치하는지 확인합니다. ID 인증은 TCP/IP 연결에서만 사용할 수 있습니다. 로컬 연결에 지정된 경우 피어 인증이 대신 사용됩니다.
peer 운영 체제에서 클라이언트의 운영 체제 사용자 이름을 얻고 요청된 데이터베이스 사용자 이름과 일치하는지 확인합니다. 이것은 로컬 연결에서만 사용할 수 있습니다.
ldap LDAP 서버를 사용하여 인증합니다.
radius RADIUS 서버를 사용하여 인증합니다.
cert SSL 클라이언트 인증서를 사용하여 인증합니다.
pam 운영 체제에서 제공하는 PAM(Pluggable Authentication Modules) 서비스를 사용하여 인증합니다.
bsd 운영 체제에서 제공하는 BSD 인증 서비스를 사용하여 인증합니다.

따라서, 앞으로 배포하게 될 컨테이너에서 해당 DB로 접속을 해주기 위해서는 pg_hba.conf 정책을 수정해야 합니다.

일단 서버를 Docker를 이용해 컨테이너 환경으로 배포하려고 합니다. 컨테이너로 된 장고 서버가 10.0.140.203의 DB로 접근을 허용해줘야 합니다.

 

그렇다면 Docker 컨테이너 실행시 잡히는 네트워크 대역을 알아야 할텐데요,

docker network ls
docker network inspect bridge

위의 명령어를 통해 네트워크 서브넷을 알 수 있습니다.

위에서 보시는 바와 같이, 172.17.0.0/16인 것을 확인할 수 있습니다. 컨테이너가 올라오면 해당 네트워크 대역의 IP를 하나 잡아 생성이 되는 것입니다.

따라서 우리는 저 대역을 허용해줘야 합니다.

# /var/lib/pgsql/11/data/pg_hba.conf
host    all             all             172.17.0.0/16           md5

위의 라인을 하단에 넣어주고 Postgresql을 재시작 합니다.

systemctl restart postgresql-11

이렇게 되면 이후 배포 될 Django 서버에서 지금 Database를 바라볼 수 있게 됩니다.

728x90
반응형
Comments