# Rozwiązywanie problemów

Najpierw ogólny obraz z katalogu instalacji:

```
./draften status      # version, health of both web colours and the workers, HTTPS, database dumps
```

Potem bardziej szczegółowo:

```
docker compose ps                        # are the services up, is the database healthy?
docker compose logs --tail 50 worker     # the worker's last entries
docker compose run --rm worker node diag.mjs mailbox@company.com
```

Ostatnie polecenie robi to samo co **Przetestuj połączenie** w interfejsie:
bierze dostęp zapisany dla skrzynki, pozyskuje token, wypisuje jego
uprawnienia (nigdy sam token) i czyta skrzynkę odbiorczą.

## Częste błędy

| Objaw | Przyczyna | Co zrobić |
|---|---|---|
| `set DB_PASSWORD in .env` przy starcie | brak haseł do bazy danych | uzupełnij `.env` |
| `mailbox … has no access yet` | skrzynka nie ma rejestracji ani podłączonego konta | strona skrzynki → Dostęp do poczty |
| `Graph … 401 … invalid_client` | błędny albo wygasły client secret | nowy sekret przy rejestracji, potem test połączenia |
| `Graph … 403 … AppOnly AccessPolicy` | zasady dostępu aplikacji jeszcze nie zaczęły działać albo skrzynki nie ma w grupie | poczekaj (nawet kilka godzin), powtórz test; dodaj skrzynkę do grupy |
| `Graph … 403 … ErrorAccessDenied` | brak zgody administratora | w Entra przy rejestracji Grant admin consent |
| `Category not added … MailboxSettings` | brak uprawnienia `MailboxSettings.ReadWrite`; etykieta działa, tylko bez koloru | dodaj uprawnienie i zgodę |
| `No active assistant in the database` | asystent jest wyłączony albo nie skonfigurowano danych początkowych | włącz asystenta; sprawdź dziennik startu |
| asystent jest pomijany („no prompts yet”) | asystent nie ma napisanych wytycznych | dokończ kreatora albo napisz wytyczne ręcznie |
| `Draft without signature` / `links outside the allowed domains` | szkic nie przeszedł kontroli | przyjrzyj się wiadomości – to może być próba podszycia się |
| `Limit reached` | limit dzienny albo na nadawcę | podnieś go tylko wtedy, gdy zalew poczty jest uzasadniony |
| `Model refused to answer` | filtr bezpieczeństwa modelu | obsłuż wiadomość ręcznie |
| `Model exhausted max_iterations` | model zapętlił się w narzędziach | ponowiono dwa razy; gdy to się powtarza, dostrój zadanie w wytycznych |
| `ECONNREFUSED … 3306` | baza danych nie działa albo jeszcze nie wstała | `docker compose ps`, `docker compose logs db` |
| pasek „Licencja wygasła” albo „Instalacja nie ma licencji”, asystenci nic nie piszą | brak licencji albo wygasła | prześlij ważną licencję – zobacz [Licencja](/pl/admin/licence) |
| aktualizacja zakończyła się błędem | nowa wersja nie stała się sprawna; poprzednia dalej obsługuje ruch | błąd w Historii zleceń albo w wyniku `./draften update`; `./draften status` |
| „Ostatnia codzienna kopia się nie udała” na karcie Kopie zapasowe bazy danych | zrzut bazy danych się nie powiódł (komunikat jest na karcie); zostanie ponowiony po godzinie | uruchom `./draften backup` i przeczytaj błąd; sprawdź wolne miejsce na dysku (`df -h`) i `./draften status` |

## Gdy dziennik tego nie pokazuje

- Interfejs: Ustawienia asystenta → **Aktywność** (sprawdzania poczty,
  zlecenia, zdarzenia) i strona **Utrzymanie** (workery, kolejka, błędy
  z ostatnich 24 godzin).
- Po trzech nieudanych próbach wiadomość dostaje status **nieudana**; ostatni
  błąd jest w jej szczegółach.

## Jednorazowe przejście ręcznie

```
docker compose run --rm worker node worker.mjs --dry-run
```

Bierze raz każdego aktywnego asystenta i wymusza tryb próbny – do poczty nic
nie zostaje zapisane. Przydaje się do sprawdzenia, czy wszystko działa.

## Gdy potrzebujesz naszej pomocy

```
./draften diagnose
```

zapisuje plik `diagnose-<time>.tar.gz` ze stanem instalacji, wersjami,
konfiguracją bez sekretów i końcówką dzienników. Wyślij nam go.

!> Zanim wyślesz plik, zajrzyj do środka: dzienniki mogą zawierać adresy
i tematy przetwarzanej poczty. Nic nie opuszcza serwera samo.
