AI ๊ธฐ๋ฐ RSS/Atom ํผ๋ ์์ง ๋ฐ ์์ฝ ์๋น์ค์ ๋๋ค. Go ๋ฐฑ์๋, Lit ๊ธฐ๋ฐ ์น UI, Firebase Functions FCM ํธ์ ์๋ฆผ์ ์ ๊ณตํฉ๋๋ค.
- 100% ๋ฌด๋ฃ: GitHub Actions + GitHub Pages + Firebase Functions
- ์๋ํ: ๋งค์ผ ์ค์ 7์ ์๋ ์คํ + FCM ํธ์ ์๋ฆผ
- 4๊ฐ์ง ํ๋ฆฌ์ : ๐ฐ ์ผ๋ฐ, ๐ง ๊ฐ๋ฐ์, โ ์บ์ฃผ์ผ, ๐ฌ ์ปค๋ฎค๋ํฐ
- ๋ชจ๋ ์น UI: Lit 3.0 ์น ์ปดํฌ๋ํธ, ๋คํฌ๋ชจ๋ ์ง์
- PWA ์ง์: ์คํ๋ผ์ธ ์บ์ฑ, ๋ชจ๋ฐ์ผ ์ต์ ํ
- ํธ์ ์๋ฆผ: Firebase FCM ๊ธฐ๋ฐ ์ค์๊ฐ ์๋ฆผ
- ๊ตฌ๋ ๊ด๋ฆฌ: ์น UI์์ ์ํด๋ฆญ ๊ตฌ๋ /ํด์
- ์๋ ์๋ฆผ: ์๋ก์ด ํผ๋ ์์ฑ ์ ์๋ ๋ฐ์ก
- ํ ํฝ ๊ธฐ๋ฐ:
daily-feed
ํ ํฝ์ผ๋ก ๋ชจ๋ ๊ตฌ๋ ์์๊ฒ ์ ์ก
- ์๋ ๋ฐ์ก: ๋งค์ผ ์๋ก์ด ์ฝํ ์ธ ์์ฑ ์
- ์๋ ํ ์คํธ: GitHub Actions๋ฅผ ํตํ ํ ์คํธ ์๋ฆผ
daily-feed/
โโโ backend/ # Go ์ ํ๋ฆฌ์ผ์ด์
โ โโโ cmd/
โ โ โโโ generate/ # ํผ๋ ์์ฑ ๋ช
๋ น
โ โ โโโ fcm-send/ # FCM ์๋ฆผ ๋ฐ์ก ๋๊ตฌ
โ โ โโโ fcm-subscribe/ # FCM ๊ตฌ๋
๊ด๋ฆฌ ๋๊ตฌ
โ โโโ internal/ # ๋ด๋ถ ํจํค์ง
โ โโโ pkg/ # ๊ณต์ฉ ํจํค์ง (FCM ํด๋ผ์ด์ธํธ ํฌํจ)
โ โโโ main.go # CLI ์ง์
์
โ โโโ feeds.csv # ํผ๋ ๋ชฉ๋ก
โ โโโ samples/ # ์ํ ์ถ๋ ฅ
โโโ web/ # ์น ์ ํ๋ฆฌ์ผ์ด์
โ โโโ components/ # Lit ์น ์ปดํฌ๋ํธ
โ โ โโโ daily-feed-app.js # ๋ฉ์ธ ์ฑ ์ปดํฌ๋ํธ
โ โ โโโ content-viewer.js # ์ฝํ
์ธ ๋ทฐ์ด (ํ๋กฌํํธ ๋ณด๊ธฐ ํฌํจ)
โ โ โโโ notification-toggle.js # FCM ์๋ฆผ ํ ๊ธ
โ โ โโโ firebase-push-manager.js # Firebase FCM ๊ด๋ฆฌ์
โ โโโ config.js # Firebase ์ค์
โ โโโ index.html # ๋ฉ์ธ ํ์ด์ง
โ โโโ manifest.json # PWA ๋งค๋ํ์คํธ
โ โโโ sw.js # ์๋น์ค ์์ปค
โ โโโ firebase-messaging-sw.js # FCM ์๋น์ค ์์ปค
โโโ functions/ # Firebase Functions
โ โโโ src/index.ts # FCM ๊ตฌ๋
/ํด์ ํจ์
โ โโโ package.json
โ โโโ tsconfig.json
โโโ data/summaries/ # ์์ฑ๋ JSON ๋ฐ์ดํฐ
โโโ .github/workflows/ # CI/CD ํ์ดํ๋ผ์ธ
โ โโโ daily-feed.yml # ํผ๋ ์์ฑ + FCM ์๋ฆผ
โ โโโ pages.yml # GitHub Pages ๋ฐฐํฌ
โ โโโ fcm-test.yml # FCM ํ
์คํธ ์๋ฆผ
โโโ .firebaserc # Firebase ํ๋ก์ ํธ ์ค์
โโโ firebase.json # Firebase ๋ฐฐํฌ ์ค์
โโโ README.md
- ์ด ์ ์ฅ์๋ฅผ GitHub์ ํธ์
- GitHub Secrets์ ๋ค์ ์ถ๊ฐ:
GEMINI_API_KEY
: Google Gemini API ํคFIREBASE_SERVICE_ACCOUNT_KEY
: Firebase Service Account JSON
- GitHub Pages ์ค์ : Settings > Pages > Source๋ฅผ "GitHub Actions"๋ก ์ค์
- Firebase ํ๋ก์ ํธ ์์ฑ ๋ฐ Blaze ํ๋ ์ ๊ทธ๋ ์ด๋
- Firebase Functions ๋ฐฐํฌ:
cd functions npm install npm run build firebase deploy --only functions
- FCM ์ค์ :
- Firebase Console > Project settings > Cloud Messaging
- ์น ํธ์ ์ธ์ฆ์ ์์ฑ ๋ฐ VAPID ํค ํ์ธ
web/config.js
์ Firebase ์ค์ ์ถ๊ฐ
๋งค์ผ ์ค์ 7์(ํ๊ตญ ์๊ฐ)์ ์๋์ผ๋ก ์คํ๋์ด:
- 4๊ฐ์ง ํ๋ฆฌ์ ์ผ๋ก ํผ๋ ์์ง ๋ฐ AI ์์ฝ ์์ฑ
- JSON ํ์ผ๋ก ์ ์ฅ ๋ฐ ์ปค๋ฐ
- FCM ํธ์ ์๋ฆผ ์๋ ๋ฐ์ก (์ ์ฝํ ์ธ ์์ฑ ์๋ง)
- GitHub Pages์ ์๋ ๋ฐฐํฌ
- ํผ๋ ์์ฑ: "Daily Feed Generation" ์ํฌํ๋ก์ฐ
- FCM ํ ์คํธ: "FCM Test Notification" ์ํฌํ๋ก์ฐ
- URL:
https://geeksbaek.github.io/daily-feed/
- ๊ธฐ๋ฅ:
- ๋ ์ง๋ณ ์์ฝ ์กฐํ
- ํ๋ฆฌ์ ๋ณ ํํฐ๋ง
- ํค์๋ ๊ฒ์
- GitHub Flavored Markdown ๋ ๋๋ง
- ๊ด๋ จ ๊ธฐ์ฌ ๋งํฌ
- ๐ FCM ํธ์ ์๋ฆผ ๊ตฌ๋ /ํด์
- ๐ค AI ํ๋กฌํํธ ๋ณด๊ธฐ (์์ฑ์ ์ฌ์ฉ๋ ์ค์ ํ๋กฌํํธ ํ์ธ)
- ๋ธ๋ผ์ฐ์ ์๋ก๊ณ ์นจ ์ ์๋ ์บ์ ๊ฐฑ์
- ์น์ฌ์ดํธ ๋ฐฉ๋ฌธ
- ์ฐ์๋จ ๐ ์๋ฆผ ๋ฒํผ ํด๋ฆญ
- ๋ธ๋ผ์ฐ์ ์๋ฆผ ๊ถํ ํ์ฉ
- ์๋์ผ๋ก
daily-feed
ํ ํฝ ๊ตฌ๋
- ์ ๋ชฉ: ๐๏ธ Daily Feed
- ๋ด์ฉ: ์๋ก์ด ๊ธฐ์ ๋ด์ค ์์ฝ์ด ์ค๋น๋์์ต๋๋ค!
- ํด๋ฆญ ์: ์น์ฌ์ดํธ๋ก ์๋ ์ด๋
- ์๋ฆผ ๋ฒํผ์ ๋ค์ ํด๋ฆญํ์ฌ ํด์
- GitHub Actions: ์ 2,000๋ถ ๋ฌด๋ฃ (์ค์ ์ฌ์ฉ๋: ~200๋ถ/์)
- GitHub Pages: 100GB ๋์ญํญ ๋ฌด๋ฃ
- Firebase Functions: ์ 2๋ฐฑ๋ง ํธ์ถ ๋ฌด๋ฃ (์ค์ ์ฌ์ฉ๋: ~1,000ํ/์)
- Firebase Cloud Messaging: ๋ฌด์ ํ ๋ฌด๋ฃ
- ์ด ๋น์ฉ: $0/์
# ๋ฐฑ์๋ ๋๋ ํ ๋ฆฌ๋ก ์ด๋
cd backend
# ํผ๋ ์์ฑ (๋ก์ปฌ ํ
์คํธ)
export GEMINI_API_KEY="your-key"
go run cmd/generate/main.go
# FCM ์๋ฆผ ๋ฐ์ก ํ
์คํธ
export FIREBASE_PROJECT_ID="your-project-id"
export FIREBASE_SERVICE_ACCOUNT_KEY="path/to/serviceAccountKey.json"
go run cmd/fcm-send/main.go -topic "daily-feed" -title "ํ
์คํธ" -body "ํ
์คํธ ๋ฉ์์ง"
# CLI ๋๊ตฌ ๋น๋ ๋ฐ ์คํ
go build -o daily-feed
./daily-feed --preset developer --feeds feeds.csv
# ์น ๋๋ ํ ๋ฆฌ๋ก ์ด๋
cd web
# ๋ก์ปฌ ๊ฐ๋ฐ ์๋ฒ ์คํ
python -m http.server 8000
# ๋๋
npx serve .
# Functions ๋๋ ํ ๋ฆฌ๋ก ์ด๋
cd functions
# ์์กด์ฑ ์ค์น ๋ฐ ๋น๋
npm install
npm run build
# ๋ก์ปฌ ์๋ฎฌ๋ ์ดํฐ ์คํ
npm run serve
# ๋ฐฐํฌ
firebase deploy --only functions
{
"date": "2025-01-15",
"preset": "developer",
"summary": "๋งํฌ๋ค์ด ํ์์ AI ์์ฝ...",
"prompt": {
"system": "์์คํ
ํ๋กฌํํธ...",
"user": "์ฌ์ฉ์ ํ๋กฌํํธ..."
},
"articles": [
{
"title": "๊ธฐ์ฌ ์ ๋ชฉ",
"link": "https://...",
"source": "์ถ์ฒ",
"category": "์นดํ
๊ณ ๋ฆฌ",
"publishedAt": "2025-01-15T10:00:00Z",
"description": "๊ธฐ์ฌ ์ค๋ช
"
}
],
"generatedAt": "2025-01-15T02:00:00Z"
}
- Lit 3.0 ์น ์ปดํฌ๋ํธ ์ ํ
- ๋คํฌ ๋ชจ๋ ์์ ์ง์
- PWA ๊ธฐ๋ฅ (์คํ๋ผ์ธ ์บ์ฑ, ๋ชจ๋ฐ์ผ ์ต์ ํ)
- ํ๊ตญ์ด UI ๋ฐ ์ด๋ชจ์ง ํญ ๋ ์ด๋ธ
- ์ฐธ๊ณ ์๋ฃ ๋งํฌ ์ ์ฐฝ ์ด๊ธฐ
- ์ฝ๋ ๋ธ๋ก ๋คํฌ๋ชจ๋ ์์ ์ง์
- ๊ฐ์ ๋ ๋ก๋ฉ UI (์คํผ๋ ์ ๋๋ฉ์ด์ )
- ๋ธ๋ผ์ฐ์ ์๋ก๊ณ ์นจ ๊ฐ์ง ๋ฐ ์๋ ์บ์ ๊ฐฑ์
- AI ํ๋กฌํํธ ๋ณด๊ธฐ ๊ธฐ๋ฅ
- Firebase Functions ๊ธฐ๋ฐ FCM ๊ตฌ๋ /ํด์ API
- ์น UI FCM ์๋ฆผ ํ ๊ธ ์ปดํฌ๋ํธ
- ์๋ ํธ์ ์๋ฆผ ๋ฐ์ก (์ ์ฝํ ์ธ ์์ฑ ์)
- GitHub Actions FCM ํ ์คํธ ์ํฌํ๋ก์ฐ
- Service Worker ๊ธฐ๋ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ์๋ฆผ ์ฒ๋ฆฌ
- Go ๊ธฐ๋ฐ FCM ํด๋ผ์ด์ธํธ ๋ฐ CLI ๋๊ตฌ
- GitHub Actions ์๋ํ ํ์ดํ๋ผ์ธ
- Firebase Functions ๊ณต๊ฐ API ๋ฐฐํฌ
- ๋ณด์ ๊ฐํ (ํ๊ฒฝ ๋ณ์ ๊ธฐ๋ฐ ์ค์ )
- RSS ํผ๋ ์์ฑ
- ์ปค์คํ ๋๋ฉ์ธ ์ค์
- ๋ถ๋งํฌ ๊ธฐ๋ฅ
- ์ด๋ฉ์ผ ๊ตฌ๋
- ์ฌ์ฉ์๋ณ ๋ง์ถค ํ ํฝ ๊ตฌ๋
- ์๋ฆผ ์ค์ ์ธ๋ถ ์ต์
MIT License