로컬에서 서버 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:
@@ -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
|
```bash
|
||||||
ssh kjh2064@178.104.200.7
|
ssh kjh2064@178.104.200.7
|
||||||
```
|
```
|
||||||
@@ -118,7 +229,7 @@ KillMode=mixed # SIGTERM → 30초 대기 → SIGKILL
|
|||||||
/etc/systemd/system/taxbaik-admin.service ← Admin
|
/etc/systemd/system/taxbaik-admin.service ← Admin
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3.5 배포 디렉토리 구조 (서버)
|
### 5.5 배포 디렉토리 구조 (서버)
|
||||||
```
|
```
|
||||||
/home/kjh2064/
|
/home/kjh2064/
|
||||||
├── taxbaik_active → ./deployments/taxbaik_20260626_150000/
|
├── taxbaik_active → ./deployments/taxbaik_20260626_150000/
|
||||||
@@ -132,7 +243,7 @@ KillMode=mixed # SIGTERM → 30초 대기 → SIGKILL
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 4. Nginx 라우팅
|
## 6. Nginx 라우팅
|
||||||
|
|
||||||
기존 Gitea (`/`)와 QuantEngine (`/quant/`)을 유지하면서 TaxBaik 추가:
|
기존 Gitea (`/`)와 QuantEngine (`/quant/`)을 유지하면서 TaxBaik 추가:
|
||||||
|
|
||||||
@@ -166,9 +277,9 @@ location /taxbaik/admin {
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 5. 데이터베이스
|
## 6. 데이터베이스
|
||||||
|
|
||||||
### 5.1 연결 설정
|
### 4.1 연결 설정
|
||||||
|
|
||||||
**환경 변수** (systemd unit file에 설정):
|
**환경 변수** (systemd unit file에 설정):
|
||||||
```ini
|
```ini
|
||||||
@@ -177,7 +288,7 @@ Environment=ConnectionStrings__Default=Host=localhost;Database=taxbaikdb;Usernam
|
|||||||
|
|
||||||
**절대 appsettings.Production.json에 비밀값을 하드코딩하지 말 것.**
|
**절대 appsettings.Production.json에 비밀값을 하드코딩하지 말 것.**
|
||||||
|
|
||||||
### 5.2 Dapper 사용 패턴
|
### 3.2 Dapper 사용 패턴
|
||||||
|
|
||||||
**DbConnectionFactory.cs**:
|
**DbConnectionFactory.cs**:
|
||||||
```csharp
|
```csharp
|
||||||
@@ -209,7 +320,7 @@ public async Task<BlogPost?> GetBySlugAsync(string slug, CancellationToken ct)
|
|||||||
- 절대 문자열 연결 금지
|
- 절대 문자열 연결 금지
|
||||||
- 대소문자 구분 안 함 (Dapper가 매핑)
|
- 대소문자 구분 안 함 (Dapper가 매핑)
|
||||||
|
|
||||||
### 5.3 마이그레이션
|
### 3.3 마이그레이션
|
||||||
|
|
||||||
마이그레이션 파일: `db/migrations/V{number}__{description}.sql`
|
마이그레이션 파일: `db/migrations/V{number}__{description}.sql`
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user