diff --git a/.gitignore b/.gitignore index f62955f4..409fd97f 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,6 @@ legacy/nlib/target/ # OS .DS_Store Thumbs.db + +# 설치 패키지 빌드 산출물(make_package.sh 로 재생성) +/dist/ diff --git a/docs/ITMS_개발자지침서.docx b/docs/ITMS_개발자지침서.docx new file mode 100644 index 00000000..e1ae4938 Binary files /dev/null and b/docs/ITMS_개발자지침서.docx differ diff --git a/docs/ITMS_사용자지침서.docx b/docs/ITMS_사용자지침서.docx new file mode 100644 index 00000000..bdbc6cf4 Binary files /dev/null and b/docs/ITMS_사용자지침서.docx differ diff --git a/docs/ITMS_서버설치가이드.docx b/docs/ITMS_서버설치가이드.docx new file mode 100644 index 00000000..bf6bf8cc Binary files /dev/null and b/docs/ITMS_서버설치가이드.docx differ diff --git a/docs/ITMS_운영자지침서.docx b/docs/ITMS_운영자지침서.docx new file mode 100644 index 00000000..7e5bf9f0 Binary files /dev/null and b/docs/ITMS_운영자지침서.docx differ diff --git a/install/README.md b/install/README.md new file mode 100644 index 00000000..f9b62aa4 --- /dev/null +++ b/install/README.md @@ -0,0 +1,39 @@ +# ITMS 설치 패키지 + +배포 대상 서버에 ITMS(4포트 WAR 스택 + datatrans 데몬)를 설치하기 위한 패키지. +상세 절차는 동봉 `docs/ITMS_서버설치가이드.docx` 참조. + +## 구성 +``` +itms-install/ +├── README.md 이 파일 +├── preflight.sh 사전 점검(JDK17·systemd·디스크·DB 도달성) +├── install.sh 멱등 설치(계정·디렉터리·systemd 유닛·env). 서비스 start 안 함 +├── uninstall.sh 제거(데이터/DB 보존) +├── build.sh 소스에서 5모듈 WAR 빌드(JDK17) +├── systemd/itms-*.service 모듈별 systemd 유닛(5) +├── env/itms.env.example env 템플릿(SPRING_PROFILES_ACTIVE) +├── ci/ (선택) CI 자동배포 연동 +│ ├── deploy_server_itms_block.py +│ └── gitea-webhook.md +└── docs/ 지침서(사용자·운영자·개발자·서버설치) docx +``` + +## 빠른 설치 +```bash +tar xzf itms-install-*.tar.gz && cd itms-install +sudo bash preflight.sh bash build.sh → artifacts/current 연결 +# /etc/itms/itms-<모듈>.env 의 SPRING_PROFILES_ACTIVE=<기관> 설정 +for m in auth api front batch datatrans; do sudo systemctl enable --now itms-$m; done +``` + +## 선결 조건 +- Linux(systemd) · **JDK17**(Boot 2.6.2 는 Java21 미지원) · 메모리 4GB 권장 +- **런타임 DB**: MariaDB(ur_itms_db, api/batch) · Oracle XE(batch) 네트워크 도달 +- 기관 프로파일(application-<기관>.yml) · keystore 사전 확보(시크릿은 서버 로컬 관리) + +## 보안 +- env/keystore 권한 600, 소유자 itms. 시크릿은 형상관리에 커밋 금지. diff --git a/install/install.sh b/install/install.sh new file mode 100644 index 00000000..6a568774 --- /dev/null +++ b/install/install.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +# ITMS 멱등 설치: 계정·디렉터리·systemd 유닛·env 배치. 서비스 start 는 하지 않음(기동은 운영자가 4.6 절차로). +set -euo pipefail +[ "$(id -u)" = "0" ] || { echo "root 로 실행하세요 (sudo bash install.sh)"; exit 1; } +HERE="$(cd "$(dirname "$0")" && pwd)" +SVC_USER=itms + +echo "== 1) 서비스 계정 ==" +id "$SVC_USER" >/dev/null 2>&1 || useradd -r -s /usr/sbin/nologin "$SVC_USER" || useradd -r -s /sbin/nologin "$SVC_USER" +echo "== 2) 디렉터리 ==" +mkdir -p /opt/itms/repo /opt/itms/artifacts /etc/itms +chown -R "$SVC_USER":"$SVC_USER" /opt/itms +echo "== 3) systemd 유닛 설치 ==" +for u in "$HERE"/systemd/itms-*.service; do + install -m 644 "$u" /etc/systemd/system/"$(basename "$u")" + echo " installed $(basename "$u")" +done +systemctl daemon-reload +echo "== 4) env 템플릿 배치 (기존 파일 보존) ==" +for m in auth api front batch datatrans; do + f=/etc/itms/itms-$m.env + if [ ! -f "$f" ]; then + install -m 600 -o "$SVC_USER" -g "$SVC_USER" "$HERE"/env/itms.env.example "$f" + echo " created $f (SPRING_PROFILES_ACTIVE 를 기관명으로 수정하세요)" + else + echo " keep $f (기존 유지)" + fi +done +echo +echo "설치 완료. 다음:" +echo " 1) 아티팩트: /opt/itms/artifacts/current/itms-<모듈>.war 배치(빌드 또는 CI)" +echo " 2) /etc/itms/itms-<모듈>.env 의 SPRING_PROFILES_ACTIVE=<기관> 설정" +echo " 3) 기동: for m in auth api front batch datatrans; do systemctl enable --now itms-\$m; done" +echo " ※ 런타임 DB(MariaDB/Oracle) 도달·keystore·프로파일 시크릿 확보 후 기동할 것." diff --git a/install/make_package.sh b/install/make_package.sh new file mode 100644 index 00000000..827eecd0 --- /dev/null +++ b/install/make_package.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +# 설치 패키지(tar.gz) 조립. repo 루트에서 실행: bash install/make_package.sh +set -euo pipefail +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +VER="v1.0" +STAGE="$(mktemp -d)/itms-install" +mkdir -p "$STAGE"/{systemd,env,ci,docs} +# 설치 스크립트 +cp "$ROOT"/install/{README.md,preflight.sh,install.sh,uninstall.sh} "$STAGE"/ +# deploy 아티팩트 재사용 +cp "$ROOT"/deploy/build.sh "$STAGE"/ +cp "$ROOT"/deploy/systemd/itms-*.service "$STAGE"/systemd/ +cp "$ROOT"/deploy/env/itms.env.example "$STAGE"/env/ +cp "$ROOT"/deploy/deploy_server_itms_block.py "$STAGE"/ci/ +cp "$ROOT"/deploy/gitea-webhook.md "$STAGE"/ci/ +# 지침서 +cp "$ROOT"/docs/ITMS_*.docx "$STAGE"/docs/ 2>/dev/null || true +chmod +x "$STAGE"/*.sh +# 산출 +OUT="$ROOT/dist"; mkdir -p "$OUT" +TAR="$OUT/itms-install-$VER.tar.gz" +tar czf "$TAR" -C "$(dirname "$STAGE")" itms-install +echo "패키지 생성: $TAR ($(du -h "$TAR" | cut -f1))" +tar tzf "$TAR" | head -40 diff --git a/install/preflight.sh b/install/preflight.sh new file mode 100644 index 00000000..c5003074 --- /dev/null +++ b/install/preflight.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +# ITMS 설치 사전 점검 (읽기 전용). 실패해도 설치를 막지 않으나 경고를 남긴다. +set -u +echo "== ITMS preflight ==" +# JDK17 +if command -v javac >/dev/null 2>&1 && javac -version 2>&1 | grep -q ' 17'; then + echo "[OK] JDK17 (javac): $(javac -version 2>&1)" +elif ls /usr/lib/jvm/ 2>/dev/null | grep -qi 'java-17'; then + echo "[OK] JDK17 설치 경로 존재: $(ls -d /usr/lib/jvm/*17* 2>/dev/null | head -1)" +else + echo "[WARN] JDK17 미검출 — 'apt-get install -y openjdk-17-jdk' 또는 'dnf install -y java-17-openjdk-devel'" +fi +# systemd +command -v systemctl >/dev/null 2>&1 && echo "[OK] systemd 존재" || echo "[WARN] systemd 미검출" +# disk +avail=$(df -Pm /opt 2>/dev/null | awk 'NR==2{print $4}'); echo "[INFO] /opt 여유: ${avail:-?} MB (권장 2000+)" +# mem +mem=$(free -m 2>/dev/null | awk '/Mem:/{print $2}'); echo "[INFO] 총 메모리: ${mem:-?} MB (권장 4096+)" +# DB 포트 도달성(선택; 인자로 host:port 전달) +for hp in "$@"; do + h=${hp%:*}; p=${hp#*:} + timeout 4 bash -c "echo > /dev/tcp/$h/$p" 2>/dev/null && echo "[OK] DB 도달 $hp" || echo "[WARN] DB 미도달 $hp (api/batch 기동 전 필요)" +done +echo "== preflight 완료 ==" diff --git a/install/uninstall.sh b/install/uninstall.sh new file mode 100644 index 00000000..18b12a9a --- /dev/null +++ b/install/uninstall.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +# ITMS 제거: 서비스 중지·disable·유닛 제거. 데이터(/opt/itms)·DB 는 보존. +set -euo pipefail +[ "$(id -u)" = "0" ] || { echo "root 로 실행하세요"; exit 1; } +for m in auth api front batch datatrans; do + systemctl disable --now itms-$m 2>/dev/null || true + rm -f /etc/systemd/system/itms-$m.service +done +systemctl daemon-reload +echo "제거 완료. /opt/itms(아티팩트)·/etc/itms(env)·DB 는 보존됨(수동 삭제 가능)."