# Instalacja na własnym serwerze

draften możesz uruchomić na własnym serwerze. Poczta, szkice i klucze zostają
wtedy u ciebie; wychodzi tylko to, co wysyłasz do dostawcy modelu językowego
(albo nic, przy modelu lokalnym).

Ta strona to przegląd tego, jak zbudowana jest instalacja. Samo postępowanie
opisuje strona [Instalacja krok po kroku](/pl/admin/installing).

## Paczka i licencja

Każde wydanie draften to jedna **paczka**, plik `draften-<version>.tar`.
Zawiera obrazy wszystkich usług, pliki, które je uruchamiają, podpisaną listę
całej zawartości i polecenie `./draften`, które zarządza instalacją. Serwer
nie potrzebuje niczego poza Dockerem.

Do uruchomienia potrzebujesz **licencji** – pliku, który dostajesz od nas
i przesyłasz w interfejsie. Ogranicza liczbę skrzynek i asystentów, a jej klucz
służy też do pobierania nowych wydań. Więcej w [Licencji](/pl/admin/licence).

## Z czego składa się instalacja

Wszystko działa w Dockerze przez `docker compose`:

| Usługa | Co robi |
|---|---|
| `db` | baza danych MariaDB – przechowuje wszystko: ustawienia, wytyczne, wiadomości, szkice, zaszyfrowane sekrety. Nic z innej maszyny jej nie dotyka |
| `worker` | czyta skrzynki, wywołuje modele, pisze szkice, uczy się, wykonuje kroki kreatora. Może ich działać kilka |
| `web-blue`, `web-green` | interfejs webowy i API w dwóch kolorach: jeden obsługuje ruch, drugi czeka na następną wersję – dlatego aktualizacje nie powodują przerwy |
| `proxy` | wejście z zewnątrz: przełącza między kolorami interfejsu i opcjonalnie kończy HTTPS |
| `updater` | opcjonalnie: wykonuje to, co operator zleci w części Instalacja (aktualizacja, powrót, liczba procesów, wymiana klucza, kopia zapasowa) i codziennie robi kopię zapasową bazy danych |
| `cloudflared` | opcjonalnie: publikacja interfejsu przez Cloudflare Tunnel |

Interfejs i worker nie komunikują się bezpośrednio – oba pracują z tą samą
bazą danych; to, co potrzebuje poczty albo modelu, interfejs ustawia w kolejce
jako zadanie dla workera.

## Czego będziesz potrzebować

- serwera x86-64 z Linuksem i Dockerem 24 lub nowszym (z wtyczką compose),
  4 GB pamięci i 20 GB dysku,
- adresu, pod którym interfejs będzie osiągalny, z HTTPS – certyfikat
  bezpośrednio w draften albo twoje reverse proxy lub tunel,
- dostępu do skrzynek: rejestracji aplikacji w Microsoft Entra, konta usługi
  Google Workspace albo danych IMAP,
- klucza API modeli (Anthropic, OpenAI) albo własnego serwera zgodnego
  z OpenAI,
- licencji od nas.

## HTTPS

- **W draften**: podaj instalatorowi certyfikat i jego klucz (PEM). draften
  nasłuchuje wtedy na porcie 443 i przekierowuje z portu 80. Odnowiony
  certyfikat wdrażasz poleceniem `./draften certificate new.pem new.key`
  bez utraty jednego żądania. Certyfikat zdobywasz samodzielnie (od urzędu
  certyfikacji albo klientem ACME).
- **Przed draften**: bez certyfikatu draften nasłuchuje na `127.0.0.1:8085`,
  a HTTPS kończy twoje proxy albo tunel.

## Updater

Updater to opcjonalna usługa, która wykonuje to, co operator zleci
w **Instalacja → Instalacja**: aktualizację do nowej wersji, powrót do
poprzedniej, zmianę liczby procesów workera, wymianę klucza szyfrowania
i kopię zapasową bazy danych. Poza tym codziennie sam robi kopię zapasową bazy
danych. Uruchamia do tego to samo `./draften`, które można uruchomić ręcznie.

