nice
This commit is contained in:
parent
7677667d0b
commit
d6fe1dbb50
18
.env.example
18
.env.example
@ -1,18 +0,0 @@
|
|||||||
# Copier vers .env et remplacer toutes les valeurs avant le déploiement.
|
|
||||||
SECRET_KEY=CHANGE_ME_GENERATE_A_RANDOM_SECRET
|
|
||||||
DEBUG=False
|
|
||||||
ALLOWED_HOSTS=localhost,127.0.0.1,example.fr
|
|
||||||
MYSQL_DATABASE=accrocbio
|
|
||||||
MYSQL_USER=accrocbio
|
|
||||||
MYSQL_PASSWORD=CHANGE_ME
|
|
||||||
MYSQL_ROOT_PASSWORD=CHANGE_ME
|
|
||||||
MYSQL_HOST=db
|
|
||||||
MYSQL_PORT=3306
|
|
||||||
# Notifications facultatives des formulaires (sinon messages dans /admin/).
|
|
||||||
CONTACT_NOTIFICATION_EMAIL=
|
|
||||||
DEFAULT_FROM_EMAIL=no-reply@example.fr
|
|
||||||
EMAIL_HOST=localhost
|
|
||||||
EMAIL_PORT=25
|
|
||||||
EMAIL_HOST_USER=
|
|
||||||
EMAIL_HOST_PASSWORD=
|
|
||||||
EMAIL_USE_TLS=False
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
# Éditeur visuel AccroCbio
|
|
||||||
|
|
||||||
L'administration éditoriale fonctionne depuis **le frontend** : `http://ADRESSE-DU-SERVEUR:1028/admin` ou `https://votre-domaine/admin` (si nginx dirige cette URL vers React).
|
|
||||||
|
|
||||||
L'URL `:1029/admin/` correspond toujours à **Django Admin**, un outil différent.
|
|
||||||
|
|
||||||
## Première mise en route
|
|
||||||
|
|
||||||
1. Installer / redémarrer les deux conteneurs avec le `docker-compose.yml` habituel.
|
|
||||||
2. Dans le conteneur backend Django, exécuter `python manage.py migrate` (nouvelle migration `education/0003_sitecontent.py`).
|
|
||||||
3. Créer un compte administrateur si nécessaire : `python manage.py createsuperuser` (ou utiliser un utilisateur Django existant avec `is_staff=True`).
|
|
||||||
4. Ouvrir `http://IP:1028/admin` et s'identifier.
|
|
||||||
5. Dans l'onglet **Pages**, choisir une page : le **mode édition** s'active automatiquement. Cliquer sur les petits crayons à côté des textes et sur **Changer l'image** près des illustrations. **Enregistrer** publie le changement, **Restaurer** remet la valeur par défaut.
|
|
||||||
6. Utiliser les onglets **Ressources / Avis / Offres / Messages** pour créer, modifier, masquer et supprimer les éléments de la base.
|
|
||||||
7. **Terminer** désactive les crayons ; **Tableau de bord** revient au panneau d'administration.
|
|
||||||
|
|
||||||
## Informations techniques
|
|
||||||
|
|
||||||
- Le frontend reste sur le port **1028** et le backend Django sur le port **1029** ; les fichiers Docker d'origine sont conservés.
|
|
||||||
- Le `vite.config.js` transmet automatiquement `/api/` au service Docker `backend:1029`. En production derrière nginx, veiller à transmettre `/api/` à Django et toutes les routes du frontend, notamment `/admin`, à React.
|
|
||||||
- Les images téléversées (PNG, JPG, WebP ; maximum 5 Mo) sont conservées dans `backend/media/editor/`. Sauvegarder ce dossier avec la base de données. Les liens HTTPS vers des images externes fonctionnent aussi.
|
|
||||||
- Les textes modifiés sont enregistrés dans la table `education_sitecontent` (différentiel par rapport au texte du code). L'édition ne nécessite ni recompilation React ni redémarrage Docker.
|
|
||||||
- Le mot de passe n'est pas stocké dans le navigateur. Le jeton d'accès est conservé uniquement durant l'onglet ouvert (`sessionStorage`) et est contrôlé côté API. Utiliser **HTTPS** en dehors du réseau local.
|
|
||||||
- Les modifications des liens n'acceptent que les chemins internes (`/contact`) ou les URL HTTPS.
|
|
||||||
- Le texte de la page et les illustrations peuvent être édités ; il ne s'agit pas encore d'un constructeur de sections glisser-déposer. Les composants React/shadcn et les mises en page restent définis dans le code.
|
|
||||||
|
|
||||||
## Vérifications
|
|
||||||
|
|
||||||
Tests Django (dans le conteneur backend avec sa configuration de test) :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python manage.py test education
|
|
||||||
```
|
|
||||||
|
|
||||||
Compilation du frontend :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm run build
|
|
||||||
```
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
# Installation
|
|
||||||
|
|
||||||
**Archive complète :** à extraire dans un NOUVEAU dossier, pas au-dessus de la production actuelle. Conserver un environnement et une base de données séparés.
|
|
||||||
|
|
||||||
**Archive de modifications :** copier les fichiers `Site/...` au-dessus d’une COPIE du projet d’origine, puis supprimer les anciens fichiers indiqués dans `FICHIERS_SUPPRIMES.txt` si vous souhaitez nettoyer totalement le dépôt.
|
|
||||||
|
|
||||||
Important : sauvegardez votre projet et la base avant toute intervention, et n’importez pas le `.env` de la boulangerie sans adapter `MYSQL_DATABASE`, secrets et hôtes. Aucun fichier `.env` réel n’est présent dans les ZIP.
|
|
||||||
|
|
||||||
Les Dockerfiles et docker-compose.yml sont conservés tels quels. Seul `start.sh` a été modifié pour ne plus écraser le projet depuis l’ancien dépôt Git. Lire `README.md` pour configurer Django, MySQL et nginx.
|
|
||||||
|
|
||||||
Contrôles effectués : syntaxe Python, analyse JSX/JS, résolution des imports locaux. Aucun build Vite ou test Django complet n'a pu être lancé ici, faute des dépendances npm/Python et d’une base de données disponibles dans le conteneur de travail.
|
|
||||||
@ -0,0 +1,33 @@
|
|||||||
|
# Generated by Django 5.2.18 on 2026-10-13 16:36
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('education', '0003_sitecontent'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='announcement',
|
||||||
|
name='id',
|
||||||
|
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='contactmessage',
|
||||||
|
name='id',
|
||||||
|
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='resource',
|
||||||
|
name='id',
|
||||||
|
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='testimonial',
|
||||||
|
name='id',
|
||||||
|
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -1,12 +1,23 @@
|
|||||||
import { defineConfig } from 'vite';
|
import { defineConfig } from 'vite'
|
||||||
import react from '@vitejs/plugin-react';
|
import react from '@vitejs/plugin-react'
|
||||||
import tailwindcss from '@tailwindcss/vite';
|
import tailwindcss from '@tailwindcss/vite'
|
||||||
import { fileURLToPath, URL } from 'node:url';
|
import { fileURLToPath, URL } from 'node:url'
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
plugins: [react(), tailwindcss()],
|
plugins: [
|
||||||
resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) } },
|
react(),
|
||||||
server: { proxy: { '/api': { target: 'http://backend:1029', changeOrigin: true } } },
|
tailwindcss(),
|
||||||
// L'accès public hors développement passe idéalement par nginx (frontend + /api).
|
],
|
||||||
preview: { proxy: { '/api': { target: 'http://backend:1029', changeOrigin: true } }, allowedHosts: ['coursbiologiechaillou.fr', 'www.coursbiologiechaillou.fr', 'localhost', 'boulangerie.louismazin.ovh'] },
|
|
||||||
});
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
preview: {
|
||||||
|
allowedHosts: [
|
||||||
|
'accrocbio.louismazin.ovh',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
})
|
||||||
95
start.sh
95
start.sh
@ -1,27 +1,86 @@
|
|||||||
|
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -euo pipefail
|
set -e
|
||||||
|
|
||||||
cd /home/container
|
cd /home/container
|
||||||
|
|
||||||
echo '=== AccroCbio — lancement ==='
|
echo "======================================"
|
||||||
(
|
echo "AccroCBio"
|
||||||
cd backend
|
echo "======================================"
|
||||||
python3 manage.py check
|
|
||||||
python3 manage.py migrate --noinput
|
# --------------------------------------
|
||||||
exec python3 manage.py runserver 0.0.0.0:1029
|
# Mise à jour du projet
|
||||||
) &
|
# --------------------------------------
|
||||||
|
|
||||||
|
if [ ! -d ".git" ]; then
|
||||||
|
echo "Dépôt Git absent → clonage..."
|
||||||
|
|
||||||
|
git clone https://gitea.louismazin.ovh/LouisMazin/AccroCBio.git /tmp/accrocbio
|
||||||
|
|
||||||
|
cp -a /tmp/accrocbio/. /home/container/
|
||||||
|
rm -rf /tmp/accrocbio
|
||||||
|
else
|
||||||
|
echo "Mise à jour du dépôt Git..."
|
||||||
|
|
||||||
|
git fetch origin
|
||||||
|
git reset --hard origin/main
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Git : $(git rev-parse --short HEAD)"
|
||||||
|
|
||||||
|
# --------------------------------------
|
||||||
|
# Backend
|
||||||
|
# --------------------------------------
|
||||||
|
|
||||||
|
cd /home/container/backend
|
||||||
|
|
||||||
|
python3 manage.py check
|
||||||
|
|
||||||
|
echo "Démarrage Django sur :1037"
|
||||||
|
|
||||||
|
python3 manage.py migrate --noinput
|
||||||
|
|
||||||
|
python3 manage.py runserver 0.0.0.0:1037 &
|
||||||
BACKEND_PID=$!
|
BACKEND_PID=$!
|
||||||
|
|
||||||
(
|
# --------------------------------------
|
||||||
cd frontend
|
# Frontend
|
||||||
npm ci
|
# --------------------------------------
|
||||||
npm run build
|
|
||||||
exec npm run preview -- --host 0.0.0.0 --port 1028
|
cd /home/container/frontend
|
||||||
) &
|
|
||||||
|
echo "Installation des dépendances frontend..."
|
||||||
|
npm ci
|
||||||
|
|
||||||
|
|
||||||
|
echo "Build React..."
|
||||||
|
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
echo "Démarrage frontend sur :1036"
|
||||||
|
|
||||||
|
npm run preview -- --host 0.0.0.0 --port 1036 &
|
||||||
FRONTEND_PID=$!
|
FRONTEND_PID=$!
|
||||||
|
|
||||||
|
# --------------------------------------
|
||||||
|
# Arrêt propre
|
||||||
|
# --------------------------------------
|
||||||
|
|
||||||
cleanup() {
|
cleanup() {
|
||||||
kill "$BACKEND_PID" "$FRONTEND_PID" 2>/dev/null || true
|
echo "Arrêt des applications..."
|
||||||
wait "$BACKEND_PID" "$FRONTEND_PID" 2>/dev/null || true
|
|
||||||
|
kill "$BACKEND_PID" 2>/dev/null || true
|
||||||
|
kill "$FRONTEND_PID" 2>/dev/null || true
|
||||||
|
|
||||||
|
wait "$BACKEND_PID" 2>/dev/null || true
|
||||||
|
wait "$FRONTEND_PID" 2>/dev/null || true
|
||||||
}
|
}
|
||||||
trap cleanup EXIT INT TERM
|
|
||||||
wait -n "$BACKEND_PID" "$FRONTEND_PID"
|
trap cleanup SIGTERM SIGINT EXIT
|
||||||
|
|
||||||
|
echo "======================================"
|
||||||
|
echo " Frontend : :1036"
|
||||||
|
echo " Backend : :1037"
|
||||||
|
echo "======================================"
|
||||||
|
|
||||||
|
wait -n "$BACKEND_PID" "$FRONTEND_PID"
|
||||||
Loading…
x
Reference in New Issue
Block a user