https://github.com/jaichangpark/open-codelabs
open-codelabs
https://github.com/jaichangpark/open-codelabs
codelabs rust self-hosted sveltekit
Last synced: 4 months ago
JSON representation
open-codelabs
- Host: GitHub
- URL: https://github.com/jaichangpark/open-codelabs
- Owner: JAICHANGPARK
- License: apache-2.0
- Created: 2025-12-26T07:56:10.000Z (6 months ago)
- Default Branch: main
- Last Pushed: 2026-01-28T12:56:58.000Z (5 months ago)
- Last Synced: 2026-01-29T01:57:51.749Z (5 months ago)
- Topics: codelabs, rust, self-hosted, sveltekit
- Language: Svelte
- Homepage: https://open-codelabs.web.app
- Size: 4.1 MB
- Stars: 4
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.ja.md
- Contributing: docs/contributing/code-style.md
- License: LICENSE
- Agents: AGENTS.md
Awesome Lists containing this project
README
# Open Codelabs (ハンズオンシステム)
[](https://www.rust-lang.org/)
[](https://svelte.dev/)
[](https://bun.sh/)
[](https://www.docker.com/)
[](https://firebase.google.com/)
[](https://supabase.com/)
**Open Codelabs** は、Google Codelab スタイルのハンズオンセッションを簡単に運営・管理できるように設計されたオープンソースプラットフォームです。最新の技術スタックで構築されており、ファシリテーター(管理者)と参加者の両方のロールをサポートしています。コンテンツは Markdown で直接管理するか、AI を使用して自動生成することができます。
[English](README.md) | [한국어](README.ko.md) | [日本語](README.ja.md) | [中文](README.zh.md)
---
## 🚀 主な特徴
- **ファシリテーターと参加者の分離**: 管理者はコードラボを作成・管理し、参加者は洗練された UI を通じてステップに従うことができます。
- **AI コードラボ生成器**: Google Gemini AI を使用して、ソースコードや参照ドキュメントからプロフェッショナルなコードラボを自動生成します。
- **Code Server ワークスペース(任意)**: コードラボごとの code-server ワークスペースを作成し、ステップごとのスナップショット(ブランチ/フォルダモード)とダウンロードを提供します。
- **クイズ・フィードバック・修了証**: クイズやフィードバック提出を修了条件に設定し、検証 URL 付きの修了証を自動発行します。
- **準備ガイド & 資料管理**: 事前準備ガイドを手書きまたは AI 生成し、リンク/ファイルを一括配布できます。
- **ライブワークショップツール**: ライブチャット/DM、ヘルプリクエストキュー、提出物パネル、修了証保持者だけを対象にするルーレット抽選を提供します。
- **マルチランタイムサポート**: ローカル/プライベートセッション用の **Rust (Axum) + SQLite** バックエンド、またはサーバーレス環境用の **Firebase (Firestore/Hosting)** または **Supabase** デプロイをサポートしています。
- **Google Codelab Look & Feel**: 慣れ親しんだ、読み取りやすい Google スタイルのデザインを採用しています。
- **簡単な外部公開**: `ngrok`、`bore`、`cloudflared`(Cloudflare Tunnel) 統合スクリプトにより、ローカルサーバーを即座に外部に公開し、参加者が QR コードでアクセスできるようにサポートします。
- **多言語対応**: グローバルなワークショップ運営のための i18n サポートが組み込まれています。
---
## ⚡ クイックスタート (Quickstart)
数秒でシステムを起動できます:
```bash
# リポジトリをクローン
git clone https://github.com/JAICHANGPARK/open-codelabs.git
cd open-codelabs
# Docker Compose で起動
docker compose up --build
```
### 🦭 Podman ユーザーガイド
Podman を使用している場合は、`podman-compose` を使用できます:
```bash
podman-compose up --build
```
または Podman の Docker 互換レイヤーを使用してください。
### 🧱 事前ビルドイメージを使用 (GHCR)
ローカルビルドを省略したい場合は、公開済みイメージを利用できます:
```bash
cp .env.sample .env
docker compose -f docker-compose.images.yml up
```
---
## 🛠 技術スタック
### フロントエンド
- **フレームワーク**: [SvelteKit 5](https://svelte.dev/) (Vite + TypeScript)
- **ランタイム**: [Bun](https://bun.sh/)
- **スタイリング**: Tailwind CSS 4.0
- **状態管理**: Svelte Runes
- **i18n**: `svelte-i18n`
### バックエンド (セルフホスト)
- **言語**: [Rust](https://www.rust-lang.org/)
- **フレームワーク**: Axum (Tokio stack)
- **データベース**: SQLite (via [SQLx](https://github.com/launchbadge/sqlx))
### クラウド (サーバーレスオプション)
- **プラットフォーム**: [Firebase](https://firebase.google.com/) (Hosting, Firestore, Storage) または [Supabase](https://supabase.com/) (Postgres, Auth, Storage, Realtime)
---
## 📂 プロジェクト構造
```text
open-codelabs/
├── backend/ # Rust Axum API サーバー
│ ├── src/ # API ロジック
│ └── migrations/ # データベースマイグレーション
├── frontend/ # SvelteKit クライアント
│ ├── src/ # コンポーネント、ルート、ライブラリ
│ └── static/ # 静的アセット
├── docs/ # ドキュメント (MkDocs)
├── docker-compose.images.yml # 事前ビルドイメージ用 compose
├── docker-compose.yml # システムオーケストレーション
└── run-public.sh # 公開デプロイスクリプト (ngrok/bore/cloudflare)
```
---
## 🚦 はじめに
### 事前準備
- [Docker](https://www.docker.com/) & Docker Compose
- [Bun](https://bun.sh/) (ローカル開発用)
- [Rust](https://www.rust-lang.org/) (ローカルバックエンド開発用)
### 1. Docker で実行 (推奨)
システム全体を起動する最も簡単な方法です。
> **注意**: デフォルトでは、データはホストマシンの `~/open-codelabs` フォルダに保存されます。保存場所をカスタマイズするには、ルートディレクトリの .env ファイルで DATA_VOLUME_PATH を編集してください。
> - **macOS/Linux**: `~/open-codelabs`
> - **Windows**: `C:/open-codelabs` (スラッシュ `/` を使用)
```bash
docker-compose up --build
```
- **フロントエンド**: [http://localhost:5173](http://localhost:5173)
- **バックエンド API**: [http://localhost:8080](http://localhost:8080)
### 2. ローカル開発環境
#### バックエンド
```bash
cd backend
# .env ファイルを作成 (DATABASE_URL=sqlite:data/sqlite.db?mode=rwc)
cargo run
```
#### フロントエンド
```bash
cd frontend
bun install
# .env ファイルを作成 (VITE_API_URL=http://localhost:8080)
bun run dev
```
### 3. 環境変数 (.env)
Docker Compose はリポジトリルートの `.env` を読み込みます。`.env.sample` をコピーして `.env` を作成し、必要な値を変更してください。
(ローカル開発は `backend/.env.sample` と `frontend/.env.sample` を最小の開始点として使えます。)
**イメージ (docker-compose.images.yml)**
- `IMAGE_REGISTRY`: 事前ビルドイメージのレジストリ(既定 `ghcr.io`)。
- `IMAGE_NAMESPACE`: イメージのネームスペース/組織名(既定 `open-codelabs`)。
- `IMAGE_TAG`: 取得するイメージタグ(既定 `latest`)。
**Backend**
- `DATABASE_URL`: SQLx 接続文字列 (sqlite/postgres/mysql)。例: `sqlite:/app/data/sqlite.db?mode=rwc`。
- `ADMIN_ID`: 管理者ログイン ID。
- `ADMIN_PW`: 管理者ログインパスワード。フロントで暗号化した Gemini API キーの復号にも使用。
- `AUTH_SECRETS`: JWT 署名用シークレット(カンマ区切り)。先頭が有効キーで、他はローテーション用。未設定時は `ADMIN_PW` を使用。
- `AUTH_ISSUER`: JWT issuer クレーム。
- `AUTH_AUDIENCE`: JWT audience クレーム。
- `ADMIN_SESSION_TTL_SECONDS`: 管理者セッション TTL(秒)。
- `ATTENDEE_SESSION_TTL_SECONDS`: 参加者セッション TTL(秒)。
- `COOKIE_SECURE`: HTTPS 時は `true` (Secure クッキー + `__Host-` プレフィックス)。`COOKIE_SAMESITE=none` には必須。
- `COOKIE_SAMESITE`: `lax`(既定)、`strict`、`none`。
- `TRUST_PROXY`: リバースプロキシ配下で `X-Forwarded-*` ヘッダーを信頼する場合 `true`。
- `CORS_ALLOWED_ORIGINS`: 許可するオリジン一覧(カンマ区切り)。空ならローカルの既定値。
- `RATE_LIMIT_GENERAL_PER_MINUTE`: 一般 API の分/IP 制限。
- `RATE_LIMIT_LOGIN_PER_5_MIN`: ログインの 5 分/IP 制限。
- `RATE_LIMIT_AI_PER_MINUTE`: AI プロキシの分/IP 制限。
- `RATE_LIMIT_UPLOAD_PER_MINUTE`: アップロード/提出 POST の分/IP 制限。
- `CSP_HEADER`: UI 応答の Content-Security-Policy ヘッダー上書き。空なら既定値。
- `HSTS_HEADER`: Strict-Transport-Security ヘッダー上書き(HTTPS のみ)。
- `ALLOWED_GEMINI_MODELS`: 許可する Gemini モデル ID の一覧(カンマ区切り)。
**AI**
- `GEMINI_API_KEY`: 管理者のキーがない場合に使う既定の Gemini API キー。
**Frontend**
- `VITE_API_URL`: バックエンド API の基底 URL (例: `http://localhost:8080`、Docker では `http://backend:8080`)。
- `VITE_ADMIN_ENCRYPTION_PASSWORD`: ブラウザで Gemini API キーを暗号化するパスワード。バックエンド `ADMIN_PW` と一致する必要あり。
- `VITE_USE_SUPABASE`: `true` に設定すると Supabase モード(サーバーレス、Rust バックエンドなし)を有効化します。
- `VITE_SUPABASE_URL`: Supabase プロジェクト URL。
- `VITE_SUPABASE_ANON_KEY`: Supabase の anon キー。
- `VITE_SUPABASE_STORAGE_BUCKET`: Supabase Storage のバケット名(既定 `open-codelabs`)。
- `VITE_ADMIN_ID`: Firebase/Supabase モードの管理者ログイン ID。
- `VITE_ADMIN_PW`: Firebase/Supabase モードの管理者ログインパスワード。
- `FRONTEND_PORT`: フロントサーバーのポート。
- `FRONTEND_HOST`: フロントサーバーのバインドホスト(例: `0.0.0.0`)。
### 4. クラウドデプロイ (AWS / GCP / Firebase)
サーバーレス環境やクラウドで運用する場合は、以下を参照してください。
- **AWS**: コンテナ or VM 配置。 [AWS デプロイガイド](docs/self-hosting/aws.md) を参照。
- **GCP (Cloud Run)**: コンテナ配置。 [GCP デプロイガイド](docs/self-hosting/gcp.md) を参照。
- **Firebase**: 迅速なサーバーレス設定。 [Firebase デプロイガイド](docs/self-hosting/firebase.md) を参照。
- **Supabase**: サーバーレス Postgres + Storage 構成。 [Supabase ガイド](docs/self-hosting/supabase.md) を参照。
---
## 🤖 AI コードラボ生成器
Open Codelabs には、コードを構造化されたチュートリアルに変換する AI 生成器が内蔵されています。
1. 設定で Gemini API キーを入力します。
2. ソースコードまたは技術的な説明を入力します。
3. AI が各ステップ、説明、検証手順を自動生成します。
---
## 🧭 ファシリテーターツールキット(新機能)
- **ライブタブ**: 参加者一覧、リアルタイムチャット/DM、ヘルプリクエスト処理。
- **クイズ & フィードバック**: 修了条件を設定し、結果を集計。
- **準備ガイド & 資料**: 事前準備ガイドを作成/AI 生成し、リンク・ファイルを配布。
- **提出物管理**: 参加者のアップロードファイルを収集・レビュー。
- **修了証ルーレット抽選**: 修了証が発行された参加者のみを対象に公平に抽選。
---
## 🌐 外部への公開 (ngrok / bore / cloudflare)
ローカルマシンでワークショップを開催する場合、`run-public.sh` スクリプトを使用して外部アクセスを提供できます。
```bash
chmod +x run-public.sh
./run-public.sh --ngrok # ngrok を使用
# または
./run-public.sh --bore # bore を使用 (Rust ベース)
# または
./run-public.sh --cloudflare # Cloudflare Tunnel を使用
```
---
## 📚 ドキュメント
完全なドキュメントは GitHub Pages で確認できます:
**[📖 Open Codelabs ドキュメントを見る](https://JAICHANGPARK.github.io/open-codelabs/)**
追加ガイド:
- [Code Server ワークスペース設定](docs/CODE_SERVER_SETUP.md)
---
## 📄 ライセンス
このプロジェクトは [Apache License 2.0](LICENSE) に基づいてライセンスされています。