프로젝트 기본 구성: Next.js + PostgreSQL + Gitea Actions 배포
- Next.js 15 (App Router, TypeScript, Tailwind), pg 커넥션 풀 - /api/health DB 헬스체크, standalone Dockerfile - Gitea Actions: 빌드 → 컨테이너 교체 → Traefik(jskim.vexplor.com) 라우팅 - 로컬 개발용 SSH DB 터널 스크립트 (scripts/db-tunnel.sh) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
이 커밋은 다음에 포함됨:
@@ -0,0 +1,46 @@
|
||||
# jskim.vexplor.com
|
||||
|
||||
Next.js(App Router, TypeScript) + PostgreSQL 개인 프로젝트.
|
||||
|
||||
## 스택
|
||||
|
||||
- **프론트/백엔드**: Next.js 15 (React 19, API Routes로 Node.js 백엔드 겸용)
|
||||
- **DB**: PostgreSQL 17 — THREEDEV 서버(211.115.91.140) `pg-jskim` 컨테이너, DB/계정 `jskim`
|
||||
- **배포**: Gitea Actions → Harbor(`harbor.wace.me/dev-pilots/jskim`) → Docker + Traefik(HTTPS, `jskim.vexplor.com`)
|
||||
|
||||
## 로컬 개발
|
||||
|
||||
DB가 방화벽 뒤에 있어 SSH 터널이 필요하다.
|
||||
|
||||
```bash
|
||||
# 터미널 1: DB 터널 (localhost:5436 -> pg-jskim)
|
||||
./scripts/db-tunnel.sh
|
||||
|
||||
# 터미널 2: 개발 서버
|
||||
npm run dev
|
||||
```
|
||||
|
||||
- 환경변수: `.env.local` (gitignore 대상, `.env.example` 참고)
|
||||
- DB 연결 확인: http://localhost:3000/api/health
|
||||
|
||||
## 배포
|
||||
|
||||
`main` 브랜치에 push하면 Gitea Actions(`.gitea/workflows/build-and-deploy.yml`)가 자동으로:
|
||||
|
||||
1. 서버(THREEDEV)에서 Docker 이미지 빌드 (레지스트리 불필요)
|
||||
2. 컨테이너 교체 (`web` + `pgnet` 네트워크, Traefik 라벨)
|
||||
3. `/api/health` 헬스체크
|
||||
|
||||
운영 `DATABASE_URL`은 서버의 `/home/three/jskim/.env`(chmod 600)에서 읽는다.
|
||||
|
||||
## 구조
|
||||
|
||||
```
|
||||
src/
|
||||
app/ # App Router 페이지
|
||||
api/health/ # DB 연결 헬스체크
|
||||
lib/db.ts # pg Pool (DATABASE_URL 사용)
|
||||
scripts/db-tunnel.sh
|
||||
Dockerfile # standalone 빌드, node:20-alpine
|
||||
.gitea/workflows/ # CI/CD
|
||||
```
|
||||
새 이슈에서 참조
사용자 차단