Stack · 어떻게 만들었나
이 사이트는
이렇게 만들어졌습니다.
Day 5째 운영 중. 모든 인프라가 사실상 무료 티어 안에 들어가고, 첫 해 총 비용은 약 $30~50입니다.
기술별 역할
| 기술 | 역할 | 용도 | 비용 |
|---|---|---|---|
| Astro 6.4 | 프레임워크 | 정적 사이트 생성, 콘텐츠 컬렉션 라우팅 | 무료 |
| Tailwind CSS v4.3 | 스타일링 | 디자인 토큰 + 유틸리티 클래스 | 무료 |
| Cloudflare Pages | 호스팅 | 정적 파일 서빙 + 자동 배포 | 무료 (트래픽 무제한) |
| Cloudflare Workers | 서버리스 백엔드 (예정) | 크롤링·요약·DB 쓰기 cron 작업 | 무료 (일 10만 req) |
| Cloudflare D1 | 데이터베이스 (예정) | 다이제스트·마켓 항목 저장 | 무료 |
| Anthropic Claude API Haiku 4.5+ | AI 엔진 | 기사 요약, 빌드로그 집필 (코디) | 월 약 $1~2 예상 |
| GitHub | 코드 저장 + 배포 트리거 | 버전 관리 + Cloudflare Pages 연동 | 무료 |
| Cloudflare Registrar | 도메인 | ucandoit.app 도메인 등록 | $14.20/년 |
왜 이 조합인가
React 대비 학습 곡선 1/3. Django 템플릿 발상이 그대로 통함. SSG = SEO 최강.
@theme 블록으로 색·폰트 토큰을 CSS 변수로 정의. 다크 모드도 prefers-color-scheme로 1줄 처리.
GitHub push → 자동 빌드 → 글로벌 CDN 배포. 무제한 트래픽. .app TLD는 HTTPS 자동 강제.
엣지에서 실행. 일 10만 요청 무료. Cron Triggers로 매일 새벽 자동 실행 가능.
SQLite 기반 엣지 DB. Workers에서 0-latency 접근. 일 2500만 reads 무료.
한국어 뉘앙스 우수. 메타 일관성 — Claude로 만들고 Claude가 요약하고 코디가 글 씀.
git push → Cloudflare Webhook → 자동 빌드. 사실상의 배포 파이프라인.
at-cost 가격 ($14.20/년). WHOIS Privacy 무료. DNS 자동 통합.
아키텍처
모든 게 정적 빌드 + 엣지 캐시. 사용자 요청에 서버가 도는 부분은 (지금은) 없습니다. 다이제스트·마켓 자동화가 들어가면 Workers Cron이 추가됩니다.
┌─ 작성 ────────────────────────────────────────┐ │ 운영자 + 코디(Claude) → 마크다운 파일 작성 │ │ src/content/{posts,market,trader}/*.md │ └──────────────────────────┬────────────────────┘ │ git push ▼ ┌─ GitHub ──────────────────────────────────────┐ │ kimnew1/ucandoit (main 브랜치) │ └──────────────────────────┬────────────────────┘ │ webhook ▼ ┌─ Cloudflare Pages 빌드 ───────────────────────┐ │ npm install → npm run build → dist/ │ │ Astro 정적 HTML/CSS/JS 생성 │ └──────────────────────────┬────────────────────┘ │ 자동 배포 ▼ ┌─ 엣지 CDN ────────────────────────────────────┐ │ ucandoit.app (전 세계 엣지에 캐시) │ │ HTTPS 자동 (.app TLD) │ └──────────────────────────┬────────────────────┘ │ ▼ 사용자
예상 비용 (첫 1년)
| 도메인 (ucandoit.app) | $14.20 |
| Cloudflare 전체 | $0 |
| GitHub | $0 |
| Claude API (월 ~$1.5) | ~$18 |
| 합계 | ~$32 |
결제·회원·법무 인프라가 없어서 가능한 가격. 트래픽이 폭증해도 Cloudflare 무료 티어 한도가 워낙 커서 한참 동안은 비용이 늘지 않습니다.
실제 코드 살짝
콘텐츠 컬렉션 (Astro v5)
마크다운 파일을 컬렉션으로 정의하고 zod로 frontmatter 검증.
const posts = defineCollection({
loader: glob({ pattern: "**/*.md", base: "./src/content/posts" }),
schema: z.object({
title: z.string(),
date: z.coerce.date(),
author: z.string().default("코디 (Kody)"),
tags: z.array(z.string()).default([]),
description: z.string().optional(),
draft: z.boolean().default(false),
}),
}); 디자인 토큰 (Tailwind v4)
@theme 블록에서 CSS 변수로 토큰 정의. 다크 모드는 @media 한 줄로 자동 전환.
@theme {
--color-bg: #faf9f6;
--color-fg: #1a1816;
--color-accent: #d94a4a;
}
@media (prefers-color-scheme: dark) {
:root {
--color-bg: #0a0a0a;
--color-fg: #fafafa;
--color-accent: #ff7878;
}
} Day 카운터 (KST 보정)
Cloudflare 빌드 서버는 UTC. KST 자정에 카운터가 넘어가도록 보정.
export const PROJECT_START = new Date("2026-05-28T00:00:00+09:00");
export function getDayOfBuilding(now: Date = new Date()): number {
const msPerDay = 1000 * 60 * 60 * 24;
return Math.floor((now.getTime() - PROJECT_START.getTime()) / msPerDay) + 1;
} 비슷한 거 만들고 싶다면
이 사이트 코드는 GitHub에 공개돼 있고, 위 스택은 그대로 따라 하면 됩니다. 가장 큰 진입 장벽은 도메인 결정과 첫 배포까지. 그 과정을 빌드로그에 시간 순서대로 적어뒀습니다.