Some checks failed
Auto Tag Develop / tag (push) Has been cancelled
- Passe par /tmp (le user SSH n'a pas les droits sur /var/www/ferme) - 6 étapes numérotées (scp, ssh, cd, dry-run, run, rm) - Note sur chmod 644 si www-data ne peut pas lire Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
255 lines
8.0 KiB
Markdown
255 lines
8.0 KiB
Markdown
# Projet Ferme t
|
|
|
|
## Installation du projet
|
|
|
|
### Windows
|
|
|
|
Pour windows, il faut installer le WSL2, Ubuntu, docker et nvm.
|
|
Il suffit de suivre cette [doc](https://wiki.malio.fr/bookstack/books/environnement-de-dev/chapter/windows)
|
|
|
|
### Linux
|
|
|
|
Pour linux, il faut installer docker et nvm.
|
|
Il suffit de suivre cette [doc](https://wiki.malio.fr/bookstack/books/environnement-de-dev/chapter/linux)
|
|
|
|
### Installation du projet
|
|
|
|
Une fois les prérequis installés, il suffit de cloner le projet et de lancer les commandes suivantes
|
|
|
|
```bash
|
|
make start
|
|
make install
|
|
```
|
|
|
|
Dans le cas ou le `make start` plante à cause du port de la bdd, il faut modifier **POSTGRES_PORT** dans le fichier .env.docker.local, remplacer le par un port disponible.
|
|
|
|
### Configuration global
|
|
|
|
Pour les variables d'environnement, il faut demander un .env.local pour le backend et un .env pour le frontend à votre collègue.
|
|
|
|
Vérifier que dans le .env.local, vous avez :
|
|
|
|
- APP_SECRET (à généré dans le conteneur avec la commande php -r "echo bin2hex(random_bytes(32));" et doit être différent de celui de votre collègue, puisque utilisé pour signer des tokens)
|
|
- DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:${POSTGRES_PORT}/${POSTGRES_DB}?serverVersion=16&charset=utf8"
|
|
- PONT_BASCULE_BYPASS (doit être à true en dev)
|
|
- PONT_BASCULE_URL
|
|
- JWT_SECRET_KEY (à générer avec la commande php bin/console lexik:jwt:generate-keypair)
|
|
- JWT_PUBLIC_KEY
|
|
- JWT_PASSPHRASE (à généré dans le conteneur avec la commande php -r "echo bin2hex(random_bytes(32));")
|
|
- COOKIE_SECURE=0 (en dev 0 et en prod 1. Si c'est du http, laisser en 0)
|
|
|
|
Vérifier que dans le .env du dossier frontend, vous avez :
|
|
|
|
- NUXT_PUBLIC_API_BASE="http://localhost:8080/api"
|
|
|
|
### Configuration xdebug
|
|
|
|
Pour configurer xdebug, il faut ajouter un serveur sur phpstorm. <br>
|
|
Pour cela, il faut aller dans **Settings > PHP > Servers** <br>
|
|
|
|
- Name : ferme-docker
|
|
- Host : localhost
|
|
- Port : 8080
|
|
- Path : File/Directory -> l'endroit où est stocké votre projet et le path -> /var/www/html
|
|
|
|
Pour que xdebug fonctionne sur windows, il faut modifier la variable **XDEBUG_CLIENT_HOST** par votre ip local
|
|
|
|
## Utilisation du projet
|
|
|
|
### Backend
|
|
|
|
L'api est disponible sur http://localhost:8080/api
|
|
Pour la bdd toutes les infos sont dans le fichier **docker/.env.docker.local**
|
|
Vous pouvez modifier le port si nécessaire.
|
|
|
|
La bdd est déja pré-configuré dans PhpStorm, il suffit de rentrer les infos du .env.docker.local pour se connecter.
|
|
C'est un bdd local dans le docker.
|
|
|
|
### Frontend
|
|
|
|
Pour le frontend, il suffit de taper la commande suivante qui va lancer le serveur de dev
|
|
|
|
```bash
|
|
make dev-nuxt
|
|
```
|
|
|
|
Le front sera accessible sur http://localhost:3000
|
|
|
|
### Authentification
|
|
|
|
Ce projet utilise l'authentification JWT avec un cookie httpOnly (LexikJWTAuthenticationBundle).
|
|
Le frontend ne lit jamais directement le token, le navigateur envoie automatiquement le cookie.
|
|
|
|
### Login flow
|
|
|
|
- Frontend envoie les identifiants à:
|
|
- `POST /api/login_check`
|
|
- Backend returns:
|
|
- `204 No Content` (normal)
|
|
- `Set-Cookie: BEARER=...; HttpOnly`
|
|
- Le cookie est automatiquement envoyé pour les futures requêtes.
|
|
- La déconnexion utilise `POST /api/logout` et redirige vers `/login`.
|
|
|
|
### Fixtures
|
|
|
|
Pour lancer les fixtures (Attention sa purge la bdd complètement)
|
|
|
|
```bash
|
|
php bin/console doctrine:fixtures:load
|
|
```
|
|
|
|
Attention cette commande est dangereuse, à utiliser que pour les débuts de la prod ou en recette.
|
|
Dans un premier temps pour remplir les listes, vous pouvez lancer la commande symfony
|
|
|
|
```bash
|
|
php bin/console app:seed
|
|
```
|
|
|
|
La commande va faire une update ou une création en fonction des data existante.
|
|
|
|
## Livraison en recette
|
|
|
|
### Préparatifs
|
|
|
|
Avant de déployer, il faut penser à ajouter les variables d'env s'il y a des changements/modifications.
|
|
Le .env se trouve /var/www/ferme/.env
|
|
|
|
Le script de livraison est version dans le repo dans script/deploy-release.sh <br>
|
|
Sur la machine, il est disponible dans /usr/local/bin/deploy-ferme <br>
|
|
Pour le modifier, il faut copier le contenu du deploy-release.sh dans le deploy-ferme
|
|
|
|
### Livraison
|
|
|
|
Sur le serveur de recette, il suffit d'utiliser cette commande pour livrer
|
|
|
|
```bash
|
|
/usr/local/bin/deploy-ferme vX.Y.Z
|
|
```
|
|
|
|
## Commandes utiles
|
|
|
|
Pour restart le container
|
|
|
|
```bash
|
|
make restart
|
|
```
|
|
|
|
Pour lancer les TU
|
|
|
|
```bash
|
|
make test
|
|
```
|
|
|
|
Pour accéder au container et lance des commandes
|
|
|
|
```bash
|
|
make shell
|
|
```
|
|
|
|
Pour clear le cache Symfony
|
|
|
|
```bash
|
|
make cache-clear
|
|
```
|
|
|
|
Faire une migration
|
|
|
|
```bash
|
|
make migration-migrate
|
|
```
|
|
|
|
Pour générer un password pour un user
|
|
|
|
```bash
|
|
make shell
|
|
php bin/console security:hash-password
|
|
```
|
|
|
|
Sélectionner entity User, taper sont mdp, le copier et l'ajouter dans l'insert de bdd suivant :
|
|
|
|
```sql
|
|
INSERT INTO "user" (username, roles, password)
|
|
VALUES ('Mon user', '["ROLE_USER"]', 'Mon mdp hashé');
|
|
```
|
|
|
|
## Gestion des logs
|
|
|
|
Pour suivre les logs en temps réel :
|
|
|
|
- tail -f var/log/dev.log
|
|
- tail -f var/log/prod.log
|
|
|
|
## Feed des prix bovins
|
|
|
|
Une commande Symfony permet de mettre à jour le **poids à l'arrivée**, le **prix au kilo** et le **fournisseur** des bovins existants à partir d'un fichier XLSX. La commande **ne crée jamais de nouveau bovin** : elle complète seulement ceux déjà présents en BDD.
|
|
|
|
### Format du fichier XLSX attendu
|
|
|
|
Pas de ligne d'en-tête, 4 colonnes dans cet ordre :
|
|
|
|
| Colonne | Champ | Format | Exemple |
|
|
|---------|-------|--------|---------|
|
|
| A | Numéro national | Avec ou sans préfixe `FR ` (insensible casse) | `FR 7979580026` ou `7979580026` |
|
|
| B | Fournisseur | Texte libre, casse ignorée | `TERRENA` |
|
|
| C | Poids à l'arrivée (kg) | Entier | `368` |
|
|
| D | Prix au kilo | Décimal | `5.7` |
|
|
| E | Code bâtiment (optionnel) | `B1`, `B2`, `B3`, `ZT` (casse ignorée) | `B2` |
|
|
|
|
### Comportement
|
|
|
|
- **Numéro national** : le préfixe `FR` (avec ou sans espace) est retiré s'il est présent. Sinon la valeur est utilisée telle quelle.
|
|
- **Bovin introuvable** en BDD → ligne ignorée, log warning à la fin avec aperçu.
|
|
- **Fournisseur introuvable** en BDD → le bovin est mis à jour quand même avec `supplier = null`, log warning.
|
|
- **Bâtiment** (colonne E) : recherché par `code` (insensible casse). Set uniquement si le bovin n'a pas déjà une `buildingCase` assignée (la case prime sur le bâtiment direct côté affichage). Si code introuvable → log warning, champ non set.
|
|
- **Cellules `weight` / `price` vides ou non numériques** → champ non modifié.
|
|
- La commande est **idempotente** : peut être relancée sans effet de bord.
|
|
|
|
### Lancement en dev
|
|
|
|
Copie le fichier dans la racine du projet (mappée dans le container sous `/var/www/html`), puis :
|
|
|
|
```bash
|
|
# Simulation sans écriture en BDD
|
|
docker compose exec php bin/console app:feed-bovine-prices /var/www/html/feed_bovin.xlsx --dry-run
|
|
|
|
# Persistance effective
|
|
docker compose exec php bin/console app:feed-bovine-prices /var/www/html/feed_bovin.xlsx
|
|
```
|
|
|
|
### Lancement en prod
|
|
|
|
Le user SSH n'a généralement pas les droits d'écriture sur `/var/www/ferme/` ; on passe donc le fichier par `/tmp` et on pointe la commande dessus (le chemin du XLSX est juste un argument).
|
|
|
|
```bash
|
|
# 1. Copier le fichier sur le serveur dans /tmp (accessible en écriture)
|
|
scp feed_bovin.xlsx <user>@<host>:/tmp/
|
|
|
|
# 2. SSH sur le serveur
|
|
ssh <user>@<host>
|
|
|
|
# 3. Se placer dans le dossier de l'app (pour bin/console)
|
|
cd /var/www/ferme
|
|
|
|
# 4. Dry-run pour vérifier sans rien écrire
|
|
php bin/console app:feed-bovine-prices /tmp/feed_bovin.xlsx --dry-run
|
|
|
|
# 5. Persistance effective
|
|
php bin/console app:feed-bovine-prices /tmp/feed_bovin.xlsx
|
|
|
|
# 6. Cleanup
|
|
rm /tmp/feed_bovin.xlsx
|
|
```
|
|
|
|
> Si à l'étape 4 le user PHP (souvent `www-data`) n'arrive pas à lire le fichier (`Permission denied`), donne-lui les droits de lecture avant : `chmod 644 /tmp/feed_bovin.xlsx`.
|
|
|
|
### Sortie attendue
|
|
|
|
À la fin, un tableau récapitule :
|
|
|
|
- Lignes totales lues
|
|
- Bovins mis à jour
|
|
- Bovins introuvables (avec aperçu des 10 premiers numéros)
|
|
- Lignes invalides (numéro national vide)
|
|
- Fournisseurs introuvables (avec liste et compte par nom)
|
|
- Bâtiments introuvables (avec liste des codes inconnus)
|