# Guide de Deploiement - GreenTech Mobility

Guide complet pour deployer le projet Django sur un hebergement mutualise o2switch (cPanel).

## Table des Matieres

1. [Prerequis](#prerequis)
2. [Configuration cPanel](#configuration-cpanel)
3. [Installation du Projet](#installation-du-projet)
4. [Configuration de la Base de Donnees](#configuration-de-la-base-de-donnees)
5. [Configuration Django](#configuration-django)
6. [Configuration Passenger](#configuration-passenger)
7. [Fichiers Statiques et Media](#fichiers-statiques-et-media)
8. [Mise en Production](#mise-en-production)
9. [Mise a Jour du Site](#mise-a-jour-du-site)
10. [Depannage](#depannage)

---

## Prerequis

- Compte hebergement o2switch avec acces cPanel
- Acces SSH active (demander au support si necessaire)
- Nom de domaine configure
- Git installe sur le serveur (disponible par defaut)

---

## Configuration cPanel

### 1. Activer l'acces SSH

1. Connexion a cPanel
2. **Securite** > **Acces SSH**
3. Generer ou importer une cle SSH
4. Autoriser l'acces

### 2. Creer l'environnement Python

1. **Logiciels** > **Setup Python App**
2. Cliquer sur **Create Application**
3. Configurer :
   - **Python version** : 3.12 (ou la plus recente disponible)
   - **Application root** : `greentech` (dossier du projet)
   - **Application URL** : votre domaine ou sous-domaine
   - **Application startup file** : `passenger_wsgi.py`
   - **Application Entry point** : `application`
4. Cliquer sur **Create**
5. Noter la commande pour activer l'environnement virtuel :
   ```bash
   source /home/USERNAME/virtualenv/greentech/3.12/bin/activate
   ```

### 3. Creer la base de donnees MySQL

1. **Bases de donnees** > **Bases de donnees MySQL**
2. Creer une nouvelle base : `USERNAME_greentech`
3. Creer un utilisateur : `USERNAME_gtmuser`
4. Associer l'utilisateur a la base avec **tous les privileges**
5. Noter les informations :
   - Nom de la base : `USERNAME_greentech`
   - Utilisateur : `USERNAME_gtmuser`
   - Mot de passe : (celui que vous avez defini)
   - Host : `localhost`

---

## Installation du Projet

### 1. Connexion SSH

```bash
ssh USERNAME@SERVEUR.o2switch.net
```

### 2. Cloner le repository

```bash
cd ~
git clone https://github.com/zezesylvain/greentech.git
cd greentech
```

### 3. Activer l'environnement virtuel

```bash
source /home/USERNAME/virtualenv/greentech/3.12/bin/activate
```

Vous verrez le prompt changer : `(greentech:3.12) [USERNAME@serveur greentech]$`

### 4. Installer les dependances

```bash
pip install --upgrade pip
pip install -r requirements.txt
```

---

## Configuration de la Base de Donnees

### 1. Creer le fichier .env

```bash
nano .env
```

Contenu :
```env
# Database
DB_ENGINE=django.db.backends.mysql
DB_NAME=USERNAME_greentech
DB_USER=USERNAME_gtmuser
DB_PASSWORD=VotreMotDePasse
DB_HOST=localhost
DB_PORT=3306

# Django
SECRET_KEY=votre-cle-secrete-tres-longue-et-complexe-minimum-50-caracteres
DEBUG=False

# Domaine (pour ALLOWED_HOSTS)
DOMAIN=votre-domaine.com
```

Remplacez :
- `USERNAME` par votre nom d'utilisateur cPanel
- `VotreMotDePasse` par le mot de passe de la base
- `votre-cle-secrete-...` par une cle generee (voir ci-dessous)
- `votre-domaine.com` par votre nom de domaine

### 2. Generer une SECRET_KEY

```bash
python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
```

Copiez le resultat dans votre fichier `.env`.

---

## Configuration Django

### 1. Creer/Modifier local_settings.py

```bash
nano greentech/local_settings.py
```

Contenu :
```python
# local_settings.py - Configuration specifique au serveur de production

import os
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

# Securite
DEBUG = False
ALLOWED_HOSTS = [
    'votre-domaine.com',
    'www.votre-domaine.com',
    'localhost',
    '127.0.0.1',
]

# CSRF
CSRF_TRUSTED_ORIGINS = [
    'https://votre-domaine.com',
    'https://www.votre-domaine.com',
]

# Base de donnees - utilise les variables d'environnement du .env
# (deja configure dans settings.py)

# Fichiers statiques
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'

# Fichiers media
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

# Securite HTTPS (activer apres avoir configure SSL)
# SECURE_SSL_REDIRECT = True
# SESSION_COOKIE_SECURE = True
# CSRF_COOKIE_SECURE = True
# SECURE_HSTS_SECONDS = 31536000
# SECURE_HSTS_INCLUDE_SUBDOMAINS = True
```

### 2. Appliquer les migrations

```bash
python manage.py migrate
```

### 3. Creer un superutilisateur

```bash
python manage.py createsuperuser
```

### 4. Collecter les fichiers statiques

```bash
python manage.py collectstatic --noinput
```

---

## Configuration Passenger

### 1. Creer passenger_wsgi.py

```bash
nano passenger_wsgi.py
```

Contenu :
```python
import os
import sys

# Chemin vers le projet
project_home = '/home/USERNAME/greentech'
if project_home not in sys.path:
    sys.path.insert(0, project_home)

# Chemin vers l'environnement virtuel
venv_path = '/home/USERNAME/virtualenv/greentech/3.12/lib/python3.12/site-packages'
if venv_path not in sys.path:
    sys.path.insert(0, venv_path)

# Configuration Django
os.environ['DJANGO_SETTINGS_MODULE'] = 'greentech.settings'

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
```

Remplacez `USERNAME` par votre nom d'utilisateur cPanel.

### 2. Creer/Modifier .htaccess

Dans le dossier `public_html` ou le dossier pointe par votre domaine :

```bash
nano ~/public_html/.htaccess
```

Contenu :
```apache
PassengerEnabled On
PassengerAppRoot /home/USERNAME/greentech
PassengerPython /home/USERNAME/virtualenv/greentech/3.12/bin/python

# Redirection des fichiers statiques et media
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/static/
RewriteRule ^static/(.*)$ /home/USERNAME/greentech/staticfiles/$1 [L]

RewriteCond %{REQUEST_URI} ^/media/
RewriteRule ^media/(.*)$ /home/USERNAME/greentech/media/$1 [L]
```

### 3. Lien symbolique pour les fichiers statiques (alternative)

Si la methode .htaccess ne fonctionne pas :

```bash
cd ~/public_html
ln -s ~/greentech/staticfiles static
ln -s ~/greentech/media media
```

---

## Fichiers Statiques et Media

### Structure des dossiers

```
greentech/
├── static/           # Fichiers sources (CSS, JS, images)
├── staticfiles/      # Fichiers collectes (cree par collectstatic)
└── media/            # Fichiers uploades par les utilisateurs
```

### Permissions

```bash
chmod 755 ~/greentech/staticfiles
chmod 755 ~/greentech/media
chmod -R 644 ~/greentech/staticfiles/*
chmod -R 644 ~/greentech/media/*
```

---

## Mise en Production

### 1. Verifier la configuration

```bash
python manage.py check --deploy
```

Corriger les avertissements si necessaire.

### 2. Charger les donnees initiales (optionnel)

```bash
# Types de parametres
python manage.py seed_setting_types

# Icones
python manage.py seed_icons

# Types d'evenements
python manage.py seed_event_types --with-translations

# Ou charger une fixture complete
python manage.py loaddata fixtures/backup_complet.json
```

### 3. Redemarrer l'application

Dans cPanel :
1. **Logiciels** > **Setup Python App**
2. Trouver votre application
3. Cliquer sur **Restart**

Ou via SSH :
```bash
touch ~/greentech/tmp/restart.txt
```

### 4. Verifier le site

- Acceder a `https://votre-domaine.com`
- Acceder a l'admin : `https://votre-domaine.com/admin/`

---

## Mise a Jour du Site

### Script de mise a jour

Creer un script `~/greentech/update.sh` :

```bash
#!/bin/bash

# Activer l'environnement virtuel
source /home/USERNAME/virtualenv/greentech/3.12/bin/activate

# Aller dans le dossier du projet
cd /home/USERNAME/greentech

# Recuperer les dernieres modifications
git pull origin main

# Installer les nouvelles dependances
pip install -r requirements.txt

# Appliquer les migrations
python manage.py migrate --noinput

# Collecter les fichiers statiques
python manage.py collectstatic --noinput

# Redemarrer l'application
touch tmp/restart.txt

echo "Mise a jour terminee !"
```

Rendre executable :
```bash
chmod +x ~/greentech/update.sh
```

### Utilisation

```bash
cd ~/greentech
./update.sh
```

---

## Logs

Le projet est configure pour generer des logs automatiquement dans le dossier `logs/`.

### Fichiers de logs

| Fichier | Description |
|---------|-------------|
| `logs/django.log` | Logs generaux (INFO et plus) |
| `logs/errors.log` | Erreurs uniquement (ERROR et plus) |

### Configuration

Les logs sont configures avec rotation automatique :
- Taille max par fichier : 5 MB
- Nombre de backups : 5 fichiers

### Consulter les logs

```bash
# Logs generaux
tail -f ~/greentech/logs/django.log

# Erreurs uniquement
tail -f ~/greentech/logs/errors.log

# Derniers 100 lignes d'erreurs
tail -100 ~/greentech/logs/errors.log

# Rechercher une erreur specifique
grep "ERROR" ~/greentech/logs/django.log
grep "500" ~/greentech/logs/errors.log
```

### Utiliser les logs dans le code

```python
import logging

logger = logging.getLogger(__name__)

# Niveaux de log
logger.debug('Message de debug')      # Pas enregistre par defaut
logger.info('Information')            # Enregistre dans django.log
logger.warning('Avertissement')       # Enregistre dans django.log
logger.error('Erreur')                # Enregistre dans django.log ET errors.log
logger.critical('Erreur critique')    # Enregistre dans django.log ET errors.log
```

### Nettoyer les logs

```bash
# Vider les logs (garder les fichiers)
> ~/greentech/logs/django.log
> ~/greentech/logs/errors.log

# Supprimer les anciens backups
rm ~/greentech/logs/*.log.*
```

---

## Depannage

### Erreur 500 - Internal Server Error

1. Verifier les logs Django :
   ```bash
   tail -f ~/greentech/logs/errors.log
   ```

2. Verifier les logs serveur :
   ```bash
   tail -f ~/logs/error.log
   ```

2. Activer temporairement DEBUG :
   ```python
   # Dans local_settings.py
   DEBUG = True
   ```
   **Important** : Desactiver apres le debug !

3. Verifier les permissions :
   ```bash
   chmod 755 ~/greentech
   chmod 644 ~/greentech/passenger_wsgi.py
   ```

### Fichiers statiques non charges (404)

1. Verifier que `collectstatic` a ete execute :
   ```bash
   ls -la ~/greentech/staticfiles/
   ```

2. Verifier les liens symboliques :
   ```bash
   ls -la ~/public_html/static
   ls -la ~/public_html/media
   ```

3. Verifier le .htaccess

### Erreur de base de donnees

1. Verifier les identifiants dans `.env`

2. Tester la connexion :
   ```bash
   python manage.py dbshell
   ```

3. Verifier que la base existe dans cPanel

### Erreur PyMySQL

Si erreur `ModuleNotFoundError: No module named 'pymysql'` :

1. Verifier que l'environnement virtuel est active
2. Reinstaller :
   ```bash
   pip install PyMySQL
   ```

### Application ne redemarre pas

1. Verifier que `tmp/` existe :
   ```bash
   mkdir -p ~/greentech/tmp
   ```

2. Forcer le redemarrage dans cPanel

### Voir les logs Django

Les logs sont deja configures dans `settings.py`. Le dossier `logs/` est cree automatiquement.

```bash
# Voir les erreurs en temps reel
tail -f ~/greentech/logs/errors.log

# Voir tous les logs
tail -f ~/greentech/logs/django.log
```

---

## Commandes Utiles

```bash
# Activer l'environnement
source /home/USERNAME/virtualenv/greentech/3.12/bin/activate

# Aller dans le projet
cd ~/greentech

# Status git
git status

# Voir les logs d'erreur
tail -f ~/logs/error.log

# Shell Django
python manage.py shell

# Exporter la base
python manage.py dumpdata --natural-foreign --natural-primary --indent 2 \
    --exclude contenttypes --exclude auth.permission \
    -o fixtures/backup_$(date +%Y%m%d).json

# Redemarrer
touch tmp/restart.txt
```

---

## Checklist de Deploiement

- [ ] Environnement Python cree dans cPanel
- [ ] Base de donnees MySQL creee
- [ ] Projet clone via git
- [ ] Dependances installees (`pip install -r requirements.txt`)
- [ ] Fichier `.env` configure
- [ ] Fichier `local_settings.py` configure
- [ ] Fichier `passenger_wsgi.py` cree
- [ ] Migrations appliquees
- [ ] Superutilisateur cree
- [ ] Fichiers statiques collectes
- [ ] Liens symboliques ou .htaccess configures
- [ ] SSL/HTTPS active
- [ ] Application redemarree
- [ ] Site accessible
- [ ] Admin accessible

---

## Support

- Documentation o2switch : https://faq.o2switch.fr/
- Documentation Django : https://docs.djangoproject.com/
- Support o2switch : support@o2switch.fr
