Rust をバックエンド、Next.js 16(TypeScript)をフロントエンドに使い、AWS × Terraform でインフラも含めて作る個人テックブログ用モノレポです。
Rust 公式ドキュメントを超初心者向けに噛み砕く記事や普段の開発で得た知見や学習内容を書きながら、アプリケーションとインフラの両方を学ぶことを目的としています。
|
目標
|
進捗
|
技術選定理由
|
| ディレクトリ | 内容 | ドキュメント |
|---|---|---|
|
Frontend
|
|
|
|
Backend
|
|
|
|
Infrastructure
|
|
|
|
Packages
|
|
各パッケージのREADME(予定) |
| Frontend | Backend | Infrastructure |
|---|---|---|
|
|
|
graph TB
subgraph "🌐 Frontend"
A[Next.js 16<br/>App Router]
B[Tailwind CSS<br/>shadcn/ui]
C[TypeScript<br/>React]
end
subgraph "⚡ Backend"
D[Rust<br/>Axum]
E[SQLx<br/>PostgreSQL]
F[Tokio<br/>Async Runtime]
end
subgraph "☁️ AWS Infrastructure"
G[ECS Fargate<br/>App Runner]
H[RDS/Aurora<br/>PostgreSQL]
I[ALB<br/>CloudFront]
end
A --> D
D --> E
G --> H
D --> G
style A fill:#61dafb
style D fill:#ce422b
style G fill:#ff9900
🔍 プロジェクト全体構造
blog/
├── 📱 apps/
│ ├── 🌐 frontend/ # Next.js 16 + TS + Tailwind + shadcn + Jest + Husky
│ └── ⚡ backend/ # Rust + Tokio + Axum + SQLx
├── 📦 packages/
│ ├── 🎨 ui/ # 共通 UI コンポーネント(TS/React)
│ ├── 🛠️ utils/ # フロント用ユーティリティ(TS)
│ └── 📋 schema/ # API レスポンスなどの型・スキーマ(TS)
├── 🏗️ infra/
│ └── terraform/
│ ├── 🧪 staging/ # ステージング環境用の AWS リソース定義
│ └── 🚀 prod/ # 本番環境用の AWS リソース定義
├── 🐳 docker-compose.yml # ローカル開発用(frontend + backend + local Postgres)
├── 📝 .env.example # ルート共通の環境変数テンプレ
├── 🚫 .gitignore
└── 📖 README.md
📁 Frontend ディレクトリ構造
apps/frontend/
├── 📱 app/
│ └── (blog)/
│ ├── 🎨 layout.tsx
│ ├── 📄 page.tsx # 記事一覧
│ └── [slug]/
│ └── 📖 page.tsx # 記事詳細
├── 🧩 components/
│ ├── 🏗️ layout/
│ └── 📝 blog/
├── 📚 lib/
│ ├── 🔌 api-client/ # Rust backend API 用の HTTP クライアント
│ └── 🔐 auth/ # 認証・セッションロジック(必要に応じて)
├── 🧪 tests/
│ ├── unit/
│ └── e2e/
├── 🖼️ public/
├── 🎨 styles/
│ └── globals.css # Tailwind エントリ
├── ⚙️ tailwind.config.ts
├── 📦 postcss.config.mjs
├── 🧪 jest.config.ts
├── ⚙️ next.config.mjs
├── 📋 package.json
└── 📄 tsconfig.json
|
🎯 App Router 構成
|
🎨 UI/UX
|
🧪 品質保証
|
🦀 Backend ディレクトリ構造
apps/backend/
├── 📦 src/
│ ├── 🚀 main.rs
│ ├── 🌐 api/ # ルーティング & ハンドラ(REST / JSON)
│ │ ├── mod.rs
│ │ ├── 📝 posts.rs # /posts, /posts/{id}
│ │ └── 💚 health.rs # /health
│ ├── 🏛️ domain/ # ドメインロジック(HTTP/DB 非依存)
│ │ ├── mod.rs
│ │ └── 📄 post.rs # Post エンティティ
│ ├── 🏗️ infrastructure/ # DB・外部サービス
│ │ ├── mod.rs
│ │ └── 🗄️ db.rs # SQLx + PostgreSQL
│ └── 🔒 security/ # セキュリティ関連(ヘッダ・認証など)
│ ├── mod.rs
│ ├── 🛡️ headers.rs
│ └── 🔐 auth.rs
└── 📋 Cargo.toml
|
🌐 API Layer
|
🏛️ Domain Layer
|
Infrastructure
|
🔒 Security
|
🚀 デプロイ先: AWS ECS Fargate / App Runner でコンテナとして動作
packages/
├── ui/
│ ├── src/components/
│ │ ├── Button.tsx
│ │ ├── Badge.tsx
│ │ ├── CodeBlock.tsx
│ │ └── Layout.tsx
│ ├── package.json
│ └── tsconfig.json
├── utils/
│ ├── src/
│ │ ├── date.ts # 日付整形など
│ │ ├── slug.ts
│ │ └── markdown.ts
│ ├── package.json
│ └── tsconfig.json
└── schema/
├── src/
│ ├── post.ts # Post の型 / Zod スキーマ
│ └── index.ts
├── package.json
└── tsconfig.json
フロントエンド間で共通利用する UI / ユーティリティ / スキーマをここにまとめる。
infra/terraform/
├── staging/
│ ├── main.tf
│ ├── variables.tf
│ └── outputs.tf
└── prod/
├── main.tf
├── variables.tf
└── outputs.tf
Terraform を使って、VPC / ECS / ALB / RDS などの AWS リソースをコードとして管理。
ステージングと本番でディレクトリを分けておき、ワークスペースや変数で環境差分を吸収する構成にする。
| 1️⃣ 依存関係インストール | 2️⃣ 環境変数設定 | 3️⃣ 開発サーバ起動 |
|---|---|---|
# フロントエンド
cd apps/frontend
npm install
# バックエンド
cd apps/backend
cargo build |
# 環境変数テンプレをコピー
cp .env.example .env
# 各アプリ固有の設定
cp apps/frontend/.env.example \
apps/frontend/.env.local
cp apps/backend/.env.example \
apps/backend/.env.local |
# Docker でローカル DB 起動
docker compose up -d
# フロントエンド開発サーバ
cd apps/frontend && npm run dev
# バックエンド開発サーバ
cd apps/backend && cargo run |
Frontend: http://localhost:3000
Backend: http://localhost:8000
🗄️ Database: localhost:5432
| Staging Environment | Production Environment |
|---|---|
cd infra/terraform/staging
terraform init
terraform plan
terraform applyリソース構成
|
cd infra/terraform/prod
terraform init
terraform plan
terraform applyリソース構成
|
graph LR
subgraph "🌐 Frontend"
A[Next.js App]
end
subgraph "☁️ AWS"
B[CloudFront]
C[ALB]
D[ECS Fargate]
E[RDS/Aurora]
F[S3]
end
A --> B
B --> C
C --> D
D --> E
B --> F
style B fill:#ff9900
style D fill:#ff9900
style E fill:#527fff
📝 学習ログ: 各インフラ構成の構築過程は技術ブログ記事として記録し、学習内容を共有予定