6.7 KiB
6.7 KiB
Inventory - Guide de Déploiement & Release
Architecture
inventory.malio-dev.fr/ → Frontend Nuxt (statique)
inventory.malio-dev.fr/api → Backend Symfony (PHP-FPM)
| Composant | Technologie | Emplacement serveur |
|---|---|---|
| Backend | Symfony 8 + API Platform | /var/www/Inventory/ |
| Frontend | Nuxt 4 (statique) | /var/www/Inventory/Inventory_frontend/.output/public/ |
| Base de données | PostgreSQL 16 | inventory |
Prérequis serveur
- OS : Ubuntu/Debian
- PHP : 8.4 avec extensions : pgsql, intl, zip, gd, mbstring, curl
- Node.js : 20+
- Nginx
- PostgreSQL : 16
- Composer
Vérifier :
php -v # PHP 8.4+
php -m | grep -E 'pgsql|intl|zip|gd|mbstring'
node -v # Node 20+
nginx -v
psql --version
composer --version
Déploiement initial
1. Cloner le projet
cd /var/www
sudo git clone --recurse-submodules gitea@gitea.malio.fr:MALIO-DEV/Inventory.git Inventory
sudo chown -R malio:malio Inventory
cd Inventory
git checkout master
git submodule update --init --recursive
2. Créer la base de données
sudo -u postgres psql
CREATE DATABASE inventory OWNER ferme_user;
GRANT ALL PRIVILEGES ON DATABASE inventory TO ferme_user;
\q
Importer le dump :
# Copier le dump depuis le PC local
scp backup_v1.0.0_clean.sql malio@192.168.0.159:/tmp/
# Importer
psql -U ferme_user -h 127.0.0.1 -d inventory -f /tmp/backup_v1.0.0_clean.sql
3. Configurer le backend Symfony
cd /var/www/Inventory
# Installer les dépendances
composer install --no-dev --optimize-autoloader
# Créer .env.local
cat > .env.local << 'EOF'
APP_ENV=prod
APP_DEBUG=0
APP_SECRET=CHANGE_ME
DATABASE_URL="postgresql://ferme_user:fermerecette@127.0.0.1:5432/inventory?serverVersion=16"
CORS_ALLOW_ORIGIN='^https?://inventory\.malio-dev\.fr$'
JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem
JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem
JWT_PASSPHRASE=inventoryjwt
EOF
# Générer APP_SECRET
sed -i "s/CHANGE_ME/$(openssl rand -hex 32)/" .env.local
# Générer les clés JWT
mkdir -p config/jwt
openssl genrsa -out config/jwt/private.pem -aes256 4096
# Passphrase : inventoryjwt
openssl rsa -pubout -in config/jwt/private.pem -out config/jwt/public.pem
chmod 600 config/jwt/private.pem
# Permissions
sudo chown -R www-data:www-data var/
sudo chmod -R 775 var/
# Vider le cache
php bin/console cache:clear --env=prod
4. Configurer le frontend Nuxt
cd /var/www/Inventory/Inventory_frontend
# Permissions
sudo chown -R malio:malio .
# Installer les dépendances
npm install
# Créer .env
cat > .env << 'EOF'
NUXT_PUBLIC_API_BASE_URL=http://inventory.malio-dev.fr/api
EOF
# Générer le site statique
npx nuxi generate
5. Configurer Nginx
sudo nano /etc/nginx/sites-available/inventory
Contenu :
server {
listen 80;
server_name inventory.malio-dev.fr;
# Gros fichiers (100MB max)
client_max_body_size 100M;
client_body_timeout 300s;
send_timeout 300s;
access_log /var/log/nginx/inventory-access.log;
error_log /var/log/nginx/inventory-error.log;
# Backend Symfony - /api
location /api {
root /var/www/Inventory/public;
try_files $uri /index.php$is_args$args;
}
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/run/php/php-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/Inventory/public/index.php;
fastcgi_param DOCUMENT_ROOT /var/www/Inventory/public;
fastcgi_read_timeout 300s;
internal;
}
# Frontend statique
location / {
root /var/www/Inventory/Inventory_frontend/.output/public;
index index.html;
try_files $uri $uri/ /index.html;
}
}
Activer :
sudo ln -s /etc/nginx/sites-available/inventory /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
6. Vérifier
curl http://inventory.malio-dev.fr
curl http://inventory.malio-dev.fr/api
Mises à jour
Mettre à jour l'application
cd /var/www/Inventory
# Pull les changements
git pull
git submodule update --init --recursive
# Backend
composer install --no-dev --optimize-autoloader
php bin/console cache:clear --env=prod
sudo chown -R www-data:www-data var/
# Frontend
cd Inventory_frontend
npm install
npx nuxi generate
Versioning & Releases
Source de vérité
Le fichier VERSION à la racine contient le numéro de version (ex: 1.0.0).
Cette version est synchronisée avec :
- Le footer de l'application
config/packages/api_platform.yaml
Créer une release
# Depuis le PC de dev
./scripts/release.sh patch # 1.0.0 → 1.0.1
./scripts/release.sh minor # 1.0.0 → 1.1.0
./scripts/release.sh major # 1.0.0 → 2.0.0
./scripts/release.sh 2.0.0 # Version exacte
Le script :
- Vérifie/commit le submodule frontend
- Met à jour
VERSIONetapi_platform.yaml - Commit et tag les deux repos
- Affiche les commandes pour push
Pousser la release
# Frontend (submodule)
cd Inventory_frontend && git push && git push --tags && cd ..
# Backend
git push && git push --tags
Créer la release sur Gitea
- Aller sur le dépôt Gitea
- Releases > New Release
- Sélectionner le tag
vX.Y.Z - Ajouter les notes de release
Commandes utiles
# Logs Nginx
tail -f /var/log/nginx/inventory-error.log
# Logs Symfony
tail -f /var/www/Inventory/var/log/prod.log
# Vider le cache Symfony
php /var/www/Inventory/bin/console cache:clear --env=prod
# Rebuild frontend
cd /var/www/Inventory/Inventory_frontend && npx nuxi generate
# Status PHP-FPM
systemctl status php8.4-fpm
# Reload Nginx
sudo systemctl reload nginx
Backup base de données
Export
pg_dump -U ferme_user -h 127.0.0.1 -d inventory --no-owner --no-acl --inserts --column-inserts --clean --if-exists > backup_inventory_$(date +%Y%m%d).sql
Import
psql -U ferme_user -h 127.0.0.1 -d inventory -f backup_inventory_YYYYMMDD.sql
Troubleshooting
Erreur 502 Bad Gateway
# Vérifier PHP-FPM
systemctl status php8.4-fpm
sudo systemctl restart php8.4-fpm
Erreur 403 Forbidden
# Vérifier les permissions
sudo chown -R www-data:www-data /var/www/Inventory/var/
sudo chmod -R 775 /var/www/Inventory/var/
Erreur API "No route found"
# Vider le cache
php /var/www/Inventory/bin/console cache:clear --env=prod
Frontend ne se met pas à jour
# Rebuild
cd /var/www/Inventory/Inventory_frontend
rm -rf .output
npx nuxi generate