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:
parent
def60a4b22
commit
69bb6b839a
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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"`
|
||||||
|
|||||||
@ -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"`
|
||||||
|
|||||||
@ -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`
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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;"
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user