Skip to content

Commit 87fce57

Browse files
authored
콘텐츠 관리 시스템을 SQLite + 개발 전용 어드민 UI로 전환
2 parents 4d3c641 + cae72f6 commit 87fce57

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+4410
-269
lines changed

.github/workflows/deploy-pages.yml

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
with:
2424
ref: main
2525

26-
- name: Checkout content
26+
- name: Checkout content (blog.db)
2727
uses: actions/checkout@v4
2828
with:
2929
ref: content
@@ -51,24 +51,11 @@ jobs:
5151
restore-keys: |
5252
${{ runner.os }}-nextjs-${{ hashFiles('pnpm-lock.yaml') }}-
5353
54-
- name: Restore Velite cache
55-
uses: actions/cache@v4
56-
id: velite-cache
57-
with:
58-
path: .velite
59-
key: ${{ runner.os }}-velite-${{ hashFiles('velite.config.ts', 'content/**') }}
60-
6154
- name: Install dependencies
6255
run: pnpm install --frozen-lockfile
6356

64-
- name: Build content
65-
if: steps.velite-cache.outputs.cache-hit != 'true'
66-
run: pnpm content
67-
6857
- name: Build
6958
run: pnpm build
70-
env:
71-
VELITE_STARTED: "1"
7259

7360
- name: Upload artifact
7461
uses: actions/upload-pages-artifact@v3

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,10 @@ yarn-error.log*
4646
*.tsbuildinfo
4747
next-env.d.ts
4848

49+
# 빌드 시 자동 생성되는 임시 콘텐츠 디렉토리
50+
.content-build/
51+
52+
# drizzle 마이그레이션
53+
/drizzle
54+
4955
.claude

drizzle.config.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { defineConfig } from "drizzle-kit";
2+
3+
export default defineConfig({
4+
schema: "./src/db/schema.ts",
5+
out: "./drizzle",
6+
dialect: "sqlite",
7+
dbCredentials: { url: "./content/blog.db" },
8+
});

next.config.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
import type { NextConfig } from "next";
22

33
const isDev = process.argv.indexOf("dev") !== -1;
4-
const isBuild = process.argv.indexOf("build") !== -1;
54

6-
if (!process.env.VELITE_STARTED && (isDev || isBuild)) {
5+
// dev 모드에서만 Velite watch 실행 (build는 package.json 스크립트에서 미리 처리)
6+
if (!process.env.VELITE_STARTED && isDev) {
77
process.env.VELITE_STARTED = "1";
8-
import("velite").then((m) => m.build({ watch: isDev, clean: !isDev }));
8+
import("velite").then((m) => m.build({ watch: true, clean: false }));
99
}
1010

11+
const isProd = process.env.NODE_ENV === "production";
12+
1113
const nextConfig: NextConfig = {
12-
output: "export",
14+
output: isProd ? "export" : undefined,
1315
reactCompiler: true,
16+
pageExtensions: isProd
17+
? ["tsx", "ts", "jsx", "js"]
18+
: ["tsx", "ts", "jsx", "js", "dev.tsx", "dev.ts"],
1419
};
1520

1621
export default nextConfig;

package.json

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@
44
"private": true,
55
"packageManager": "pnpm@10.28.2",
66
"scripts": {
7-
"dev": "next dev",
8-
"build": "next build",
7+
"dev": "pnpm content && next dev",
8+
"build": "pnpm content && next build",
99
"start": "next start",
1010
"lint": "biome check",
1111
"format": "biome format --write && biome check --fix",
12-
"content": "velite --clean"
12+
"content": "tsx scripts/export-content.ts && velite --clean",
13+
"db:generate": "drizzle-kit generate",
14+
"db:migrate": "drizzle-kit migrate",
15+
"db:studio": "drizzle-kit studio"
1316
},
1417
"dependencies": {
1518
"@giscus/react": "^3.1.0",
@@ -18,29 +21,44 @@
1821
"@radix-ui/react-tooltip": "^1.2.8",
1922
"@shikijs/rehype": "^3.21.0",
2023
"@tailwindcss/typography": "^0.5.19",
24+
"better-sqlite3": "^12.6.2",
2125
"class-variance-authority": "^0.7.1",
2226
"clsx": "^2.1.1",
2327
"cmdk": "^1.1.1",
28+
"drizzle-orm": "^0.45.1",
2429
"fuse.js": "^7.1.0",
2530
"lucide-react": "^0.563.0",
2631
"next": "16.1.6",
2732
"next-themes": "^0.4.6",
2833
"pretendard": "^1.3.9",
34+
"radix-ui": "^1.4.3",
2935
"react": "19.2.3",
3036
"react-dom": "19.2.3",
37+
"react-markdown": "^10.1.0",
3138
"rehype-autolink-headings": "^7.1.0",
3239
"rehype-slug": "^6.0.0",
3340
"shiki": "^3.21.0",
41+
"sonner": "^2.0.7",
3442
"tailwind-merge": "^3.4.0"
3543
},
44+
"pnpm": {
45+
"onlyBuiltDependencies": [
46+
"better-sqlite3",
47+
"esbuild"
48+
]
49+
},
3650
"devDependencies": {
3751
"@biomejs/biome": "2.2.0",
3852
"@tailwindcss/postcss": "^4",
53+
"@types/better-sqlite3": "^7.6.13",
3954
"@types/node": "^20",
4055
"@types/react": "^19",
4156
"@types/react-dom": "^19",
4257
"babel-plugin-react-compiler": "1.0.0",
58+
"drizzle-kit": "^0.31.9",
59+
"gray-matter": "^4.0.3",
4360
"tailwindcss": "^4",
61+
"tsx": "^4.21.0",
4462
"tw-animate-css": "^1.4.0",
4563
"typescript": "^5",
4664
"velite": "^0.3.1"

0 commit comments

Comments
 (0)