nordabiz/database
Maciej Pienczyn eaac876ec2
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(calendar): multi-day events + **bold** w opisach wydarzeń
- norda_events: kolumna event_date_end (NULLABLE, check constraint >= event_date)
- NordaEvent: property is_multi_day, date_range_display; is_past uwzględnia koniec
- Admin (new/edit): pole "Data zakończenia" w formularzu
- Calendar grid: wydarzenie wielodniowe wyświetla się na każdym dniu zakresu
- Upcoming/past filter: używa COALESCE(end, date) — 2-dniowe zostaje w Upcoming
  do swojego ostatniego dnia
- event.html: "Termin" + zakres dla wielodniowych; ICS/Google end date z dateEnd
- Lekki markdown dla opisów: tylko **bold** → <strong> (audyt: tylko event #60)

Zero wpływu na 42 istniejące wydarzenia (NULL == stare zachowanie).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 17:52:31 +02:00
..
migrations feat(calendar): multi-day events + **bold** w opisach wydarzeń 2026-04-15 17:52:31 +02:00
add-users-and-chat.sql Initial commit 2026-01-01 14:01:49 +01:00
CLAUDE.md claude-mem plugin v10.3.3 2026-02-23 10:33:26 +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 feat: migrate prod docs to OVH VPS + UTC→Warsaw timezone in all templates 2026-04-06 13:41:53 +02: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 OVH VPS (inpi-vps-waw01)

Krok 1: Instalacja PostgreSQL

# 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

# 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