|
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
- 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> |
||
|---|---|---|
| .. | ||
| migrations | ||
| add-users-and-chat.sql | ||
| CLAUDE.md | ||
| fix-search-trigger.sql | ||
| forum_categories_attachments.sql | ||
| improve-search-schema.sql | ||
| migrate_news_tables.sql | ||
| migrate-json-to-pg.js | ||
| README.md | ||
| schema.sql | ||
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
- 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