Skip to content

xm-i/CaliphAuctionBackend

Repository files navigation

Caliph Auction Logo

Caliph Auction Backend

免責事項

本プロジェクトは、過去に詐欺目的で運営されていたペニーオークションサイトの再現です。このコードベース上での実装は研究・教育目的であり、実際の金銭のやり取りは発生しません。本バックエンドを実際の決済システムと連携させて商用利用することは禁止されています。

概要

.NET 10 (ASP.NET Core) で構築されたペニーオークション型リアルタイムアプリケーションの REST API サーバ。SignalR Hub による低遅延な入札更新ブロードキャスト、EF Core コードファーストマイグレーション、複数の HostedService による非同期バックグラウンド処理を備えます。本番サイト: https://www.caliphauction.com/

関連リポジトリ

名前 リンク 役割 / 概要
Frontend https://github.com/xm-i/CaliphAuctionFront SPA / Vue3 / SignalR クライアント
Backend (本リポジトリ) https://github.com/xm-i/CaliphAuctionBackend REST API / 入札 BOT / SignalR Hub
Infrastructure https://github.com/xm-i/CaliphAuctionInfrastructure IaC / CI/CD / 環境構築スクリプト

※ ライセンスはいずれも「ソース公開 (再頒布不可)」ポリシーに準拠(各 README を参照)。

技術要件

項目 バージョン
.NET SDK 10.0
PostgreSQL 15+

主要技術スタック

分類 技術
フレームワーク ASP.NET Core 10 (Minimal Hosting)
言語 C# 13 / .NET 10
ORM Entity Framework Core 10 + Npgsql
データベース PostgreSQL 15+
リアルタイム通信 ASP.NET Core SignalR
認証 JWT Bearer (Microsoft.AspNetCore.Authentication.JwtBearer 10)
バックグラウンド処理 IHostedService (AutoBid / AuctionTopUp)
API ドキュメント Microsoft.AspNetCore.OpenApi (開発環境のみ)

核心機能

リアルタイム入札更新

Hubs/AuctionHub.cs が SignalR Hub エンドポイント (/auctionHub) を公開します。入札発生時にサーバ側で ReceiveBidUpdate イベントをブロードキャストし、オークション終了時に ReceiveAuctionClosed を送信します。クライアントは SetVisibleItems メッセージで表示中アイテム ID 群を送信でき、サーバ側でブロードキャスト対象を最適化します。

自動入札 (AutoBid) HostedService

Services/Background/AutoBidCoordinatorService.cs が定期的に入札キューを監視し、設定値 (AutoBid セクション) に基づいてボット入札を制御します。BotUserCache によりボット ユーザ情報を起動時にメモリキャッシュします。

オークション時間延長ロジック

残り秒数が設定閾値 (Auction:ExtendThresholdSeconds) を下回る入札に対して残り時間を延長します。延長量 (Auction:ExtendSeconds) はアプリケーション設定で制御されます。

ポイント管理

PointTransaction / PointTransactionEntry / PointBalanceLot の 3 層構造でポイントの付与・消費・ロット管理を行います。キャンペーン (登録ボーナス等) は設定駆動で追加可能です。

認証とセキュリティ

パスワードは PBKDF2 ベースのソルト付きハッシュで保存します (Utils/SecurityUtils.cs)。JWT 署名検証 (Issuer / SymmetricSecurityKey)、フォールバックポリシーによる全エンドポイントの認証必須化、ログイン失敗回数の DB 記録による IP ブルートフォース対策を実装しています。

カスタム例外ハンドリング

CaliphException サブクラス (ValidationCaliphException, AuthenticationFailedCaliphException 等) をスローすると、CaliphExceptionHandlingMiddleware が一貫した JSON レスポンスに変換します。

{ "error": "<message>", "status": 400 }

未処理例外は 500 を返します (Development 環境のみ詳細メッセージ付与)。

スクリーンショット

list

アーキテクチャ

リクエストパイプライン

HTTP リクエスト
    ↓
