Go言語のChi(HTTPルーター)とHuma(APIフレームワーク)によるバックエンドと、Svelte 5によるフロントエンドを組み合わせたTODOアプリケーション。
学習目的で作成しており、全てのファイルに詳細なコメントを記載しています。
| レイヤー | 技術 | 役割 |
|---|---|---|
| フロントエンド | Svelte 5 + Vite+ | TODOアプリのUI |
| バックエンド | Go + Chi v5 + Huma v2 | REST API(OpenAPI自動生成) |
| リバースプロキシ | Caddy | 静的ファイル配信 + APIプロキシ(Docker時) |
| コンテナ | Docker Compose | 全サービスの一括管理 |
svelte-go-todo/
├── docker-compose.yml # Docker Compose 設定
├── backend/
│ ├── Dockerfile # Go マルチステージビルド
│ ├── main.go # API 本体(CRUD + CORS)
│ ├── go.mod # Go モジュール定義
│ └── go.sum
└── frontend/
├── Dockerfile # Node build → Caddy 配信
├── Caddyfile # Caddy 設定(プロキシ含む)
├── package.json # pnpm 依存関係
├── vite.config.js # Vite+ 設定(開発プロキシ)
├── svelte.config.js # Svelte 設定
├── index.html # エントリーHTML
└── src/
├── main.js # Svelte マウント
├── App.svelte # ルートコンポーネント
└── lib/
└── TodoApp.svelte # TODO CRUD コンポーネント
docker compose up --build
| URL | 内容 |
|---|---|
| http://localhost:3000 | Svelte UI |
| http://localhost:3000/api/todos | API |
| http://localhost:3000/docs | OpenAPI ドキュメント |
| http://localhost:3000/openapi.json | OpenAPI 仕様(JSON) |
停止:
docker compose down
ターミナルを2つ使います。
ターミナル1 - バックエンド:
cd backend
go run main.go
ターミナル2 - フロントエンド:
cd frontend
vp install # 初回のみ
vp dev
| URL | 内容 |
|---|---|
| http://localhost:5173 | Svelte UI(Vite+ dev server) |
| http://localhost:8888/api/todos | API(直接アクセス) |
| http://localhost:8888/docs | OpenAPI ドキュメント |
開発モードでは Vite+ のプロキシが /api/* へのリクエストを自動的にバックエンド(:8888)に転送します。
| メソッド | パス | 説明 | ステータス |
|---|---|---|---|
| GET | /api/todos |
TODO 一覧取得 | 200 |
| GET | /api/todos?completed=true |
完了済みのみ取得 | 200 |
| POST | /api/todos |
TODO 作成 | 201 |
| GET | /api/todos/{id} |
TODO 個別取得 | 200 |
| PUT | /api/todos/{id} |
TODO 更新 | 200 |
| DELETE | /api/todos/{id} |
TODO 削除 | 204 |
# 一覧取得
curl http://localhost:3000/api/todos
# 作成
curl -X POST http://localhost:3000/api/todos \
-H 'Content-Type: application/json' \
-d '{"title":"買い物に行く"}'
# 更新(完了にする)
curl -X PUT http://localhost:3000/api/todos/1 \
-H 'Content-Type: application/json' \
-d '{"title":"買い物に行く","completed":true}'
# 削除
curl -X DELETE http://localhost:3000/api/todos/1
Docker Compose
┌─────────────────────────────────────────────┐
│ │
│ ブラウザ → Caddy(:3000) │
│ ├→ / → 静的ファイル │
│ ├→ /api/* → backend:8888 │
│ └→ /docs → backend:8888 │
│ │
│ backend(:8888) │
│ Go + Chi + Huma │
│ └→ インメモリストア │
│ │
└─────────────────────────────────────────────┘