From 756679538c24d73f74977100ad5e6de799011ce3 Mon Sep 17 00:00:00 2001 From: aweso Date: Tue, 6 Jan 2026 09:11:45 +0900 Subject: [PATCH] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ENV_SETUP_GUIDE.md | 197 ++++++++++++++++++++++++++++++++++++++++++ check_db_user.php | 68 +++++++++++++++ download_db.ps1 | 36 ++++++++ dump_db.php | 110 +++++++++++++++++++++++ sales_process_plan.md | 4 +- 5 files changed, 413 insertions(+), 2 deletions(-) create mode 100644 ENV_SETUP_GUIDE.md create mode 100644 check_db_user.php create mode 100644 download_db.ps1 create mode 100644 dump_db.php diff --git a/ENV_SETUP_GUIDE.md b/ENV_SETUP_GUIDE.md new file mode 100644 index 0000000..1523fc0 --- /dev/null +++ b/ENV_SETUP_GUIDE.md @@ -0,0 +1,197 @@ +# .env 파일 설정 가이드 (로컬/서버 환경 분리) + +## 현재 구조 + +프로젝트는 `.env` 파일을 사용하여 데이터베이스 연결 정보를 관리합니다. + +### 파일 구조 + +``` +sales/ +├── .env # 환경별 설정 파일 (Git에 포함되지 않음) +├── session.php # .env 파일 로드 +└── lib/mydb.php # DB 연결 (session.php에서 로드된 .env 사용) +``` + +### 코드 동작 방식 + +1. **session.php**: 프로젝트 루트의 `.env` 파일을 읽어 `$_ENV` 배열에 저장 +2. **lib/mydb.php**: `$_ENV` 배열에서 DB 연결 정보를 읽어옴 (기본값 제공) + +## 환경별 설정 + +### 로컬 개발 환경 (Docker) + +**파일 위치**: `C:\Users\aweso\sam\sales\.env` + +```env +DB_HOST=sam-mysql-1 +DB_NAME=chandj +DB_USER=root +DB_PASS=root +``` + +또는 Docker Compose 서비스 이름 사용: + +```env +DB_HOST=mysql +DB_NAME=chandj +DB_USER=root +DB_PASS=root +``` + +**중요 사항**: +- Docker 네트워크에서 MySQL 컨테이너는 서비스 이름(`mysql`) 또는 컨테이너 이름(`sam-mysql-1`)으로 접근 +- `localhost`를 사용하면 Docker 컨테이너 내부의 localhost를 가리켜 연결 실패 + +### 서버 환경 (실서버) + +**파일 위치**: `/home/webservice/sales/.env` + +```env +DB_HOST=localhost +DB_NAME=chandj +DB_USER=codebridge +DB_PASS=실제비밀번호 +APP_URL=https://sales.codebridge-x.com/ +DOCUMENT_ROOT=/home/webservice/sales +``` + +**중요 사항**: +- 서버에서는 MySQL이 같은 서버에 설치되어 있으므로 `localhost` 사용 +- 보안상 `root` 계정 대신 전용 계정(`codebridge`) 사용 + +## 기본값 (Fallback) + +`.env` 파일이 없거나 값이 설정되지 않은 경우 `lib/mydb.php`의 기본값이 사용됩니다: + +```php +$db_host = $_ENV['DB_HOST'] ?? 'localhost'; // 기본값: localhost +$db_name = $_ENV['DB_NAME'] ?? 'chandj'; +$db_user = $_ENV['DB_USER'] ?? 'root'; +$db_pass = $_ENV['DB_PASS'] ?? 'root'; +``` + +**주의**: 기본값이 `localhost`인데, Docker 환경에서는 `.env` 파일이 필수입니다! + +## 현재 구조의 장단점 + +### ✅ 장점 + +1. **환경 분리**: 로컬과 서버에서 다른 설정 파일 사용 가능 +2. **보안**: `.env` 파일은 Git에 포함되지 않음 (`.gitignore`에 추가됨) +3. **유연성**: 환경별로 다른 DB 계정, 호스트, 비밀번호 사용 가능 +4. **기본값 제공**: `.env` 파일이 없어도 기본값으로 동작 (단, Docker 환경에서는 문제 발생) + +### ⚠️ 주의사항 + +1. **Docker 환경**: `.env` 파일이 반드시 필요 (기본값 `localhost`는 Docker에서 작동하지 않음) +2. **기본값 불일치**: 기본값이 `localhost`인데 Docker 환경 기본값은 `mysql`이어야 함 +3. **배포 시**: 서버에 `.env` 파일을 수동으로 생성해야 함 + +## 권장 설정 + +### 로컬 개발 환경 + +`.env` 파일 생성 (필수): + +```env +DB_HOST=mysql +DB_NAME=chandj +DB_USER=root +DB_PASS=root +``` + +### 서버 환경 + +`.env` 파일 생성 (필수): + +```env +DB_HOST=localhost +DB_NAME=chandj +DB_USER=codebridge +DB_PASS=실제비밀번호 +APP_URL=https://sales.codebridge-x.com/ +DOCUMENT_ROOT=/home/webservice/sales +``` + +## 확인 방법 + +### 로컬에서 .env 파일 확인 + +```powershell +# Windows PowerShell +cd C:\Users\aweso\sam\sales +Get-Content .env + +# 또는 파일이 있는지 확인 +Test-Path .env +``` + +### 서버에서 .env 파일 확인 + +```bash +cd /home/webservice/sales +cat .env + +# 또는 파일이 있는지 확인 +test -f .env && echo "존재함" || echo "없음" +``` + +### PHP에서 현재 설정 확인 + +임시 파일 생성 (`check_env.php`): + +```php + +``` + +## 문제 해결 + +### 문제: Docker 환경에서 DB 연결 실패 + +**원인**: `.env` 파일이 없거나 `DB_HOST`가 `localhost`로 설정됨 + +**해결**: +```env +DB_HOST=mysql +``` + +또는 Docker Compose에서 정의한 서비스 이름 사용 + +### 문제: 서버에서 DB 연결 실패 + +**원인**: `.env` 파일이 없거나 잘못된 설정 + +**해결**: +1. `.env` 파일 생성 +2. `DB_HOST=localhost` 확인 +3. 올바른 DB 사용자 계정 및 비밀번호 설정 + +### 문제: Git에 .env 파일이 포함됨 + +**해결**: `.gitignore`에 `.env` 추가 확인 + +```gitignore +.env +.env.* +!.env.example +``` + +## 개선 제안 + +현재 구조는 올바르게 작동하지만, 다음을 고려할 수 있습니다: + +1. **기본값 개선**: Docker 환경 감지하여 기본값을 `mysql`로 변경 +2. **.env.example 파일**: 환경 변수 템플릿 제공 +3. **환경 변수 검증**: 필수 환경 변수가 없을 때 명확한 에러 메시지 + +--- + +**결론**: 현재 구조는 로컬과 서버 환경 분리에 적합합니다. 각 환경에 맞는 `.env` 파일을 생성하여 사용하면 됩니다. + diff --git a/check_db_user.php b/check_db_user.php new file mode 100644 index 0000000..ae053c2 --- /dev/null +++ b/check_db_user.php @@ -0,0 +1,68 @@ + PDO::ERRMODE_EXCEPTION, + ]); + echo "✅ PHP로 DB 연결 성공!\n"; + echo "사용 가능한 사용자: $db_user\n"; + echo "\n"; + echo "다음 명령으로 덤프를 생성하세요:\n"; + if (empty($db_pass)) { + echo " mysqldump -u $db_user -p $db_name > /tmp/chandj_backup.sql\n"; + } else { + echo " MYSQL_PWD='$db_pass' mysqldump -u $db_user $db_name > /tmp/chandj_backup.sql\n"; + } +} catch (PDOException $e) { + echo "❌ PHP로 DB 연결 실패: " . $e->getMessage() . "\n"; + echo "\n"; + echo "다른 사용자를 시도해보세요:\n"; + echo " 1. mysqldump -u codebridge -p chandj > /tmp/chandj_backup.sql\n"; + echo " 2. mysqldump -u root -p chandj > /tmp/chandj_backup.sql\n"; + echo " 3. sudo mysqldump -u root -p chandj > /tmp/chandj_backup.sql\n"; +} + diff --git a/download_db.ps1 b/download_db.ps1 new file mode 100644 index 0000000..f61ef6f --- /dev/null +++ b/download_db.ps1 @@ -0,0 +1,36 @@ +# 서버에서 chandj 데이터베이스 다운로드 스크립트 +# 사용법: .\download_db.ps1 + +$REMOTE_USER = "pro" +$REMOTE_HOST = "114.203.209.83" +$DB_NAME = "chandj" +$DB_USER = "codebridge" # 서버 DB 사용자 (필요시 변경) +$OUTPUT_FILE = "chandj_backup_$(Get-Date -Format 'yyyyMMdd_HHmmss').sql" + +Write-Host "========================================" -ForegroundColor Cyan +Write-Host "데이터베이스 덤프 다운로드 시작" -ForegroundColor Cyan +Write-Host "========================================" -ForegroundColor Cyan +Write-Host "서버: $REMOTE_USER@$REMOTE_HOST" -ForegroundColor Yellow +Write-Host "데이터베이스: $DB_NAME" -ForegroundColor Yellow +Write-Host "출력 파일: $OUTPUT_FILE" -ForegroundColor Yellow +Write-Host "" + +# 방법 1: SSH를 통해 직접 mysqldump 실행 (비밀번호 입력 필요) +Write-Host "방법 1: SSH를 통해 직접 덤프 다운로드" -ForegroundColor Green +Write-Host "명령어 실행 중..." -ForegroundColor Yellow + +# SSH를 통해 mysqldump 실행하고 로컬 파일로 저장 +ssh "$REMOTE_USER@$REMOTE_HOST" "mysqldump -u $DB_USER -p $DB_NAME" | Out-File -FilePath $OUTPUT_FILE -Encoding UTF8 + +if ($LASTEXITCODE -eq 0) { + Write-Host "✅ 덤프 다운로드 완료: $OUTPUT_FILE" -ForegroundColor Green + Write-Host "파일 크기: $((Get-Item $OUTPUT_FILE).Length / 1MB) MB" -ForegroundColor Cyan +} else { + Write-Host "❌ 덤프 다운로드 실패" -ForegroundColor Red + Write-Host "" + Write-Host "대안 방법:" -ForegroundColor Yellow + Write-Host "1. 서버에 SSH 접속" -ForegroundColor White + Write-Host "2. 다음 명령 실행: mysqldump -u $DB_USER -p $DB_NAME > /tmp/chandj_backup.sql" -ForegroundColor White + Write-Host "3. SFTP로 /tmp/chandj_backup.sql 파일 다운로드" -ForegroundColor White +} + diff --git a/dump_db.php b/dump_db.php new file mode 100644 index 0000000..da6f41e --- /dev/null +++ b/dump_db.php @@ -0,0 +1,110 @@ + $outputFile\n"; + } else { + echo " mysqldump -h $db_host -u $db_user -p $db_name > $outputFile\n"; + } + echo "\n"; + echo "비밀번호를 입력하라는 프롬프트가 나타나면 MySQL root 비밀번호를 입력하세요.\n"; + echo "덤프 파일이 생성되면 다음 명령으로 다운로드하세요:\n"; + echo " SFTP: Download -> $outputFile\n"; + echo " 또는: scp pro@114.203.209.83:$outputFile .\n"; + exit(0); +} + +// mysqldump 명령 구성 +// localhost인 경우 -h 옵션 생략 (소켓 연결 사용) +if ($db_host === 'localhost' || $db_host === '127.0.0.1') { + // 비밀번호를 환경 변수로 전달 (더 안전) + $command = sprintf( + 'MYSQL_PWD=%s mysqldump -u %s %s > %s 2>&1', + escapeshellarg($db_pass), + escapeshellarg($db_user), + escapeshellarg($db_name), + escapeshellarg($outputFile) + ); + $commandDisplay = "mysqldump -u $db_user [비밀번호] $db_name > $outputFile"; +} else { + $command = sprintf( + 'MYSQL_PWD=%s mysqldump -h %s -u %s %s > %s 2>&1', + escapeshellarg($db_pass), + escapeshellarg($db_host), + escapeshellarg($db_user), + escapeshellarg($db_name), + escapeshellarg($outputFile) + ); + $commandDisplay = "mysqldump -h $db_host -u $db_user [비밀번호] $db_name > $outputFile"; +} + +echo "명령 실행 중...\n"; +echo "\n"; + +exec($command, $output, $returnCode); + +if ($returnCode === 0 && file_exists($outputFile)) { + $fileSize = filesize($outputFile); + echo "✅ 덤프 생성 완료!\n"; + echo "파일: $outputFile\n"; + echo "크기: " . number_format($fileSize / 1024 / 1024, 2) . " MB\n"; + echo "\n"; + echo "다음 명령으로 다운로드하세요:\n"; + echo " SFTP: Download -> $outputFile\n"; + echo " 또는: scp pro@114.203.209.83:$outputFile .\n"; +} else { + echo "❌ 덤프 생성 실패\n"; + if (!empty($output)) { + echo "오류 메시지:\n"; + echo implode("\n", $output) . "\n"; + } + echo "\n"; + echo "수동으로 시도해보세요:\n"; + if ($db_host === 'localhost' || $db_host === '127.0.0.1') { + echo " mysqldump -u $db_user -p $db_name > $outputFile\n"; + } else { + echo " mysqldump -h $db_host -u $db_user -p $db_name > $outputFile\n"; + } +} + diff --git a/sales_process_plan.md b/sales_process_plan.md index 5931d10..a6a86ab 100644 --- a/sales_process_plan.md +++ b/sales_process_plan.md @@ -23,7 +23,7 @@ ## 3. 영업 프로세스 기록 관리 계획 (C:\Users\light\sam\sales\sales_scenario) -영업관리자의 프로세스를 `C:\Users\light\sam\sales\sales_scenario`에 기록하고 활용하는 상세 계획입니다. +영업관리자의 프로세스를 `C:\Users\aweso\sam\sales\sales_scenario`에 기록하고 활용하는 상세 계획입니다. ### 3.1 시나리오 기반 체크리스트 통합 - 신규 테넌트 등록 시, `sales_scenario_checklist` 테이블에 해당 테넌트용 체크리스트를 자동 생성합니다. @@ -56,5 +56,5 @@ --- ## 5. 실행 가이드 -1. 생성된 `c:\Users\light\sam\sales\sales_records_schema.sql` 파일을 MySQL 클라이언트(DBeaver, phpMyAdmin 등)에서 실행해 주세요. +1. 생성된 `c:\Users\aweso\sam\sales\sales_records_schema.sql` 파일을 MySQL 클라이언트(DBeaver, phpMyAdmin 등)에서 실행해 주세요. 2. 실행이 완료되면, 해당 테이블을 기반으로 실제 API(api/sales_tenants.php 등)와 UI 작업을 진행하도록 저에게 요청해 주세요.