#!/bin/bash # PostgreSQL 로컬 설치 + 데이터 경로를 시놀로지 NAS(/mnt/nas)에 설정 # 실행: sudo bash setup-postgres-local.sh set -e NAS_HOST="192.168.0.36" NAS_NFS_PATH="/volume1/trading" NFS_MOUNT_LOCAL="/mnt/nas" PG_DATA_DIR="${NFS_MOUNT_LOCAL}/postgresql/data" PG_VERSION="16" PG_USER="kyu" PG_PASSWORD="7895123" PG_DB="trading_ai" echo "==============================" echo "1. NFS 클라이언트 설치 확인" echo "==============================" apt-get install -y nfs-common 2>/dev/null || true echo "" echo "==============================" echo "2. NAS NFS 마운트" echo "==============================" mkdir -p "${NFS_MOUNT_LOCAL}" # 이미 마운트 되어있으면 스킵 if mountpoint -q "${NFS_MOUNT_LOCAL}"; then echo "이미 마운트됨: ${NFS_MOUNT_LOCAL}" else mount -t nfs "${NAS_HOST}:${NAS_NFS_PATH}" "${NFS_MOUNT_LOCAL}" -o rw,hard,intr,timeo=30,retrans=3 echo "마운트 완료: ${NAS_HOST}:${NAS_NFS_PATH} -> ${NFS_MOUNT_LOCAL}" fi # /etc/fstab에 자동 마운트 등록 (없으면 추가) FSTAB_ENTRY="${NAS_HOST}:${NAS_NFS_PATH} ${NFS_MOUNT_LOCAL} nfs rw,hard,intr,timeo=30,retrans=3,_netdev 0 0" if ! grep -qF "${NFS_MOUNT_LOCAL}" /etc/fstab; then echo "${FSTAB_ENTRY}" >> /etc/fstab echo "fstab에 자동 마운트 추가됨" fi echo "" echo "==============================" echo "3. PostgreSQL 데이터 디렉토리 생성" echo "==============================" mkdir -p "${PG_DATA_DIR}" chown postgres:postgres "${PG_DATA_DIR}" chmod 700 "${PG_DATA_DIR}" echo "데이터 경로: ${PG_DATA_DIR}" echo "" echo "==============================" echo "4. PostgreSQL 서비스 설정" echo "==============================" # 기존 클러스터 중지 및 제거 pg_ctlcluster ${PG_VERSION} main stop 2>/dev/null || true # 기존 기본 데이터 디렉토리를 NAS 경로로 교체 CONF_FILE="/etc/postgresql/${PG_VERSION}/main/postgresql.conf" if [ -f "${CONF_FILE}" ]; then # data_directory 변경 sed -i "s|^data_directory.*|data_directory = '${PG_DATA_DIR}'|" "${CONF_FILE}" # 이미 변경된 경우가 아니면 추가 if ! grep -q "^data_directory" "${CONF_FILE}"; then echo "data_directory = '${PG_DATA_DIR}'" >> "${CONF_FILE}" fi echo "postgresql.conf 업데이트 완료" fi echo "" echo "==============================" echo "5. 데이터 디렉토리 초기화 (최초 1회)" echo "==============================" if [ ! -f "${PG_DATA_DIR}/PG_VERSION" ]; then sudo -u postgres /usr/lib/postgresql/${PG_VERSION}/bin/initdb \ -D "${PG_DATA_DIR}" \ --encoding=UTF8 \ --locale=ko_KR.UTF-8 \ --auth=md5 2>/dev/null || \ sudo -u postgres /usr/lib/postgresql/${PG_VERSION}/bin/initdb \ -D "${PG_DATA_DIR}" \ --encoding=UTF8 \ --locale=C.UTF-8 \ --auth=md5 echo "DB 초기화 완료" else echo "이미 초기화된 데이터 디렉토리 (스킵)" fi echo "" echo "==============================" echo "6. 외부 접속 허용 설정" echo "==============================" # postgresql.conf - 모든 인터페이스 리슨 sed -i "s|^#listen_addresses.*|listen_addresses = '*'|; s|^listen_addresses.*|listen_addresses = '*'|" "${PG_DATA_DIR}/postgresql.conf" 2>/dev/null || \ echo "listen_addresses = '*'" >> "${PG_DATA_DIR}/postgresql.conf" # pg_hba.conf - Docker 네트워크(172.30.0.0/16) 접속 허용 PG_HBA="${PG_DATA_DIR}/pg_hba.conf" if ! grep -q "172.30.0.0/16" "${PG_HBA}" 2>/dev/null; then cat >> "${PG_HBA}" << 'HBA' # Trading AI Docker 네트워크 host all all 172.30.0.0/16 md5 host all all 127.0.0.1/32 md5 host all all ::1/128 md5 HBA echo "pg_hba.conf 업데이트 완료" fi echo "" echo "==============================" echo "7. PostgreSQL 서비스 시작" echo "==============================" systemctl start postgresql systemctl enable postgresql sleep 3 systemctl is-active postgresql && echo "PostgreSQL 실행 중" echo "" echo "==============================" echo "8. 유저 및 DB 생성" echo "==============================" sudo -u postgres psql -c "DO \$\$ BEGIN IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '${PG_USER}') THEN CREATE USER ${PG_USER} WITH SUPERUSER PASSWORD '${PG_PASSWORD}'; ELSE ALTER USER ${PG_USER} WITH PASSWORD '${PG_PASSWORD}'; END IF; END \$\$;" sudo -u postgres psql -c "CREATE DATABASE ${PG_DB} OWNER ${PG_USER};" 2>/dev/null || \ echo "DB ${PG_DB} 이미 존재 (스킵)" echo "" echo "==============================" echo "완료! PostgreSQL 로컬 실행 중" echo " Host: localhost (또는 127.0.0.1)" echo " Port: 5432" echo " DB: ${PG_DB}" echo " User: ${PG_USER}" echo " Data: ${PG_DATA_DIR} (NAS)" echo "==============================" echo "" echo "다음 단계: 덤프 임포트" echo " PGPASSWORD=${PG_PASSWORD} psql -h 127.0.0.1 -U ${PG_USER} -d ${PG_DB} -f /home/kyu/trading/pg_backup/trading_ai_backup.sql"