From 03850fefddeb95b2e5426bb0555b5fda491648f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=ED=98=81=EC=84=B1?= Date: Sat, 7 Mar 2026 01:28:08 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=EC=84=9C=EB=B2=84=20=EC=A0=91=EA=B7=BC?= =?UTF-8?q?=20=EA=B6=8C=ED=95=9C=20=EA=B4=80=EB=A6=AC=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 운영 관리자 정보 추가 (hskwon/권혁성, pro/김보곤) - 서버 시간대 설정 정리 (OS, PHP CLI/FPM, Laravel) - develop 그룹 + setgid 공동 관리 구조 추가 - DB 리플리케이션 현황 (sam, sam_stat, codebridge) - DB 백업 설정 (/data/ 경로, codebridge 포함) - sam-dev 서버 정보 추가 - INDEX.md에 서버 접근/백업 문서 등록 Co-Authored-By: Claude Opus 4.6 --- INDEX.md | 4 +- system/server-access-management.md | 168 +++++++++++++++++++++++++---- 2 files changed, 153 insertions(+), 19 deletions(-) diff --git a/INDEX.md b/INDEX.md index 03e82ea..580176b 100644 --- a/INDEX.md +++ b/INDEX.md @@ -1,7 +1,7 @@ # SAM 문서 인덱스 (Claude Code용) > 작업 유형에 맞는 문서를 먼저 읽고 시작하세요. -> 최종 갱신: 2026-03-05 +> 최종 갱신: 2026-03-07 --- @@ -21,6 +21,7 @@ | 견적관리 | `features/quotes/README.md` | 견적 시스템, BOM 계산 | | 운영 배포 | `dev/dev_plans/production-deployment-plan.md` | 배포 계획 | | 서버 운영 | `dev/deploys/ops-manual/README.md` | 서버 운영 매뉴얼 | +| 서버 접근/백업 | `system/server-access-management.md` | 계정, 권한, 백업, 리플리케이션 | | MES | `projects/mes/README.md` | MES 프로젝트 | --- @@ -72,6 +73,7 @@ docs/ | [docker-setup.md](system/docker-setup.md) | Docker 환경 + CI/CD | | [database/README.md](system/database/README.md) | DB 스키마 인덱스 | | [security-policy.md](system/security-policy.md) | 보안 정책 | +| [server-access-management.md](system/server-access-management.md) | 서버 접근 권한, 백업, 리플리케이션 | | [scaling-roadmap.md](system/scaling-roadmap.md) | 스케일링 로드맵 | | [board-system-spec.md](system/board-system-spec.md) | 게시판 시스템 설계 | | [item-master-integration.md](system/item-master-integration.md) | 품목 마스터 통합 설계 | diff --git a/system/server-access-management.md b/system/server-access-management.md index 7abc143..67da35a 100644 --- a/system/server-access-management.md +++ b/system/server-access-management.md @@ -5,7 +5,16 @@ SAM 시스템의 서버 및 데이터베이스 접근 권한을 관리합니다. 서버 관리자는 1명이며, 외부 인원에게는 임시로 접근을 허용하고 작업 완료 후 차단합니다. -**최종 업데이트:** 2026-03-05 +**최종 업데이트:** 2026-03-07 + +--- + +## 운영 관리자 + +| 계정 | 이름 | 역할 | +|------|------|------| +| `hskwon` | 권혁성 | 서버 관리자 (배포, 운영, 인프라) | +| `pro` | 김보곤 | 서브 관리자 (임시 접근, 평상시 잠금) | --- @@ -14,7 +23,20 @@ SAM 시스템의 서버 및 데이터베이스 접근 권한을 관리합니다. | 구분 | 호스트 | SSH alias | 용도 | |------|--------|-----------|------| | 운영 (prod) | 211.117.60.189 | `sam-prod` | API + React 운영 배포 | -| CI/CD | 114.203.209.83 | `sam-cicd` | Jenkins + React 개발 배포 | +| 개발 (dev) | - | `sam-dev` | 개발 환경 | +| CI/CD | 114.203.209.83 | `sam-cicd` | Jenkins + React 개발 배포 + DB 백업 | + +### 서버 시간대 + +| 설정 | prod | cicd | +|------|------|------| +| OS timezone | Asia/Seoul (KST, +0900) | Asia/Seoul (KST, +0900) | +| NTP 동기화 | 활성 | 활성 | +| PHP CLI (`/etc/php/8.4/cli/php.ini`) | Asia/Seoul | PHP 미설치 | +| PHP FPM (`/etc/php/8.4/fpm/php.ini`) | Asia/Seoul | - | +| Laravel `app.timezone` | Asia/Seoul | - | + +> **주의:** PHP timezone이 UTC면 스케줄러 실행 시간이 9시간 어긋남. 반드시 Asia/Seoul로 설정할 것. --- @@ -22,23 +44,30 @@ SAM 시스템의 서버 및 데이터베이스 접근 권한을 관리합니다. ### sam-prod (운영서버) -| 계정 | 용도 | 상태 | -|------|------|------| -| `hskwon` | 서버 관리자 (배포, 운영) | 활성 | -| `pro` | 외부 작업자 임시 접근용 | **잠금** | +| 계정 | 이름 | 용도 | 상태 | +|------|------|------|------| +| `hskwon` | 권혁성 | 서버 관리자 (배포, 운영) | 활성 | +| `pro` | 김보곤 | 서브 관리자 임시 접근용 | 평상시 **잠금** | ### sam-cicd (CI/CD 서버) -| 계정 | 용도 | 상태 | -|------|------|------| -| `hskwon` | 서버 관리자 | 활성 | -| `pro` | 외부 작업자 임시 접근용 | **잠금** | +| 계정 | 이름 | 용도 | 상태 | +|------|------|------|------| +| `hskwon` | 권혁성 | 서버 관리자 | 활성 | +| `pro` | 김보곤 | 서브 관리자 임시 접근용 | 평상시 **잠금** | + +### sam-dev (개발서버) + +| 계정 | 이름 | 용도 | 상태 | +|------|------|------|------| +| `hskwon` | 권혁성 | 서버 관리자 | 활성 | +| `pro` | 김보곤 | 서브 관리자 | 활성 | --- ## OS 계정 잠금/해제 -외부 작업자에게 서버 접근이 필요한 경우, 작업 시간 동안만 해제하고 완료 후 다시 잠금합니다. +서브 관리자에게 서버 접근이 필요한 경우, 작업 시간 동안만 해제하고 완료 후 다시 잠금합니다. ```bash # 계정 잠금 @@ -61,6 +90,39 @@ sudo passwd -S pro --- +## 공동 관리 구조 (cicd 서버) + +인력 변동에 대비하여 cicd 서버는 공동 관리 구조로 운영합니다. + +### develop 그룹 + +```bash +# 그룹 구성원 +$ getent group develop +develop:x:1004:hskwon,pro + +# 디렉토리 구조 +/data/ +├── backups/mysql/ # DB 백업 파일 (14일 보관) +└── scripts/ # 운영 스크립트 + .sam_backup.cnf +``` + +### 권한 설정 + +- `/data/` 전체: `develop` 그룹 소유, **setgid** 적용 +- setgid(`chmod g+s`)로 하위에 생성되는 파일/폴더도 자동으로 `develop` 그룹 상속 +- 그룹 권한 = 소유자 권한 (`chmod g=u`) +- 누가 작업하든 다른 관리자가 접근/수정 가능 + +```bash +# 권한 재설정 필요 시 +sudo chown -R hskwon:develop /data +sudo chmod -R g=u /data +sudo chmod g+s /data /data/backups /data/backups/mysql /data/scripts +``` + +--- + ## DB 계정 현황 ### sam-prod (운영서버 MySQL 8.4) @@ -69,17 +131,25 @@ sudo passwd -S pro |------|-------------|---------|------| | `codebridge@localhost` | caching_sha2_password | sam, sam_stage, sam_stat, codebridge | 애플리케이션 (.env) | | `hskwon@localhost` | caching_sha2_password | 전역 관리자 + sam | 서버 관리자 | -| `pro@localhost` | caching_sha2_password | sam, sam_stage, sam_stat, codebridge | 외부 작업자용 | +| `pro@localhost` | caching_sha2_password | sam, sam_stage, sam_stat, codebridge | 서브 관리자용 | ### sam-cicd (CI/CD 서버 MySQL 8.4) | 계정 | 인증 플러그인 | 접근 DB | 용도 | |------|-------------|---------|------| | `hskwon@localhost` | caching_sha2_password | 전역 관리자 | 서버 관리자 | -| `pro@localhost` | caching_sha2_password | sam, sam_stage, sam_stat, codebridge, gitea | 외부 작업자용 | +| `pro@localhost` | caching_sha2_password | sam, sam_stage, sam_stat, codebridge, gitea | 서브 관리자용 | > **참고:** cicd 서버에는 `codebridge` DB 계정이 없음 (애플리케이션이 다른 계정 사용) +### sam-dev (개발서버 MySQL 8.4) + +| 계정 | 용도 | +|------|------| +| `pro@localhost` | 서브 관리자용 | + +> **참고:** dev 서버는 `sudo mysql` 불가, root 비밀번호 인증 방식 + --- ## DB 계정 관리 @@ -114,6 +184,65 @@ FLUSH PRIVILEGES; --- +## DB 리플리케이션 + +운영 DB(prod)에서 cicd 서버로 실시간 리플리케이션이 구성되어 있습니다. + +| 항목 | 값 | +|------|---| +| Source (마스터) | sam-prod (211.117.60.189) | +| Replica (슬레이브) | sam-cicd | +| 리플리케이션 사용자 | `sam_backup` | +| 대상 DB | **sam, sam_stat, codebridge** | +| 지연 | 0초 (실시간) | + +```sql +-- cicd에서 리플리케이션 상태 확인 +SHOW REPLICA STATUS\G + +-- 확인 항목 +-- Replica_IO_Running: Yes +-- Replica_SQL_Running: Yes +-- Seconds_Behind_Source: 0 +``` + +--- + +## DB 백업 + +리플리케이션과 별도로, cicd 서버에서 매일 03:00에 mysqldump 백업을 수행합니다. + +### 백업 설정 + +| 항목 | 값 | +|------|---| +| 스크립트 | `/data/scripts/backup-db.sh` | +| 인증 파일 | `/data/scripts/.sam_backup.cnf` | +| 백업 경로 | `/data/backups/mysql/` | +| 실행 시간 | 매일 03:00 (cron, hskwon 사용자) | +| 보관 기간 | 14일 | + +### 백업 대상 + +| DB | 방식 | 파일명 패턴 | +|----|------|------------| +| sam | 원격 (prod) | `sam_production_YYYYMMDD_HHMMSS.sql.gz` | +| sam_stat | 원격 (prod) | `sam_stat_production_YYYYMMDD_HHMMSS.sql.gz` | +| codebridge | 원격 (prod) | `codebridge_production_YYYYMMDD_HHMMSS.sql.gz` | +| gitea | 로컬 (cicd) | `gitea_YYYYMMDD_HHMMSS.sql.gz` | + +### 백업 확인 + +```bash +# 최근 백업 파일 확인 +ls -lt /data/backups/mysql/ | head -10 + +# 백업 로그 확인 +tail /data/backups/mysql/backup.log +``` + +--- + ## 배포 계정 관리 ### Jenkins 배포 흐름 @@ -130,10 +259,12 @@ FLUSH PRIVILEGES; ## 관리 정책 -1. **서버 관리자 1명 원칙** — 여러 명이 동시에 관리하지 않음 -2. **임시 접근만 허용** — 외부 작업자는 필요 시에만 OS/DB 계정 해제 -3. **작업 완료 후 즉시 잠금** — 해제 상태로 방치하지 않음 -4. **DB 접근은 SSH 터널 경유** — 외부에서 MySQL 직접 접근 불가 (localhost 바인딩) +1. **서버 관리자 1명 원칙** -- 여러 명이 동시에 관리하지 않음 +2. **임시 접근만 허용** -- 서브 관리자는 필요 시에만 OS/DB 계정 해제 +3. **작업 완료 후 즉시 잠금** -- 해제 상태로 방치하지 않음 +4. **DB 접근은 SSH 터널 경유** -- 외부에서 MySQL 직접 접근 불가 (localhost 바인딩) +5. **공동 관리 대비** -- cicd `/data/`는 develop 그룹으로 관리, 인력 변동 대비 +6. **이중 백업** -- 리플리케이션(실시간) + mysqldump(매일 03:00) 병행 --- @@ -142,9 +273,10 @@ FLUSH PRIVILEGES; - API 보안 가이드: [security-policy.md](./security-policy.md) - Docker 설정: [docker-setup.md](./docker-setup.md) - 원격 근무 설정: [remote-work-setup.md](./remote-work-setup.md) +- Jenkins 설정: [../dev/guides/jenkins-setup-guide.md](../dev/guides/jenkins-setup-guide.md) --- **작성일:** 2026-03-05 -**버전:** 1.0 +**버전:** 1.1 **담당자:** SAM Infrastructure Team \ No newline at end of file