diff --git a/.gitignore b/.gitignore index f8d3e62..d20a5f7 100644 --- a/.gitignore +++ b/.gitignore @@ -64,3 +64,4 @@ VALIDATION_*.md preflight_report_*.txt venv-py312/ .claude_settings.json +.worktrees/ diff --git a/database/migrations/003_membership_fees.sql b/database/migrations/003_membership_fees.sql new file mode 100644 index 0000000..b1b46dd --- /dev/null +++ b/database/migrations/003_membership_fees.sql @@ -0,0 +1,120 @@ +-- ============================================================ +-- NordaBiz - Migration 003: Membership Fees Management +-- ============================================================ +-- Created: 2026-01-04 +-- Description: +-- - Creates membership_fees table for tracking monthly payments +-- - Creates membership_fee_config for fee amount configuration +-- - Creates announcements table for board communications +-- ============================================================ + +-- ============================================================ +-- 1. MEMBERSHIP FEES TABLE +-- ============================================================ + +CREATE TABLE IF NOT EXISTS membership_fees ( + id SERIAL PRIMARY KEY, + company_id INTEGER NOT NULL REFERENCES companies(id) ON DELETE CASCADE, + + -- Period + fee_year INTEGER NOT NULL, + fee_month INTEGER NOT NULL CHECK (fee_month >= 1 AND fee_month <= 12), + + -- Amounts + amount NUMERIC(10, 2) NOT NULL, + amount_paid NUMERIC(10, 2) DEFAULT 0, + + -- Status: pending, paid, partial, overdue, waived + status VARCHAR(20) DEFAULT 'pending', + + -- Payment details + payment_date DATE, + payment_method VARCHAR(50), + payment_reference VARCHAR(100), + + -- Admin tracking + recorded_by INTEGER REFERENCES users(id), + recorded_at TIMESTAMP, + + notes TEXT, + + -- Timestamps + created_at TIMESTAMP DEFAULT NOW(), + updated_at TIMESTAMP DEFAULT NOW(), + + -- Unique constraint: one fee record per company per month + CONSTRAINT uq_company_fee_period UNIQUE (company_id, fee_year, fee_month) +); + +CREATE INDEX IF NOT EXISTS idx_membership_fees_company ON membership_fees(company_id); +CREATE INDEX IF NOT EXISTS idx_membership_fees_period ON membership_fees(fee_year, fee_month); +CREATE INDEX IF NOT EXISTS idx_membership_fees_status ON membership_fees(status); + +COMMENT ON TABLE membership_fees IS 'Monthly membership fee tracking for Norda Biznes companies'; + +-- ============================================================ +-- 2. FEE CONFIGURATION TABLE +-- ============================================================ + +CREATE TABLE IF NOT EXISTS membership_fee_config ( + id SERIAL PRIMARY KEY, + scope VARCHAR(20) NOT NULL, -- 'global', 'category', 'company' + category_id INTEGER REFERENCES categories(id), + company_id INTEGER REFERENCES companies(id), + + monthly_amount NUMERIC(10, 2) NOT NULL, + + valid_from DATE NOT NULL, + valid_until DATE, + + created_by INTEGER REFERENCES users(id), + created_at TIMESTAMP DEFAULT NOW(), + notes TEXT +); + +CREATE INDEX IF NOT EXISTS idx_fee_config_scope ON membership_fee_config(scope); +CREATE INDEX IF NOT EXISTS idx_fee_config_validity ON membership_fee_config(valid_from, valid_until); + +-- Insert default global fee (100 PLN) +INSERT INTO membership_fee_config (scope, monthly_amount, valid_from, notes) +VALUES ('global', 100.00, '2026-01-01', 'Domyslna skladka miesieczna') +ON CONFLICT DO NOTHING; + +COMMENT ON TABLE membership_fee_config IS 'Configuration for membership fee amounts'; + +-- ============================================================ +-- 3. ANNOUNCEMENTS TABLE +-- ============================================================ + +CREATE TABLE IF NOT EXISTS announcements ( + id SERIAL PRIMARY KEY, + + title VARCHAR(255) NOT NULL, + content TEXT NOT NULL, + + -- Types: general, fees, event, important, urgent + announcement_type VARCHAR(50) DEFAULT 'general', + + is_published BOOLEAN DEFAULT FALSE, + is_pinned BOOLEAN DEFAULT FALSE, + publish_date TIMESTAMP, + expire_date TIMESTAMP, + + -- Target: all, fee_pending, fee_overdue + target_audience VARCHAR(50) DEFAULT 'all', + + author_id INTEGER NOT NULL REFERENCES users(id), + + created_at TIMESTAMP DEFAULT NOW(), + updated_at TIMESTAMP DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_announcements_published ON announcements(is_published); +CREATE INDEX IF NOT EXISTS idx_announcements_type ON announcements(announcement_type); +CREATE INDEX IF NOT EXISTS idx_announcements_dates ON announcements(publish_date, expire_date); + +COMMENT ON TABLE announcements IS 'Board announcements visible to logged-in members'; + +-- ============================================================ +-- MIGRATION COMPLETE +-- ============================================================ diff --git a/docs/INCIDENT_REPORT_20260102.md b/docs/INCIDENT_REPORT_20260102.md new file mode 100644 index 0000000..60eb56f --- /dev/null +++ b/docs/INCIDENT_REPORT_20260102.md @@ -0,0 +1,283 @@ +# Raport Incydentu - nordabiznes.pl ERR_TOO_MANY_REDIRECTS + +**Data incydentu:** 2026-01-02 +**Czas wykrycia:** ~18:00 CET +**Czas rozwiązania:** ~18:30 CET +**Czas trwania:** ~30 minut +**Severity:** CRITICAL (portal niedostępny z zewnątrz) +**Status:** ROZWIĄZANY + +--- + +## 1. OPIS PROBLEMU + +### Objawy +- Portal https://nordabiznes.pl całkowicie niedostępny z zewnątrz +- Błąd w przeglądarce: `ERR_TOO_MANY_REDIRECTS` (zbyt wiele przekierowań) +- Dotyczyło WSZYSTKICH zewnętrznych użytkowników +- Dostęp z sieci wewnętrznej INPI działał poprawnie + +### Zgłoszenie +Użytkownik zgłosił problem: +> "krytyczne!!! z zewnatrz nie dziala !!!" +> "To nie działa na nowym komputerze nowy test pierwszy raz i od razu jest taki błąd także to nie jest jakiś cash" + +--- + +## 2. PRZYCZYNA GŁÓWNA (ROOT CAUSE) + +### Błędna konfiguracja Nginx Proxy Manager (NPM) + +**Proxy Host ID:** 27 +**Domena:** nordabiznes.pl, www.nordabiznes.pl + +**Problem:** NPM był skonfigurowany do przekazywania ruchu na **port 80** zamiast **port 5000** + +``` +BŁĘDNA KONFIGURACJA: +NPM (10.22.68.250) → Backend (10.22.68.249:80) ← ŹRÓDŁO PROBLEMU + +PRAWIDŁOWA KONFIGURACJA: +NPM (10.22.68.250) → Backend (10.22.68.249:5000) ✓ +``` + +### Dlaczego to powodowało pętlę przekierowań? + +1. Na serwerze backend (10.22.68.249) działają DWA serwisy: + - **Port 80:** Nginx (system) - przekierowuje na HTTPS + - **Port 5000:** Flask/Gunicorn (aplikacja NordaBiznes) + +2. Przepływ ruchu z błędną konfiguracją: + ``` + Użytkownik → https://nordabiznes.pl + ↓ + NPM (SSL termination) → http://10.22.68.249:80 + ↓ + Nginx (port 80) → 301 redirect → https://nordabiznes.pl + ↓ + NPM (SSL termination) → http://10.22.68.249:80 + ↓ + ... PĘTLA NIESKOŃCZONA ... + ``` + +3. Po 20 przekierowaniach przeglądarka przerywa z błędem `ERR_TOO_MANY_REDIRECTS` + +--- + +## 3. DIAGNOZA + +### Kroki diagnostyczne + +1. **Sprawdzenie logów NPM:** + ```bash + ssh maciejpi@10.22.68.250 "docker logs nginx-proxy-manager_app_1 --tail 50" + # Wynik: Wszystkie requesty zwracały 301 redirect + ``` + +2. **Test bezpośredni na backend:** + ```bash + # Test portu 80 (nginx systemowy) + curl -I http://10.22.68.249:80/ + # Wynik: HTTP 301 → https://nordabiznes.pl/ ← PROBLEM! + + # Test portu 5000 (Flask/Gunicorn) + curl -I http://10.22.68.249:5000/ + # Wynik: HTTP 200 OK ← DZIAŁA! + ``` + +3. **Sprawdzenie konfiguracji NPM:** + ```bash + docker exec nginx-proxy-manager_app_1 sqlite3 /data/database.sqlite \ + "SELECT forward_port FROM proxy_host WHERE id = 27;" + # Wynik: 80 ← BŁĘDNY PORT! + ``` + +--- + +## 4. ROZWIĄZANIE + +### Zmiana portu w NPM z 80 na 5000 + +**Metoda:** NPM API (PUT request) + +```python +import requests + +NPM_URL = "http://10.22.68.250:81/api" +# ... autentykacja ... + +data = { + "domain_names": ["nordabiznes.pl", "www.nordabiznes.pl"], + "forward_scheme": "http", + "forward_host": "10.22.68.249", + "forward_port": 5000, # ZMIANA: 80 → 5000 + "certificate_id": 27, + "ssl_forced": True, + "http2_support": True, + "block_exploits": True, + "allow_websocket_upgrade": True, + "hsts_enabled": True, + "hsts_subdomains": True +} + +resp = requests.put(f"{NPM_URL}/nginx/proxy-hosts/27", headers=headers, json=data) +``` + +### Weryfikacja po naprawie + +```bash +curl -I https://nordabiznes.pl/ +# HTTP/2 200 ✓ +# server: nginx/1.24.0 (Ubuntu) +# strict-transport-security: max-age=31536000; includeSubDomains +``` + +--- + +## 5. KIEDY I JAK POWSTAŁ PROBLEM? + +### Analiza historii + +1. **Pierwotna konfiguracja (2025-11-23):** Proxy utworzony z portem 5000 - POPRAWNIE +2. **Okres działania:** 2025-11-23 do ~2026-01-02 - portal działał poprawnie +3. **Zmiana konfiguracji:** Podczas dodawania maintenance mode lub innej modyfikacji NPM, port mógł zostać zmieniony na 80 (domyślny) + +### Możliwe przyczyny zmiany portu: + +1. **Edycja w NPM UI** - ktoś edytował proxy host i nie zwrócił uwagi na port +2. **Automatyczna zmiana** - NPM mógł zresetować do domyślnego portu 80 przy aktualizacji +3. **Maintenance mode** - konfiguracja maintenance mode mogła zmodyfikować inne ustawienia + +### Lekcja na przyszłość: +> Port 5000 to niestandardowy port dla aplikacji Flask. Przy KAŻDEJ modyfikacji proxy hosta należy sprawdzić czy port jest poprawny! + +--- + +## 6. ŚRODKI ZAPOBIEGAWCZE + +### Natychmiastowe (wdrożone) + +1. **Dokumentacja konfiguracji NPM:** + - Proxy Host 27: nordabiznes.pl → 10.22.68.249:**5000** + - Zapisane w tym raporcie incydentu + +2. **Procedura weryfikacji po zmianach NPM:** + ```bash + # Po KAŻDEJ zmianie w NPM sprawdź: + curl -I https://nordabiznes.pl/health + # Oczekiwany wynik: HTTP 200 + ``` + +### Długoterminowe (do wdrożenia) + +1. **Monitoring zewnętrzny:** + - Dodać monitoring https://nordabiznes.pl do Zabbix + - Alert gdy HTTP != 200 + - Sprawdzanie co 5 minut + +2. **Backup konfiguracji NPM:** + ```bash + # Regularny backup (raz dziennie) + docker cp nginx-proxy-manager_app_1:/data/database.sqlite /backup/npm/ + ``` + +3. **Checklist przy zmianach NPM:** + - [ ] Sprawdź forward_port (musi być 5000 dla nordabiznes.pl) + - [ ] Testuj z zewnętrznej sieci (telefon bez WiFi) + - [ ] Sprawdź health endpoint: /health + +4. **Usunięcie zbędnego nginx na porcie 80:** + - Na serwerze 10.22.68.249 działa nginx na porcie 80 który tylko przekierowuje + - Rozważyć wyłączenie (NPM obsługuje SSL termination) + +--- + +## 7. KLUCZOWE DANE TECHNICZNE + +### Architektura + +``` +Internet + │ + ▼ +[Fortigate 85.237.177.83] (NAT/Firewall) + │ + ▼ Port 443 +[NPM R11-REVPROXY-01 10.22.68.250] (SSL Termination, Reverse Proxy) + │ + ▼ Port 5000 (HTTP) +[NORDABIZ-01 10.22.68.249] (Flask/Gunicorn Application) + │ + ▼ +[PostgreSQL localhost:5432] (Database) +``` + +### Konfiguracja NPM (PRAWIDŁOWA) + +| Parametr | Wartość | +|----------|---------| +| Proxy Host ID | 27 | +| Domeny | nordabiznes.pl, www.nordabiznes.pl | +| Backend IP | 10.22.68.249 | +| **Backend Port** | **5000** (NIE 80!) | +| SSL Certificate ID | 27 | +| SSL Forced | Yes | +| HTTP/2 | Yes | +| HSTS | Yes | + +### Porty na backend server (10.22.68.249) + +| Port | Serwis | Status | +|------|--------|--------| +| 22 | SSH | Aktywny | +| 80 | Nginx (redirect) | Aktywny (NIE UŻYWAĆ!) | +| 443 | Nginx (redirect) | Aktywny (NIE UŻYWAĆ!) | +| **5000** | **Gunicorn (Flask App)** | **WŁAŚCIWY PORT** | +| 5432 | PostgreSQL | Aktywny (tylko localhost) | + +--- + +## 8. PODSUMOWANIE + +| Aspekt | Wartość | +|--------|---------| +| Czas niedostępności | ~30 minut | +| Wpływ na użytkowników | 100% użytkowników zewnętrznych | +| Przyczyna główna | Błędny port w NPM (80 zamiast 5000) | +| Rozwiązanie | Zmiana portu na 5000 via NPM API | +| Status | ROZWIĄZANY | +| Ponowne wystąpienie | Mało prawdopodobne (monitoring do wdrożenia) | + +--- + +## 9. ZAŁĄCZNIKI + +### Polecenia diagnostyczne (do użycia w przyszłości) + +```bash +# 1. Sprawdź status aplikacji +curl -I https://nordabiznes.pl/health +# Oczekiwany: HTTP 200 + +# 2. Sprawdź konfigurację NPM +ssh maciejpi@10.22.68.250 "docker exec nginx-proxy-manager_app_1 \ + sqlite3 /data/database.sqlite \ + \"SELECT id, domain_names, forward_host, forward_port FROM proxy_host WHERE id = 27;\"" +# Oczekiwany: 27|["nordabiznes.pl","www.nordabiznes.pl"]|10.22.68.249|5000 + +# 3. Test bezpośredni na backend (z sieci INPI) +curl -I http://10.22.68.249:5000/health +# Oczekiwany: HTTP 200 + +# 4. Sprawdź logi NPM +ssh maciejpi@10.22.68.250 "docker logs nginx-proxy-manager_app_1 --tail 20" + +# 5. Sprawdź status usługi +ssh maciejpi@10.22.68.249 "sudo systemctl status nordabiznes" +``` + +--- + +**Autor raportu:** Claude Code +**Data utworzenia:** 2026-01-02 +**Wersja:** 1.0 diff --git a/static/img/companies/agat.webp b/static/img/companies/agat.webp new file mode 100644 index 0000000..ad8d140 Binary files /dev/null and b/static/img/companies/agat.webp differ diff --git a/static/img/companies/agis-management-group.webp b/static/img/companies/agis-management-group.webp new file mode 100644 index 0000000..84c8e24 Binary files /dev/null and b/static/img/companies/agis-management-group.webp differ diff --git a/static/img/companies/almares.webp b/static/img/companies/almares.webp new file mode 100644 index 0000000..f31a9b1 Binary files /dev/null and b/static/img/companies/almares.webp differ diff --git a/static/img/companies/alumech.webp b/static/img/companies/alumech.webp new file mode 100644 index 0000000..d84c34b Binary files /dev/null and b/static/img/companies/alumech.webp differ diff --git a/static/img/companies/ama.webp b/static/img/companies/ama.webp new file mode 100644 index 0000000..628f7eb Binary files /dev/null and b/static/img/companies/ama.webp differ diff --git a/static/img/companies/ampery.webp b/static/img/companies/ampery.webp new file mode 100644 index 0000000..a97a41f Binary files /dev/null and b/static/img/companies/ampery.webp differ diff --git a/static/img/companies/ard-invest.webp b/static/img/companies/ard-invest.webp new file mode 100644 index 0000000..5d9f3e5 Binary files /dev/null and b/static/img/companies/ard-invest.webp differ diff --git a/static/img/companies/armet-bis.webp b/static/img/companies/armet-bis.webp new file mode 100644 index 0000000..b31aed2 Binary files /dev/null and b/static/img/companies/armet-bis.webp differ diff --git a/static/img/companies/bibrokers.webp b/static/img/companies/bibrokers.webp new file mode 100644 index 0000000..125a806 Binary files /dev/null and b/static/img/companies/bibrokers.webp differ diff --git a/static/img/companies/biuro-rachunkowosci-perfekta.webp b/static/img/companies/biuro-rachunkowosci-perfekta.webp new file mode 100644 index 0000000..a62687c Binary files /dev/null and b/static/img/companies/biuro-rachunkowosci-perfekta.webp differ diff --git a/static/img/companies/bormax.webp b/static/img/companies/bormax.webp new file mode 100644 index 0000000..e31346a Binary files /dev/null and b/static/img/companies/bormax.webp differ diff --git a/static/img/companies/chlodnictwo-klimatyzacja-tomasz-nowak.webp b/static/img/companies/chlodnictwo-klimatyzacja-tomasz-nowak.webp new file mode 100644 index 0000000..6a30461 Binary files /dev/null and b/static/img/companies/chlodnictwo-klimatyzacja-tomasz-nowak.webp differ diff --git a/static/img/companies/chopin-telewizja-kablowa.webp b/static/img/companies/chopin-telewizja-kablowa.webp new file mode 100644 index 0000000..c41c8a8 Binary files /dev/null and b/static/img/companies/chopin-telewizja-kablowa.webp differ diff --git a/static/img/companies/coolair.webp b/static/img/companies/coolair.webp new file mode 100644 index 0000000..db32b70 Binary files /dev/null and b/static/img/companies/coolair.webp differ diff --git a/static/img/companies/cristap.webp b/static/img/companies/cristap.webp new file mode 100644 index 0000000..c50cc82 Binary files /dev/null and b/static/img/companies/cristap.webp differ diff --git a/static/img/companies/delkom.webp b/static/img/companies/delkom.webp new file mode 100644 index 0000000..d03b34b Binary files /dev/null and b/static/img/companies/delkom.webp differ diff --git a/static/img/companies/eko-laser.webp b/static/img/companies/eko-laser.webp new file mode 100644 index 0000000..8dde3a9 Binary files /dev/null and b/static/img/companies/eko-laser.webp differ diff --git a/static/img/companies/ekod.webp b/static/img/companies/ekod.webp new file mode 100644 index 0000000..84639b4 Binary files /dev/null and b/static/img/companies/ekod.webp differ diff --git a/static/img/companies/ekofabryka.webp b/static/img/companies/ekofabryka.webp new file mode 100644 index 0000000..2f3f0cc Binary files /dev/null and b/static/img/companies/ekofabryka.webp differ diff --git a/static/img/companies/el-forte.webp b/static/img/companies/el-forte.webp new file mode 100644 index 0000000..c65b4be Binary files /dev/null and b/static/img/companies/el-forte.webp differ diff --git a/static/img/companies/el-professional.webp b/static/img/companies/el-professional.webp new file mode 100644 index 0000000..2017d81 Binary files /dev/null and b/static/img/companies/el-professional.webp differ diff --git a/static/img/companies/eura-tech.webp b/static/img/companies/eura-tech.webp new file mode 100644 index 0000000..0bcc0ad Binary files /dev/null and b/static/img/companies/eura-tech.webp differ diff --git a/static/img/companies/graal.webp b/static/img/companies/graal.webp new file mode 100644 index 0000000..bf07e2c Binary files /dev/null and b/static/img/companies/graal.webp differ diff --git a/static/img/companies/green-house-systems.webp b/static/img/companies/green-house-systems.webp new file mode 100644 index 0000000..6bc066d Binary files /dev/null and b/static/img/companies/green-house-systems.webp differ diff --git a/static/img/companies/hebel-masiak-i-wspolnicy-adwokaci-i-radcowie-prawni.webp b/static/img/companies/hebel-masiak-i-wspolnicy-adwokaci-i-radcowie-prawni.webp new file mode 100644 index 0000000..0a0af70 Binary files /dev/null and b/static/img/companies/hebel-masiak-i-wspolnicy-adwokaci-i-radcowie-prawni.webp differ diff --git a/static/img/companies/hillob.webp b/static/img/companies/hillob.webp new file mode 100644 index 0000000..c2aa827 Binary files /dev/null and b/static/img/companies/hillob.webp differ diff --git a/static/img/companies/hotel-spa-wieniawa.webp b/static/img/companies/hotel-spa-wieniawa.webp new file mode 100644 index 0000000..3b916d6 Binary files /dev/null and b/static/img/companies/hotel-spa-wieniawa.webp differ diff --git a/static/img/companies/inpi.webp b/static/img/companies/inpi.webp new file mode 100644 index 0000000..f87e14b Binary files /dev/null and b/static/img/companies/inpi.webp differ diff --git a/static/img/companies/joker.webp b/static/img/companies/joker.webp new file mode 100644 index 0000000..54fa27f Binary files /dev/null and b/static/img/companies/joker.webp differ diff --git a/static/img/companies/kammet.webp b/static/img/companies/kammet.webp new file mode 100644 index 0000000..ab4cf84 Binary files /dev/null and b/static/img/companies/kammet.webp differ diff --git a/static/img/companies/kancelaria-rachunkowa-gawin-i-wojnowska-sp-z-o-o.webp b/static/img/companies/kancelaria-rachunkowa-gawin-i-wojnowska-sp-z-o-o.webp new file mode 100644 index 0000000..58b7105 Binary files /dev/null and b/static/img/companies/kancelaria-rachunkowa-gawin-i-wojnowska-sp-z-o-o.webp differ diff --git a/static/img/companies/kancelaria-radcy-prawnego-lukasz-gilewicz.webp b/static/img/companies/kancelaria-radcy-prawnego-lukasz-gilewicz.webp new file mode 100644 index 0000000..156e1cd Binary files /dev/null and b/static/img/companies/kancelaria-radcy-prawnego-lukasz-gilewicz.webp differ diff --git a/static/img/companies/kancelaria-radcy-prawnego-radoslaw-skwarlo.webp b/static/img/companies/kancelaria-radcy-prawnego-radoslaw-skwarlo.webp new file mode 100644 index 0000000..99766aa Binary files /dev/null and b/static/img/companies/kancelaria-radcy-prawnego-radoslaw-skwarlo.webp differ diff --git a/static/img/companies/kantor-promes.svg b/static/img/companies/kantor-promes.svg new file mode 100644 index 0000000..04c3732 --- /dev/null +++ b/static/img/companies/kantor-promes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/companies/kaszubski-bank-spoldzielczy.webp b/static/img/companies/kaszubski-bank-spoldzielczy.webp new file mode 100644 index 0000000..ba77518 Binary files /dev/null and b/static/img/companies/kaszubski-bank-spoldzielczy.webp differ diff --git a/static/img/companies/kbms.webp b/static/img/companies/kbms.webp new file mode 100644 index 0000000..161f0c2 Binary files /dev/null and b/static/img/companies/kbms.webp differ diff --git a/static/img/companies/konkretstudio.webp b/static/img/companies/konkretstudio.webp new file mode 100644 index 0000000..2b381b0 Binary files /dev/null and b/static/img/companies/konkretstudio.webp differ diff --git a/static/img/companies/kornix.webp b/static/img/companies/kornix.webp new file mode 100644 index 0000000..3e09e1b Binary files /dev/null and b/static/img/companies/kornix.webp differ diff --git a/static/img/companies/kupsa-coathing.webp b/static/img/companies/kupsa-coathing.webp new file mode 100644 index 0000000..daed555 Binary files /dev/null and b/static/img/companies/kupsa-coathing.webp differ diff --git a/static/img/companies/lean-idea.webp b/static/img/companies/lean-idea.webp new file mode 100644 index 0000000..da1ad17 Binary files /dev/null and b/static/img/companies/lean-idea.webp differ diff --git a/static/img/companies/lenap-hale.webp b/static/img/companies/lenap-hale.webp new file mode 100644 index 0000000..f416988 Binary files /dev/null and b/static/img/companies/lenap-hale.webp differ diff --git a/static/img/companies/litwicilitwic.webp b/static/img/companies/litwicilitwic.webp new file mode 100644 index 0000000..6c5e260 Binary files /dev/null and b/static/img/companies/litwicilitwic.webp differ diff --git a/static/img/companies/mesan.webp b/static/img/companies/mesan.webp new file mode 100644 index 0000000..9956bbe Binary files /dev/null and b/static/img/companies/mesan.webp differ diff --git a/static/img/companies/mkonsult.svg b/static/img/companies/mkonsult.svg new file mode 100644 index 0000000..ce01d10 --- /dev/null +++ b/static/img/companies/mkonsult.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/companies/nadmorski24pl.webp b/static/img/companies/nadmorski24pl.webp new file mode 100644 index 0000000..c3b645e Binary files /dev/null and b/static/img/companies/nadmorski24pl.webp differ diff --git a/static/img/companies/orlex-mg.webp b/static/img/companies/orlex-mg.webp new file mode 100644 index 0000000..cd99f0e Binary files /dev/null and b/static/img/companies/orlex-mg.webp differ diff --git a/static/img/companies/pelmar.webp b/static/img/companies/pelmar.webp new file mode 100644 index 0000000..75c50fb Binary files /dev/null and b/static/img/companies/pelmar.webp differ diff --git a/static/img/companies/pg-construction.webp b/static/img/companies/pg-construction.webp new file mode 100644 index 0000000..f68ab52 Binary files /dev/null and b/static/img/companies/pg-construction.webp differ diff --git a/static/img/companies/phu-sik-tobacco.webp b/static/img/companies/phu-sik-tobacco.webp new file mode 100644 index 0000000..0585950 Binary files /dev/null and b/static/img/companies/phu-sik-tobacco.webp differ diff --git a/static/img/companies/phu-ted.webp b/static/img/companies/phu-ted.webp new file mode 100644 index 0000000..37efd9f Binary files /dev/null and b/static/img/companies/phu-ted.webp differ diff --git a/static/img/companies/phu-witka.webp b/static/img/companies/phu-witka.webp new file mode 100644 index 0000000..4436597 Binary files /dev/null and b/static/img/companies/phu-witka.webp differ diff --git a/static/img/companies/pip.webp b/static/img/companies/pip.webp new file mode 100644 index 0000000..3d87e6b Binary files /dev/null and b/static/img/companies/pip.webp differ diff --git a/static/img/companies/pixlab-softwarehouse.svg b/static/img/companies/pixlab-softwarehouse.svg new file mode 100644 index 0000000..be7c6b4 --- /dev/null +++ b/static/img/companies/pixlab-softwarehouse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/companies/porta-kmi.webp b/static/img/companies/porta-kmi.webp new file mode 100644 index 0000000..9c76efc Binary files /dev/null and b/static/img/companies/porta-kmi.webp differ diff --git a/static/img/companies/portal.webp b/static/img/companies/portal.webp new file mode 100644 index 0000000..70b93de Binary files /dev/null and b/static/img/companies/portal.webp differ diff --git a/static/img/companies/pro-invest.webp b/static/img/companies/pro-invest.webp new file mode 100644 index 0000000..5142be5 Binary files /dev/null and b/static/img/companies/pro-invest.webp differ diff --git a/static/img/companies/pro-sport.webp b/static/img/companies/pro-sport.webp new file mode 100644 index 0000000..e8b4230 Binary files /dev/null and b/static/img/companies/pro-sport.webp differ diff --git a/static/img/companies/progress-optima.webp b/static/img/companies/progress-optima.webp new file mode 100644 index 0000000..1fab3eb Binary files /dev/null and b/static/img/companies/progress-optima.webp differ diff --git a/static/img/companies/pucka-gospodarka-komunalna.webp b/static/img/companies/pucka-gospodarka-komunalna.webp new file mode 100644 index 0000000..d7f9216 Binary files /dev/null and b/static/img/companies/pucka-gospodarka-komunalna.webp differ diff --git a/static/img/companies/radio-norda-fm.webp b/static/img/companies/radio-norda-fm.webp new file mode 100644 index 0000000..29e5181 Binary files /dev/null and b/static/img/companies/radio-norda-fm.webp differ diff --git a/static/img/companies/riela-polska.webp b/static/img/companies/riela-polska.webp new file mode 100644 index 0000000..9807afc Binary files /dev/null and b/static/img/companies/riela-polska.webp differ diff --git a/static/img/companies/rotor.webp b/static/img/companies/rotor.webp new file mode 100644 index 0000000..52d1a31 Binary files /dev/null and b/static/img/companies/rotor.webp differ diff --git a/static/img/companies/rubinsolar.webp b/static/img/companies/rubinsolar.webp new file mode 100644 index 0000000..2f1fa75 Binary files /dev/null and b/static/img/companies/rubinsolar.webp differ diff --git a/static/img/companies/rubo.webp b/static/img/companies/rubo.webp new file mode 100644 index 0000000..931f19a Binary files /dev/null and b/static/img/companies/rubo.webp differ diff --git a/static/img/companies/rumia-invest-park.svg b/static/img/companies/rumia-invest-park.svg new file mode 100644 index 0000000..1953c35 --- /dev/null +++ b/static/img/companies/rumia-invest-park.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/companies/scrol.webp b/static/img/companies/scrol.webp new file mode 100644 index 0000000..1635508 Binary files /dev/null and b/static/img/companies/scrol.webp differ diff --git a/static/img/companies/semerling-security.webp b/static/img/companies/semerling-security.webp new file mode 100644 index 0000000..742b1f5 Binary files /dev/null and b/static/img/companies/semerling-security.webp differ diff --git a/static/img/companies/seo-partner.webp b/static/img/companies/seo-partner.webp new file mode 100644 index 0000000..582ad97 Binary files /dev/null and b/static/img/companies/seo-partner.webp differ diff --git a/static/img/companies/sibuk.webp b/static/img/companies/sibuk.webp new file mode 100644 index 0000000..5f1da57 Binary files /dev/null and b/static/img/companies/sibuk.webp differ diff --git a/static/img/companies/sigma-budownictwo.svg b/static/img/companies/sigma-budownictwo.svg new file mode 100644 index 0000000..b886f77 --- /dev/null +++ b/static/img/companies/sigma-budownictwo.svg @@ -0,0 +1,34 @@ + + + sigma + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/companies/sim-rumia.webp b/static/img/companies/sim-rumia.webp new file mode 100644 index 0000000..93e46eb Binary files /dev/null and b/static/img/companies/sim-rumia.webp differ diff --git a/static/img/companies/stalpunkt.webp b/static/img/companies/stalpunkt.webp new file mode 100644 index 0000000..d7a0704 Binary files /dev/null and b/static/img/companies/stalpunkt.webp differ diff --git a/static/img/companies/ttm.webp b/static/img/companies/ttm.webp new file mode 100644 index 0000000..976d7e8 Binary files /dev/null and b/static/img/companies/ttm.webp differ diff --git a/static/img/companies/vencode.webp b/static/img/companies/vencode.webp new file mode 100644 index 0000000..81af5a0 Binary files /dev/null and b/static/img/companies/vencode.webp differ diff --git a/static/img/companies/vindor.webp b/static/img/companies/vindor.webp new file mode 100644 index 0000000..a45a7e4 Binary files /dev/null and b/static/img/companies/vindor.webp differ diff --git a/static/img/companies/voltrim-trade.webp b/static/img/companies/voltrim-trade.webp new file mode 100644 index 0000000..f97b8c7 Binary files /dev/null and b/static/img/companies/voltrim-trade.webp differ diff --git a/static/img/companies/waterm.webp b/static/img/companies/waterm.webp new file mode 100644 index 0000000..be1ea42 Binary files /dev/null and b/static/img/companies/waterm.webp differ diff --git a/static/img/companies/wdx.svg b/static/img/companies/wdx.svg new file mode 100644 index 0000000..e25fdc6 --- /dev/null +++ b/static/img/companies/wdx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/companies/wejherplast.webp b/static/img/companies/wejherplast.webp new file mode 100644 index 0000000..c114380 Binary files /dev/null and b/static/img/companies/wejherplast.webp differ