docs: SSH 터널링을 이용한 로컬 개발 환경 가이드 추가
TaxBaik CI/CD / build-and-deploy (push) Successful in 1m4s

로컬에서 서버 PostgreSQL DB에 접속하는 방법:

1. SSH 터널 열기
   ssh -L 5432:127.0.0.1:5432 kjh2064@178.104.200.7

2. 다른 터미널에서 Web/Admin 앱 실행
   - Web: dotnet run -p TaxBaik.Web
   - Admin: dotnet run -p TaxBaik.Admin

3. 마이그레이션 자동 실행 (앱 시작 시)
   - schema_migrations 테이블 확인
   - 미실행 마이그레이션 순서대로 실행

개발 워크플로우:
- 터미널 1: SSH 터널 유지
- 터미널 2: Web (http://localhost:5001/taxbaik)
- 터미널 3: Admin (https://localhost:5002, admin/admin123)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-06-26 22:24:35 +09:00
parent adb6e9e875
commit 17cbf4e40b
+119 -8
View File
@@ -49,9 +49,120 @@ TaxBaik.Admin ASP.NET Core 앱 (Blazor Server, port 5002)
---
## 3. 서버 & 배포
## 3. 로컬 개발 환경 설정
### 3.1 SSH 접속
### 3.1 SSH 터널링으로 서버 DB 접속
**목적**: 로컬에서 개발/테스트 시 서버의 PostgreSQL에 접속
#### 단계 1: SSH 터널 구성 (PowerShell / Bash)
```bash
# 터널 열기 (백그라운드 유지)
ssh -L 5432:127.0.0.1:5432 kjh2064@178.104.200.7
# 터널이 열린 상태에서 다른 터미널에서 개발
```
또는 **영구 설정** (`~/.ssh/config`):
```
Host taxbaik-tunnel
HostName 178.104.200.7
User kjh2064
LocalForward 5432 127.0.0.1:5432
IdentityFile ~/.ssh/id_ed25519
```
그 후:
```bash
ssh taxbaik-tunnel # 터널 유지
```
#### 단계 2: 연결 확인
```bash
# 로컬에서 PostgreSQL 연결 테스트
psql -h localhost -U taxbaik -d taxbaikdb -c "\dt"
# 또는 .NET 앱 실행 (자동으로 마이그레이션 실행)
dotnet run -p TaxBaik.Web
```
#### 단계 3: 개발 워크플로우
```bash
# 터미널 1: SSH 터널 유지
ssh -L 5432:127.0.0.1:5432 kjh2064@178.104.200.7
# 터미널 2: Web 사이트 (Razor Pages)
cd TaxBaik.Web
dotnet run
# 접속: http://localhost:5001/taxbaik
# 터미널 3: Admin 앱 (Blazor)
cd TaxBaik.Admin
dotnet run
# 접속: https://localhost:5002
# 로그인: admin / admin123
```
### 3.2 appsettings.json (로컬)
```json
{
"ConnectionStrings": {
"Default": "Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=XXXXXXXX"
}
}
```
**중요**: 로컬 appsettings.json은 버전 관리에서 제외 또는 .local suffix 사용
```bash
# 로컬 오버라이드
appsettings.Development.json # gitignore에 추가
```
### 3.3 데이터베이스 마이그레이션
앱 시작 시 자동 실행:
1. `db/migrations/` 폴더에서 V001, V002, V003... 순서대로 읽음
2. `schema_migrations` 테이블에서 실행 여부 확인
3. 미실행 마이그레이션만 실행
**마이그레이션 추가**:
```bash
# 파일명: db/migrations/V004__새기능설명.sql
# 예시
CREATE TABLE IF NOT EXISTS new_table (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
```
### 3.4 블로그 & 문의 테스트 데이터
마이그레이션 V003에서 자동 생성:
- 테스트 관리자: `admin` / `admin123`
- 테스트 블로그 포스트 5개
- 테스트 카테고리 5개
수동 추가:
```sql
-- Admin 추가
INSERT INTO admin_users (username, password_hash, created_at)
VALUES ('newadmin', '$2a$11$...bcrypt_hash...', NOW());
-- 블로그 포스트 추가
INSERT INTO blog_posts (title, content, slug, category_id, is_published, created_at)
VALUES ('제목', '내용', 'slug-text', 1, true, NOW());
```
---
## 6. 서버 & 배포
### 4.1 SSH 접속
```bash
ssh kjh2064@178.104.200.7
```
@@ -118,7 +229,7 @@ KillMode=mixed # SIGTERM → 30초 대기 → SIGKILL
/etc/systemd/system/taxbaik-admin.service ← Admin
```
### 3.5 배포 디렉토리 구조 (서버)
### 5.5 배포 디렉토리 구조 (서버)
```
/home/kjh2064/
├── taxbaik_active → ./deployments/taxbaik_20260626_150000/
@@ -132,7 +243,7 @@ KillMode=mixed # SIGTERM → 30초 대기 → SIGKILL
---
## 4. Nginx 라우팅
## 6. Nginx 라우팅
기존 Gitea (`/`)와 QuantEngine (`/quant/`)을 유지하면서 TaxBaik 추가:
@@ -166,9 +277,9 @@ location /taxbaik/admin {
---
## 5. 데이터베이스
## 6. 데이터베이스
### 5.1 연결 설정
### 4.1 연결 설정
**환경 변수** (systemd unit file에 설정):
```ini
@@ -177,7 +288,7 @@ Environment=ConnectionStrings__Default=Host=localhost;Database=taxbaikdb;Usernam
**절대 appsettings.Production.json에 비밀값을 하드코딩하지 말 것.**
### 5.2 Dapper 사용 패턴
### 3.2 Dapper 사용 패턴
**DbConnectionFactory.cs**:
```csharp
@@ -209,7 +320,7 @@ public async Task<BlogPost?> GetBySlugAsync(string slug, CancellationToken ct)
- 절대 문자열 연결 금지
- 대소문자 구분 안 함 (Dapper가 매핑)
### 5.3 마이그레이션
### 3.3 마이그레이션
마이그레이션 파일: `db/migrations/V{number}__{description}.sql`