6f01e2d1b472fda018a249fb3aa20f156bf6be74
MTG Online Web Application
A modern web-based implementation of the MTG Online multiplayer Magic: The Gathering platform.
Features
- User Authentication: Secure JWT-based authentication with bcrypt password hashing
- Deck Building: Full-featured deck editor with import/export in multiple formats
- Real-Time Multiplayer: WebSocket-based game server for live gameplay
- Protocol Compatibility: Compatible with MTG Online protocol buffer messages
- Card Database: Integration with MTJSON for comprehensive card data
- Admin Tools: Comprehensive moderation and administration dashboard
Tech Stack
- Backend: Python 3.12, FastAPI, SQLAlchemy (async), PostgreSQL
- Frontend: React, TypeScript, Zustand (coming soon)
- Game Server: WebSocket with real-time state synchronization
- Authentication: JWT tokens with bcrypt password hashing
- Database: PostgreSQL with async driver (asyncpg)
- Protocol: Protocol buffer message compatibility
Getting Started
Prerequisites
- Docker and Docker Compose
- Python 3.12+ (for development)
- PostgreSQL 14+ (if running without Docker)
- Redis (optional, for caching)
- MTGJSON data files (see below)
Installation
- Clone the repository
git clone https://github.com/yourusername/mtgonline-web.git
cd mtgonline-web
- Configure environment
cp .env.example .env
# Edit .env with your configuration
- Prepare MTGJSON data files
The application requires MTGJSON data files. You have two options:
Option A: Download from MTGJSON (recommended)
# Create data directory
mkdir -p data
# Download required files from MTGJSON
# See scripts/download-mtgjson.sh for automated download
bash scripts/download-mtgjson.sh
Option B: Provide your own JSON files
Place these files in the data/ directory:
AllSetFiles/(directory containing set JSON files)AllPrintings.jsonAllIdentifiers.jsonCardTypes.jsonDeckList.jsonKeywords.jsonSetList.json
Running with Docker (recommended)
# Copy the data directory to a volume mount path
mkdir -p ~/mtg-data
cp -r data/* ~/mtg-data/
# Start the application
sudo docker compose up -d
The backend container will automatically process the JSON files from the mounted volume and populate the database.
Project Structure
mtgonline-web/
├── backend/
│ ├── app/
│ │ ├── core/ # Core configuration and utilities
│ │ │ ├── settings.py # Application settings
│ │ │ ├── database.py # Database engine and sessions
│ │ │ └── security.py # Authentication and password hashing
│ │ ├── models/ # SQLAlchemy ORM models
│ │ │ └── models.py
│ │ ├── schemas/ # Pydantic schemas
│ │ │ ├── schemas.py
│ │ │ ├── proto_messages.py
│ │ │ └── protocol_constants.py
│ │ ├── routers/ # API route handlers
│ │ │ ├── auth.py
│ │ │ ├── users.py
│ │ │ ├── decks.py
│ │ │ ├── rooms.py
│ │ │ ├── games.py
│ │ │ ├── admin.py
│ │ │ └── ws.py
│ │ ├── services/ # Business logic services
│ │ │ ├── game_server.py
│ │ │ ├── card_database.py
│ │ │ └── deck_parser.py
│ │ └── main.py # FastAPI application
│ ├── tests/ # Test suite
│ ├── requirements.txt # Python dependencies
│ ├── pyproject.toml # Ruff configuration
│ └── .env.example # Environment template
├── frontend/ # React/TypeScript frontend (coming soon)
├── shared/ # Shared protocol definitions
│ └── proto/ # Protocol buffer definitions
└── README.md
Docker Deployment
1. Prepare the Data Directory
Create a directory on your host machine to store the MTGJSON files:
mkdir -p ~/mtg-data
cp -r data/* ~/mtg-data/
2. Configure Environment
cp .env.example .env
# Edit .env with your configuration
3. Mount and Start
# Start with data directory mounted (Linux/macOS)
sudo docker compose up -d
# The data directory is automatically mounted to /app/data in the backend container
# Alternatively, specify a custom path:
sudo docker compose up -d --build
The backend will:
- Detect the JSON files in the mounted volume
- Upsert all data into the PostgreSQL database
- Start the FastAPI application
4. Verify
# Check backend logs
docker compose logs -f backend
# Test health endpoint
curl http://localhost:8000/health
Updating Data
When MTGJSON releases updates:
- Copy new
.jsonfiles to~/mtg-data/ - The backend will automatically process new files on next startup
- Or trigger a manual refresh via
/refreshendpoint
Development
Run Locally
cd backend
pip install -r requirements.txt
python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
Run Tests
cd backend
pytest
Project Structure
mtgonline-web/
├── backend/
│ ├── app/
│ │ ├── core/ # Core configuration and utilities
│ │ │ ├── settings.py # Application settings
│ │ │ ├── database.py # Database engine and sessions
│ │ │ └── security.py # Authentication and password hashing
│ │ ├── models/ # SQLAlchemy ORM models
│ │ │ └── models.py
│ │ ├── schemas/ # Pydantic schemas
│ │ │ ├── schemas.py
│ │ │ ├── proto_messages.py
│ │ │ └── protocol_constants.py
│ │ ├── routers/ # API route handlers
│ │ │ ├── auth.py
│ │ │ ├── users.py
│ │ │ ├── decks.py
│ │ │ ├── rooms.py
│ │ │ ├── games.py
│ │ │ ├── admin.py
│ │ │ └── ws.py
│ │ ├── services/ # Business logic services
│ │ │ ├── game_server.py
│ │ │ ├── card_database.py
│ │ │ └── deck_parser.py
│ │ └── main.py # FastAPI application
│ ├── tests/ # Test suite
│ ├── requirements.txt # Python dependencies
│ ├── pyproject.toml # Ruff configuration
│ └── .env.example # Environment template
├── frontend/ # React/TypeScript frontend (coming soon)
├── shared/ # Shared protocol definitions
│ └── proto/ # Protocol buffer definitions
├── data/ # MTGJSON data files (not in git)
├── scripts/ # Utility scripts
└── README.md
API Endpoints
Authentication
POST /api/v1/auth/login- User loginPOST /api/v1/auth/register- User registrationPOST /api/v1/auth/refresh- Refresh access tokenGET /api/v1/auth/me- Get current user
Users
GET /api/v1/users/{user_id}- Get user by IDPATCH /api/v1/users/{user_id}- Update user profilePOST /api/v1/users/{user_id}/ban- Ban user (admin)POST /api/v1/users/{user_id}/unban- Unban user (admin)
Decks
GET /api/v1/decks/- List decksPOST /api/v1/decks/- Create deckGET /api/v1/decks/{deck_id}- Get deckPATCH /api/v1/decks/{deck_id}- Update deckDELETE /api/v1/decks/{deck_id}- Delete deckGET /api/v1/decks/folders- List foldersPOST /api/v1/decks/folders- Create folderDELETE /api/v1/decks/folders/{folder_id}- Delete folder
Admin
GET /api/v1/admin/users- List all users (admin)GET /api/v1/admin/bans- List all bans (admin)POST /api/v1/admin/bans- Create ban (admin)POST /api/v1/admin/bans/{ban_id}/unban- Unban user (admin)GET /api/v1/admin/logs- List game logs (admin)
Testing
Run the test suite:
cd backend
pytest
License
MIT License
Contributing
Contributions are welcome! Please open an issue or submit a pull request.
Support
For questions or issues, please open a GitHub issue.
Languages
C++
80.4%
Python
15.7%
CMake
1.8%
Shell
0.9%
C
0.9%
Other
0.1%