Skip to content

Procédure de migration VPS → VPS (base + documents)#131

Draft
Cyril-CB wants to merge 2 commits into
mainfrom
claude/youthful-ramanujan-8wmkm
Draft

Procédure de migration VPS → VPS (base + documents)#131
Cyril-CB wants to merge 2 commits into
mainfrom
claude/youthful-ramanujan-8wmkm

Conversation

@Cyril-CB

@Cyril-CB Cyril-CB commented Jun 3, 2026

Copy link
Copy Markdown
Owner

Contexte

L'application est aujourd'hui testée sur le serveur de test ; le centre prendra ensuite son propre VPS. Il fallait une procédure reproductible pour transférer l'intégralité d'une installation de production vers un nouveau serveur. Jusqu'ici il n'existait aucune procédure documentée ni script dédié.

Ce qui est migré

  • cspilot.db — copie cohérente via l'API backup SQLite (indispensable, base en mode WAL).
  • Dossiers de données sur disque : documents/, factures/, modeles_contrats/, contrats_generes/, exports/.
  • Paramètres de la table app_settings : config SMTP/notifications, clés API (OpenAI/Anthropic/Groq), tarifs ALSH, salaire socle, options d'affichage.

Point clé : paramètres chiffrés + nouveau SECRET_KEY

Les valeurs de app_settings sont chiffrées (Fernet) avec une clé dérivée du SECRET_KEY. Comme la cible reçoit un nouveau SECRET_KEY, ces valeurs deviendraient illisibles. La solution retenue :

  • l'export embarque la clé d'origine de façon transitoire dans l'archive ;
  • l'import re-chiffre automatiquement tous les paramètres avec la nouvelle clé (scripts/migration/reencrypt_settings.py) ;
  • résultat : rien à reconfigurer, et la cible tourne ensuite avec une clé neuve (la clé d'origine est jetée).

L'archive (base + clé) est créée en permissions 600 ; le script rappelle de la supprimer des deux côtés après migration.

Fichiers

  • scripts/migration/export-data.sh (VPS source) — copie cohérente de la base + dossiers présents + clé d'origine, archive .tar.gz (SHA-256 affiché), option --stop-service.
  • scripts/migration/import-data.sh (VPS cible) — sauvegarde de sécurité de tout existant, restauration base + dossiers, génération .env/SECRET_KEY si absent, re-chiffrement des paramètres, application des migrations de schéma.
  • scripts/migration/reencrypt_settings.py — re-chiffrement autonome (sans contexte Flask) des valeurs app_settings de l'ancienne vers la nouvelle clé.
  • docs/migration-vps.md — guide pas-à-pas : pré-requis, transfert (scp + vérif SHA-256), import, reconstruction systemd cspilot + Nginx + HTTPS (certbot), vérification, rollback.
  • README.md — lien vers le guide.

Choix de conception

  • Réutilise l'existant : backup_db.py (copie cohérente) et migration_manager.py (schéma) ; reencrypt_settings.py réplique utils._get_fernet.
  • Régénération du SECRET_KEY validée en amont, sans perte de paramètres grâce au re-chiffrement.

Tests effectués (migration « à blanc », 2 dossiers = 2 VPS)

  • Source : schéma v0034 (73 tables), 5 dossiers de données peuplés, 3 paramètres chiffrés (email_password, email_smtp_server, anthropic_api_key) avec une clé connue.
  • Export → archive valide, contenu vérifié, clé d'origine capturée, permissions 600.
  • Import sur cible avec une clé différente → base + 5 dossiers restaurés ; les 3 paramètres se déchiffrent correctement avec la nouvelle clé ; schéma v0034, 0 migration en attente.
  • Sauvegarde de sécurité auto de chaque dossier au ré-import ; re-chiffrement idempotent.
  • bash -n OK sur les 2 scripts, py_compile OK sur le script Python.

https://claude.ai/code/session_01Rgf2WkjyUY564jBCBDRCsC

claude added 2 commits June 3, 2026 10:42
- scripts/migration/export-data.sh : export coherent (base SQLite + documents)
  depuis le serveur source vers une archive .tar.gz unique
- scripts/migration/import-data.sh : import sur le serveur cible avec sauvegarde
  de securite, generation d'un nouveau SECRET_KEY et application des migrations
- docs/migration-vps.md : guide pas-a-pas (transfert, systemd, Nginx, HTTPS,
  verification, rollback)
- README.md : lien vers le guide de migration

https://claude.ai/code/session_01Rgf2WkjyUY564jBCBDRCsC
- Export/import des dossiers factures, modeles_contrats, contrats_generes,
  exports (en plus de documents)
- Re-chiffrement automatique des parametres app_settings (SMTP, cles API,
  tarifs ALSH, salaire socle, options) lors du changement de SECRET_KEY :
  nouveau script reencrypt_settings.py ; la cle d'origine transite de facon
  transitoire dans l'archive et est jetee apres import
- Archive creee en permissions 600 (donnees + cle sensibles), rappel de
  suppression apres migration
- Sauvegarde de securite de chaque dossier existant avant ecrasement
- Guide migration-vps.md et README mis a jour

https://claude.ai/code/session_01Rgf2WkjyUY564jBCBDRCsC
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants