From 9c70136c3c1241f9cf421a81b4dcbc1eeafdffe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Fri, 20 Feb 2026 08:43:08 +0900 Subject: [PATCH] =?UTF-8?q?docs:MNG=20=EC=84=9C=EB=B2=84-=EB=A1=9C?= =?UTF-8?q?=EC=BB=AC=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=8F=99=EA=B8=B0?= =?UTF-8?q?=ED=99=94=20=EA=B0=80=EC=9D=B4=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- claudedocs/server-local-data-sync.md | 84 ++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 claudedocs/server-local-data-sync.md diff --git a/claudedocs/server-local-data-sync.md b/claudedocs/server-local-data-sync.md new file mode 100644 index 00000000..31ed1e55 --- /dev/null +++ b/claudedocs/server-local-data-sync.md @@ -0,0 +1,84 @@ +# MNG 서버 ↔ 로컬 데이터 동기화 가이드 + +> **적용 범위: MNG 프로젝트(`/home/aweso/sam/mng`)에만 해당** +> API 프로젝트는 별도 환경이므로 이 가이드를 적용하지 않습니다. + +## 핵심 원리 + +``` +서버 ↔ 로컬 데이터 이동은 3단계: + +1. 원본에서 데이터 추출 (DB → JSON, 파일 → base64) +2. 전송 (SSH/curl 경유) +3. 대상에 저장 (JSON → DB, base64 → 파일) +``` + +### 왜 이 방식인가? + +| 제약 사항 | 우회 방법 | +|----------|----------| +| 서버 storage는 `www-data` 소유 → SSH(`pro`)로 직접 접근 불가 | `public/`에 임시 PHP 스크립트 → curl로 실행 (www-data 권한) | +| 로컬 앱은 Docker 컨테이너 안에 있음 | `docker exec sam-mng-1 php artisan tinker`로 DB 조작 | +| SCP로 storage 디렉토리에 직접 쓰기 불가 | base64 인코딩 → PHP `Storage::put()`으로 저장 | + +## MNG 환경 정보 + +| 항목 | 값 | +|------|------| +| 서버 SSH | `pro@114.203.209.83` | +| 서버 MNG 경로 | `/home/webservice/mng` | +| 서버 웹 도메인 | `https://mng.codebridge-x.com` | +| 서버 PHP 실행 | nginx + php8.4-fpm (www-data) | +| 로컬 Docker 컨테이너 | `sam-mng-1` | +| 로컬 Storage 경로 | `/var/www/mng/storage/app/private/` | +| 서버 Storage 경로 | `/home/webservice/mng/storage/app/private/` | + +## 프롬프트 템플릿 + +### 서버 → 로컬 (서버 데이터를 로컬로 가져오기) + +``` +서버(mng.codebridge-x.com)의 [테이블명/기능명]에서 [조건]에 해당하는 데이터를 +로컬 Docker(sam-mng-1)로 복사해줘. + +절차: +1. 서버에서 tinker로 DB 데이터 추출 (JSON) +2. 파일이 있으면 public/에 임시 PHP로 base64 export → curl로 다운로드 +3. 로컬 Docker에 파일 복사 (docker cp) 후 tinker로 DB INSERT +4. 임시 파일 모두 삭제 +``` + +### 로컬 → 서버 (로컬 데이터를 서버로 올리기) + +``` +로컬 Docker(sam-mng-1)의 [테이블명/기능명]에서 [조건]에 해당하는 데이터를 +서버(mng.codebridge-x.com)로 복사해줘. + +절차: +1. 로컬 Docker에서 tinker로 DB 데이터 추출 (JSON) +2. 파일이 있으면 docker cp로 호스트로 꺼내기 → base64로 서버 /tmp에 전송 +3. 서버 public/에 임시 PHP 작성 → curl로 실행 (base64 디코딩 + Storage::put + DB INSERT) +4. 임시 파일 모두 삭제 +``` + +## 사용 예시 + +``` +# 템플릿 동기화 (DB + PDF 파일) +서버의 esign_field_templates에서 name='영업파트너 계약서(단체용)'인 +템플릿과 관련 items, PDF 파일을 로컬로 복사해줘. + +# 여러 건 동기화 +로컬의 esign_field_templates에서 ID 4,5,6번 템플릿 3개와 +관련 items, PDF 파일을 서버로 복사해줘. + +# DB만 동기화 (파일 없음) +서버의 tenant_prospects 테이블 전체 데이터를 로컬 DB로 동기화해줘. +``` + +## 주의사항 + +- 작업 후 `public/`의 임시 PHP 스크립트는 **반드시 삭제** (보안) +- ID는 서버/로컬이 다를 수 있으므로 **이름/조건 기반**으로 매칭 +- 관계 테이블(FK)이 있으면 부모 먼저 생성 후 자식 INSERT +- 대량 데이터는 트랜잭션(`DB::beginTransaction`)으로 원자성 보장