Application Symfony 8 (Twig + Symfony UX) pour le suivi de progression Fallout 76:
- plans Minerva
- plans et recettes
- mods légendaires
- progression joueur partagée
- calendrier communautaire
- codes nucléaires
- backoffice admin (traductions, utilisateurs, logs, roadmap, Minerva)
Le projet est 100% dockerisé pour éviter toute installation locale (hors Docker/Compose).
- Stack
- Architecture
- Prerequis
- Installation rapide
- Acces locaux
- Fonctionnalites joueur
- Configuration (.env.local)
- Commandes utiles
- Donnees metier (import/sync)
- Qualite et tests
- Exploitation et securite
- Troubleshooting
- Documentation projet
- PHP 8.4+
- Symfony 8
- Twig + Stimulus + Symfony UX Turbo
- PostgreSQL 16
- Nginx (reverse proxy local)
- Mailpit (emails dev)
- Docker Compose + Makefile
Architecture pragmatique Symfony en migration progressive vers des frontières DDD:
src/Catalogsrc/Progressionsrc/Identitysrc/Support
Chaque feature est organisée autour de couches Domain, Application, Infrastructure, UI.
- Docker
- Docker Compose v2
- GNU Make
Aucun PHP/Composer/PostgreSQL n'est requis sur ta machine.
- Demarrer la stack:
make up
- Initialiser la base:
make db-migrate
Si c'est un premier setup complet (reset DB):
make db-init
- (Optionnel) Synchroniser et importer les donnees metier:
make data-sync
docker compose -f compose.yaml exec -T app php bin/console app:items:import data- Creer un utilisateur local:
docker compose -f compose.yaml exec -T app php bin/console app:user:create user@example.com --password='ChangeMe123!'
- Promouvoir admin (si besoin backoffice):
docker compose -f compose.yaml exec -T app php bin/console app:user:promote-admin user@example.com- App: http://localhost:8000/en/
- Mailpit: http://localhost:8025
- PostgreSQL (expose pour IDE):
- Host:
127.0.0.1 - Port:
5434 - DB:
app - User:
app - Password:
!ChangeMe!
- Host:
/en/minerva-rotation- suivi des rotations Minerva
- progression des listes par personnage
- etat appris partage avec les autres vues
BOOK
/en/plans-recipes- catalogue joueur des plans et recettes (
BOOK) - recherche, tri, pagination et filtres metier
- progression
appris / a apprendrepartagee avec Minerva - taxonomie par categorie, sous-categorie et certains types fins (
atelier,recettes)
- catalogue joueur des plans et recettes (
/en/progression- resume global par personnage
- progression des mods legendaires
- progression Minerva
- progression
plans / recettespar categorie et sous-categorie
Ne jamais stocker de secrets dans .env versionné.
Exemple minimal:
APP_SECRET=change-me-local-secret # Captcha Cloudflare Turnstile TURNSTILE_SITE_KEY= TURNSTILE_SECRET_KEY= # Google OIDC OIDC_GOOGLE_ENABLED=0 OIDC_GOOGLE_ISSUER=https://accounts.google.com OIDC_GOOGLE_CLIENT_ID= OIDC_GOOGLE_CLIENT_SECRET=
make up make down make restart-app make logs make ps make shell
make restart-app attend automatiquement que l'URL de login reponde avant de rendre la main.
make db-init make db-migrate make db-diff make db-test-init
make data-sync make nuke-codes-warmup docker compose -f compose.yaml exec -T app php bin/console app:data:sync:fandom docker compose -f compose.yaml exec -T app php bin/console app:data:sync --only=fandom --fandom-no-delay docker compose -f compose.yaml exec -T app php bin/console app:data:sync --only=fandom --fandom-page='Fallout_76_plans/Weapons' docker compose -f compose.yaml exec -T app php bin/console app:data:sync:fallout-wiki docker compose -f compose.yaml exec -T app php bin/console app:data:sync --only=fallout-wiki --fallout-wiki-no-delay docker compose -f compose.yaml exec -T app php bin/console app:data:sync --only=fallout-wiki --fallout-wiki-page='Fallout_76_Weapon_Plans' docker compose -f compose.yaml exec -T app php bin/console app:data:report:source-diff docker compose -f compose.yaml exec -T app php bin/console app:data:report:source-merge docker compose -f compose.yaml exec -T app php bin/console app:data:report:source-merge-summary docker compose -f compose.yaml exec -T app php bin/console app:data:report:source-collisions docker compose -f compose.yaml exec -T app php bin/console app:data:probe:nukacrypt-record 'Plan: Vault 96 Jumpsuit' --signature=BOOK --format=json docker compose -f compose.yaml exec -T app php bin/console app:data:probe:nukacrypt-conflict --expected-form-id=002B42A4 --candidate='Plan: Bladed Commie Whacker' --candidate='Plan: Garden Trowel Knife' --signature=BOOK --format=json docker compose -f compose.yaml exec -T app php bin/console app:data:sync --only=nukaknights make minerva-refresh-dry-run make minerva-refresh-check make minerva-refresh-check-json make minerva-refresh-run
Roadmap saison (workflow recommande):
- Backoffice roadmap: importer les 3 snapshots JSON (FR, EN, DE).
- Verifier/corriger chaque snapshot, puis approuver les 3.
- Merge FR/EN/DE (la saison fusionnee devient active automatiquement).
make audit-retention-dry-run make audit-retention-run
make smoke-ops make smoke-app make smoke
Flux recommande:
- Recuperer les JSON upstream:
make data-sync
- Simuler l'import:
docker compose -f compose.yaml exec -T app php bin/console app:items:import data --dry-run- Import reel:
docker compose -f compose.yaml exec -T app php bin/console app:items:import dataNotes:
- L'import est idempotent (mise à jour + creation).
- Les traductions UI restent dans
translations/. - Les evenements roadmap canoniques sont scopes par saison (pas d'ecrasement global inter-saisons).
- Les sources brutes sont organisees sous
data/sources/par provider. - Nukaknights ecrit par defaut dans
data/sources/nukaknights/{legendary_mods,minerva}/+index.json. - Fandom ecrit par defaut dans
data/sources/fandom/plan_recipes/(recipes.json,plans_*.json) +index.json. - Fallout Wiki ecrit par defaut dans
data/sources/fallout_wiki/plan_recipes/(recipes.json,plans_*.json) +index.json. app:data:syncaffiche maintenant une progression explicite par dataset pourNukaknights(Legendary mods,Minerva) afin d eviter l impression de blocage pendant les appels externes.- Le sync
Fandomconserve maintenant les pages deja reussies et ecrit unindex.jsonpartiel si une page externe echoue. Pour une relance ciblee, utiliserapp:data:sync --only=fandom --fandom-page='...'. - Le sync
fallout.wikiapplique maintenant la meme logique: pages reussies conservees,index.jsonpartiel avecpage_errors, et relance ciblee viaapp:data:sync --only=fallout-wiki --fallout-wiki-page='...'. - Nukacrypt est actuellement exploite en recherche ciblee par nom (
app:data:probe:nukacrypt-record ...) pour arbitrage ponctuel; le lookup direct public parform_idn est pas encore suffisamment fiable pour en faire un sync exhaustif, et certains cas qui repondent via uncurlcolle manuellement dans le shell du conteneurappne sont pas encore reproductibles via le runtime PHP de l application. - Pour arbitrer un conflit entre deux noms candidats, utiliser
app:data:probe:nukacrypt-conflictavec un--expected-form-idet un ou plusieurs--candidate; un--editor-idpeut etre ajoute quand il est connu.
Commandes standard:
make phpstan make phpunit-unit make phpunit-integration make php-cs-fixer-check
Suite fonctionnelle:
make phpunit-functional
Correction style:
make php-cs-fixer
Points importants:
- Les URLs front sont préfixées par locale (
/en/...,/fr/...,/de/...). - Les secrets vont dans
.env.local(dev) ou variables d'environnement (prod). - Config proxy/host/CSP à adapter en production.
Runbooks:
- Ops:
docs/ops/ops-runbook.md - Gouvernance Minerva:
docs/ops/minerva-governance.md - Securite:
docs/security/readme.md - Go-live checklist:
docs/security/go-live-checklist.md
Tu as lancé une commande Symfony hors conteneur. Utilise :
docker compose -f compose.yaml exec -T app php bin/console ...Problème de permissions/volume var. Relancer :
make restart-app
Verifier MAILER_DSN et consulter Mailpit: http://localhost:8025
- Cartographie docs:
docs/README.md - Backlog:
docs/backlog/readme.md - Focus courant:
docs/backlog/current-focus.md - Tickets:
docs/backlog/tickets/ - Memo agent:
docs/ai/memory.md - Checklists livraison:
docs/ai/checklists.md
Licence: propriétaire (voir composer.json).