From 69bb6b839ad1c548f6def28921d175e2f0fa42a7 Mon Sep 17 00:00:00 2001 From: Maciej Pienczyn Date: Fri, 9 Jan 2026 03:40:50 +0100 Subject: [PATCH] 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 --- .claude/commands/add-company.md | 77 ++++++++++++++++++------------- .claude/commands/backup.md | 31 +++++++------ .claude/commands/chat-stats.md | 34 +++++++------- .claude/commands/data-report.md | 47 ++++++++++--------- .claude/commands/deploy.md | 2 +- .claude/commands/status.md | 26 +++++++++-- CLAUDE.md | 6 +-- PROJECT_INFO.md | 17 +++++-- SCRIPTS_INDEX.md | 8 ++-- deployment_checklist.md | 32 ++++++------- tests/test_admin_seo_dashboard.py | 13 +++++- 11 files changed, 172 insertions(+), 121 deletions(-) diff --git a/.claude/commands/add-company.md b/.claude/commands/add-company.md index 40121fb..6ed7640 100644 --- a/.claude/commands/add-company.md +++ b/.claude/commands/add-company.md @@ -38,52 +38,61 @@ Slug = kebab-case z nazwy firmy: - "ABC Usługi" → "abc-uslugi" - Usuń znaki specjalne, zamień spacje na myślniki, lowercase -### 4. Sprawdź duplikaty +### 4. Sprawdź duplikaty (DEV via Docker) ```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 -Wygeneruj plik `import_NEW_COMPANY.py` na wzór istniejących: +Wygeneruj plik `import_NEW_COMPANY.py` używający SQLAlchemy: ```python #!/usr/bin/env python3 """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 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(): - conn = sqlite3.connect('nordabiz_local.db') - cursor = conn.cursor() + engine = create_engine(DATABASE_URL) + Session = sessionmaker(bind=engine) + session = Session() - company = { - 'slug': 'nazwa-firmy', - '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() - } + # Znajdź kategorię + category = session.query(Category).filter_by(name='Services').first() - # 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() - conn.close() - print(f"Firma {company['legal_name']} dodana pomyślnie!") + session.add(company) + session.commit() + print(f"Firma {company.legal_name} dodana pomyślnie! ID: {company.id}") + session.close() if __name__ == '__main__': import_company() @@ -94,12 +103,14 @@ if __name__ == '__main__': python import_NEW_COMPANY.py ``` -### 7. Zweryfikuj dodanie +### 7. Zweryfikuj dodanie (DEV via Docker) ```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: +- DEV: PostgreSQL via Docker na localhost:5433 +- PROD: PostgreSQL na 10.22.68.249:5432 - Dla produkcji: po przetestowaniu lokalnie, wdróż przez `/deploy` - Nowe firmy powinny pochodzić z oficjalnej listy członków Norda Biznes - Zawsze weryfikuj NIP przed dodaniem diff --git a/.claude/commands/backup.md b/.claude/commands/backup.md index 2390197..92fcda7 100644 --- a/.claude/commands/backup.md +++ b/.claude/commands/backup.md @@ -11,28 +11,29 @@ Opcjonalny argument określa typ backupu: ## Kroki do wykonania: -### 1. Backup lokalnej bazy SQLite +### 1. Backup lokalnej bazy PostgreSQL (DEV via Docker) ```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 -Połącz się z serwerem: +Eksport do lokalnego: ```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 -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 ```bash mkdir -p backups/config_$(date +%Y%m%d) -cp .env backups/config_$(date +%Y%m%d)/ -ssh root@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 +cp .env backups/config_$(date +%Y%m%d)/dev.env +ssh maciejpi@10.22.68.249 "cat /var/www/nordabiznes/.env" > backups/config_$(date +%Y%m%d)/prod.env +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 @@ -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 Lokalne: ```bash -ls -la backups/*.db backups/*.sql 2>/dev/null +ls -la backups/*.sql 2>/dev/null ``` Snapshoty VM (użyj skill proxmox-manager): @@ -59,14 +60,14 @@ Pokaż snapshoty VM 249 ### 6. Przywracanie z backupu -#### SQLite (lokalne): +#### DEV (Docker PostgreSQL): ```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 -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: @@ -92,3 +93,5 @@ Przywróć VM 249 ze snapshotu backup_YYYYMMDD - Testuj przywracanie okresowo - Snapshoty VM są najszybsze do rollbacku - 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 diff --git a/.claude/commands/chat-stats.md b/.claude/commands/chat-stats.md index 7c43c50..eda2af1 100644 --- a/.claude/commands/chat-stats.md +++ b/.claude/commands/chat-stats.md @@ -5,16 +5,16 @@ Wyświetl statystyki użycia chatu AI (Google Gemini) w projekcie NordaBiz. ## Kroki do wykonania: ### 1. Podstawowe statystyki -Wykonaj zapytania na lokalnej bazie: +Wykonaj zapytania na bazie PostgreSQL (DEV via Docker): ```bash -sqlite3 nordabiz_local.db " +docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c " SELECT '=== STATYSTYKI CHATU AI ===' as header; SELECT '--- Konwersacje ---' as section; SELECT 'Łącznie konwersacji: ' || 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 'Łą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 '--- Koszty (USD) ---' as section; -SELECT 'Łączny koszt: $' || ROUND(COALESCE(SUM(cost_usd), 0), 4) FROM ai_chat_messages; -SELECT 'Średni koszt/wiadomość: $' || ROUND(COALESCE(AVG(cost_usd), 0), 6) FROM ai_chat_messages WHERE role='assistant'; +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)::numeric, 6) FROM ai_chat_messages WHERE role='assistant'; 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'; " ``` ### 2. Statystyki dzienne (ostatnie 7 dni) ```bash -sqlite3 nordabiz_local.db " +docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c " 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 -WHERE created_at > datetime('now', '-7 days') -GROUP BY date(created_at) +WHERE created_at > NOW() - INTERVAL '7 days' +GROUP BY DATE(created_at) ORDER BY dzien DESC; " ``` ### 3. Top użytkownicy (jeśli są powiązania) ```bash -sqlite3 nordabiz_local.db " +docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c " SELECT '=== TOP UŻYTKOWNICY ===' as header; SELECT c.user_id, COUNT(m.id) as wiadomosci FROM ai_chat_conversations c @@ -62,17 +62,17 @@ LIMIT 10; ### 4. Koszty API (tabela ai_api_costs) ```bash -sqlite3 nordabiz_local.db " +docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c " SELECT '=== KOSZTY API GEMINI ===' as header; SELECT - date(created_at) as dzien, + DATE(created_at) as dzien, COUNT(*) as wywolania, SUM(input_tokens) as input_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 -WHERE created_at > datetime('now', '-30 days') -GROUP BY date(created_at) +WHERE created_at > NOW() - INTERVAL '30 days' +GROUP BY DATE(created_at) ORDER BY dzien DESC LIMIT 10; " @@ -98,3 +98,5 @@ Podsumuj w czytelnej formie: - Google Gemini 2.0 Flash jest na free tier (0 cost) - Monitoruj tokeny dla kontroli limitów - 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"` diff --git a/.claude/commands/data-report.md b/.claude/commands/data-report.md index b3c3ddb..22cb592 100644 --- a/.claude/commands/data-report.md +++ b/.claude/commands/data-report.md @@ -6,32 +6,32 @@ Wygeneruj raport jakości danych firm w katalogu NordaBiz. ### 1. Podsumowanie ogólne ```bash -sqlite3 nordabiz_local.db " +docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c " 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 'Łącznie firm: ' || COUNT(*) FROM companies; -SELECT 'Aktywnych: ' || COUNT(*) FROM companies WHERE is_active = 1; -SELECT 'Nieaktywnych: ' || COUNT(*) FROM companies WHERE is_active = 0 OR is_active IS NULL; +SELECT 'Aktywnych: ' || COUNT(*) FROM companies WHERE status = 'active'; +SELECT 'Nieaktywnych: ' || COUNT(*) FROM companies WHERE status != 'active' OR status IS NULL; " ``` ### 2. Kompletność danych kontaktowych ```bash -sqlite3 nordabiz_local.db " +docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c " SELECT '--- DANE KONTAKTOWE ---' as section; 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 'Ze stroną www: ' || COUNT(*) FROM companies WHERE website IS NOT NULL AND website != ''; 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 ```bash -sqlite3 nordabiz_local.db " +docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c " SELECT '--- DANE REJESTROWE ---' as section; 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 != ''; @@ -41,29 +41,30 @@ SELECT 'Z KRS: ' || COUNT(*) FROM companies WHERE krs IS NOT NULL AND krs != ''; ### 4. Jakość opisów ```bash -sqlite3 nordabiz_local.db " +docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c " SELECT '--- OPISY ---' as section; -SELECT 'Z krótkim opisem: ' || COUNT(*) FROM companies WHERE short_description IS NOT NULL AND short_description != ''; -SELECT 'Z pełnym opisem: ' || COUNT(*) FROM companies WHERE full_description IS NOT NULL AND full_description != ''; -SELECT 'Śr. długość krótkiego opisu: ' || ROUND(AVG(LENGTH(short_description)), 0) || ' znaków' - FROM companies WHERE short_description IS NOT NULL; +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 description_full IS NOT NULL AND description_full != ''; +SELECT 'Śr. długość krótkiego opisu: ' || ROUND(AVG(LENGTH(description_short))::numeric, 0) || ' znaków' + FROM companies WHERE description_short IS NOT NULL; " ``` ### 5. Rozkład kategorii ```bash -sqlite3 nordabiz_local.db " +docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c " SELECT '--- KATEGORIE ---' as section; -SELECT category, COUNT(*) as liczba -FROM companies -GROUP BY category +SELECT c.name as kategoria, COUNT(*) as liczba +FROM companies co +LEFT JOIN categories c ON co.category_id = c.id +GROUP BY c.name ORDER BY liczba DESC; " ``` ### 6. Poziomy jakości danych ```bash -sqlite3 nordabiz_local.db " +docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c " SELECT '--- POZIOMY JAKOŚCI ---' as section; SELECT COALESCE(data_quality, 'brak') as poziom, @@ -76,28 +77,28 @@ ORDER BY liczba DESC; ### 7. Firmy wymagające uzupełnienia ```bash -sqlite3 nordabiz_local.db " +docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c " SELECT '--- WYMAGAJĄ UZUPEŁNIENIA ---' as section; SELECT slug, legal_name, CASE WHEN email IS NULL OR email = '' THEN 'brak email' 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' END as problem FROM companies WHERE email IS NULL OR email = '' OR website IS NULL OR website = '' - OR short_description IS NULL OR short_description = '' + OR description_short IS NULL OR description_short = '' LIMIT 20; " ``` ### 8. Ostatnio aktualizowane ```bash -sqlite3 nordabiz_local.db " +docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c " 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 ORDER BY updated_at DESC LIMIT 10; @@ -125,3 +126,5 @@ Wygeneruj raport w formacie markdown z tabelami: - Cel: 100% kompletność podstawowych danych - Priorytet: email > telefon > www > opis - 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"` diff --git a/.claude/commands/deploy.md b/.claude/commands/deploy.md index 4fb262d..1674846 100644 --- a/.claude/commands/deploy.md +++ b/.claude/commands/deploy.md @@ -14,7 +14,7 @@ Wykonaj deployment projektu NordaBiz na serwer produkcyjny NORDABIZ-01. - Przejdź do katalogu: `cd /var/www/nordabiznes` ### 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` - Zainstaluj zależności (jeśli zmienione): `pip install -r requirements.txt` - Restart usługi: `systemctl restart nordabiznes` diff --git a/.claude/commands/status.md b/.claude/commands/status.md index cf2f8b8..84e9d66 100644 --- a/.claude/commands/status.md +++ b/.claude/commands/status.md @@ -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" ``` - 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 - 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) - Sprawdź: CPU, RAM, uptime, snapshoty -### 4. Statystyki bazy danych -Wykonaj na lokalnej bazie SQLite: +### 4. Statystyki bazy danych (DEV via Docker) ```bash -sqlite3 nordabiz_local.db " +docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c " SELECT 'Firmy: ' || COUNT(*) FROM companies; SELECT 'Użytkownicy: ' || COUNT(*) FROM users; 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 log --oneline -5` - ostatnie commity @@ -40,7 +50,13 @@ Podsumuj status w formie tabeli: | Element | Status | Szczegóły | |---------|--------|-----------| | Lokalna aplikacja | OK/ERROR | port | +| Docker PostgreSQL | OK/ERROR | localhost:5433 | | Produkcja | OK/ERROR | response time | | 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 | + +## Uwagi: +- DEV: PostgreSQL via Docker na localhost:5433 +- PROD: PostgreSQL na 10.22.68.249:5432 diff --git a/CLAUDE.md b/CLAUDE.md index 551e4b2..036eb9d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -149,7 +149,7 @@ ssh maciejpi@10.22.68.249 "cd /var/www/nordabiznes && sudo -u www-data git pull ### Bezpieczeństwo - 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) - Rate limiting: 200 req/dzień, 50 req/godzinę @@ -230,8 +230,8 @@ Unified search dla chatbota AI i wyszukiwarki `/search`. ### Funkcje: - **NIP/REGON lookup** - bezpośrednie wyszukiwanie po identyfikatorach - **Synonym expansion** - rozszerzenie słów kluczowych (np. "strony" → www, web, portal) -- **PostgreSQL FTS** - full-text search z tsvector (produkcja) -- **SQLite fallback** - keyword scoring (development) +- **PostgreSQL FTS** - full-text search z tsvector (DEV i PROD) +- **SQLite fallback** - keyword scoring (tylko jako fallback, nieużywane) - **Fuzzy matching** - pg_trgm dla literówek (gdy dostępne) ### Scoring: diff --git a/PROJECT_INFO.md b/PROJECT_INFO.md index 4acd339..add9e0b 100644 --- a/PROJECT_INFO.md +++ b/PROJECT_INFO.md @@ -12,7 +12,7 @@ Aplikacja webowa umożliwiająca przeglądanie, wyszukiwanie i czat z AI o firma - Data ostatniej aktualizacji: 2025-11-24 ### Struktura Bazy -**Database:** SQLite (`nordabiz_local.db`) +**Database:** PostgreSQL via Docker (`localhost:5433/nordabiz` - DEV) / PostgreSQL (`10.22.68.249:5432` - PROD) **ORM:** SQLAlchemy **Tabele:** @@ -165,7 +165,12 @@ https://norda-biznes.info/czlonkowie - oficjalna lista 80 członków ### .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:@10.22.68.249:5432/nordabiz + SECRET_KEY= GEMINI_API_KEY= ``` @@ -206,7 +211,7 @@ Główna aplikacja Flask ## Technologie - **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 - **AI:** Google Gemini 2.0 Flash (FREE tier) - **Auth:** Flask-Login, werkzeug password hashing @@ -228,7 +233,11 @@ ps aux | grep app.py ### Database Backup ```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 diff --git a/SCRIPTS_INDEX.md b/SCRIPTS_INDEX.md index 326f3d0..2b8e8fb 100644 --- a/SCRIPTS_INDEX.md +++ b/SCRIPTS_INDEX.md @@ -163,14 +163,14 @@ python3 .py python3 .py > output.log 2>&1 ``` -### Sprawdzenie przed uruchomieniem +### Sprawdzenie przed uruchomieniem (DEV via Docker) ```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 -cp nordabiz_local.db nordabiz_local.db.backup_before_ +docker exec nordabiz-postgres pg_dump -U nordabiz_app nordabiz > nordabiz_backup_before_.sql ``` ## Wskazówki diff --git a/deployment_checklist.md b/deployment_checklist.md index 3800880..765dca4 100644 --- a/deployment_checklist.md +++ b/deployment_checklist.md @@ -13,7 +13,7 @@ This checklist ensures safe, repeatable deployments to production with minimal r ### Key Principles - **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 - **Verify application:** Test application functionality after deployment - **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 ``` - [ ] 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.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) ### Test Environment Setup -- [ ] Local SQLite database created from backup +- [ ] DEV PostgreSQL (Docker) is running and accessible ```bash - # Restore PostgreSQL backup to SQLite (if doing data migrations) - # Or create fresh SQLite schema - python3 -c "from database import init_db; init_db()" + # Verify Docker PostgreSQL is running + docker ps | grep nordabiz-postgres + + # Test connection + docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "SELECT 1;" ``` ### Application Tests @@ -230,23 +232,19 @@ This checklist ensures safe, repeatable deployments to production with minimal r ``` ### SQL Script Testing -- [ ] Each SQL script tested individually on SQLite fallback +- [ ] Each SQL script tested individually on DEV PostgreSQL (Docker) ```bash # For each .sql file: - python3 << 'EOF' - import sqlite3 - conn = sqlite3.connect('nordabiz_local.db') - with open('database/schema_change.sql', 'r') as f: - conn.executescript(f.read()) - conn.commit() - print("✓ Schema change applied successfully") - EOF + docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -f /path/to/schema_change.sql + + # Or using stdin: + cat database/schema_change.sql | docker exec -i nordabiz-postgres psql -U nordabiz_app -d nordabiz ``` - [ ] Verify data integrity after applying changes ```bash # Count records in key tables - sqlite3 nordabiz_local.db "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 'companies' AS table, COUNT(*) FROM companies;" + docker exec nordabiz-postgres psql -U nordabiz_app -d nordabiz -c "SELECT 'users' AS table, COUNT(*) FROM users;" ``` --- diff --git a/tests/test_admin_seo_dashboard.py b/tests/test_admin_seo_dashboard.py index 7a2f113..68c1760 100644 --- a/tests/test_admin_seo_dashboard.py +++ b/tests/test_admin_seo_dashboard.py @@ -10,7 +10,9 @@ Tests: 5. Statistics calculation 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 @@ -20,7 +22,14 @@ from datetime import datetime, timedelta # Add project root to path 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