# 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 ```