# Norda Biznes - Database Setup ## 📦 Struktura ``` database/ ├── schema.sql # Pełny schemat bazy danych PostgreSQL ├── migrate-json-to-pg.js # Skrypt migracji z JSON do PostgreSQL ├── README.md # Ten plik └── .env.example # Przykładowa konfiguracja połączenia ``` --- ## 🚀 Instalacja na OVH VPS (inpi-vps-waw01) ### Krok 1: Instalacja PostgreSQL ```bash # SSH do serwera ssh maciejpi@57.128.200.27 # Aktualizacja pakietów sudo apt update # Instalacja PostgreSQL 15 sudo apt install -y postgresql-15 postgresql-contrib-15 # Sprawdzenie statusu systemctl status postgresql # Włączenie autostartu systemctl enable postgresql ``` ### Krok 2: Konfiguracja PostgreSQL ```bash # Przełącz się na użytkownika postgres sudo -u postgres psql # W psql: CREATE DATABASE nordabiz; CREATE USER nordabiz_app WITH PASSWORD 'your_secure_password_here'; GRANT ALL PRIVILEGES ON DATABASE nordabiz TO nordabiz_app; # Wyjdź z psql \q ``` ### Krok 3: Utworzenie schematu ```bash # Jako użytkownik postgres sudo -u postgres psql -d nordabiz -f /var/www/nordabiznes/database/schema.sql ``` ### Krok 4: Weryfikacja ```bash # Połącz się jako nordabiz_app psql -U nordabiz_app -d nordabiz -h localhost # W psql sprawdź tabele: \dt # Powinno pokazać wszystkie tabele: # companies, categories, services, competencies, etc. # Sprawdź dane referencyjne: SELECT * FROM categories; SELECT * FROM data_sources; \q ``` --- ## 📊 Schemat Bazy Danych ### Główne tabele: #### **companies** Podstawowe dane firm (NIP, REGON, KRS, adres, kontakt) #### **categories** Kategorie branżowe (IT, Produkcja, Handel, etc.) #### **services** Usługi oferowane przez firmy (Many-to-Many przez company_services) #### **competencies** Kompetencje i technologie (Many-to-Many przez company_competencies) #### **certifications** Certyfikaty i uprawnienia firm #### **awards** Nagrody i wyróżnienia (Gazele Biznesu, Diamenty Forbesa, etc.) #### **financial_data** Historyczne dane finansowe (przychody, zyski, aktywa) #### **social_media** Profile społecznościowe (Facebook, LinkedIn, Instagram) #### **data_sources** Źródła danych (ALEO.com, strony WWW, etc.) #### **collection_log** Log aktywności agenta zbierającego dane ### Widoki: - **v_companies_full** - kompletny widok firm ze wszystkimi relacjami - **v_data_quality_stats** - statystyki jakości danych - **v_companies_incomplete** - firmy z brakującymi danymi ### Funkcje: - **calculate_data_quality(company_id)** - oblicza poziom jakości danych - **update_all_data_quality()** - aktualizuje jakość dla wszystkich firm --- ## 🔄 Migracja Danych z JSON ### Wymagania: ```bash # W katalogu projektu npm install pg ``` ### Konfiguracja połączenia: Utwórz plik `.env` w katalogu głównym projektu: ```bash DB_HOST=localhost DB_PORT=5432 DB_NAME=nordabiz DB_USER=nordabiz_app DB_PASSWORD=your_secure_password_here ``` Lub eksportuj zmienne środowiskowe: ```bash export DB_HOST=localhost export DB_PORT=5432 export DB_NAME=nordabiz export DB_USER=nordabiz_app export DB_PASSWORD=your_secure_password_here ``` ### Uruchomienie migracji: ```bash # Dry run - sprawdzenie bez zmian node database/migrate-json-to-pg.js --dry-run # Migracja z verbose output node database/migrate-json-to-pg.js --verbose # Standardowa migracja node database/migrate-json-to-pg.js ``` ### Przykładowy output: ``` 🤖 Norda Biznes - JSON → PostgreSQL Migration ============================================================ 📂 Wczytywanie danych JSON... ✅ Załadowano 10 firm z companies-full.json 🔌 Łączenie z bazą danych... Host: localhost:5432 Database: nordabiz ✅ Połączono: 2025-11-23 19:00:00 📦 Migracja 10 firm... [1] PIXLAB ✅ Dodano: PIXLAB (ID: 1) 🔗 Usługi: 4 🔗 Kompetencje: 3 [2] KORNIX ✅ Dodano: KORNIX (ID: 2) 🔗 Usługi: 4 🔗 Kompetencje: 3 💰 Dane finansowe: 1 ... ============================================================ 📊 RAPORT MIGRACJI ============================================================ 📋 Firmy: ✅ Dodane: 10 🔄 Zaktualizowane: 0 ❌ Błędy: 0 🔧 Usługi: 🔗 Połączone: 40 💡 Kompetencje: 🔗 Połączone: 30 🏆 Certyfikaty: 5 🥇 Nagrody: 15 💰 Dane finansowe: 10 📱 Social media: 8 ============================================================ ✅ Migracja zakończona pomyślnie! ``` --- ## 🔍 Przydatne Zapytania SQL ### Statystyki ogólne: ```sql -- Liczba firm według kategorii SELECT c.name as category, COUNT(*) as count FROM companies co JOIN categories c ON co.category_id = c.id GROUP BY c.name ORDER BY count DESC; -- Jakość danych SELECT * FROM v_data_quality_stats; -- Firmy z brakującymi danymi SELECT * FROM v_companies_incomplete LIMIT 20; ``` ### Wyszukiwanie: ```sql -- Pełnotekstowe wyszukiwanie SELECT id, name, category_id, description_short FROM companies WHERE search_vector @@ plainto_tsquery('polish', 'oprogramowanie IT'); -- Firmy z konkretną usługą SELECT co.name, s.name as service FROM companies co JOIN company_services cs ON co.id = cs.company_id JOIN services s ON cs.service_id = s.id WHERE s.slug = 'custom-software-development'; -- Firmy z konkretną kompetencją SELECT co.name, c.name as competency FROM companies co JOIN company_competencies cc ON co.id = cc.company_id JOIN competencies c ON cc.competency_id = c.id WHERE c.slug = 'php'; ``` ### Raporty: ```sql -- Top 10 firm po przychodach SELECT co.name, fd.revenue, fd.year FROM companies co JOIN financial_data fd ON co.id = fd.company_id ORDER BY fd.revenue DESC LIMIT 10; -- Firmy z najwi ększą liczbą certyfikatów SELECT co.name, COUNT(ce.id) as cert_count FROM companies co LEFT JOIN certifications ce ON co.id = ce.company_id GROUP BY co.name ORDER BY cert_count DESC; -- Pokrycie źródeł danych SELECT ds.name, COUNT(cds.company_id) as companies_count FROM data_sources ds LEFT JOIN company_data_sources cds ON ds.id = cds.source_id GROUP BY ds.name ORDER BY companies_count DESC; ``` --- ## 🔐 Backup i Restore ### Backup: ```bash # Pełny backup bazy pg_dump -U nordabiz_app -d nordabiz -F c -f nordabiz_backup_$(date +%Y%m%d).dump # Tylko dane (bez schematu) pg_dump -U nordabiz_app -d nordabiz --data-only -F c -f nordabiz_data_$(date +%Y%m%d).dump # Tylko schemat (bez danych) pg_dump -U nordabiz_app -d nordabiz --schema-only -f nordabiz_schema.sql ``` ### Restore: ```bash # Restore z dump pg_restore -U nordabiz_app -d nordabiz_new nordabiz_backup_20251123.dump # Restore z SQL psql -U nordabiz_app -d nordabiz < nordabiz_schema.sql ``` ### Automatyczny backup (cron): ```bash # Dodaj do crontab: crontab -e # Backup codziennie o 3:00 0 3 * * * pg_dump -U nordabiz_app -d nordabiz -F c -f /backup/nordabiz_$(date +\%Y\%m\%d).dump # Czyszczenie starych backupów (starsze niż 30 dni) 0 4 * * * find /backup -name "nordabiz_*.dump" -mtime +30 -delete ``` --- ## 📈 Monitoring ### Rozmiar bazy: ```sql SELECT pg_size_pretty(pg_database_size('nordabiz')) as database_size; SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size FROM pg_tables WHERE schemaname = 'public' ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC; ``` ### Aktywne połączenia: ```sql SELECT datname, usename, application_name, client_addr, state, query FROM pg_stat_activity WHERE datname = 'nordabiz'; ``` ### Performance: ```sql -- Najczęściej używane tabele SELECT schemaname, tablename, seq_scan, idx_scan FROM pg_stat_user_tables ORDER BY seq_scan + idx_scan DESC; -- Wolne zapytania (jeśli włączone logowanie) SELECT query, mean_exec_time, calls FROM pg_stat_statements ORDER BY mean_exec_time DESC LIMIT 10; ``` --- ## 🛠️ Maintenance ### Vacuum: ```sql -- Pełny vacuum analyze VACUUM ANALYZE; -- Dla konkretnej tabeli VACUUM ANALYZE companies; ``` ### Reindex: ```sql -- Reindeksowanie bazy REINDEX DATABASE nordabiz; -- Dla konkretnej tabeli REINDEX TABLE companies; ``` --- ## 🐛 Troubleshooting ### Połączenie odmówione: ```bash # Sprawdź czy PostgreSQL działa systemctl status postgresql # Sprawdź port sudo netstat -plnt | grep 5432 # Sprawdź logi sudo tail -f /var/log/postgresql/postgresql-15-main.log ``` ### Uprawnienia: ```sql -- Nadaj wszystkie uprawnienia GRANT ALL PRIVILEGES ON DATABASE nordabiz TO nordabiz_app; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO nordabiz_app; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO nordabiz_app; ``` ### Reset hasła: ```sql -- Jako postgres ALTER USER nordabiz_app WITH PASSWORD 'new_secure_password'; ``` --- ## 📚 Dokumentacja - PostgreSQL: https://www.postgresql.org/docs/ - Node.js pg: https://node-postgres.com/ - Full-text search: https://www.postgresql.org/docs/current/textsearch.html --- **Wersja:** 1.0 **Ostatnia aktualizacja:** 2025-11-23 **Autor:** Norda Biznes Partner Development Team