Updater ma dostęp do Dockera, co oznacza prawa roota na serwerze. Sam interfejs
nigdy nie dotyka Dockera – zapisuje tylko zlecenie dla updatera w bazie danych.
Włącza się go przy instalacji (`COMPOSE_PROFILES=updater` w `.env`); bez niego
wszystko działa z wiersza poleceń.

## Ustawienia w `.env`

Plik `.env` w katalogu instalacji zapisuje instalator i może go czytać tylko
jego właściciel. Zawiera infrastrukturę i sekrety; wszystko, co dotyczy
asystentów, jest w bazie danych i ustawia się w interfejsie.

| Zmienna | Do czego |
|---|---|
| `DRAFTEN_VERSION`, `DRAFTEN_EDITION` | działająca wersja i edycja (`onprem`) |
| `DB_ROOT_PASSWORD`, `DB_PASSWORD` | hasła do bazy danych |
| `MASTER_KEY` | klucz szyfrujący sekrety w bazie danych (klucze API, dostęp do skrzynek, klienci logowania). **Przechowuj kopię poza serwerem** |
| `MASTER_KEY_PREVIOUS` | poprzedni klucz po jego wymianie, dopóki `backups/` zawiera zrzuty sprzed niej |
| `WEB_APP_SECRET` | losowy ciąg podpisujący sesje |
| `WEB_PUBLIC_URL` | adres, pod którym ludzie otwierają interfejs; na jego podstawie powstają adresy przekierowania przy logowaniu |
| `WEB_BIND`, `DRAFTEN_TLS`, `WEB_TLS_BIND` | gdzie nasłuchują HTTP i HTTPS |
| `COMPOSE_PROFILES` | usługi opcjonalne: `updater`, `tunnel` |
| `DRAFTEN_BACKUPS` | ile zrzutów bazy danych sprzed aktualizacji przechowywać w `backups/` (domyślnie 3) |
| `DRAFTEN_DAILY_BACKUPS` | ile kopii codziennych i na żądanie przechowywać (domyślnie 7; `0` wyłącza kopię codzienną) |
| `DRAFTEN_BACKUP_AT`, `DRAFTEN_TIMEZONE` | godzina codziennej kopii i jej strefa (domyślnie `01:00`, `Europe/Prague`); godzina ustawiona w interfejsie ma pierwszeństwo |
| `CLOUDFLARE_TUNNEL_TOKEN` | tylko przy Cloudflare Tunnel |
| `INTERVAL_SECONDS`, `WORKER_CONCURRENCY` | domyślny odstęp sprawdzania i liczba równoczesnych sprawdzań (lepiej ustawiać w interfejsie) |
| `WORKER_REPLICAS` | ile procesów `worker` działa na tej maszynie (domyślnie 1), zobacz [Utrzymanie i przepustowość](/pl/admin/operations) |

Wartość ze znakiem `$` trzeba zapisać w `.env` jako `$$` – inaczej część po
dolarze po cichu przepadnie. Klucze generowane poleceniem `openssl rand -hex 32`
nigdy nie zawierają dolara.

## Co gdzie leży

| | |
|---|---|
| `.env` | ustawienia i sekrety instalacji |
| `compose.yaml`, `proxy/` | jak działają kontenery; każda aktualizacja je podmienia |
| `backups/` | zrzuty bazy danych: codzienne, na żądanie i sprzed aktualizacji – kopiuj je poza serwer |
| `data/` | dziennik i raporty workera |
| `updates/` | paczki czekające na instalację; tutaj pobiera też updater |
| `NOTES.md` | co zmieniło zainstalowane wydanie |

## Dalej

- [Instalacja krok po kroku](/pl/admin/installing),
- [Administracja instalacji](/pl/admin/installation-admin) – wersja,
  licencja, domyślne klucze i nadawca, organizacje,
- [Aktualizacja przez updater](/pl/admin/updating-with-the-updater)
  i [z wiersza poleceń](/pl/admin/updating),
- [Utrzymanie i przepustowość](/pl/admin/operations),
- [Kopia zapasowa i odtwarzanie](/pl/admin/backup-and-restore),
- [Rozwiązywanie problemów](/pl/admin/troubleshooting).
