{"id":51436837,"url":"https://github.com/claude-code-expert/brewnet-boilerplate","last_synced_at":"2026-07-05T07:07:33.270Z","repository":{"id":341234564,"uuid":"1168964439","full_name":"claude-code-expert/brewnet-boilerplate","owner":"claude-code-expert","description":"one command boilerplate app creation","archived":false,"fork":false,"pushed_at":"2026-03-22T06:41:36.000Z","size":1612,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-22T21:30:23.030Z","etag":null,"topics":["boilerplate-template","homeserver","self-hosted"],"latest_commit_sha":null,"homepage":"https://www.brewnet.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/claude-code-expert.png","metadata":{"files":{"readme":"README.ko.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-28T02:04:51.000Z","updated_at":"2026-03-22T06:41:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/claude-code-expert/brewnet-boilerplate","commit_stats":null,"previous_names":["claude-code-expert/brewnet-boilerplate"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/claude-code-expert/brewnet-boilerplate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claude-code-expert%2Fbrewnet-boilerplate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claude-code-expert%2Fbrewnet-boilerplate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claude-code-expert%2Fbrewnet-boilerplate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claude-code-expert%2Fbrewnet-boilerplate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/claude-code-expert","download_url":"https://codeload.github.com/claude-code-expert/brewnet-boilerplate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claude-code-expert%2Fbrewnet-boilerplate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35146126,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-05T02:00:06.290Z","response_time":100,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["boilerplate-template","homeserver","self-hosted"],"created_at":"2026-07-05T07:07:30.036Z","updated_at":"2026-07-05T07:07:33.181Z","avatar_url":"https://github.com/claude-code-expert.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ch1 align=\"center\"\u003eBrewnet Boilerplate\u003c/h1\u003e\n  \u003cp align=\"center\"\u003e\n    \u003ca href=\"https://www.brewnet.dev\"\u003ehttps://www.brewnet.dev\u003c/a\u003e · \u003ca href=\"mailto:brewnet.dev@gmail.com\"\u003ebrewnet.dev@gmail.com\u003c/a\u003e\n  \u003c/p\u003e\n  \u003cp align=\"center\"\u003e\n    \u003cem\u003e손쉽게 설치하는 나만의 홈서버, Brewnet\u003c/em\u003e\u003cbr/\u003e\n    \u003cstrong\u003eYour server on tap. Just brew it.\u003c/strong\u003e\u003cbr/\u003e\n    \u003cem\u003e한 명령어로 풀스택 앱을 생성하세요.\u003c/em\u003e\n  \u003c/p\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"./README.md\"\u003eEnglish README\u003c/a\u003e ·\n  \u003ca href=\"#빠른-시작\"\u003e빠른 시작\u003c/a\u003e ·\n  \u003ca href=\"#지원-스택\"\u003e스택\u003c/a\u003e ·\n  \u003ca href=\"#cli-사용법\"\u003eCLI 사용법\u003c/a\u003e ·\n  \u003ca href=\"#수동-클론\"\u003e수동 클론\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## Brewnet Boilerplate란?\n\n이 저장소는 **[Brewnet](https://github.com/claude-code-expert/brewnet)** 의 공식 보일러플레이트 모음입니다. Brewnet은 Self-hosting을 위한 Home Server 솔루션으로, 집에 있는 Mac 또는 Linux 장비에서 홈페이지, API, E-Biz 서비스를 직접 서빙할 수 있도록 설계되었습니다.\n\n**Brewnet CLI** (`brewnet create-app`)는 이 저장소에서 원하는 스택을 자동으로 clone하고, 보안 시크릿이 포함된 `.env`를 생성한 뒤 Docker로 풀스택 애플리케이션을 바로 실행합니다. 별도의 수동 설정이 필요 없습니다.\n\n### Brewnet으로 만들 수 있는 것\n\n- 집에 있는 장비에서 직접 서빙하는 개인 홈페이지 및 포트폴리오\n- 자신의 Mac 또는 Linux 서버에서 운영하는 웹 서비스 및 E-Biz 플랫폼\n- PostgreSQL, MySQL, SQLite3를 기반으로 6개 언어 × 16개 프레임워크 조합의 풀스택 앱\n\n이 모노레포의 각 스택은 `docker compose up` 한 번으로 실행 가능한 독립적인 백엔드 + 프론트엔드 프로젝트입니다. 지원 언어: **Python, Node.js, Java, Kotlin, Rust, Go** — 각 언어별 다양한 프레임워크 옵션 제공.\n\n\u003e **Brewnet CLI** — 소스 코드 및 문서: [github.com/claude-code-expert/brewnet](https://github.com/claude-code-expert/brewnet)\n\u003e **라이브 데모**: [www.brewnet.dev](https://www.brewnet.dev)\n\n## 사전 요구사항\n\n스택을 실행하기 전에 아래 항목이 설치되어 있고 실행 중인지 확인하세요:\n\n| 요구사항 | 버전 | 설치 |\n|----------|------|------|\n| **Docker Desktop** (macOS / Windows) 또는 **Docker Engine** (Linux) | 27+ | [docs.docker.com/get-docker](https://docs.docker.com/get-docker/) |\n| **Docker Compose** (Docker Desktop에 포함) | v2+ | Docker Desktop에 포함 |\n| **Node.js** (대시보드 전용) | 18+ | [nodejs.org](https://nodejs.org/) |\n\n\u003e ⚠️ **▶ Start 버튼** 클릭 또는 `make dev` 실행 전에 **Docker Desktop이 반드시 실행 중** 이어야 합니다.\n\u003e 각 스택은 `docker compose up -d --build` 명령으로 백엔드, 프론트엔드, DB를 Docker 컨테이너로 실행합니다.\n\n```bash\n# Docker 실행 확인\ndocker info\n# \"Cannot connect to the Docker daemon\" 메시지가 나오면 → Docker Desktop을 먼저 실행하세요\n```\n\n---\n\n## 빠른 시작\n\n### 방법 1: Brewnet CLI (권장)\n\n```bash\n# Brewnet CLI 설치\nnpm install -g brewnet\n\n# 새 프로젝트 생성\nbrewnet create-app my-project\n\n# 대화형 프롬프트가 단계별로 안내합니다:\n# → 언어 선택 (Go, Rust, Java, Kotlin, Node.js, Python)\n# → 프레임워크 선택 (Gin, Echo, Fiber, Spring Boot, Express, FastAPI, ...)\n# → 프론트엔드 선택 (React, API-only)\n# → 보안 시크릿이 포함된 .env 자동 생성\n# → Docker 컨테이너 시작\n\n# 앱 열기\nopen http://localhost:3000\n```\n\n### 방법 2: 대시보드 (브라우저 UI)\n\n```bash\ngit clone https://github.com/claude-code-expert/brewnet-boilerplate.git\ncd brewnet-boilerplate/dashboard\nnpm install\nnpm run dev\n# → http://localhost:4000\n```\n\n브라우저에서 **http://localhost:4000**을 열면 16개 스택 전체를 한눈에 확인하고 Start/Stop/테스트할 수 있습니다. 스택마다 터미널을 열 필요가 없습니다.\n\n\u003e ⚠️ 스택 카드의 **▶ Start** 버튼 클릭 전에 **Docker Desktop이 반드시 실행 중**이어야 합니다.\n\n### 방법 3: 수동 클론\n\n```bash\n# 원하는 스택 브랜치를 직접 clone (권장)\ngit clone --depth=1 -b stack/go-gin \\\n  https://github.com/claude-code-expert/brewnet-boilerplate.git my-project\ncd my-project\ncp .env.example .env\nmake dev\n\nopen http://localhost:3000\n```\n\n---\n\n## 지원 스택\n\n16개의 백엔드 스택을 제공하며, 모두 Docker로 프로덕션 준비가 되어 있습니다. 각 스택에는 React 19 + Vite 6 + TypeScript가 기본 프론트엔드로 포함되어 있습니다.\n\n### 백엔드 스택\n\n| 언어 | 스택 | 프레임워크 | ORM / DB 레이어 | 진입점 |\n|------|------|------------|-----------------|--------|\n| **Go** | `go-gin` | Gin | GORM | `backend/cmd/server/main.go` |\n| | `go-echo` | Echo v4 | GORM | `backend/cmd/server/main.go` |\n| | `go-fiber` | Fiber v3 | GORM | `backend/cmd/server/main.go` |\n| **Rust** | `rust-actix-web` | Actix-web 4 | SQLx | `backend/src/main.rs` |\n| | `rust-axum` | Axum 0.8 | SQLx | `backend/src/main.rs` |\n| **Java** | `java-springboot` | Spring Boot 3.3 | JPA / JDBC | `backend/src/.../Application.java` |\n| | `java-spring` | Spring Framework 6.2 | JDBC / HikariCP | `backend/src/.../Application.java` |\n| **Kotlin** | `kotlin-ktor` | Ktor 3.1 | Exposed ORM | `backend/src/.../Application.kt` |\n| | `kotlin-springboot` | Spring Boot 3.4 | JDBC | `backend/src/.../Application.kt` |\n| **Node.js** | `nodejs-express` | Express 5 | Prisma | `backend/src/index.ts` |\n| | `nodejs-nestjs` | NestJS 11 | Prisma | `backend/src/main.ts` |\n| | `nodejs-nextjs` | Next.js 15 (API Routes) | Prisma | `src/app/route.ts` |\n| | `nodejs-nextjs-full` | Next.js 15 (Full-Stack) | Prisma | `src/app/page.tsx` |\n| **Python** | `python-fastapi` | FastAPI | SQLAlchemy (async) | `backend/src/main.py` |\n| | `python-django` | Django 6 | Django ORM | `backend/src/config/wsgi.py` |\n| | `python-flask` | Flask 3.1 | Flask-SQLAlchemy | `backend/wsgi.py` |\n\n\u003e **참고**: `nodejs-nextjs` 계열은 프론트엔드 컨테이너 없는 통합 스택으로, 포트 3000에서 실행됩니다.\n\u003e - `nodejs-nextjs`: API Routes 백엔드 중심 — 최소 UI, 빠른 MVP\n\u003e - `nodejs-nextjs-full`: Server Components + Client Components + API Routes — 풀스택 UI 포함\n\n### 스택 브랜치 대응표\n\n각 스택은 직접 clone 가능한 독립 브랜치 `stack/{name}`으로 퍼블리시됩니다:\n\n```\n스택 ID                → 브랜치\n────────────────────────────────────────────\ngo-gin                 → stack/go-gin\ngo-echo                → stack/go-echo\ngo-fiber               → stack/go-fiber\nrust-actix-web         → stack/rust-actix-web\nrust-axum              → stack/rust-axum\njava-springboot        → stack/java-springboot\njava-spring            → stack/java-spring\nkotlin-ktor            → stack/kotlin-ktor\nkotlin-springboot      → stack/kotlin-springboot\nnodejs-express         → stack/nodejs-express\nnodejs-nestjs          → stack/nodejs-nestjs\nnodejs-nextjs          → stack/nodejs-nextjs\nnodejs-nextjs-full     → stack/nodejs-nextjs-full\npython-fastapi         → stack/python-fastapi\npython-django          → stack/python-django\npython-flask           → stack/python-flask\n```\n\n---\n\n## CLI 사용법\n\n### 설치\n\n```bash\nnpm install -g brewnet\n```\n\n### 새 앱 생성\n\n```bash\nbrewnet create-app \u003c프로젝트명\u003e [옵션]\n```\n\n**대화형 모드** — 옵션 없이 실행하면 CLI가 단계별로 안내합니다:\n\n```bash\nbrewnet create-app my-project\n```\n\n```\n? 언어를 선택하세요:\n  ❯ Go\n    Rust\n    Java\n    Kotlin\n    Node.js\n    Python\n\n? 프레임워크를 선택하세요:\n  ❯ Gin (경량, 고성능)\n    Echo (미니멀, 확장성)\n    Fiber (Express 스타일)\n\n? 프론트엔드를 선택하세요:\n  ❯ React (기본값)\n    API-only (프론트엔드 없음)\n```\n\n**플래그 사용** — CI/스크립트에서 프롬프트 생략:\n\n```bash\n# 스택 직접 지정\nbrewnet create-app my-api --stack go-gin\n\n# API 전용 (프론트엔드 없음)\nbrewnet create-app my-api --stack python-fastapi --frontend none\n```\n\n### 내부 동작\n\n```\nbrewnet create-app my-project --stack go-gin\n```\n\n1. `git clone --depth=1 -b stack/go-gin https://github.com/claude-code-expert/brewnet-boilerplate.git my-project`\n2. `.env.example` 기반으로 보안 시크릿이 포함된 `.env` 자동 생성\n3. `docker compose up -d` 실행\n4. `/health` + `/api/hello` 응답 확인\n5. `http://localhost:3000` 브라우저에서 열기\n\n---\n\n## CLI 연동 레퍼런스\n\n\u003e `brewnet create-app` 구현 시 이 섹션을 기준으로 사용하세요.\n\n### 저장소\n\n```\nREPO_URL = https://github.com/claude-code-expert/brewnet-boilerplate.git\n```\n\n### 클론 명령어 패턴\n\n```bash\ngit clone --depth=1 -b stack/\u003cSTACK_ID\u003e \\\n  https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cPROJECT_NAME\u003e\n```\n\n### 전체 스택 클론 명령어\n\n```bash\ngit clone --depth=1 -b stack/go-gin           https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\ngit clone --depth=1 -b stack/go-echo          https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\ngit clone --depth=1 -b stack/go-fiber         https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\ngit clone --depth=1 -b stack/rust-actix-web   https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\ngit clone --depth=1 -b stack/rust-axum        https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\ngit clone --depth=1 -b stack/java-springboot  https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\ngit clone --depth=1 -b stack/java-spring      https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\ngit clone --depth=1 -b stack/kotlin-ktor      https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\ngit clone --depth=1 -b stack/kotlin-springboot https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\ngit clone --depth=1 -b stack/nodejs-express   https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\ngit clone --depth=1 -b stack/nodejs-nestjs    https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\ngit clone --depth=1 -b stack/nodejs-nextjs    https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\ngit clone --depth=1 -b stack/nodejs-nextjs-full https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\ngit clone --depth=1 -b stack/python-fastapi   https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\ngit clone --depth=1 -b stack/python-django    https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\ngit clone --depth=1 -b stack/python-flask     https://github.com/claude-code-expert/brewnet-boilerplate.git \u003cproject\u003e\n```\n\n### 클론 후 처리 순서\n\n```bash\ncd \u003cproject\u003e\n\n# 1. 템플릿으로 .env 생성 (CLI는 시크릿 자동 생성)\ncp .env.example .env\n\n# 2. 컨테이너 시작\ndocker compose up -d\n\n# 3. 검증\ncurl -sf http://localhost:8080/health    # → {\"status\":\"ok\",\"db_connected\":true}\ncurl -sf http://localhost:8080/api/hello # → {\"message\":\"Hello from ...\"}\n\n# 4. 브라우저에서 열기\nopen http://localhost:3000\n```\n\n### 스택 ID 매핑표\n\n| 스택 ID | 언어 | 프레임워크 | 포트 |\n|---------|------|------------|------|\n| `go-gin` | Go | Gin | 8080 |\n| `go-echo` | Go | Echo v4 | 8080 |\n| `go-fiber` | Go | Fiber v3 | 8080 |\n| `rust-actix-web` | Rust | Actix-web 4 | 8080 |\n| `rust-axum` | Rust | Axum 0.8 | 8080 |\n| `java-springboot` | Java | Spring Boot 3.3 | 8080 |\n| `java-spring` | Java | Spring Framework 6.2 | 8080 |\n| `kotlin-ktor` | Kotlin | Ktor 3.1 | 8080 |\n| `kotlin-springboot` | Kotlin | Spring Boot 3.4 | 8080 |\n| `nodejs-express` | Node.js | Express 5 | 8080 |\n| `nodejs-nestjs` | Node.js | NestJS 11 | 8080 |\n| `nodejs-nextjs` | Node.js | Next.js 15 (API Routes) | 3000 ⚠️ 통합 |\n| `nodejs-nextjs-full` | Node.js | Next.js 15 (Full-Stack) | 3000 ⚠️ 통합 |\n| `python-fastapi` | Python | FastAPI | 8080 |\n| `python-django` | Python | Django 6 | 8080 |\n| `python-flask` | Python | Flask 3.1 | 8080 |\n\n\u003e ⚠️ `nodejs-nextjs` 계열은 통합 스택으로 프론트엔드가 별도 없으며, 백엔드 포트가 3000입니다.\n\n---\n\n## 수동 클론\n\n### 전체 저장소 클론\n\n```bash\ngit clone https://github.com/claude-code-expert/brewnet-boilerplate.git\ncd brewnet-boilerplate\n```\n\n### 단일 스택만 클론\n\n```bash\n# 방법 A (권장): 스택 브랜치 직접 clone — 모노레포 없이 즉시 사용 가능\ngit clone --depth=1 -b stack/go-gin \\\n  https://github.com/claude-code-expert/brewnet-boilerplate.git my-project\ncd my-project\n\n# 방법 B: sparse checkout (모노레포에서 특정 스택만 추출)\ngit clone --filter=blob:none --sparse \\\n  https://github.com/claude-code-expert/brewnet-boilerplate.git\ncd brewnet-boilerplate\ngit sparse-checkout set stacks/go-gin shared\n\n# 방법 C: degit (git 히스토리 없는 클린 복사)\nnpx degit claude-code-expert/brewnet-boilerplate/stacks/go-gin my-project\ncd my-project\n```\n\n### 스택 실행\n\n```bash\ncd stacks/go-gin          # 또는 원하는 스택\ncp .env.example .env      # 환경 설정\nmake dev                  # Docker로 시작\n```\n\n| URL | 설명 |\n|-----|------|\n| http://localhost:3000 | 프론트엔드 |\n| http://localhost:8080 | 백엔드 API |\n| http://localhost:8080/health | 헬스체크 |\n| http://localhost:8080/api/hello | Hello API |\n\n---\n\n## API 규약\n\n모든 16개 백엔드 스택은 동일한 4개의 엔드포인트를 구현합니다:\n\n| 메서드 | 경로 | 응답 |\n|--------|------|------|\n| `GET` | `/` | `{\"service\":\"...-backend\",\"status\":\"running\",\"message\":\"Hello Brewnet (https://www.brewnet.dev)\"}` |\n| `GET` | `/health` | `{\"status\":\"ok\",\"timestamp\":\"...\",\"db_connected\":true\\|false}` |\n| `GET` | `/api/hello` | `{\"message\":\"Hello from ...!\",\"lang\":\"...\",\"version\":\"...\"}` |\n| `POST` | `/api/echo` | 요청 본문을 그대로 반환 |\n\n```bash\n# 아무 스택이나 테스트\ncurl -s http://localhost:8080/api/hello | jq .\ncurl -s -X POST http://localhost:8080/api/echo \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"hello\":\"brewnet\"}' | jq .\n```\n\n---\n\n## 데이터베이스 지원\n\n모든 스택은 `DB_DRIVER` 환경 변수를 통해 3개의 데이터베이스를 지원합니다:\n\n| DB_DRIVER | 데이터베이스 | 호스트 포트 | 비고 |\n|-----------|-------------|------------|------|\n| `postgres` (기본값) | PostgreSQL 16 | 5433 | 기본값, 권장 |\n| `mysql` | MySQL 8.4 | 3307 | 대안 |\n| `sqlite3` | SQLite3 | — | 외부 컨테이너 불필요 |\n\n### 기본 접속 정보\n\n| 항목 | 값 |\n|------|-----|\n| DB명 | `brewnet_db` |\n| 사용자명 | `brewnet` |\n| 비밀번호 | `password` |\n\n```bash\n# PostgreSQL 접속 (호스트에서)\npsql -h localhost -p 5433 -U brewnet -d brewnet_db\n\n# MySQL 접속 (호스트에서)\nmysql -h 127.0.0.1 -P 3307 -u brewnet -p brewnet_db\n```\n\n### 데이터베이스 전환\n\n```bash\nmake down\n# .env 수정: DB_DRIVER=mysql\nmake dev\n```\n\n---\n\n## 포트 규약\n\n| 서비스 | 컨테이너 포트 | 호스트 포트 | 비고 |\n|--------|--------------|------------|------|\n| Backend | 8080 | `localhost:8080` | 전 스택 공통 |\n| Frontend | 5173 (dev) / 80 (prod) | `localhost:3000` | 프로덕션에서 nginx |\n| PostgreSQL | 5432 | `localhost:5433` | 로컬 PG 충돌 방지 |\n| MySQL | 3306 | `localhost:3307` | 로컬 MySQL 충돌 방지 |\n\n---\n\n## Makefile 타겟\n\n모든 스택에서 동일합니다:\n\n| 타겟 | 설명 |\n|------|------|\n| `make dev` | 핫 리로드로 시작 (`docker compose up --build`) |\n| `make build` | Docker 이미지 빌드 |\n| `make up` | 프로덕션 모드 (백그라운드) |\n| `make down` | 전체 서비스 중지 |\n| `make logs` | 컨테이너 로그 추적 |\n| `make test` | 테스트 실행 |\n| `make clean` | 컨테이너, 볼륨, 이미지 제거 |\n| `make validate` | API 엔드포인트 검증 |\n\n---\n\n## 저장소 구조\n\n```\nbrewnet-boilerplate/\n├── stacks/                          ← 풀스택 보일러플레이트\n│   ├── go-gin/                      ← Go (Gin + React)\n│   ├── go-echo/                     ← Go (Echo + React)\n│   ├── go-fiber/                    ← Go (Fiber v3 + React)\n│   ├── rust-actix-web/              ← Rust (Actix-web + React)\n│   ├── rust-axum/                   ← Rust (Axum + React)\n│   ├── java-springboot/             ← Java (Spring Boot 3.3 + React)\n│   ├── java-spring/                 ← Java (Spring Framework 6.2 + React)\n│   ├── kotlin-ktor/                 ← Kotlin (Ktor + React)\n│   ├── kotlin-springboot/           ← Kotlin (Spring Boot 3.4 + React)\n│   ├── nodejs-express/              ← Node.js (Express + React)\n│   ├── nodejs-nestjs/               ← Node.js (NestJS + React)\n│   ├── nodejs-nextjs/               ← Node.js (Next.js API Routes, 통합)\n│   ├── nodejs-nextjs-full/          ← Node.js (Next.js Full-Stack, 통합)\n│   ├── python-fastapi/              ← Python (FastAPI + React)\n│   ├── python-django/               ← Python (Django + React)\n│   ├── python-flask/                ← Python (Flask + React)\n│   └── frontend-template/           ← 공유 React 프론트엔드 템플릿\n├── dashboard/                       ← 스택 관리 대시보드 (Next.js 15, 포트 4000)\n├── shared/                          ← 공용 스크립트\n│   ├── scripts/validate.sh          ← 헬스체크 + API 검증\n│   └── traefik/                     ← 리버스 프록시 설정\n├── docs/                            ← 문서\n├── .github/workflows/               ← CI: 전체 스택 검증\n├── CLAUDE.md                        ← AI 어시스턴트 가이드\n├── LICENSE                          ← Apache 2.0 라이선스\n└── README.md                        ← 영문 README\n```\n\n각 `stacks/{lang}-{framework}/` 디렉토리에는 다음이 포함됩니다:\n\n```\nstacks/{lang}-{framework}/\n├── backend/           ← 백엔드 소스 + Dockerfile\n├── frontend/          ← React 19 + TypeScript + Dockerfile (nextjs 제외)\n├── docker-compose.yml ← 전체 서비스 정의\n├── Makefile           ← 통일된 빌드 타겟\n├── .env.example       ← 환경 변수 템플릿\n└── README.md          ← 스택별 문서\n```\n\n---\n\n## Docker 아키텍처\n\n- **멀티스테이지 빌드** — 모든 Dockerfile에서 builder → runner\n- **비루트 사용자 실행** — `appuser` 또는 언어 관례\n- **헬스체크** — 모든 서비스에 `HEALTHCHECK` 지시어\n- **네트워크 격리** — `brewnet` (public) + `brewnet-internal` (DB 전용)\n- **리소스 제한** — `deploy.resources.limits`로 CPU/메모리 제한\n\n---\n\n## 환경 변수\n\n모든 스택 공통 (`.env.example`):\n\n| 변수 | 기본값 | 설명 |\n|------|--------|------|\n| `PROJECT_NAME` | `brewnet` | 프로젝트명 |\n| `DOMAIN` | `localhost` | 도메인 |\n| `DB_DRIVER` | `postgres` | `postgres` \\| `mysql` \\| `sqlite3` |\n| `DB_HOST` | `postgres` | Docker: `postgres`, 로컬: `localhost` |\n| `DB_PORT` | `5432` | PostgreSQL 포트 |\n| `DB_NAME` | `brewnet_db` | DB명 |\n| `DB_USER` | `brewnet` | DB 사용자 |\n| `DB_PASSWORD` | `password` | DB 비밀번호 |\n| `MYSQL_HOST` | `mysql` | Docker: `mysql`, 로컬: `localhost` |\n| `MYSQL_PORT` | `3306` | MySQL 포트 |\n| `MYSQL_DATABASE` | `brewnet_db` | MySQL DB명 |\n| `MYSQL_USER` | `brewnet` | MySQL 사용자 |\n| `MYSQL_PASSWORD` | `password` | MySQL 비밀번호 |\n| `MYSQL_ROOT_PASSWORD` | `password` | MySQL 루트 비밀번호 |\n| `SQLITE_PATH` | `/app/data/brewnet_db.db` | SQLite 파일 경로 |\n| `BACKEND_PORT` | `8080` | 백엔드 호스트 포트 |\n| `FRONTEND_PORT` | `3000` | 프론트엔드 호스트 포트 |\n| `VITE_API_URL` | `http://localhost:8080` | 프론트엔드 개발용 API URL |\n| `TZ` | `Asia/Seoul` | 타임존 |\n\n---\n\n## 대시보드\n\n`dashboard/` 디렉토리에는 브라우저에서 16개 스택을 실행하고 테스트할 수 있는 **Next.js 15 메타 대시보드**가 포함되어 있습니다. 각 스택마다 터미널을 열 필요가 없습니다.\n\n### 사전 요구사항\n\n| 요구사항 | 설명 |\n|----------|------|\n| **Node.js 18+** | 대시보드 실행에 필요 |\n| **Docker Desktop** (실행 중) | 스택 **Start** 시 필요 |\n\n\u003e ⚠️ 대시보드 UI(`npm run dev`)는 Docker 없이 시작됩니다. 하지만 스택 카드의 **▶ Start** 버튼을 누르면 내부적으로 `docker compose up -d --build`를 실행하므로 — 그 시점에 **Docker Desktop이 반드시 실행 중**이어야 합니다.\n\n### 빠른 설정\n\n```bash\n# 1. Docker Desktop 실행 확인\ndocker info\n\n# 2. 저장소 클론 후 대시보드 실행\ngit clone https://github.com/claude-code-expert/brewnet-boilerplate.git\ncd brewnet-boilerplate/dashboard\nnpm install\nnpm run dev\n# → http://localhost:4000\n```\n\n브라우저에서 **http://localhost:4000**을 열면 16개 스택이 그리드로 표시됩니다:\n\n- **▶ Start** — `docker compose up -d --build`로 스택 실행\n- **README** — 해당 스택의 README.md를 모달로 렌더링\n- **GitHub ↗** — GitHub의 orphan 브랜치로 바로 이동\n\n스택이 **Running** 상태가 되면 카드에 표시된 주소로 접속하세요:\n\n```\n프론트엔드  →  http://localhost:3001  (할당된 포트)\n백엔드     →  http://localhost:8081\n```\n\n![Brewnet Dashboard](./public/images/brewnet-boilerplate.png)\n\n### 대시보드 기능\n\n| 기능 | 설명 |\n|------|------|\n| Start / Stop | 원하는 스택을 `docker compose up -d --build`로 실행 |\n| 실시간 상태 | 실행 중인 스택 상태를 5초마다 자동 갱신 |\n| 다중 스택 | 동적 포트 할당(백엔드 8081–8096, 프론트엔드 3001–3016)으로 여러 스택 동시 실행 가능 |\n| README 뷰어 | 각 스택의 README.md를 모달로 렌더링 |\n| API 탐색기 | 4개 엔드포인트를 인라인에서 직접 테스트 (`GET /`, `/health`, `/api/hello`, `POST /api/echo`) |\n| GitHub 링크 | 각 스택의 orphan 브랜치를 바로 열기 |\n\n\u003e **참고**: 대시보드는 스택 포트(3001–3016, 8081–8096)와 충돌을 방지하기 위해 **포트 4000**에서 실행됩니다.\n\n---\n\n## CI\n\nGitHub Actions가 푸시 시 모든 스택을 검증합니다:\n\n```\ndocker compose build → docker compose up -d → GET /health (200) → GET /api/hello (200) → docker compose down\n```\n\n---\n\n## 기여하기\n\n기여를 환영합니다! 지원하고 싶은 기술 스택이 있을 경우, 아래 조건을 충족하게 만드신 후 PR을 보내주세요.\n\n---\n\n### Step 1: 디렉토리 생성\n\n```bash\nmkdir -p stacks/{lang}-{framework}\n# 예: stacks/ruby-rails, stacks/csharp-aspnet, stacks/elixir-phoenix\n```\n\n디렉토리에는 다음 파일들이 포함되어야 합니다:\n\n```\nstacks/{lang}-{framework}/\n├── backend/              # 백엔드 소스 코드 + Dockerfile\n│   ├── Dockerfile        # 멀티스테이지 빌드 (builder → runner)\n│   └── .dockerignore\n├── frontend/             # React 19 + Vite 6 + TypeScript (기존 스택에서 복사)\n│   ├── Dockerfile        # 멀티스테이지 빌드 (node → nginx)\n│   └── .dockerignore\n├── docker-compose.yml    # backend + frontend + postgres + mysql 서비스\n├── Makefile              # 표준 타겟 (dev, build, up, down, logs, test, clean, validate)\n├── .env.example          # 환경 변수 템플릿\n└── README.md             # 스택별 문서 (한글/영문 이중 언어)\n```\n\n### Step 2: 4개 백엔드 엔드포인트 구현\n\n모든 스택은 동일한 API 규약을 구현해야 합니다:\n\n| 메서드 | 경로 | 응답 형식 |\n|--------|------|----------|\n| `GET` | `/` | `{\"service\":\"{framework}-backend\",\"status\":\"running\",\"message\":\"Hello Brewnet (https://www.brewnet.dev)\"}` |\n| `GET` | `/health` | `{\"status\":\"ok\",\"timestamp\":\"...\",\"db_connected\":true\\|false}` |\n| `GET` | `/api/hello` | `{\"message\":\"Hello from {Framework}!\",\"lang\":\"{lang}\",\"version\":\"...\"}` |\n| `POST` | `/api/echo` | 요청 본문을 그대로 반환 |\n\n### Step 3: 데이터베이스 지원\n\n`DB_DRIVER` 환경 변수를 통해 3개의 데이터베이스를 지원해야 합니다:\n\n- **PostgreSQL** (`DB_DRIVER=postgres`) — 기본값\n- **MySQL** (`DB_DRIVER=mysql`) — 대안\n- **SQLite3** (`DB_DRIVER=sqlite3`) — 파일 기반, 외부 컨테이너 불필요\n\n### Step 4: Docker 요구사항\n\n| 요구사항 | 설명 |\n|----------|------|\n| 멀티스테이지 빌드 | 빌드 스테이지 → 경량 실행 스테이지 |\n| 비루트 사용자 | `appuser` 또는 언어 관례로 실행 |\n| HEALTHCHECK | 백엔드에 HEALTHCHECK 지시어 포함 |\n| .dockerignore | 불필요한 파일 빌드 컨텍스트에서 제외 |\n| 네트워크 격리 | `brewnet` (public) + `brewnet-internal` (DB 전용) |\n| 리소스 제한 | docker-compose.yml에 CPU/메모리 제한 설정 |\n| 포트 규약 | Backend: `8080`, Frontend: `3000`, PostgreSQL: `5433`, MySQL: `3307` |\n\n\u003e **중요**: HEALTHCHECK 명령에서 `localhost` 대신 `127.0.0.1`을 사용하세요. Alpine 컨테이너는 `localhost`를 IPv6(`::1`)로 해석하여 헬스체크가 실패할 수 있습니다.\n\n### Step 5: 프론트엔드 연동\n\n기존 스택(예: `stacks/go-gin/frontend/`)에서 `frontend/` 디렉토리를 복사하세요. React 프론트엔드는 모든 스택에서 공유됩니다.\n\n- `App` 컴포넌트가 `GET /api/hello`를 호출하고 응답을 표시\n- 프로덕션: nginx가 정적 파일을 제공하고 `/api`를 백엔드로 역프록시\n\n### Step 6: Makefile 작성\n\n기존 스택에서 `Makefile`을 복사하고 테스트 명령을 해당 언어에 맞게 수정하세요:\n\n```makefile\nmake dev       # docker compose up --build\nmake build     # docker compose build\nmake up        # docker compose up -d\nmake down      # docker compose down\nmake logs      # docker compose logs -f\nmake test      # 테스트 실행 (언어별 명령)\nmake clean     # docker compose down -v --rmi local\nmake validate  # bash ../../shared/scripts/validate.sh\n```\n\n### Step 7: README 작성\n\n기존 스택 README 형식을 따라 한글/영문 이중 언어로 README를 작성하세요. 상단에 모노레포 참조를 추가하세요:\n\n```markdown\n**[Brewnet Boilerplate](../../README.md) 모노레포의 일부입니다** — 전체 스택 목록, CLI 사용법, 클론 방법은 루트 README를 참고하세요.\n```\n\n### Step 8: 검증\n\n```bash\ncd stacks/{lang}-{framework}\n\nmake build\nmake dev\n\ncurl -s http://localhost:8080/ | jq .\ncurl -s http://localhost:8080/health | jq .\ncurl -s http://localhost:8080/api/hello | jq .\ncurl -s -X POST http://localhost:8080/api/echo \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"test\":\"brewnet\"}' | jq .\n\nopen http://localhost:3000\nmake validate\nmake clean\n```\n\n### Step 9: PR 제출\n\n```bash\n# 1. GitHub에서 이 저장소를 Fork하세요\n\n# 2. Fork를 클론하고 develop 브랜치로 전환\ngit clone https://github.com/\u003cyour-username\u003e/brewnet-boilerplate.git\ncd brewnet-boilerplate\ngit checkout develop\n\n# 3. develop에서 기능 브랜치 생성\ngit checkout -b feat/add-{lang}-{framework}-stack\n\n# 4. 변경 사항 커밋\ngit add stacks/{lang}-{framework}/\ngit commit -m \"feat: add {lang}-{framework} stack\"\n\n# 5. Fork에 푸시\ngit push origin feat/add-{lang}-{framework}-stack\n\n# 6. GitHub에서 PR 생성: 본인 Fork → 원본 저장소의 develop 브랜치\n```\n\n\u003e **중요**: PR 대상은 반드시 `develop` 브랜치입니다. `main`이 아닙니다.\n\n**PR 체크리스트**:\n\n- [ ] 디렉토리가 `stacks/{lang}-{framework}/` 네이밍 규칙을 따름\n- [ ] 4개 엔드포인트 구현 및 정상 응답\n- [ ] 멀티 DB 지원 (PostgreSQL, MySQL, SQLite3)\n- [ ] `make dev`로 전체 스택 시작\n- [ ] `make validate` 통과\n- [ ] 멀티스테이지 Dockerfile + 비루트 사용자\n- [ ] README가 한글/영문 이중 언어로 작성됨\n- [ ] 시크릿이나 인증 정보가 커밋되지 않음\n\n---\n\n### 문의\n\n기여 관련 문의 사항이 있으시면 편하게 연락해 주세요:\n\n- Email: [brewnet.dev@gmail.com](mailto:brewnet.dev@gmail.com)\n- Website: [https://www.brewnet.dev](https://www.brewnet.dev)\n\n---\n\n## 라이선스\n\n[Apache 2.0](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclaude-code-expert%2Fbrewnet-boilerplate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclaude-code-expert%2Fbrewnet-boilerplate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclaude-code-expert%2Fbrewnet-boilerplate/lists"}