docs:ops-manual 서버 점검 결과 반영 — Grafana 알림, 개발서버 보안, 백업 설정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-24 20:45:48 +09:00
parent 801c9ddfd5
commit 47fdf147c3
7 changed files with 94 additions and 18 deletions

View File

@@ -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
```
---
## 아키텍처 다이어그램
### 운영서버

View File

@@ -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

View File

@@ -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)
---
## [운영] 성능 모니터링

View File

@@ -519,4 +519,4 @@ sudo systemctl restart grafana-server
| 역할 | 연락처 | 비고 |
|------|--------|------|
| 서버 관리 | hskwon | SSH 접속 가능 |
| IDC 업체 | (IDC 연락처 기입) | 서버 물리적 장애, 네트워크 |
| IDC 업체 | (확인 후 기입 필요) | 서버 물리적 장애, 네트워크 |

View File

@@ -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

View File

@@ -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
```
---

View File

@@ -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