From 47fdf147c3cfdb21163c33900f84a4833bd4066b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=ED=98=81=EC=84=B1?= Date: Tue, 24 Feb 2026 20:45:48 +0900 Subject: [PATCH] =?UTF-8?q?docs:ops-manual=20=EC=84=9C=EB=B2=84=20?= =?UTF-8?q?=EC=A0=90=EA=B2=80=20=EA=B2=B0=EA=B3=BC=20=EB=B0=98=EC=98=81=20?= =?UTF-8?q?=E2=80=94=20Grafana=20=EC=95=8C=EB=A6=BC,=20=EA=B0=9C=EB=B0=9C?= =?UTF-8?q?=EC=84=9C=EB=B2=84=20=EB=B3=B4=EC=95=88,=20=EB=B0=B1=EC=97=85?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 --- deploys/ops-manual/01-server-overview.md | 47 ++++++++++++++++++++++++ deploys/ops-manual/04-service-cicd.md | 7 ++-- deploys/ops-manual/07-monitoring.md | 16 ++++---- deploys/ops-manual/08-troubleshooting.md | 2 +- deploys/ops-manual/09-security.md | 21 ++++++++++- deploys/ops-manual/10-backup-recovery.md | 15 ++++++-- deploys/ops-manual/11-server-setup.md | 4 +- 7 files changed, 94 insertions(+), 18 deletions(-) diff --git a/deploys/ops-manual/01-server-overview.md b/deploys/ops-manual/01-server-overview.md index eeced64..8c54453 100644 --- a/deploys/ops-manual/01-server-overview.md +++ b/deploys/ops-manual/01-server-overview.md @@ -205,6 +205,53 @@ --- +## 개발서버 (sam-dev) + +### 서버 사양 + +| 항목 | 값 | +|------|-----| +| IP | 114.203.209.83 | +| 호스트명 | sam-dev | +| OS | Ubuntu 24.04.2 LTS | +| 사용자 | hskwon (SSH 키 인증, sudo NOPASSWD) | + +### 서비스 현황 + +| 서비스 | 포트 | 상태 | +|--------|------|------| +| Nginx | 80/443 | active | +| Apache | 8080 | active (레거시) | +| MySQL 8.0 | 3306 (localhost) | active | +| Gitea | 3000 | active | +| Next.js (PM2) | 3001 | active | +| fail2ban | - | active | + +### 방화벽 (UFW) 규칙 + +| 포트 | 프로토콜 | 용도 | +|------|---------|------| +| 22/tcp | ALLOW | SSH | +| 80/tcp | ALLOW | HTTP | +| 443/tcp | ALLOW | HTTPS | +| 3000/tcp | ALLOW | Gitea | + +> MySQL(3306), Apache(8080), Next.js(3001), CUPS(631) 등은 외부 차단 + +### 주요 디렉토리 + +``` +/home/webservice/ + react/ Next.js 프론트엔드 + api/ Laravel API + mng/ Laravel Admin + sales/ Plain PHP 레거시 + +/data/GIT/samproject/ Gitea bare repositories +``` + +--- + ## 아키텍처 다이어그램 ### 운영서버 diff --git a/deploys/ops-manual/04-service-cicd.md b/deploys/ops-manual/04-service-cicd.md index bcc5189..1ad3e6d 100644 --- a/deploys/ops-manual/04-service-cicd.md +++ b/deploys/ops-manual/04-service-cicd.md @@ -20,17 +20,16 @@ sudo systemctl status jenkins | 파일 | 용도 | |------|------| | /var/lib/jenkins/ | Jenkins 홈 (jobs, plugins, credentials) | -| /etc/systemd/system/jenkins.service.d/override.conf | JVM 옵션 (메모리, CSP) | +| /etc/systemd/system/jenkins.service.d/override.conf | JVM 메모리 설정 | | /var/lib/jenkins/env-files/ | 배포 환경변수 (.env 파일) | | /var/lib/jenkins-agent/ | Agent 워크스페이스 (빌드 실행 격리) | | /etc/systemd/system/jenkins-agent.service | Agent systemd 서비스 | -**JVM 설정:** +**JVM 메모리 설정:** ```bash # /etc/systemd/system/jenkins.service.d/override.conf -# - 메모리: -Xmx2048m -Xms512m -# - CSP: DirectoryBrowserSupport.CSP (workspace 브라우저 보안) +# Environment="JAVA_OPTS=-Xmx2048m -Xms512m -Djava.awt.headless=true" # 변경 후 적용 sudo systemctl daemon-reload diff --git a/deploys/ops-manual/07-monitoring.md b/deploys/ops-manual/07-monitoring.md index f64233d..a2a2d75 100644 --- a/deploys/ops-manual/07-monitoring.md +++ b/deploys/ops-manual/07-monitoring.md @@ -156,17 +156,19 @@ node_filefd_allocated **설정 경로:** Grafana > Alerting > Alert rules -**권장 알림 규칙:** +**현재 설정된 알림 규칙 (SAM Alerts 폴더):** -| 조건 | 임계값 | 설명 | -|------|--------|------| -| CPU 사용률 | > 90% (5분) | CPU 과부하 | -| 메모리 사용률 | > 85% | 메모리 부족 | -| 디스크 사용률 | > 80% | 디스크 공간 부족 | -| 서비스 다운 | target down > 1분 | 스크래핑 실패 | +| 규칙명 | 조건 | 대기 시간 | 설명 | +|--------|------|-----------|------| +| CPU 사용률 > 90% | avg(rate(node_cpu_idle[5m])) | 5분 | CPU 과부하 | +| 메모리 사용률 > 85% | MemAvailable/MemTotal | 5분 | 메모리 부족 | +| 디스크 사용률 > 80% | filesystem_avail/size (/) | 5분 | 디스크 공간 부족 | +| 서비스 다운 (스크래핑 실패) | up < 1 | 1분 | Prometheus 타겟 다운 | **알림 채널:** Grafana > Alerting > Contact points 에서 이메일, Slack 등 설정 +> **TODO:** Contact Point에 실제 이메일 주소 또는 Slack Webhook 설정 필요 (현재 기본 email placeholder) + --- ## [운영] 성능 모니터링 diff --git a/deploys/ops-manual/08-troubleshooting.md b/deploys/ops-manual/08-troubleshooting.md index 2a6fe35..5c64847 100644 --- a/deploys/ops-manual/08-troubleshooting.md +++ b/deploys/ops-manual/08-troubleshooting.md @@ -519,4 +519,4 @@ sudo systemctl restart grafana-server | 역할 | 연락처 | 비고 | |------|--------|------| | 서버 관리 | hskwon | SSH 접속 가능 | -| IDC 업체 | (IDC 연락처 기입) | 서버 물리적 장애, 네트워크 | +| IDC 업체 | (확인 후 기입 필요) | 서버 물리적 장애, 네트워크 | diff --git a/deploys/ops-manual/09-security.md b/deploys/ops-manual/09-security.md index 4334206..5038eb8 100644 --- a/deploys/ops-manual/09-security.md +++ b/deploys/ops-manual/09-security.md @@ -75,6 +75,17 @@ sudo -u jenkins ssh-keyscan -H 211.117.60.189 >> /var/lib/jenkins/.ssh/known_hos | 80 | Anywhere | HTTP | | 443 | Anywhere | HTTPS | +### [개발] 규칙 + +| 포트 | 허용 범위 | 용도 | +|------|-----------|------| +| 22 | Anywhere | SSH | +| 80 | Anywhere | HTTP | +| 443 | Anywhere | HTTPS | +| 3000 | Anywhere | Gitea | + +> MySQL(3306), Apache(8080), Next.js(3001) 등은 외부 차단됨 + ### 공통 명령어 ```bash @@ -136,10 +147,18 @@ sudo fail2ban-client restart sshd ### 화이트리스트 설정 +**현재 설정:** + +| 서버 | ignoreip | +|------|----------| +| 운영 | 127.0.0.1/8, 110.10.147.46 (CI/CD) | +| CI/CD | 127.0.0.1/8, 211.117.60.189 (운영) | +| 개발 | 127.0.0.1/8, 110.10.147.46 (CI/CD), 211.117.60.189 (운영) | + ```bash # /etc/fail2ban/jail.local [DEFAULT] -ignoreip = 127.0.0.1/8 관리자_IP_1 관리자_IP_2 +ignoreip = 127.0.0.1/8 110.10.147.46 211.117.60.189 # 변경 후 sudo systemctl restart fail2ban diff --git a/deploys/ops-manual/10-backup-recovery.md b/deploys/ops-manual/10-backup-recovery.md index 1f4578d..313c537 100644 --- a/deploys/ops-manual/10-backup-recovery.md +++ b/deploys/ops-manual/10-backup-recovery.md @@ -168,14 +168,23 @@ sudo tar czf /home/hskwon/backups/grafana/grafana-data-$(date +%Y%m%d).tar.gz /v **자동 백업:** crontab 매일 03:00 실행 - 스크립트: /home/hskwon/scripts/backup-db.sh +- 인증 정보: /home/hskwon/.sam_backup.cnf (chmod 600) - 저장소: /home/hskwon/backups/mysql/ - 보존: 14일 -**수동 원격 백업:** +**백업 대상:** + +| DB | 서버 | 사용자 | 비고 | +|----|------|--------|------| +| gitea | localhost | root (auth_socket) | Gitea DB | +| sam | 211.117.60.189 (운영) | sam_backup | 운영 메인 DB | +| sam_stat | 211.117.60.189 (운영) | sam_backup | 통계 DB | + +**수동 백업 실행:** ```bash -ssh sam-prod "mysqldump --single-transaction --routines sam" | gzip \ - > /home/hskwon/backups/mysql/sam_production_$(date +%Y%m%d).sql.gz +# 전체 백업 (Gitea + 운영 DB) +/home/hskwon/scripts/backup-db.sh ``` --- diff --git a/deploys/ops-manual/11-server-setup.md b/deploys/ops-manual/11-server-setup.md index e161efc..3581f33 100644 --- a/deploys/ops-manual/11-server-setup.md +++ b/deploys/ops-manual/11-server-setup.md @@ -771,11 +771,11 @@ echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.gpg]" \ sudo apt update sudo apt install -y jenkins -# JVM 옵션 (메모리 + CSP) +# JVM 메모리 제한 sudo mkdir -p /etc/systemd/system/jenkins.service.d sudo tee /etc/systemd/system/jenkins.service.d/override.conf > /dev/null << 'EOF' [Service] -Environment="JAVA_OPTS=-Xmx2048m -Xms512m -Djava.awt.headless=true -Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:;\"" +Environment="JAVA_OPTS=-Xmx2048m -Xms512m -Djava.awt.headless=true" EOF sudo systemctl daemon-reload