ForwardedHeaders ミドルウェア (リバースプロキシ対応)
    ↓
CORS ポリシー (DefaultCorsPolicy)
    ↓
Authentication / Authorization
    ↓
RequestLoggingMiddleware
    ↓
CaliphExceptionHandlingMiddleware
    ↓
Controller / Hub エンドポイント
    ├─ Controllers/           (REST API)
    └─ Hubs/AuctionHub.cs     (SignalR)

サービス層

Controllers (HTTP 受付)
    ↓
Services/Implementations/     (ドメインロジック、属性ベース自動 DI 登録)
    ↓
Data/CaliphDbContext.cs        (EF Core / Npgsql)
    ↓
PostgreSQL

バックグラウンド処理

IHostedService
    ├─ AuctionTopUpService       (オークション補充・状態管理)
    └─ AutoBidCoordinatorService (ボット入札キュー制御)

ファイル構成

CaliphAuctionBackend/
  Controllers/
    AuctionController.cs         # オークション一覧・詳細・入札 API
    UserController.cs            # 認証・ユーザ登録 API
    PointsController.cs          # ポイント残高・チャージ API
    PurchasesController.cs       # 購入履歴 API
    MyPageController.cs          # マイページ情報 API
    External/                    # 外部決済連携 Controller 群

  Data/
    CaliphDbContext.cs            # DbContext・タイムスタンプ自動設定
    Migrations/                  # EF Core マイグレーションファイル

  Hubs/
    AuctionHub.cs                # SignalR Hub (入札イベント管理)

  Middleware/
    CaliphExceptionHandlingMiddleware.cs
    RequestLoggingMiddleware.cs

  Models/                        # EF Core エンティティ
    BaseEntity.cs                # 共通タイムスタンプ基底クラス
    AuctionItem.cs
    Bid.cs
    User.cs
    PointTransaction.cs
    ...

  Services/
    Background/                  # IHostedService 実装
    Implementations/             # ドメインサービス (自動 DI 登録)
    Interfaces/                  # サービスインタフェース定義
    Infrastructure/              # 設定オプションクラス群

  Dtos/                          # API 入出力 DTO
  Exceptions/                    # CaliphException サブクラス群
  Utils/
    SecurityUtils.cs             # パスワードハッシュ / JWT 生成
    MathUtils.cs
    Attributes/                  # DI 自動登録属性

  Program.cs                     # エントリポイント・DI・パイプライン構成
appsettings.json

セットアップ手順

1. リポジトリのクローンと依存解決

git clone https://github.com/xm-i/CaliphAuctionBackend.git
cd CaliphAuctionBackend
dotnet restore

2. データベースの準備

PostgreSQL 15+ が必要です。Docker を使用する場合:

docker run -d --name caliph-pg -p 5432:5432 \
  -e POSTGRES_PASSWORD=caliph \
  -e POSTGRES_USER=caliph \
  -e POSTGRES_DB=caliph \
  postgres:15

3. 環境変数の設定

appsettings.Development.json を作成し、以下を設定してください:

{
  "ConnectionStrings": {
    "DefaultConnection": "Host=localhost;Database=caliph;Username=caliph;Password=caliph"
  },
  "Jwt": {
    "Key": "<32 文字以上の署名キー>",
    "Issuer": "CaliphAuction",
    "ExpireMinutes": 60
  },
  "ExternalPaymentJwt": {
    "Key": "<外部決済用署名キー>"
  },
  "Cors": {
    "AllowedOrigins": [ "http://localhost:5173" ]
  }
}

4. マイグレーション適用

dotnet tool install --global dotnet-ef
dotnet ef database update \
  --project CaliphAuctionBackend/CaliphAuctionBackend.csproj

5. 開発サーバの起動

dotnet run --project CaliphAuctionBackend/CaliphAuctionBackend.csproj

デフォルトでは https://localhost:5000 で起動します。OpenAPI ドキュメントは https://localhost:5000/openapi/v1.json で参照できます (Development のみ)。

環境変数

