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
Production moved from on-prem VM 249 (10.22.68.249) to OVH VPS (57.128.200.27, inpi-vps-waw01). Updated ALL documentation, slash commands, memory files, architecture docs, and deploy procedures. Added |local_time Jinja filter (UTC→Europe/Warsaw) and converted 155 .strftime() calls across 71 templates so timestamps display in Polish timezone regardless of server timezone. Also includes: created_by_id tracking, abort import fix, ICS calendar fix for missing end times, Pros Poland data cleanup. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
459 lines
8.9 KiB
Markdown
459 lines
8.9 KiB
Markdown
# 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
|