diff --git a/dev/deploys/ops-manual/01-server-overview.md b/dev/deploys/ops-manual/01-server-overview.md index 324c64a..eb6baf7 100644 --- a/dev/deploys/ops-manual/01-server-overview.md +++ b/dev/deploys/ops-manual/01-server-overview.md @@ -218,14 +218,24 @@ ### 서비스 현황 -| 서비스 | 포트 | 상태 | -|--------|------|------| -| Nginx | 80/443 | active | -| Apache | 8080 | active (레거시) | -| MySQL 8.4 | 3306 (localhost) | active | -| Gitea | 3000 | active | -| Next.js (PM2) | 3001 | active | -| fail2ban | - | active | +| 서비스 | 포트 | 상태 | 비고 | +|--------|------|------|------| +| Nginx | 80/443 | active | | +| PHP 8.4 FPM | unix socket | active | SAM 앱 (api, mng, sales) | +| PHP 7.3 FPM | unix socket | active | 5130.codebridge-x.com 레거시 전용 | +| MySQL 8.4 | 3306 (localhost) | active | binlog 7일 보관 | +| Gitea | 3000 | active | | +| Next.js (PM2) | 3001 | active | | +| fail2ban | - | active | | +| Swap | - | active | 4G (/swapfile, fstab 등록) | +| ~~Apache~~ | ~~8080~~ | **disabled** | 2026-03-09 비활성화 (front.5130.co.kr 미사용) | +| ~~PHP 5.6 FPM~~ | - | **disabled** | 2026-03-09 비활성화 (미사용) | + +### 자동 정리 (cron, hskwon) + +| 작업 | 주기 | 설명 | +|------|------|------| +| Gitea repo-archive 캐시 정리 | 매주 일요일 04:00 | 7일 이상 된 캐시 파일 삭제 + 빈 디렉토리 정리 | ### 방화벽 (UFW) 규칙 diff --git a/dev/deploys/ops-manual/02-daily-operations.md b/dev/deploys/ops-manual/02-daily-operations.md index 3c24a43..01a886f 100644 --- a/dev/deploys/ops-manual/02-daily-operations.md +++ b/dev/deploys/ops-manual/02-daily-operations.md @@ -48,6 +48,59 @@ chmod 640 /home/webservice/mng/shared/.env --- +## [개발] sam-dev 리소스 관리 + +sam-dev는 2 vCPU / 3.8GB RAM으로 여러 서비스가 공존하므로 리소스 관리가 중요하다. + +### 주요 리소스 소비자 + +| 프로세스 | 메모리 | CPU (상시) | 비고 | +|----------|--------|-----------|------| +| MySQL | ~1.2G (30%) | 2~5% | | +| Gitea | ~400M (10%) | 1.8% | | +| Next.js (PM2) | ~380M (9.5%) | 0.5% | | +| PHP 8.4 FPM | ~250M (변동) | 요청 시 높음 | max_children=5 | +| PHP 7.3 FPM | ~30M | idle | 5130 레거시 전용 | + +### Swap (4G, 2026-03-09 추가) + +Swap 없이 운영하면 메모리 부족 시 OOM Killer가 프로세스를 즉시 종료한다. + +```bash +# Swap 상태 확인 +swapon --show +free -m + +# /etc/fstab에 등록되어 있으므로 재부팅 후에도 유지됨 +# /swapfile none swap sw 0 0 +``` + +### Gitea repo-archive 캐시 + +Gitea는 Web UI에서 ZIP/TAR.GZ 다운로드 시 `/var/lib/gitea/data/repo-archive/`에 캐시를 생성한다. +기본 설정에서는 만료가 없어 무한 증가하므로, cron으로 7일 이상 된 캐시를 정리한다. + +```bash +# 캐시 크기 확인 +sudo du -sh /var/lib/gitea/data/repo-archive/ + +# 수동 정리 (긴급 시) +sudo rm -rf /var/lib/gitea/data/repo-archive/* + +# 자동 정리: hskwon crontab (매주 일요일 04:00) +# 0 4 * * 0 find /var/lib/gitea/data/repo-archive -type f -mtime +7 -delete +# 0 4 * * 0 find /var/lib/gitea/data/repo-archive -type d -empty -delete +``` + +### 비활성화된 서비스 (2026-03-09) + +| 서비스 | 사유 | 복원 명령 | +|--------|------|----------| +| PHP 5.6 FPM | 미사용 (아무 사이트도 참조 안 함) | `sudo systemctl enable --now php5.6-fpm` | +| Apache | front.5130.co.kr 미사용 | `sudo systemctl enable --now apache2` | + +--- + ## 시스템 리소스 모니터링 양쪽 서버 공통 명령어: diff --git a/dev/deploys/ops-manual/06-database.md b/dev/deploys/ops-manual/06-database.md index 148f917..c31a6da 100644 --- a/dev/deploys/ops-manual/06-database.md +++ b/dev/deploys/ops-manual/06-database.md @@ -92,6 +92,33 @@ gunzip -c /home/hskwon/backups/mysql/gitea_YYYYMMDD_HHMMSS.sql.gz | mysql gitea --- +## [개발] MySQL Binlog 관리 + +sam-dev에서는 리플리케이션/PITR을 사용하지 않으므로 binlog 보관을 최소화한다. + +**설정 파일:** `/etc/mysql/mysql.conf.d/mysqld.cnf` + +```ini +binlog_expire_logs_seconds = 604800 # 7일 보관 (2026-03-09 설정) +max_binlog_size = 100M +``` + +```bash +# binlog 상태 확인 +sudo ls -lh /var/lib/mysql/binlog.0* | wc -l # 파일 수 +sudo du -shc /var/lib/mysql/binlog.0* | tail -1 # 총 크기 + +# 수동 퍼지 (필요 시) +mysql -u pro -p -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);" + +# binlog 완전 비활성화가 필요하면 (권장하지 않음) +# mysqld.cnf에 skip-log-bin 추가 후 MySQL 재시작 +``` + +> **참고:** 운영서버(sam-prod)의 binlog는 CI/CD 백업에 활용되므로 별도 정책 적용. + +--- + ## Slow Query 분석 (운영) ```bash