キー 説明
ConnectionStrings:DefaultConnection PostgreSQL 接続文字列
Jwt:Key JWT 署名キー (十分な長さ)
Jwt:Issuer JWT 発行者名
Jwt:ExpireMinutes JWT 有効期限 (分)
ExternalPaymentJwt:Key 外部決済連携用トークン署名キー
Cors:AllowedOrigins 許可オリジン配列 (AllowCredentials のため * 不可)
Auction:ExtendThresholdSeconds 時間延長が発動する残り秒数閾値
Auction:ExtendSeconds 延長秒数
AutoBid:* 自動入札間隔・キュー制御設定
Points:RegistrationBonus 登録時付与ポイント数

マイグレーション

本番サーバに SDK を配置しない運用方針のため、DDL は手動管理です。

ローカルでのマイグレーション追加とスクリプト出力:

dotnet ef migrations add AddSomething \
  --project CaliphAuctionBackend/CaliphAuctionBackend.csproj
dotnet ef migrations script -o diff.sql

デプロイ (GitHub Actions)

ワークフロー: .github/workflows/build-publish.yml

  1. dotnet publish (Release / UseAppHost=false)
  2. Secrets / Variables から appsettings.Production.json を生成
  3. app.tar.gz としてアーティファクト化
  4. SSH 経由で DEPLOY_PATH/releases/<timestamp> に展開し current シンボリックリンクを切り替え
  5. systemd ユニットを再起動

必要 Secrets: DB_CONNECTION, JWT_KEY, EXTERNAL_JWT_KEY, SSH_KEY 必要 Variables: CORS_ALLOWED_ORIGINS

セキュリティ上の注意

  • JWT 秘密鍵は必ず Secrets / Vault で管理し、設定ファイルにハードコードしない
  • 自動マイグレーション (Database.MigrateAsync) は本番環境で実行しない
  • Cors:AllowedOrigins* ワイルドカードは使用不可 (AllowCredentials と非互換)
  • SQL ログは本番環境で抑制する (接続文字列・クエリの漏えい防止)
  • ForwardedHeaders ミドルウェアの KnownProxies にはリバースプロキシ IP のみを登録する

ライセンス

このリポジトリは「ソースコード閲覧・学習目的での公開」であり、一般的な OSS ライセンス (MIT / Apache など) ではありません。いわゆる Source-Available ポリシーです。

許可される行為

  • 個人的または社内での学習・参考・評価
  • 自身の環境でのビルド・実行・検証
  • 一部コード断片 (短い抜粋) を引用した技術記事等への掲載 (出典明記が条件)

禁止される行為 (明示的に許可しない)

  • 本リポジトリ全体または実質的主要部分の再頒布 (フォークを含む公的再公開)
  • コードの改変版を公衆に提供 / ホスティング / SaaS として提供
  • ライセンス互換を前提とした他 OSS への組み込み
  • 商用目的 (利用・販売・再販) での使用

追加注意

  • 上記に該当しない利用 (教材化 / セミナー利用 / 研究引用 など) を希望する場合は事前に相談してください。
  • いつでもライセンス/公開方針を変更・終了する可能性があります。
  • Issue / PR は受け付けますが、マージ/反映は保証されません。

将来的に OSS ライセンスへ移行する場合は明示的に本節を置き換えます。それまでは本記述が優先します。

クイック参照

領域 ファイル
エントリポイント・DI 構成 Program.cs
例外ハンドラ Middleware/CaliphExceptionHandlingMiddleware.cs
DbContext Data/CaliphDbContext.cs
JWT 設定 appsettings.json (Jwt.*)
SignalR Hub Hubs/AuctionHub.cs
バックグラウンドサービス Services/Background/
セキュリティユーティリティ Utils/SecurityUtils.cs
入札サービス Services/Implementations/BidService.cs

問い合わせ

改善提案 / バグ報告は Issue へ。重大なセキュリティ懸念は公開前に直接連絡してください。

About

penny auction backend

Resources

Stars

1 star

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages