From 8251136faf2ce1acf3debe8432d388937db96b74 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 14 Nov 2025 08:37:01 +0000 Subject: [PATCH] Docs: Quick start PostgreSQL migration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajout des outils de migration et documentation: - scripts/verify-postgres-connection.js: Test connexion PostgreSQL - scripts/run-migration.sh: Script automatique de migration - docker-compose.yml: Volume mount pour accès SQLite depuis container - MIGRATION-STEPS.md: Guide pas-à-pas complet de migration La migration peut maintenant être lancée avec: docker-compose build notes-app docker-compose up -d bash scripts/run-migration.sh --- MIGRATION-STEPS.md | 188 ++++++++++++++++++++++++++ docker-compose.yml | 1 + scripts/run-migration.sh | 56 ++++++++ scripts/verify-postgres-connection.js | 44 ++++++ 4 files changed, 289 insertions(+) create mode 100644 MIGRATION-STEPS.md create mode 100755 scripts/run-migration.sh create mode 100644 scripts/verify-postgres-connection.js diff --git a/MIGRATION-STEPS.md b/MIGRATION-STEPS.md new file mode 100644 index 0000000..a448532 --- /dev/null +++ b/MIGRATION-STEPS.md @@ -0,0 +1,188 @@ +# Migration SQLite → PostgreSQL - Instructions + +## ✅ Ce qui a été préparé + +1. **Docker-compose configuré** avec PostgreSQL sur port 5499 +2. **Scripts de migration** créés et prêts +3. **Configuration PostgreSQL** complète dans `config/database-postgres.js` +4. **Volume monté** pour accéder à la base SQLite depuis le container + +## 🚀 Étapes de migration + +### Option A: Script automatique (RECOMMANDÉ) + +```bash +# 1. Reconstruire l'image Docker avec les nouvelles dépendances +docker-compose build notes-app + +# 2. Démarrer les containers +docker-compose up -d + +# 3. Attendre que PostgreSQL soit prêt (30 secondes) +docker-compose logs -f postgres | grep "ready to accept connections" +# Appuyez sur Ctrl+C quand vous voyez le message + +# 4. Lancer la migration automatique +bash scripts/run-migration.sh +``` + +### Option B: Commandes manuelles + +```bash +# 1. Reconstruire et démarrer +docker-compose build notes-app +docker-compose up -d + +# 2. Vérifier que PostgreSQL est accessible +docker exec notes-todo-app node scripts/verify-postgres-connection.js + +# 3. Lancer la migration +docker exec -e SQLITE_PATH=/app/data-sqlite/notes.db \ + notes-todo-app node scripts/migrate-sqlite-to-postgres.js + +# 4. Vérifier les données migrées +docker exec noteflow-postgres psql -U noteflow -d noteflow -p 5499 \ + -c "SELECT COUNT(*) FROM rss_articles;" +``` + +## 🔍 Vérification après migration + +### Vérifier les articles RSS + +```bash +# Compter les articles dans PostgreSQL +docker exec notes-todo-app node -e " +const { Pool } = require('pg'); +const pool = new Pool({ + connectionString: process.env.DATABASE_URL +}); +pool.query('SELECT COUNT(*) FROM rss_articles').then(r => { + console.log('Articles RSS:', r.rows[0].count); + pool.end(); +}); +" +``` + +### Vérifier les flux RSS + +```bash +# Compter les flux configurés +docker exec notes-todo-app node -e " +const { Pool } = require('pg'); +const pool = new Pool({ + connectionString: process.env.DATABASE_URL +}); +pool.query('SELECT COUNT(*) FROM rss_feeds').then(r => { + console.log('Flux RSS:', r.rows[0].count); + pool.end(); +}); +" +``` + +## 🎯 Test du système RSS + +### 1. Forcer une mise à jour des flux + +```bash +# Exécuter manuellement le scheduler RSS +docker exec notes-todo-app node services/rss-scheduler-v2.js +``` + +### 2. Vérifier dans l'interface web + +Ouvrez votre navigateur sur `http://localhost:2222` et vérifiez: +- Les articles RSS s'affichent +- Les nouveaux articles apparaissent (pas seulement ceux du 12 nov) +- L'auto-refresh fonctionne (2 minutes) + +## 📊 Logs et diagnostic + +### Voir les logs du container + +```bash +# Logs de l'application +docker-compose logs -f notes-app + +# Logs PostgreSQL +docker-compose logs -f postgres +``` + +### Entrer dans le container pour debug + +```bash +# Shell dans le container +docker exec -it notes-todo-app sh + +# Puis dans le container: +node -e "console.log(process.env.DATABASE_URL)" +ls -la /app/data-sqlite/ +``` + +## 🧹 Nettoyage après migration réussie + +Une fois que TOUT fonctionne parfaitement: + +```bash +# Sauvegarder l'ancienne base SQLite +cp data/notes.db data/notes.db.backup-$(date +%Y%m%d) + +# Optionnel: Supprimer l'ancienne base +# rm data/notes.db +``` + +## ❌ En cas de problème + +### Problème: Container ne démarre pas + +```bash +# Voir les erreurs +docker-compose logs notes-app + +# Reconstruire proprement +docker-compose down +docker-compose build --no-cache notes-app +docker-compose up -d +``` + +### Problème: Connexion PostgreSQL refusée + +```bash +# Vérifier que PostgreSQL écoute sur le bon port +docker exec noteflow-postgres netstat -tlnp | grep 5499 + +# Vérifier les variables d'environnement +docker exec notes-todo-app env | grep DATABASE +``` + +### Problème: Migration échoue + +```bash +# Vérifier que le fichier SQLite est accessible +docker exec notes-todo-app ls -la /app/data-sqlite/notes.db + +# Relancer avec plus de détails +docker exec -e SQLITE_PATH=/app/data-sqlite/notes.db \ + notes-todo-app node scripts/migrate-sqlite-to-postgres.js +``` + +## 🔄 Rollback vers SQLite + +Si vous voulez revenir à SQLite temporairement: + +1. Arrêter les containers: `docker-compose down` +2. Modifier `docker-compose.yml`: commenter la section `postgres` +3. Modifier l'environnement de `notes-app` pour utiliser SQLite +4. Redémarrer: `docker-compose up -d` + +## 📝 Notes importantes + +- La base SQLite est montée en **lecture seule** (`:ro`) pour éviter les modifications accidentelles +- Le container PostgreSQL utilise un volume persistant `postgres_data` +- Les données ne sont PAS perdues si vous redémarrez les containers +- Le port 5499 est exposé sur le host pour debug si besoin + +## 🎉 Prochaine étape + +Une fois la migration réussie, consultez: +- `QUICK-START-POSTGRES.md` pour l'utilisation quotidienne +- `MIGRATION-POSTGRESQL.md` pour la documentation technique complète diff --git a/docker-compose.yml b/docker-compose.yml index c40eeca..c8fa365 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -37,6 +37,7 @@ services: volumes: - notes_uploads:/app/public/uploads - notes_logs:/app/data/logs + - ./data:/app/data-sqlite:ro # Mount SQLite DB for migration (read-only) environment: - NODE_ENV=production - JWT_SECRET=${JWT_SECRET:-change_me_in_production_please_use_strong_secret} diff --git a/scripts/run-migration.sh b/scripts/run-migration.sh new file mode 100755 index 0000000..f57b525 --- /dev/null +++ b/scripts/run-migration.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +# Script de migration SQLite → PostgreSQL +# À exécuter depuis le host où Docker tourne + +echo "🔄 Migration SQLite → PostgreSQL" +echo "================================" +echo "" + +# Vérifier que les containers tournent +if ! docker ps | grep -q "noteflow-postgres"; then + echo "❌ Container PostgreSQL non trouvé. Lancez: docker-compose up -d" + exit 1 +fi + +if ! docker ps | grep -q "notes-todo-app"; then + echo "❌ Container notes-todo-app non trouvé. Lancez: docker-compose up -d" + exit 1 +fi + +echo "✅ Containers trouvés" +echo "" + +# Test de connexion PostgreSQL +echo "🔍 Test de connexion PostgreSQL..." +docker exec notes-todo-app node scripts/verify-postgres-connection.js + +if [ $? -ne 0 ]; then + echo "" + echo "❌ Impossible de se connecter à PostgreSQL" + exit 1 +fi + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "📊 Lancement de la migration..." +echo "" + +# Exécuter la migration depuis le container notes-todo-app +# Le fichier SQLite est monté dans /app/data-sqlite/notes.db +docker exec -e SQLITE_PATH=/app/data-sqlite/notes.db notes-todo-app node scripts/migrate-sqlite-to-postgres.js + +if [ $? -eq 0 ]; then + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "✅ Migration terminée avec succès!" + echo "" + echo "📋 Prochaines étapes:" + echo " 1. Vérifier les articles RSS dans l'interface" + echo " 2. Tester la récupération des flux RSS" + echo " 3. Supprimer l'ancienne base SQLite (data/notes.db) si tout fonctionne" +else + echo "" + echo "❌ Erreur lors de la migration" + exit 1 +fi diff --git a/scripts/verify-postgres-connection.js b/scripts/verify-postgres-connection.js new file mode 100644 index 0000000..8fc0d12 --- /dev/null +++ b/scripts/verify-postgres-connection.js @@ -0,0 +1,44 @@ +const { Pool } = require('pg'); + +const DATABASE_URL = process.env.DATABASE_URL || 'postgresql://noteflow:noteflow_secure_password_change_me@postgres:5499/noteflow'; + +async function verifyConnection() { + const pool = new Pool({ + connectionString: DATABASE_URL, + max: 1, + connectionTimeoutMillis: 5000, + }); + + try { + console.log('🔍 Test de connexion PostgreSQL...'); + console.log('📍 URL:', DATABASE_URL.replace(/:[^:@]+@/, ':***@')); + + const client = await pool.connect(); + console.log('✅ Connexion PostgreSQL réussie!'); + + // Vérifier les tables existantes + const tables = await client.query(` + SELECT tablename FROM pg_tables + WHERE schemaname = 'public' + ORDER BY tablename + `); + + console.log('\n📋 Tables existantes:', tables.rows.length); + tables.rows.forEach(row => console.log(' -', row.tablename)); + + // Vérifier les articles RSS si la table existe + if (tables.rows.some(r => r.tablename === 'rss_articles')) { + const count = await client.query('SELECT COUNT(*) FROM rss_articles'); + console.log('\n📰 Articles RSS:', count.rows[0].count); + } + + client.release(); + await pool.end(); + + } catch (error) { + console.error('❌ Erreur:', error.message); + process.exit(1); + } +} + +verifyConnection();