This commit is contained in:
aweso
2026-01-06 09:11:45 +09:00
parent 7cae32b54c
commit 756679538c
5 changed files with 413 additions and 2 deletions

197
ENV_SETUP_GUIDE.md Normal file
View File

@@ -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
<?php
require_once 'session.php';
echo "DB_HOST: " . ($_ENV['DB_HOST'] ?? '기본값 사용') . "\n";
echo "DB_NAME: " . ($_ENV['DB_NAME'] ?? '기본값 사용') . "\n";
echo "DB_USER: " . ($_ENV['DB_USER'] ?? '기본값 사용') . "\n";
?>
```
## 문제 해결
### 문제: 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` 파일을 생성하여 사용하면 됩니다.

68
check_db_user.php Normal file
View File

@@ -0,0 +1,68 @@
<?php
/**
* 서버에서 실행할 DB 사용자 확인 스크립트
* 사용법: php check_db_user.php
*/
echo "=== 데이터베이스 연결 정보 확인 ===\n\n";
// .env 파일 로드
$envFile = __DIR__ . '/.env';
$db_host = 'localhost';
$db_name = 'chandj';
$db_user = 'root';
$db_pass = '';
if (file_exists($envFile)) {
echo "✅ .env 파일 발견: $envFile\n";
$lines = file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
if (strpos($line, '=') !== false && strpos($line, '#') !== 0) {
list($key, $value) = explode('=', $line, 2);
$key = trim($key);
$value = trim($value);
if ($key === 'DB_HOST') {
$db_host = ($value === 'mysql' || strpos($value, 'mysql') !== false) ? 'localhost' : $value;
}
if ($key === 'DB_NAME') $db_name = $value;
if ($key === 'DB_USER') $db_user = $value;
if ($key === 'DB_PASS') $db_pass = $value;
}
}
} else {
echo "⚠️ .env 파일을 찾을 수 없습니다: $envFile\n";
echo "기본값을 사용합니다.\n";
}
echo "\n";
echo "DB_HOST: $db_host\n";
echo "DB_NAME: $db_name\n";
echo "DB_USER: $db_user\n";
echo "DB_PASS: " . (empty($db_pass) ? '(설정되지 않음)' : '***') . "\n";
echo "\n";
// PHP로 DB 연결 테스트
echo "=== PHP로 DB 연결 테스트 ===\n";
try {
$dsn = "mysql:host=$db_host;dbname=$db_name;charset=utf8mb4";
$pdo = new PDO($dsn, $db_user, $db_pass, [
PDO::ATTR_ERRMODE => 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";
}

36
download_db.ps1 Normal file
View File

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

110
dump_db.php Normal file
View File

@@ -0,0 +1,110 @@
<?php
/**
* 서버에서 실행할 데이터베이스 덤프 생성 스크립트
* 사용법: php dump_db.php
*/
// .env 파일 로드
$envFile = __DIR__ . '/.env';
$db_host = 'localhost';
$db_name = 'chandj';
$db_user = 'root';
$db_pass = '';
if (file_exists($envFile)) {
$lines = file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
if (strpos($line, '=') !== false && strpos($line, '#') !== 0) {
list($key, $value) = explode('=', $line, 2);
$key = trim($key);
$value = trim($value);
if ($key === 'DB_HOST') {
// 서버 환경에서는 mysql 호스트명을 localhost로 변환
$db_host = ($value === 'mysql' || strpos($value, 'mysql') !== false) ? 'localhost' : $value;
}
if ($key === 'DB_NAME') $db_name = $value;
if ($key === 'DB_USER') $db_user = $value;
if ($key === 'DB_PASS') $db_pass = $value;
}
}
}
echo "=== 데이터베이스 덤프 생성 ===\n";
echo "DB_HOST: $db_host\n";
echo "DB_NAME: $db_name\n";
echo "DB_USER: $db_user\n";
echo "\n";
$outputFile = '/tmp/chandj_backup_' . date('Ymd_His') . '.sql';
// 비밀번호가 없으면 수동 실행 안내
if (empty($db_pass)) {
echo "⚠️ .env 파일에 DB_PASS가 설정되지 않았습니다.\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";
}
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";
}
}

View File

@@ -23,7 +23,7 @@
## 3. 영업 프로세스 기록 관리 계획 (C:\Users\light\sam\sales\sales_scenario) ## 3. 영업 프로세스 기록 관리 계획 (C:\Users\light\sam\sales\sales_scenario)
영업관리자의 프로세스를 `C:\Users\light\sam\sales\sales_scenario`에 기록하고 활용하는 상세 계획입니다. 영업관리자의 프로세스를 `C:\Users\aweso\sam\sales\sales_scenario`에 기록하고 활용하는 상세 계획입니다.
### 3.1 시나리오 기반 체크리스트 통합 ### 3.1 시나리오 기반 체크리스트 통합
- 신규 테넌트 등록 시, `sales_scenario_checklist` 테이블에 해당 테넌트용 체크리스트를 자동 생성합니다. - 신규 테넌트 등록 시, `sales_scenario_checklist` 테이블에 해당 테넌트용 체크리스트를 자동 생성합니다.
@@ -56,5 +56,5 @@
--- ---
## 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 작업을 진행하도록 저에게 요청해 주세요. 2. 실행이 완료되면, 해당 테이블을 기반으로 실제 API(api/sales_tenants.php 등)와 UI 작업을 진행하도록 저에게 요청해 주세요.