KCDLE est un jeu quotidien où l’utilisateur doit deviner un joueur (univers LoL / Karmine Corp) à partir d’indices. Le projet est split en 2 parties :
- backend/ : API Laravel + admin Filament + scheduler (daily games, purge, PVP ticks…)
- frontend/ : SPA Vue 3 (Vite + TypeScript)
Le but de ce README est que n’importe qui puisse cloner le repo, lancer l’app en local, comprendre l’architecture et contribuer sans friction.
- Laravel 12
- PHP 8.2+ (les images Docker utilisent PHP 8.3)
- PostgreSQL 16
- Filament v3 (admin)
- Sanctum (auth / sessions selon le contexte)
Le backend expose :
/api: API consommée par le frontend/admin: interface Filament/storage: fichiers publics (images, etc.) viastorage:link
- Vue 3 + Vue Router + Pinia
- Vite + TypeScript
- L’API est configurable via
VITE_API_BASE_URL
Le docker-compose.yml (racine) lance :
db(Postgres)app(php-fpm + Laravel)scheduler(php artisan schedule:work)nginx(reverse proxy HTTP vers php-fpm)adminer(UI DB)
backend/ est monté en volume dans le container (./backend:/var/www/html), donc il faut installer les dépendances Composer pour générer backend/vendor sur la machine hôte (via une commande Docker fournie plus bas).
- Docker + Docker Compose
- Node.js :
^20.19.0ou>= 22.12.0(requis par le frontend)
- PHP 8.2+
- Composer
git clone https://github.com/Pethalyse/KCDLE.git
cd KCDLE
cp backend/.env.example backend/.envEnsuite :
- Ajuster
backend/.envpour Docker (voir section dédiée) - Installer les dépendances backend (Composer) via Docker
- Générer la clé Laravel
- Démarrer les conteneurs
- Lancer le frontend Vue
docker compose up -d --buildSi c’est un premier lancement et que l’app ne démarre pas encore, c’est normal tant que :
backend/vendorn’existe pasAPP_KEYn’est pas défini
Les étapes suivantes corrigent ça.
Comme backend/ est monté en volume, il faut créer backend/vendor sur la machine hôte.
Le plus simple est d’utiliser un “run” Docker en désactivant les migrations automatiques :
docker compose run --rm -e RUN_MIGRATIONS=false app composer installDans backend/.env, assure-toi au minimum d’avoir :
APP_ENV=dev
APP_DEBUG=true
APP_URL=http://localhost:8080
FRONTEND_URL=http://localhost:5173
DB_CONNECTION=pgsql
DB_HOST=db
DB_PORT=5432
DB_DATABASE=kcdle
DB_USERNAME=kcdle
DB_PASSWORD=kcdle
SESSION_DRIVER=databaseLe
docker-compose.ymlconfigure Postgres aveckcdle/kcdle.
docker compose run --rm -e RUN_MIGRATIONS=false app php artisan key:generatePar défaut, le container app lance automatiquement (via docker/php/entrypoint.sh) :
storage:linkpackage:discover- caches (config/route/view)
php artisan migrate --force --seed
Si tu veux relancer manuellement :
docker compose exec app php artisan migrate --seedLe frontend est dans frontend/.
- Créer un
.envfrontend (ou utiliser un export shell) :
cp frontend/.env.prod.example frontend/.envPuis édite frontend/.env (en local) :
VITE_ENV=dev
VITE_API_BASE_URL=http://localhost:8080/api
VITE_PUBLISHER_ID=
VITE_AD_SENSE_ID=- Installer / lancer :
cd frontend
npm install
npm run dev- Frontend (Vite) :
http://localhost:5173 - Backend (nginx -> php-fpm) :
http://localhost:8080 - API :
http://localhost:8080/api - Admin Filament :
http://localhost:8080/admin - Adminer :
http://localhost:8081 - Postgres (host) :
localhost:5433(port exposé par compose)
docker compose logs -f app
docker compose logs -f nginx
docker compose logs -f scheduler
docker compose logs -f dbdocker compose exec app php artisan optimize:clear
docker compose exec app php artisan route:list
docker compose exec app php artisan tinkerdocker compose exec app php artisan kcdle:generate-daily-gamesdocker compose exec app php artisan migrate:fresh --seeddocker compose down -v
docker compose up -d --buildLes tests utilisent SQLite en mémoire (config imposée par backend/phpunit.xml) :
DB_CONNECTION=sqliteDB_DATABASE=:memory:
Lancer les tests via Docker :
docker compose run --rm -e RUN_MIGRATIONS=false app php artisan testOu si tu bosses hors Docker (PHP + Composer installés) :
cd backend
composer install
php artisan test⚙️ CI : les workflows GitHub lancent également les tests et peuvent produire un rapport de couverture HTML.
- Pint (Laravel) :
docker compose run --rm -e RUN_MIGRATIONS=false app ./vendor/bin/pintDepuis frontend/ :
npm run type-check
npm run lint
npm run formatLe service scheduler lance :
php artisan schedule:workLes tâches sont définies dans backend/routes/console.php, notamment :
kcdle:generate-daily-games(tous les jours à 00:00)kcdle:purge-pending-guesses(tous les jours à 00:00)pvp:afk-sweep(chaque minute)pvp:passive-tick(chaque seconde,withoutOverlapping())
En dev, le scheduler tourne automatiquement via Docker.
Au démarrage (si RUN_MIGRATIONS=true), l’entrypoint exécute :
php artisan migrate --force --seedLe seeding principal est dans backend/database/seeders/DatabaseSeeder.php et appelle notamment :
- Countries
- Roles
- Games
- Teams
- Leagues
- Une PR = une intention claire (feature / fix / refactor ciblé)
- Ajouter/adapter les tests quand c’est pertinent
- Éviter les changements “massifs” non liés (formatage global, renommages inutiles, etc.)
- Créer une branche
- Développer en local (Docker + frontend)
- Lancer :
php artisan testpint(si modif PHP)npm run lint/type-check(si modif frontend)
- Ouvrir une PR
Tu n’as pas encore installé Composer dans backend/.
docker compose run --rm -e RUN_MIGRATIONS=false app composer installAPP_KEY est vide.
docker compose run --rm -e RUN_MIGRATIONS=false app php artisan key:generateVérifie frontend/.env :
VITE_API_BASE_URL=http://localhost:8080/api
Puis relance npm run dev.
docker compose exec app php artisan optimize:cleardocker compose down -v
docker compose up -d --buildLe repo contient aussi :
docker-compose.beta.ymldocker-compose.prod.yml
Ils sont surtout pensés pour l’infra actuelle (images GHCR + Caddy + config nginx prod). Si ton objectif est uniquement de contribuer, tu peux ignorer cette section.
- Le frontend est buildé et copié dans
backend/public/lors du build de l’image (docker/php/Dockerfile.prod) nginxsert la SPA et ne renvoie vers Laravel que pour/api,/admin, etc.- Un volume
storage_dataest utilisé pour persisterstorage/app/public