mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-11 17:29:37 +02:00
Docs: Quick start PostgreSQL migration
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
This commit is contained in:
4 files changed
+289
No files matched your search
@@ -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
|
||||
@@ -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}
|
||||
|
||||
Executable
+56
@@ -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
|
||||
@@ -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();
|
||||
Reference in new issue
Block a user