Files
rail-game/README.md

6.3 KiB

Rail Game

A browser-based railway simulation game using real-world railway maps from OpenStreetMap.

At a glance

  • Frontend: React + Vite (TypeScript)
  • Backend: Python (FastAPI, SQLAlchemy)
  • Database: PostgreSQL with PostGIS (spatial types)
  • Mapping: Leaflet + OpenStreetMap

Features

  • Real-world railway maps
  • Interactive Leaflet map preview of a demo network snapshot
  • Build and manage your railway network
  • Dynamic train schedules and simulated trains

Current project layout

This repository contains a full-stack demo app (frontend + backend), supporting scripts, docs and infra. Key folders:

  • backend/ — FastAPI application, models, services, migration scripts and backend tests.
  • frontend/ — React app (Vite) and frontend tests.
  • docs/ — Architecture docs and ADRs.
  • infra/ — Deployment assets (Dockerfiles, compose files, init scripts).
  • data/ — Fixtures and imported OSM snapshots.
  • scripts/ — Utility scripts (precommit helpers, setup hooks).
  • tests/ — End-to-end tests and cross-cutting tests.

Refer to the in-repo docs/ for architecture decisions and deeper design notes.

Installation

Below are concise, verified steps for getting the project running locally. Commands show both PowerShell (Windows) and Bash/macOS/Linux variants where they differ.

Prerequisites

  • Git
  • Python 3.10+ (3.11 recommended) and pip
  • Node.js 16+ (or the version required by frontend/package.json)
  • PostgreSQL with PostGIS if you want to run the full DB-backed stack locally
  • Docker & Docker Compose (optional, for containerized dev)

Clone repository

PowerShell / Bash

git clone https://github.com/zwitschi/rail-game.git
cd rail-game

Backend: create virtual environment and install

PowerShell

python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -e .[dev]

Bash / macOS / Linux

python -m venv .venv
source .venv/bin/activate
python -m pip install -e '.[dev]'

Notes

  • Installing editable extras (.[dev]) installs dev/test tools used by the backend (pytest, black, isort, alembic, etc.).

Environment file

Copy the sample .env.example to .env and adjust the database connection strings as needed.

PowerShell

Copy-Item .env.example .env

Bash

cp .env.example .env

Important environment variables

  • DATABASE_URL — runtime DB connection for the app
  • TEST_DATABASE_URL — database used by pytest in CI/local tests
  • ALEMBIC_DATABASE_URL — used when running alembic outside the app process

Database (Postgres + PostGIS)

If you run Postgres locally, create the dev/test DBs and ensure the postgis extension is available. Example (psql):

-- create DBs (run in psql as a superuser or role with create privileges)
CREATE DATABASE railgame_dev;
CREATE DATABASE railgame_test;

-- connect to the db and enable extensions
\c railgame_dev
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS pgcrypto;

Adjust DB names and roles to match your .env values.

For a streamlined setup, use the included initialization script after configuring your .env file:

PowerShell / Bash

python scripts/init_demo_db.py

This script validates your environment, runs migrations, and loads demo OSM data. Use --dry-run to preview changes, or --region to load specific regions.

Note: The script uses python-dotenv to load your .env file. If not installed, run pip install python-dotenv.

Run migrations

PowerShell / Bash

cd backend
alembic upgrade head
cd ..

If you prefer to run alembic with a specific URL without editing .env, set ALEMBIC_DATABASE_URL in the environment before running the command.

Load OSM fixtures (optional)

Use the included scripts to refresh stations and tracks from saved OSM fixtures. This step assumes the database is migrated and reachable.

PowerShell / Bash

# dry-run
python -m backend.scripts.osm_refresh --region all --no-commit

# commit to DB
python -m backend.scripts.osm_refresh --region all

See backend/scripts/*.py for more granular import options (--skip-* flags).

Frontend

Install dependencies and run the dev server from the frontend/ directory.

PowerShell / Bash

cd frontend
npm install
npm run dev

The frontend runs at http://localhost:5173 by default (Vite). The React app talks to the backend API at the address configured in its environment (see frontend README or vite config).

Run backend locally (development)

PowerShell / Bash

# from project root
uvicorn backend.app.main:app --reload --port 8000

The backend API listens at http://localhost:8000 by default.

Tests & linters

Backend

pytest
black backend/ && isort backend/

Frontend

cd frontend
npm run lint
npm run build    # type/build check

Docker / Compose (optional)

Build and run both services with Docker Compose if you prefer containers:

PowerShell / Bash

docker compose up --build

This expects a working Docker environment and may require you to set DB URLs to point to the containerized Postgres service if one is defined in docker-compose.yml.

Troubleshooting

  • If migrations fail with missing PostGIS functions, ensure postgis is installed and enabled in the target database.
  • If alembic autogenerate creates unexpected changes, confirm the models being imported match the app import path used by alembic (see backend/migrations/env.py).
  • For authentication/debugging, the demo user is demo / railgame123 (used by some integration tests and the demo auth flow).
  • If frontend dev server fails due to node version, check frontend/package.json engines or use nvm/nvm-windows to match the recommended Node version.

API preview

Some useful endpoints for local testing:

  • GET /api/health — readiness probe
  • POST /api/auth/register — demo account creation + JWT
  • POST /api/auth/login — exchange credentials for JWT (demo user: demo / railgame123)
  • GET /api/auth/me — current user profile (requires bearer token)
  • GET /api/network — sample network snapshot (requires bearer token)

Contributing

  • See docs/ for architecture and ADRs.
  • Keep tests green and follow formatting rules (black, isort for Python; Prettier/ESLint for frontend).
  • Open issues or PRs for bugs, features, or docs improvements.