Skip to content

Repository files navigation

DaileyCoding

LinuxClub の毎日 Python コーディング練習サービス。

Stack

レイヤー技術
FrontendNext.js 16 (App Router) / TypeScript / Tailwind CSS v4
BackendGo / Echo v5
DBPostgreSQL 17
コード実行Docker (python:3.14-slim)
認証OAuth2 Authorization Code Flow + HttpOnly Cookie (JWT)
バージョン管理mise

前提条件

  • mise がインストールされていること
  • Docker / Docker Compose が動作していること

セットアップ

1. ツールのインストール

mise install

Go・Node.js・pnpm が mise.toml に記載のバージョンで揃います。

2. フロントエンド依存関係のインストール

cd frontend && pnpm install &&cd ..

3. 環境変数の設定

バックエンドは起動時に環境変数を読みます。backend/.env.example をコピーして backend/.env を作成し、値を設定してください。

cp backend/.env.example backend/.env

AUTH_BYPASS についてAUTH_BYPASS=true にすると JWT 検証を完全スキップし、固定のテスト管理者として動作します。 デフォルトは false です。開発時も OIDC プロバイダーを使ってください。

Google OAuth2 を使う場合

Google Cloud Console でプロジェクトを作成し、OAuth 2.0 クライアント ID を発行します。

  • 承認済みリダイレクト URI: http://localhost:8080/api/auth/google/callback
export GOOGLE_CLIENT_ID="your-client-id.apps.googleusercontent.com"export GOOGLE_CLIENT_SECRET="your-client-secret"export GOOGLE_CALLBACK_URL="http://localhost:8080/api/auth/google/callback"export JWT_SECRET="任意のランダム文字列(本番は強いシークレットを使うこと)"export AUTH_BYPASS=false

Keycloak を使う場合

export KEYCLOAK_CLIENT_ID="daileycoding"export KEYCLOAK_CLIENT_SECRET="your-secret"export KEYCLOAK_ISSUER="http://keycloak:8080/realms/daileycoding"export KEYCLOAK_CALLBACK_URL="http://localhost:8080/api/auth/keycloak/callback"export JWT_SECRET="任意のランダム文字列"export AUTH_BYPASS=false

4. DB の起動とマイグレーション

mise run db # PostgreSQL コンテナを起動
mise run db:migrate # マイグレーションを実行(初回・変更時)

マイグレーションは backend/internal/infrastructure/db/migrations/ 以下の SQL ファイルが順番に適用されます。

5. 管理者アカウントの登録

ログインすると role=student のユーザーが自動作成されます。 管理者への昇格には 2 つの方法 があります。

方法 A: DB を直接更新(手動・初回セットアップ向け)

まず対象ユーザーが一度ログインしてアカウントを作成してから実行します。

docker compose exec postgres psql -U daileycoding -d daileycoding
-- ログイン済みユーザーを管理者に昇格UPDATE users SET role ='admin'WHERE email ='yourname@example.com';
-- 昇格後は再ログインすると admin ロールが反映される

方法 B: authentik グループで自動同期(推奨・本番環境向け)

authentik を OIDC プロバイダーとして使う場合、グループ単位で管理者を自動付与できます。

authentik 側の設定:

  1. authentik 管理画面でグループ(例: dailycoding-admins)を作成し、管理者にしたいユーザーを追加する
  2. Provider の Advanced Protocol Settings → Scopesgroups Property Mapping を追加する (これにより ID Token に groups クレームが含まれるようになる)

バックエンド側の設定:

# backend/.env.prod に追記
ADMIN_GROUPS=dailycoding-admins # カンマ区切りで複数指定可

この設定を有効にすると、ログイン時にグループが照合されロールが自動で同期されます。

状態結果
グループに所属しているrole = admin
グループから除外された次回ログイン時に role = student に戻る
ADMIN_GROUPS 未設定ロールを変更しない(方法 A の手動管理)

管理者になると /admin/problems の問題管理ページにアクセスできます。

6. 外部メールアドレスの個別許可

ALLOWED_DOMAINS に含まれないドメインのユーザー(外部協力者など)を個別に許可できます。

docker compose exec postgres psql -U daileycoding -d daileycoding
-- 外部メールアドレスを許可リストに追加INSERT INTO allowed_emails (email, note)
VALUES ('guest@gmail.com', '外部協力者 山田太郎');
-- 一覧確認SELECT*FROM allowed_emails;
-- 削除(アクセス停止)DELETEFROM allowed_emails WHERE email ='guest@gmail.com';

ALLOWED_DOMAINS が未設定の場合はこのテーブルに関係なく全員許可になります。 本番環境では必ず ALLOWED_DOMAINS を設定してください。


起動

ターミナルを 3 つ用意して、それぞれ実行します。

# 1. DB(起動済みであればスキップ)
mise run db
# 2. バックエンド(port 8080)
mise run backend
# 3. フロントエンド(port 3000)
mise run frontend

ブラウザで http://localhost:3000 を開きます。

その他の mise タスク

コマンド内容
mise run dbPostgreSQL コンテナを起動
mise run db:migrate未適用マイグレーションを実行
mise run db:resetデータ全削除 → DB 再起動 → マイグレーション
mise run backendGo API サーバー起動 (port 8080)
mise run frontendNext.js 開発サーバー起動 (port 3000)

認証フロー概要

ブラウザ
→ GET /api/auth/google # state Cookie を発行し Google 認可画面へリダイレクト
→ Google 同意画面
→ GET /api/auth/google/callback # コード交換 → ユーザー情報取得 → JIT プロビジョニング
→ HttpOnly Cookie (dc_session) に JWT を発行
→ フロントエンドへリダイレクト
  • Cookie 名: dc_session(HttpOnly / SameSite=Lax / 有効期限 24 時間)
  • JWT ペイロード: uid / email / name / role
  • 複数プロバイダー対応: 同じメールアドレスで Google と Keycloak の両方からログインすると同一ユーザーに紐づく

ディレクトリ構成

.
├── mise.toml # ツールバージョン・タスク定義
├── docker-compose.yml # PostgreSQL
├── backend/
│ ├── cmd/server/ # エントリポイント
│ ├── internal/
│ │ ├── domain/ # エンティティ・型定義
│ │ ├── handler/ # HTTP ハンドラー
│ │ ├── middleware/ # JWT 認証ミドルウェア
│ │ ├── usecase/ # ビジネスロジック
│ │ └── infrastructure/
│ │ ├── db/ # PostgreSQL(migrations・repository)
│ │ └── docker/ # コード実行エンジン
└── frontend/
└── src/
├── app/ # Next.js App Router ページ
├── features/ # 機能ごとのコンポーネント・API
├── shared/ # 共通 Provider・型・設定
└── components/ # 汎用 UI コンポーネント

About

毎日コーディングしてみよう、なサービス

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages