nordabiz/database
Maciej Pienczyn 9c24c8bbab
Some checks are pending
NordaBiz Tests / Unit & Integration Tests (push) Waiting to run
NordaBiz Tests / E2E Tests (Playwright) (push) Blocked by required conditions
NordaBiz Tests / Smoke Tests (Production) (push) Blocked by required conditions
NordaBiz Tests / Send Failure Notification (push) Blocked by required conditions
feat: Add website_type with color-coded buttons and tooltips
Six types: website (blue), store (green), booking (purple), blog (orange),
portfolio (pink), other (gray). Each type has unique icon, color in contact
bar and banner section, and tooltip with site description.
Form edit adds type selector dropdown per website row.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 07:59:44 +01:00
..
migrations feat: Add website_type with color-coded buttons and tooltips 2026-02-17 07:59:44 +01:00
add-users-and-chat.sql Initial commit 2026-01-01 14:01:49 +01:00
fix-search-trigger.sql Initial commit 2026-01-01 14:01:49 +01:00
forum_categories_attachments.sql feat: Forum categories, statuses, and multi-file attachments 2026-01-10 21:26:20 +01:00
improve-search-schema.sql refactor: Rebranding i aktualizacja modelu AI 2026-01-29 14:08:39 +01:00
migrate_news_tables.sql Initial commit 2026-01-01 14:01:49 +01:00
migrate-json-to-pg.js Initial commit 2026-01-01 14:01:49 +01:00
README.md refactor: Rebranding i aktualizacja modelu AI 2026-01-29 14:08:39 +01:00
schema.sql Initial commit 2026-01-01 14:01:49 +01:00

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 NORDABIZ-01

Krok 1: Instalacja PostgreSQL

# SSH do serwera
ssh root@10.22.68.249

# Aktualizacja pakietów
apt update

# Instalacja PostgreSQL 15
apt install -y postgresql-15 postgresql-contrib-15

# Sprawdzenie statusu
systemctl status postgresql

# Włączenie autostartu
systemctl enable postgresql

Krok 2: Konfiguracja PostgreSQL

# 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

# Jako użytkownik postgres
sudo -u postgres psql -d nordabiz -f /var/www/nordabiznes/database/schema.sql

Krok 4: Weryfikacja

# 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:

# W katalogu projektu
npm install pg

Konfiguracja połączenia:

Utwórz plik .env w katalogu głównym projektu:

DB_HOST=localhost
DB_PORT=5432
DB_NAME=nordabiz
DB_USER=nordabiz_app
DB_PASSWORD=your_secure_password_here

Lub eksportuj zmienne środowiskowe:

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:

# 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:

-- 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:

-- 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:

-- 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:

# 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:

# 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):

# 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:

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:

SELECT
    datname,
    usename,
    application_name,
    client_addr,
    state,
    query
FROM pg_stat_activity
WHERE datname = 'nordabiz';

Performance:

-- 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:

-- Pełny vacuum analyze
VACUUM ANALYZE;

-- Dla konkretnej tabeli
VACUUM ANALYZE companies;

Reindex:

-- Reindeksowanie bazy
REINDEX DATABASE nordabiz;

-- Dla konkretnej tabeli
REINDEX TABLE companies;

🐛 Troubleshooting

Połączenie odmówione:

# 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:

-- 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:

-- Jako postgres
ALTER USER nordabiz_app WITH PASSWORD 'new_secure_password';

📚 Dokumentacja


Wersja: 1.0 Ostatnia aktualizacja: 2025-11-23 Autor: Norda Biznes Partner Development Team