# Reset & Redéploiement OSEP — Guide

Trois scripts séquentiels pour repartir d'une base propre tout en préservant la DB et les uploads.

## Ce qui est préservé

- **MySQL** (externe, non touchée — un dump est quand même fait par sécurité)
- **kplan_data** : rapports générés par les workers
- **kplan_uploads** : documents joints aux projets, avatars
- **rabbitmq_data** : messages en file d'attente

## Ce qui est jeté

- Le stack Swarm `kplan` au complet (services, containers)
- Le volume `kplan_public` (sera repeuplé par `assets_sync` depuis l'image fraîche)
- Sessions Redis (les utilisateurs se reconnectent)
- L'ancienne image Docker pourrie

## Ordre d'exécution

### 1. Backup — sur le serveur de prod

```bash
# Copier les scripts sur le serveur
scp -r scripts/ adminadie@srv-mctn-kplan-app:/opt/kplan/

# SSH
ssh adminadie@srv-mctn-kplan-app

# Backup
sudo /opt/kplan/scripts/01-backup-prod.sh
```

Sortie : `/opt/kplan/backups/<timestamp>/` contenant le dump SQL, les volumes en tar.gz, et la config actuelle.

### 2. Build & push — sur ton poste de dev

```bash
cd ~/projects/kplan
docker login -u massambafall92    # une fois
./scripts/02-build-and-push.sh
```

Le script :
- Vérifie que `osep.scss` a bien ses classes en local
- Build avec `--no-cache` (5-10 min)
- Push sur Docker Hub
- Tire l'image fraîche et valide qu'elle a > 1000 classes `osep-` dans le bundle
- Sauvegarde le tag dans `.last-build-tag`

À la fin, tu obtiens un tag du genre `202605041930-abc1234-clean`.

### 3. Redéploiement — sur le serveur

```bash
# Toujours sur le serveur
export KPLAN_IMAGE_TAG=202605041930-abc1234-clean   # le tag retourné par l'étape 2
sudo /opt/kplan/scripts/03-redeploy.sh
```

Le script :
1. Vérifie que le backup est récent (< 2h)
2. Vérifie que l'image existe sur Docker Hub avec le bon contenu
3. Demande confirmation (taper `REDEPLOY`)
4. `docker stack rm kplan` — arrêt complet
5. Wipe `kplan_public`
6. Patch `KPLAN_IMAGE_PHP` dans `.env.stack`
7. `docker stack deploy --with-registry-auth`
8. Attend que `assets_sync` finisse en `Complete`
9. Attend que `php` soit `Running`
10. Smoke tests : volume public, HTTP 200, cache writable

## Rollback

Si quelque chose foire après le déploiement :

```bash
# Récupérer l'ancien tag depuis le snapshot
cat /opt/kplan/backups/<timestamp>/swarm-services-snapshot.txt | grep kplan_php

# Relancer avec l'ancien tag
sudo KPLAN_IMAGE_TAG=<ancien-tag> /opt/kplan/scripts/03-redeploy.sh

# Si la DB a été corrompue, restaurer le dump
gunzip -c /opt/kplan/backups/<timestamp>/mysql-*.sql.gz | \
    docker run --rm -i -e MYSQL_PWD="$DB_PASSWORD" mysql:8.0 \
    mysql -h "$DB_HOST" -u "$DB_USER" "$DB_NAME"
```

## En cas de pépin pendant le redéploiement

| Symptôme | Cause | Fix |
|---|---|---|
| `assets_sync` reste en `Running` | ENTRYPOINT du Dockerfile non neutralisé | Vérifier `stack.yaml` : `entrypoint: ["/bin/sh", "-lc"]` sur `assets_sync` |
| `assets_sync` `Failed` avec "Aucune classe osep-" | Image cassée (cache BuildKit) | Re-builder avec `02-build-and-push.sh` (qui a `--no-cache`) |
| `php` reste en `Starting` | Migrations qui timeout, ou DB injoignable | `docker service logs kplan_php --tail 50` |
| `Unable to write in cache directory` | Cache files root-owned | Voir `entrypoint.sh` qui doit run `bin/console` en `www-data` |
| HTTP 502 | nginx ne joint pas php | Vérifier que `nginx` mount bien `kplan_public:/var/www/public:ro` |

## Prérequis serveur

```bash
# Sur le serveur, une fois
sudo mkdir -p /opt/kplan/{scripts,backups,nginx}
sudo chown -R adminadie:adminadie /opt/kplan

# Volumes externes (créés par 01-backup-prod.sh si absents)
docker volume create kplan_data
docker volume create kplan_uploads

# Configs externes (worker)
docker config create kplan_worker_conf docker/stack/worker/worker.conf 2>/dev/null || true
```

## Variables d'environnement attendues dans `.env.stack`

```bash
# Image
KPLAN_IMAGE_PHP=massambafall92/kplan-www:LATEST_TAG_AFTER_BUILD

# Database
DB_HOST=mysql.example.sn
DB_PORT=3306
DB_NAME=kplan_prod
DB_USER=kplan
DB_PASSWORD=********
DB_SERVER_VERSION=8.0

# App
APP_ENV=prod
APP_DEBUG=0

# Messenger
MESSENGER_TRANSPORT_DSN=amqp://kplan:kplanpass@rabbitmq:5672/%2f/messages
MESSENGER_TRANSPORT_DSN_HIGH=amqp://kplan:kplanpass@rabbitmq:5672/%2f/messages_high

# RabbitMQ
RABBITMQ_USER=kplan
RABBITMQ_PASS=kplanpass

# Docker Hub (optionnel — pour login automatique)
DOCKERHUB_USERNAME=massambafall92
DOCKERHUB_TOKEN=dckr_pat_xxxxxxxxxxxxxx
```
