docs: Fix incorrect SQLite references - DEV uses PostgreSQL via Docker

The documentation incorrectly stated that DEV environment uses SQLite
when it actually uses PostgreSQL via Docker on localhost:5433.

Updated files:
- CLAUDE.md - main project instructions
- PROJECT_INFO.md - environment documentation
- deployment_checklist.md - deployment procedures
- SCRIPTS_INDEX.md - script usage commands
- .claude/commands/*.md - all slash command definitions
- tests/test_admin_seo_dashboard.py - test database URL

DEV environment:
- PostgreSQL via Docker: localhost:5433
- Container: nordabiz-postgres
- Database: nordabiz
- User: nordabiz_app

PROD environment:
- PostgreSQL: 10.22.68.249:5432

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Maciej Pienczyn 2026-01-09 03:40:50 +01:00
parent def60a4b22
commit 69bb6b839a
11 changed files with 172 additions and 121 deletions

View File

@ -38,52 +38,61 @@ Slug = kebab-case z nazwy firmy:
- "ABC Usługi" → "abc-uslugi" - "ABC Usługi" → "abc-uslugi"
- Usuń znaki specjalne, zamień spacje na myślniki, lowercase - Usuń znaki specjalne, zamień spacje na myślniki, lowercase
### 4. Sprawdź duplikaty ### 4. Sprawdź duplikaty (DEV via Docker)
```bash ```bash
sqlite3 nordabiz_local.db "SELECT slug, legal_name FROM companies WHERE nip='NUMER_NIP' OR slug LIKE '%FRAGMENT%';" docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "SELECT slug, legal_name FROM companies WHERE nip='NUMER_NIP' OR slug LIKE '%FRAGMENT%';"
``` ```
### 5. Utwórz skrypt importu ### 5. Utwórz skrypt importu
Wygeneruj plik `import_NEW_COMPANY.py` na wzór istniejących: Wygeneruj plik `import_NEW_COMPANY.py` używający SQLAlchemy:
```python ```python
#!/usr/bin/env python3 #!/usr/bin/env python3
"""Import firmy [NAZWA] do bazy NordaBiz.""" """Import firmy [NAZWA] do bazy NordaBiz."""
import sqlite3 import os
import sys
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from datetime import datetime from datetime import datetime
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from database import Company, Category
DATABASE_URL = os.environ.get('DATABASE_URL', 'postgresql://nordabiz_app:dev_password@localhost:5433/nordabiz')
def import_company(): def import_company():
conn = sqlite3.connect('nordabiz_local.db') engine = create_engine(DATABASE_URL)
cursor = conn.cursor() Session = sessionmaker(bind=engine)
session = Session()
company = { # Znajdź kategorię
'slug': 'nazwa-firmy', category = session.query(Category).filter_by(name='Services').first()
'legal_name': 'Nazwa Prawna Sp. z o.o.',
'business_name': 'Nazwa Handlowa',
'nip': '1234567890',
'regon': '123456789',
'krs': None,
'email': 'kontakt@firma.pl',
'phone': '+48 123 456 789',
'website': 'https://firma.pl',
'street_address': 'ul. Przykładowa 1',
'city': 'Wejherowo',
'postal_code': '84-200',
'category': 'Services',
'short_description': 'Krótki opis firmy',
'full_description': 'Pełny opis działalności firmy...',
'data_quality': 'enhanced',
'is_active': True,
'created_at': datetime.now().isoformat(),
'updated_at': datetime.now().isoformat()
}
# Insert logic here... company = Company(
slug='nazwa-firmy',
name='Nazwa Handlowa',
legal_name='Nazwa Prawna Sp. z o.o.',
nip='1234567890',
regon='123456789',
krs=None,
email='kontakt@firma.pl',
phone='+48 123 456 789',
website='https://firma.pl',
address_street='ul. Przykładowa 1',
address_city='Wejherowo',
address_postal='84-200',
category_id=category.id if category else None,
description_short='Krótki opis firmy',
description_full='Pełny opis działalności firmy...',
data_quality='enhanced',
status='active'
)
conn.commit() session.add(company)
conn.close() session.commit()
print(f"Firma {company['legal_name']} dodana pomyślnie!") print(f"Firma {company.legal_name} dodana pomyślnie! ID: {company.id}")
session.close()
if __name__ == '__main__': if __name__ == '__main__':
import_company() import_company()
@ -94,12 +103,14 @@ if __name__ == '__main__':
python import_NEW_COMPANY.py python import_NEW_COMPANY.py
``` ```
### 7. Zweryfikuj dodanie ### 7. Zweryfikuj dodanie (DEV via Docker)
```bash ```bash
sqlite3 nordabiz_local.db "SELECT slug, legal_name, nip, category FROM companies WHERE slug='NOWY_SLUG';" docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "SELECT slug, legal_name, nip FROM companies WHERE slug='NOWY_SLUG';"
``` ```
## Uwagi: ## Uwagi:
- DEV: PostgreSQL via Docker na localhost:5433
- PROD: PostgreSQL na 10.22.68.249:5432
- Dla produkcji: po przetestowaniu lokalnie, wdróż przez `/deploy` - Dla produkcji: po przetestowaniu lokalnie, wdróż przez `/deploy`
- Nowe firmy powinny pochodzić z oficjalnej listy członków Norda Biznes - Nowe firmy powinny pochodzić z oficjalnej listy członków Norda Biznes
- Zawsze weryfikuj NIP przed dodaniem - Zawsze weryfikuj NIP przed dodaniem

View File

@ -11,28 +11,29 @@ Opcjonalny argument określa typ backupu:
## Kroki do wykonania: ## Kroki do wykonania:
### 1. Backup lokalnej bazy SQLite ### 1. Backup lokalnej bazy PostgreSQL (DEV via Docker)
```bash ```bash
cp nordabiz_local.db "backups/nordabiz_local_$(date +%Y%m%d_%H%M%S).db" mkdir -p backups
docker exec nordabiz-postgres pg_dump -U nordabiz_app nordabiz > "backups/dev_$(date +%Y%m%d_%H%M%S).sql"
``` ```
### 2. Backup produkcyjnej bazy PostgreSQL ### 2. Backup produkcyjnej bazy PostgreSQL
Połącz się z serwerem: Eksport do lokalnego:
```bash ```bash
ssh root@10.22.68.249 "cd /var/www/nordabiznes && pg_dump -U nordabiznes nordabiznes_db > backup_$(date +%Y%m%d_%H%M%S).sql" ssh maciejpi@10.22.68.249 "sudo -u postgres pg_dump nordabiz" > "backups/prod_$(date +%Y%m%d_%H%M%S).sql"
``` ```
Lub eksport do lokalnego: Lub backup na serwerze:
```bash ```bash
ssh root@10.22.68.249 "pg_dump -U nordabiznes nordabiznes_db" > "backups/prod_$(date +%Y%m%d_%H%M%S).sql" ssh maciejpi@10.22.68.249 "sudo -u postgres pg_dump nordabiz > /tmp/backup_$(date +%Y%m%d_%H%M%S).sql"
``` ```
### 3. Backup plików konfiguracyjnych ### 3. Backup plików konfiguracyjnych
```bash ```bash
mkdir -p backups/config_$(date +%Y%m%d) mkdir -p backups/config_$(date +%Y%m%d)
cp .env backups/config_$(date +%Y%m%d)/ cp .env backups/config_$(date +%Y%m%d)/dev.env
ssh root@10.22.68.249 "cat /var/www/nordabiznes/.env" > backups/config_$(date +%Y%m%d)/prod.env ssh maciejpi@10.22.68.249 "cat /var/www/nordabiznes/.env" > backups/config_$(date +%Y%m%d)/prod.env
ssh root@10.22.68.249 "cat /etc/nginx/sites-available/nordabiznes" > backups/config_$(date +%Y%m%d)/nginx.conf ssh maciejpi@10.22.68.249 "cat /etc/nginx/sites-available/nordabiznes" > backups/config_$(date +%Y%m%d)/nginx.conf
``` ```
### 4. Snapshot VM w Proxmox ### 4. Snapshot VM w Proxmox
@ -49,7 +50,7 @@ ssh root@10.22.68.10 "qm snapshot 249 backup_$(date +%Y%m%d) --description 'Auto
### 5. Lista istniejących backupów ### 5. Lista istniejących backupów
Lokalne: Lokalne:
```bash ```bash
ls -la backups/*.db backups/*.sql 2>/dev/null ls -la backups/*.sql 2>/dev/null
``` ```
Snapshoty VM (użyj skill proxmox-manager): Snapshoty VM (użyj skill proxmox-manager):
@ -59,14 +60,14 @@ Pokaż snapshoty VM 249
### 6. Przywracanie z backupu ### 6. Przywracanie z backupu
#### SQLite (lokalne): #### DEV (Docker PostgreSQL):
```bash ```bash
cp backups/nordabiz_local_YYYYMMDD_HHMMSS.db nordabiz_local.db docker exec -i nordabiz-postgres psql -U nordabiz_app -d nordabiz < backups/dev_YYYYMMDD_HHMMSS.sql
``` ```
#### PostgreSQL (produkcja): #### PROD (PostgreSQL):
```bash ```bash
ssh root@10.22.68.249 "psql -U nordabiznes nordabiznes_db < /var/www/nordabiznes/backup_YYYYMMDD.sql" cat backups/prod_YYYYMMDD_HHMMSS.sql | ssh maciejpi@10.22.68.249 "sudo -u postgres psql nordabiz"
``` ```
#### Rollback VM: #### Rollback VM:
@ -92,3 +93,5 @@ Przywróć VM 249 ze snapshotu backup_YYYYMMDD
- Testuj przywracanie okresowo - Testuj przywracanie okresowo
- Snapshoty VM są najszybsze do rollbacku - Snapshoty VM są najszybsze do rollbacku
- PostgreSQL dump jest przenośny między środowiskami - PostgreSQL dump jest przenośny między środowiskami
- DEV używa Docker PostgreSQL na localhost:5433
- PROD używa PostgreSQL na 10.22.68.249:5432

View File

@ -5,16 +5,16 @@ Wyświetl statystyki użycia chatu AI (Google Gemini) w projekcie NordaBiz.
## Kroki do wykonania: ## Kroki do wykonania:
### 1. Podstawowe statystyki ### 1. Podstawowe statystyki
Wykonaj zapytania na lokalnej bazie: Wykonaj zapytania na bazie PostgreSQL (DEV via Docker):
```bash ```bash
sqlite3 nordabiz_local.db " docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "
SELECT '=== STATYSTYKI CHATU AI ===' as header; SELECT '=== STATYSTYKI CHATU AI ===' as header;
SELECT '--- Konwersacje ---' as section; SELECT '--- Konwersacje ---' as section;
SELECT 'Łącznie konwersacji: ' || COUNT(*) FROM ai_chat_conversations; SELECT 'Łącznie konwersacji: ' || COUNT(*) FROM ai_chat_conversations;
SELECT 'Aktywne (ostatnie 7 dni): ' || COUNT(*) FROM ai_chat_conversations SELECT 'Aktywne (ostatnie 7 dni): ' || COUNT(*) FROM ai_chat_conversations
WHERE updated_at > datetime('now', '-7 days'); WHERE updated_at > NOW() - INTERVAL '7 days';
SELECT '--- Wiadomości ---' as section; SELECT '--- Wiadomości ---' as section;
SELECT 'Łącznie wiadomości: ' || COUNT(*) FROM ai_chat_messages; SELECT 'Łącznie wiadomości: ' || COUNT(*) FROM ai_chat_messages;
@ -26,30 +26,30 @@ SELECT 'Input tokens: ' || COALESCE(SUM(input_tokens), 0) FROM ai_chat_messages;
SELECT 'Output tokens: ' || COALESCE(SUM(output_tokens), 0) FROM ai_chat_messages; SELECT 'Output tokens: ' || COALESCE(SUM(output_tokens), 0) FROM ai_chat_messages;
SELECT '--- Koszty (USD) ---' as section; SELECT '--- Koszty (USD) ---' as section;
SELECT 'Łączny koszt: $' || ROUND(COALESCE(SUM(cost_usd), 0), 4) FROM ai_chat_messages; SELECT 'Łączny koszt: \$' || ROUND(COALESCE(SUM(cost_usd), 0)::numeric, 4) FROM ai_chat_messages;
SELECT 'Średni koszt/wiadomość: $' || ROUND(COALESCE(AVG(cost_usd), 0), 6) FROM ai_chat_messages WHERE role='assistant'; SELECT 'Średni koszt/wiadomość: \$' || ROUND(COALESCE(AVG(cost_usd), 0)::numeric, 6) FROM ai_chat_messages WHERE role='assistant';
SELECT '--- Wydajność ---' as section; SELECT '--- Wydajność ---' as section;
SELECT 'Średni czas odpowiedzi: ' || ROUND(COALESCE(AVG(latency_ms), 0), 0) || ' ms' FROM ai_chat_messages WHERE role='assistant'; SELECT 'Średni czas odpowiedzi: ' || ROUND(COALESCE(AVG(latency_ms), 0)::numeric, 0) || ' ms' FROM ai_chat_messages WHERE role='assistant';
SELECT 'Max czas odpowiedzi: ' || COALESCE(MAX(latency_ms), 0) || ' ms' FROM ai_chat_messages WHERE role='assistant'; SELECT 'Max czas odpowiedzi: ' || COALESCE(MAX(latency_ms), 0) || ' ms' FROM ai_chat_messages WHERE role='assistant';
" "
``` ```
### 2. Statystyki dzienne (ostatnie 7 dni) ### 2. Statystyki dzienne (ostatnie 7 dni)
```bash ```bash
sqlite3 nordabiz_local.db " docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "
SELECT '=== AKTYWNOŚĆ OSTATNIE 7 DNI ===' as header; SELECT '=== AKTYWNOŚĆ OSTATNIE 7 DNI ===' as header;
SELECT date(created_at) as dzien, COUNT(*) as wiadomosci SELECT DATE(created_at) as dzien, COUNT(*) as wiadomosci
FROM ai_chat_messages FROM ai_chat_messages
WHERE created_at > datetime('now', '-7 days') WHERE created_at > NOW() - INTERVAL '7 days'
GROUP BY date(created_at) GROUP BY DATE(created_at)
ORDER BY dzien DESC; ORDER BY dzien DESC;
" "
``` ```
### 3. Top użytkownicy (jeśli są powiązania) ### 3. Top użytkownicy (jeśli są powiązania)
```bash ```bash
sqlite3 nordabiz_local.db " docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "
SELECT '=== TOP UŻYTKOWNICY ===' as header; SELECT '=== TOP UŻYTKOWNICY ===' as header;
SELECT c.user_id, COUNT(m.id) as wiadomosci SELECT c.user_id, COUNT(m.id) as wiadomosci
FROM ai_chat_conversations c FROM ai_chat_conversations c
@ -62,17 +62,17 @@ LIMIT 10;
### 4. Koszty API (tabela ai_api_costs) ### 4. Koszty API (tabela ai_api_costs)
```bash ```bash
sqlite3 nordabiz_local.db " docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "
SELECT '=== KOSZTY API GEMINI ===' as header; SELECT '=== KOSZTY API GEMINI ===' as header;
SELECT SELECT
date(created_at) as dzien, DATE(created_at) as dzien,
COUNT(*) as wywolania, COUNT(*) as wywolania,
SUM(input_tokens) as input_tok, SUM(input_tokens) as input_tok,
SUM(output_tokens) as output_tok, SUM(output_tokens) as output_tok,
ROUND(SUM(total_cost_usd), 4) as koszt_usd ROUND(SUM(total_cost_usd)::numeric, 4) as koszt_usd
FROM ai_api_costs FROM ai_api_costs
WHERE created_at > datetime('now', '-30 days') WHERE created_at > NOW() - INTERVAL '30 days'
GROUP BY date(created_at) GROUP BY DATE(created_at)
ORDER BY dzien DESC ORDER BY dzien DESC
LIMIT 10; LIMIT 10;
" "
@ -98,3 +98,5 @@ Podsumuj w czytelnej formie:
- Google Gemini 2.0 Flash jest na free tier (0 cost) - Google Gemini 2.0 Flash jest na free tier (0 cost)
- Monitoruj tokeny dla kontroli limitów - Monitoruj tokeny dla kontroli limitów
- Wysokie latency może wskazywać na problemy z API - Wysokie latency może wskazywać na problemy z API
- DEV: `docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz`
- PROD: `ssh maciejpi@10.22.68.249 "sudo -u postgres psql -d nordabiz"`

View File

@ -6,32 +6,32 @@ Wygeneruj raport jakości danych firm w katalogu NordaBiz.
### 1. Podsumowanie ogólne ### 1. Podsumowanie ogólne
```bash ```bash
sqlite3 nordabiz_local.db " docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "
SELECT '=== RAPORT JAKOŚCI DANYCH ===' as header; SELECT '=== RAPORT JAKOŚCI DANYCH ===' as header;
SELECT datetime('now', 'localtime') as 'Data raportu'; SELECT NOW() as data_raportu;
SELECT '--- OGÓLNE ---' as section; SELECT '--- OGÓLNE ---' as section;
SELECT 'Łącznie firm: ' || COUNT(*) FROM companies; SELECT 'Łącznie firm: ' || COUNT(*) FROM companies;
SELECT 'Aktywnych: ' || COUNT(*) FROM companies WHERE is_active = 1; SELECT 'Aktywnych: ' || COUNT(*) FROM companies WHERE status = 'active';
SELECT 'Nieaktywnych: ' || COUNT(*) FROM companies WHERE is_active = 0 OR is_active IS NULL; SELECT 'Nieaktywnych: ' || COUNT(*) FROM companies WHERE status != 'active' OR status IS NULL;
" "
``` ```
### 2. Kompletność danych kontaktowych ### 2. Kompletność danych kontaktowych
```bash ```bash
sqlite3 nordabiz_local.db " docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "
SELECT '--- DANE KONTAKTOWE ---' as section; SELECT '--- DANE KONTAKTOWE ---' as section;
SELECT 'Z emailem: ' || COUNT(*) FROM companies WHERE email IS NOT NULL AND email != ''; SELECT 'Z emailem: ' || COUNT(*) FROM companies WHERE email IS NOT NULL AND email != '';
SELECT 'Z telefonem: ' || COUNT(*) FROM companies WHERE phone IS NOT NULL AND phone != ''; SELECT 'Z telefonem: ' || COUNT(*) FROM companies WHERE phone IS NOT NULL AND phone != '';
SELECT 'Ze stroną www: ' || COUNT(*) FROM companies WHERE website IS NOT NULL AND website != ''; SELECT 'Ze stroną www: ' || COUNT(*) FROM companies WHERE website IS NOT NULL AND website != '';
SELECT 'Z pełnym adresem: ' || COUNT(*) FROM companies SELECT 'Z pełnym adresem: ' || COUNT(*) FROM companies
WHERE street_address IS NOT NULL AND city IS NOT NULL AND postal_code IS NOT NULL; WHERE address_street IS NOT NULL AND address_city IS NOT NULL AND address_postal IS NOT NULL;
" "
``` ```
### 3. Dane rejestrowe ### 3. Dane rejestrowe
```bash ```bash
sqlite3 nordabiz_local.db " docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "
SELECT '--- DANE REJESTROWE ---' as section; SELECT '--- DANE REJESTROWE ---' as section;
SELECT 'Z NIP: ' || COUNT(*) FROM companies WHERE nip IS NOT NULL AND nip != ''; SELECT 'Z NIP: ' || COUNT(*) FROM companies WHERE nip IS NOT NULL AND nip != '';
SELECT 'Z REGON: ' || COUNT(*) FROM companies WHERE regon IS NOT NULL AND regon != ''; SELECT 'Z REGON: ' || COUNT(*) FROM companies WHERE regon IS NOT NULL AND regon != '';
@ -41,29 +41,30 @@ SELECT 'Z KRS: ' || COUNT(*) FROM companies WHERE krs IS NOT NULL AND krs != '';
### 4. Jakość opisów ### 4. Jakość opisów
```bash ```bash
sqlite3 nordabiz_local.db " docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "
SELECT '--- OPISY ---' as section; SELECT '--- OPISY ---' as section;
SELECT 'Z krótkim opisem: ' || COUNT(*) FROM companies WHERE short_description IS NOT NULL AND short_description != ''; SELECT 'Z krótkim opisem: ' || COUNT(*) FROM companies WHERE description_short IS NOT NULL AND description_short != '';
SELECT 'Z pełnym opisem: ' || COUNT(*) FROM companies WHERE full_description IS NOT NULL AND full_description != ''; SELECT 'Z pełnym opisem: ' || COUNT(*) FROM companies WHERE description_full IS NOT NULL AND description_full != '';
SELECT 'Śr. długość krótkiego opisu: ' || ROUND(AVG(LENGTH(short_description)), 0) || ' znaków' SELECT 'Śr. długość krótkiego opisu: ' || ROUND(AVG(LENGTH(description_short))::numeric, 0) || ' znaków'
FROM companies WHERE short_description IS NOT NULL; FROM companies WHERE description_short IS NOT NULL;
" "
``` ```
### 5. Rozkład kategorii ### 5. Rozkład kategorii
```bash ```bash
sqlite3 nordabiz_local.db " docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "
SELECT '--- KATEGORIE ---' as section; SELECT '--- KATEGORIE ---' as section;
SELECT category, COUNT(*) as liczba SELECT c.name as kategoria, COUNT(*) as liczba
FROM companies FROM companies co
GROUP BY category LEFT JOIN categories c ON co.category_id = c.id
GROUP BY c.name
ORDER BY liczba DESC; ORDER BY liczba DESC;
" "
``` ```
### 6. Poziomy jakości danych ### 6. Poziomy jakości danych
```bash ```bash
sqlite3 nordabiz_local.db " docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "
SELECT '--- POZIOMY JAKOŚCI ---' as section; SELECT '--- POZIOMY JAKOŚCI ---' as section;
SELECT SELECT
COALESCE(data_quality, 'brak') as poziom, COALESCE(data_quality, 'brak') as poziom,
@ -76,28 +77,28 @@ ORDER BY liczba DESC;
### 7. Firmy wymagające uzupełnienia ### 7. Firmy wymagające uzupełnienia
```bash ```bash
sqlite3 nordabiz_local.db " docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "
SELECT '--- WYMAGAJĄ UZUPEŁNIENIA ---' as section; SELECT '--- WYMAGAJĄ UZUPEŁNIENIA ---' as section;
SELECT slug, legal_name, SELECT slug, legal_name,
CASE CASE
WHEN email IS NULL OR email = '' THEN 'brak email' WHEN email IS NULL OR email = '' THEN 'brak email'
WHEN website IS NULL OR website = '' THEN 'brak www' WHEN website IS NULL OR website = '' THEN 'brak www'
WHEN short_description IS NULL OR short_description = '' THEN 'brak opisu' WHEN description_short IS NULL OR description_short = '' THEN 'brak opisu'
ELSE 'inne' ELSE 'inne'
END as problem END as problem
FROM companies FROM companies
WHERE email IS NULL OR email = '' WHERE email IS NULL OR email = ''
OR website IS NULL OR website = '' OR website IS NULL OR website = ''
OR short_description IS NULL OR short_description = '' OR description_short IS NULL OR description_short = ''
LIMIT 20; LIMIT 20;
" "
``` ```
### 8. Ostatnio aktualizowane ### 8. Ostatnio aktualizowane
```bash ```bash
sqlite3 nordabiz_local.db " docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "
SELECT '--- OSTATNIE AKTUALIZACJE ---' as section; SELECT '--- OSTATNIE AKTUALIZACJE ---' as section;
SELECT slug, legal_name, date(updated_at) as ostatnia_aktualizacja SELECT slug, legal_name, DATE(updated_at) as ostatnia_aktualizacja
FROM companies FROM companies
ORDER BY updated_at DESC ORDER BY updated_at DESC
LIMIT 10; LIMIT 10;
@ -125,3 +126,5 @@ Wygeneruj raport w formacie markdown z tabelami:
- Cel: 100% kompletność podstawowych danych - Cel: 100% kompletność podstawowych danych
- Priorytet: email > telefon > www > opis - Priorytet: email > telefon > www > opis
- Weryfikuj dane przez oficjalne źródła (CEIDG, KRS) - Weryfikuj dane przez oficjalne źródła (CEIDG, KRS)
- DEV: `docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz`
- PROD: `ssh maciejpi@10.22.68.249 "sudo -u postgres psql -d nordabiz"`

View File

@ -14,7 +14,7 @@ Wykonaj deployment projektu NordaBiz na serwer produkcyjny NORDABIZ-01.
- Przejdź do katalogu: `cd /var/www/nordabiznes` - Przejdź do katalogu: `cd /var/www/nordabiznes`
### 3. Deployment ### 3. Deployment
- Wykonaj backup bazy: `cp nordabiznes.db nordabiznes.db.backup.$(date +%Y%m%d_%H%M%S)` (jeśli SQLite) - Wykonaj backup bazy PostgreSQL: `sudo -u postgres pg_dump nordabiz > nordabiz_backup_$(date +%Y%m%d_%H%M%S).sql`
- Pobierz zmiany: `git pull origin main` - Pobierz zmiany: `git pull origin main`
- Zainstaluj zależności (jeśli zmienione): `pip install -r requirements.txt` - Zainstaluj zależności (jeśli zmienione): `pip install -r requirements.txt`
- Restart usługi: `systemctl restart nordabiznes` - Restart usługi: `systemctl restart nordabiznes`

View File

@ -10,6 +10,7 @@ Sprawdź aktualny status projektu NordaBiz - lokalnie i na produkcji.
curl -s http://localhost:5000/health 2>/dev/null || curl -s http://localhost:5001/health 2>/dev/null || echo "Aplikacja nie działa lokalnie" curl -s http://localhost:5000/health 2>/dev/null || curl -s http://localhost:5001/health 2>/dev/null || echo "Aplikacja nie działa lokalnie"
``` ```
- Pokaż działające procesy Python: `ps aux | grep -E "python.*app.py" | grep -v grep` - Pokaż działające procesy Python: `ps aux | grep -E "python.*app.py" | grep -v grep`
- Sprawdź Docker PostgreSQL: `docker ps | grep nordabiz-postgres`
### 2. Status produkcji ### 2. Status produkcji
- Health check produkcji: `curl -s https://nordabiznes.pl/health` - Health check produkcji: `curl -s https://nordabiznes.pl/health`
@ -20,10 +21,9 @@ Sprawdź aktualny status projektu NordaBiz - lokalnie i na produkcji.
- VM: NORDABIZ-01 (ID: 249) - VM: NORDABIZ-01 (ID: 249)
- Sprawdź: CPU, RAM, uptime, snapshoty - Sprawdź: CPU, RAM, uptime, snapshoty
### 4. Statystyki bazy danych ### 4. Statystyki bazy danych (DEV via Docker)
Wykonaj na lokalnej bazie SQLite:
```bash ```bash
sqlite3 nordabiz_local.db " docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "
SELECT 'Firmy: ' || COUNT(*) FROM companies; SELECT 'Firmy: ' || COUNT(*) FROM companies;
SELECT 'Użytkownicy: ' || COUNT(*) FROM users; SELECT 'Użytkownicy: ' || COUNT(*) FROM users;
SELECT 'Konwersacje chat: ' || COUNT(*) FROM ai_chat_conversations; SELECT 'Konwersacje chat: ' || COUNT(*) FROM ai_chat_conversations;
@ -31,7 +31,17 @@ SELECT 'Wiadomości chat: ' || COUNT(*) FROM ai_chat_messages;
" "
``` ```
### 5. Status Git ### 5. Statystyki bazy danych (PROD)
```bash
ssh maciejpi@10.22.68.249 "sudo -u postgres psql -d nordabiz -c \"
SELECT 'Firmy: ' || COUNT(*) FROM companies;
SELECT 'Użytkownicy: ' || COUNT(*) FROM users;
SELECT 'Konwersacje chat: ' || COUNT(*) FROM ai_chat_conversations;
SELECT 'Wiadomości chat: ' || COUNT(*) FROM ai_chat_messages;
\""
```
### 6. Status Git
- `git status` - niezacommitowane zmiany - `git status` - niezacommitowane zmiany
- `git log --oneline -5` - ostatnie commity - `git log --oneline -5` - ostatnie commity
@ -40,7 +50,13 @@ Podsumuj status w formie tabeli:
| Element | Status | Szczegóły | | Element | Status | Szczegóły |
|---------|--------|-----------| |---------|--------|-----------|
| Lokalna aplikacja | OK/ERROR | port | | Lokalna aplikacja | OK/ERROR | port |
| Docker PostgreSQL | OK/ERROR | localhost:5433 |
| Produkcja | OK/ERROR | response time | | Produkcja | OK/ERROR | response time |
| VM NORDABIZ-01 | OK/ERROR | uptime | | VM NORDABIZ-01 | OK/ERROR | uptime |
| Baza danych | OK/ERROR | liczba rekordów | | Baza danych DEV | OK/ERROR | liczba rekordów |
| Baza danych PROD | OK/ERROR | liczba rekordów |
| Git | CLEAN/DIRTY | branch | | Git | CLEAN/DIRTY | branch |
## Uwagi:
- DEV: PostgreSQL via Docker na localhost:5433
- PROD: PostgreSQL na 10.22.68.249:5432

View File

@ -149,7 +149,7 @@ ssh maciejpi@10.22.68.249 "cd /var/www/nordabiznes && sudo -u www-data git pull
### Bezpieczeństwo ### Bezpieczeństwo
- NIE edytuj bezpośrednio bazy produkcyjnej PostgreSQL - NIE edytuj bezpośrednio bazy produkcyjnej PostgreSQL
- Zawsze testuj zmiany na SQLite przed wdrożeniem - Zawsze testuj zmiany na DEV PostgreSQL (Docker: localhost:5433) przed wdrożeniem
- Klucze API i hasła tylko w `.env` (nigdy w kodzie) - Klucze API i hasła tylko w `.env` (nigdy w kodzie)
- Rate limiting: 200 req/dzień, 50 req/godzinę - Rate limiting: 200 req/dzień, 50 req/godzinę
@ -230,8 +230,8 @@ Unified search dla chatbota AI i wyszukiwarki `/search`.
### Funkcje: ### Funkcje:
- **NIP/REGON lookup** - bezpośrednie wyszukiwanie po identyfikatorach - **NIP/REGON lookup** - bezpośrednie wyszukiwanie po identyfikatorach
- **Synonym expansion** - rozszerzenie słów kluczowych (np. "strony" → www, web, portal) - **Synonym expansion** - rozszerzenie słów kluczowych (np. "strony" → www, web, portal)
- **PostgreSQL FTS** - full-text search z tsvector (produkcja) - **PostgreSQL FTS** - full-text search z tsvector (DEV i PROD)
- **SQLite fallback** - keyword scoring (development) - **SQLite fallback** - keyword scoring (tylko jako fallback, nieużywane)
- **Fuzzy matching** - pg_trgm dla literówek (gdy dostępne) - **Fuzzy matching** - pg_trgm dla literówek (gdy dostępne)
### Scoring: ### Scoring:

View File

@ -12,7 +12,7 @@ Aplikacja webowa umożliwiająca przeglądanie, wyszukiwanie i czat z AI o firma
- Data ostatniej aktualizacji: 2025-11-24 - Data ostatniej aktualizacji: 2025-11-24
### Struktura Bazy ### Struktura Bazy
**Database:** SQLite (`nordabiz_local.db`) **Database:** PostgreSQL via Docker (`localhost:5433/nordabiz` - DEV) / PostgreSQL (`10.22.68.249:5432` - PROD)
**ORM:** SQLAlchemy **ORM:** SQLAlchemy
**Tabele:** **Tabele:**
@ -165,7 +165,12 @@ https://norda-biznes.info/czlonkowie - oficjalna lista 80 członków
### .env ### .env
``` ```
DATABASE_URL=sqlite:///nordabiz_local.db # DEV (PostgreSQL via Docker)
DATABASE_URL=postgresql://nordabiz_app:dev_password@localhost:5433/nordabiz
# PROD
# DATABASE_URL=postgresql://nordabiz_app:<password>@10.22.68.249:5432/nordabiz
SECRET_KEY=<random_secret> SECRET_KEY=<random_secret>
GEMINI_API_KEY=<api_key> GEMINI_API_KEY=<api_key>
``` ```
@ -206,7 +211,7 @@ Główna aplikacja Flask
## Technologie ## Technologie
- **Backend:** Python 3.9+, Flask 3.0+, SQLAlchemy - **Backend:** Python 3.9+, Flask 3.0+, SQLAlchemy
- **Database:** SQLite (development), PostgreSQL (production ready) - **Database:** PostgreSQL (dev via Docker na localhost:5433, prod na 10.22.68.249:5432)
- **Frontend:** HTML5, Bootstrap 5, JavaScript - **Frontend:** HTML5, Bootstrap 5, JavaScript
- **AI:** Google Gemini 2.0 Flash (FREE tier) - **AI:** Google Gemini 2.0 Flash (FREE tier)
- **Auth:** Flask-Login, werkzeug password hashing - **Auth:** Flask-Login, werkzeug password hashing
@ -228,7 +233,11 @@ ps aux | grep app.py
### Database Backup ### Database Backup
```bash ```bash
cp nordabiz_local.db nordabiz_local.db.backup_$(date +%Y%m%d_%H%M%S) # DEV (Docker PostgreSQL)
docker exec nordabiz-postgres pg_dump -U nordabiz_app nordabiz > backup_dev_$(date +%Y%m%d_%H%M%S).sql
# PROD
ssh maciejpi@10.22.68.249 "sudo -u postgres pg_dump nordabiz" > backup_prod_$(date +%Y%m%d_%H%M%S).sql
``` ```
### Schema Migration ### Schema Migration

View File

@ -163,14 +163,14 @@ python3 <script_name>.py
python3 <script_name>.py > output.log 2>&1 python3 <script_name>.py > output.log 2>&1
``` ```
### Sprawdzenie przed uruchomieniem ### Sprawdzenie przed uruchomieniem (DEV via Docker)
```bash ```bash
sqlite3 nordabiz_local.db "SELECT COUNT(*) FROM companies;" docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "SELECT COUNT(*) FROM companies;"
``` ```
### Backup przed uruchomieniem ### Backup przed uruchomieniem (DEV via Docker)
```bash ```bash
cp nordabiz_local.db nordabiz_local.db.backup_before_<operation> docker exec nordabiz-postgres pg_dump -U nordabiz_app nordabiz > nordabiz_backup_before_<operation>.sql
``` ```
## Wskazówki ## Wskazówki

View File

@ -13,7 +13,7 @@ This checklist ensures safe, repeatable deployments to production with minimal r
### Key Principles ### Key Principles
- **Backup first:** Always backup before any database changes - **Backup first:** Always backup before any database changes
- **Test locally:** Validate changes on SQLite before PostgreSQL - **Test locally:** Validate changes on DEV PostgreSQL (Docker) before PROD
- **Review SQL:** Never execute SQL without reviewing it first - **Review SQL:** Never execute SQL without reviewing it first
- **Verify application:** Test application functionality after deployment - **Verify application:** Test application functionality after deployment
- **Document changes:** Keep rollback plan ready and documented - **Document changes:** Keep rollback plan ready and documented
@ -46,7 +46,7 @@ This checklist ensures safe, repeatable deployments to production with minimal r
ls -lh *.sql # Any SQL in root ls -lh *.sql # Any SQL in root
``` ```
- [ ] No destructive operations (DROP, TRUNCATE, CASCADE DELETE) without approval - [ ] No destructive operations (DROP, TRUNCATE, CASCADE DELETE) without approval
- [ ] All schema changes tested on local SQLite first - [ ] All schema changes tested on DEV PostgreSQL (Docker: localhost:5433) first
### Requirements & Dependencies ### Requirements & Dependencies
- [ ] `requirements.txt` up-to-date and committed - [ ] `requirements.txt` up-to-date and committed
@ -203,11 +203,13 @@ This checklist ensures safe, repeatable deployments to production with minimal r
## Phase 3: Local Testing (Development Environment) ## Phase 3: Local Testing (Development Environment)
### Test Environment Setup ### Test Environment Setup
- [ ] Local SQLite database created from backup - [ ] DEV PostgreSQL (Docker) is running and accessible
```bash ```bash
# Restore PostgreSQL backup to SQLite (if doing data migrations) # Verify Docker PostgreSQL is running
# Or create fresh SQLite schema docker ps | grep nordabiz-postgres
python3 -c "from database import init_db; init_db()"
# Test connection
docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "SELECT 1;"
``` ```
### Application Tests ### Application Tests
@ -230,23 +232,19 @@ This checklist ensures safe, repeatable deployments to production with minimal r
``` ```
### SQL Script Testing ### SQL Script Testing
- [ ] Each SQL script tested individually on SQLite fallback - [ ] Each SQL script tested individually on DEV PostgreSQL (Docker)
```bash ```bash
# For each .sql file: # For each .sql file:
python3 << 'EOF' docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -f /path/to/schema_change.sql
import sqlite3
conn = sqlite3.connect('nordabiz_local.db') # Or using stdin:
with open('database/schema_change.sql', 'r') as f: cat database/schema_change.sql | docker exec -i nordabiz-postgres psql -U nordabiz_app -d nordabiz
conn.executescript(f.read())
conn.commit()
print("✓ Schema change applied successfully")
EOF
``` ```
- [ ] Verify data integrity after applying changes - [ ] Verify data integrity after applying changes
```bash ```bash
# Count records in key tables # Count records in key tables
sqlite3 nordabiz_local.db "SELECT 'companies' AS table, COUNT(*) FROM companies;" docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "SELECT 'companies' AS table, COUNT(*) FROM companies;"
sqlite3 nordabiz_local.db "SELECT 'users' AS table, COUNT(*) FROM users;" docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "SELECT 'users' AS table, COUNT(*) FROM users;"
``` ```
--- ---

View File

@ -10,7 +10,9 @@ Tests:
5. Statistics calculation 5. Statistics calculation
Usage: Usage:
DATABASE_URL=sqlite:///nordabiz_local.db python3 tests/test_admin_seo_dashboard.py python3 tests/test_admin_seo_dashboard.py
# Uses DATABASE_URL from .env (PostgreSQL via Docker: localhost:5433)
""" """
import os import os
@ -20,7 +22,14 @@ from datetime import datetime, timedelta
# Add project root to path # Add project root to path
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
os.environ.setdefault('DATABASE_URL', 'sqlite:///nordabiz_local.db') # Load .env if dotenv available
try:
from dotenv import load_dotenv
load_dotenv()
except ImportError:
pass
os.environ.setdefault('DATABASE_URL', 'postgresql://nordabiz_app:dev_password@localhost:5433/nordabiz')
from database import SessionLocal, Company, CompanyWebsiteAnalysis, User from database import SessionLocal, Company, CompanyWebsiteAnalysis, User