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"
|
||||
- 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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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"`
|
||||
|
||||
@ -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"`
|
||||
|
||||
@ -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`
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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:<password>@10.22.68.249:5432/nordabiz
|
||||
|
||||
SECRET_KEY=<random_secret>
|
||||
GEMINI_API_KEY=<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
|
||||
|
||||
@ -163,14 +163,14 @@ python3 <script_name>.py
|
||||
python3 <script_name>.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_<operation>
|
||||
docker exec nordabiz-postgres pg_dump -U nordabiz_app nordabiz > nordabiz_backup_before_<operation>.sql
|
||||
```
|
||||
|
||||
## Wskazówki
|
||||
|
||||
@ -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;"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user