5. Po instalaci a CLI nástroje
Ať jsi instaloval přes Docker nebo nativně, poslední krok je stejný: otevři aplikaci v prohlížeči a projdi úvodním průvodcem. Tato kapitola navíc shrnuje CLI nástroje a plánované úlohy (cron) pro běžnou údržbu.
Pokud převádíš existující instalaci MyInvoice, neprocházej nejdřív setup wizardem. Použij postup Převod dat z MyInvoice do MyÚčto, který zachová správné pořadí importu a MyÚčto migrací.
5.1 První spuštění
Otevři aplikaci v prohlížeči (u Dockeru http://localhost:8080, u nativní instalace URL podle web serveru) — naskočí setup wizard. Provede tě založením prvního dodavatele, administrátorského účtu a základní konfigurace. Detailní popis: První spuštění (setup wizard).
5.2 Co nastavit hned po prvním přihlášení
- Dodavatel — IČO/DIČ, adresa, logo, číslování faktur, bankovní účty (Nastavení → Můj dodavatel; detail viz Nastavení).
- Odchozí pošta (SMTP) — aby fungovalo odesílání faktur a upomínek.
- Daňové nastavení — typ poplatníka, perioda DPH, kód FÚ (pokud jsi plátce; viz Výkazy DPH).
- Zabezpečení — 2FA, IP allowlist, role uživatelů (viz Bezpečnost).
- Plánované úlohy (cron) — zálohy, párování plateb, upomínky (viz § 5.5 Cron skripty).
5.3 Produkční doporučení
- Nasazuj za HTTPS (u Dockeru reverse proxy — viz § 3.8 HTTPS / TLS terminace).
- Zapni zálohy a ověř, že běží (Systém → Plánované úlohy).
- Pinuj konkrétní neměnný release tag image a sleduj Aktualizace.
5.4 CLI nástroje
php api/bin/migrate.php # spustí pending migrace
php api/bin/migrate.php --status # vypíše stav migrací
php api/bin/setup.php # interaktivní úvodní zřízení
php api/bin/sample.php # vygeneruje testovací data (po setupu)
php api/bin/sample.php --list # vypíše firmy a jestli už data mají
php api/bin/sample.php --supplier=7 # testovací data do konkrétní prázdné firmy
php api/bin/reset.php # smaže všechna user-data (vyžaduje "ANO")
php api/bin/recompute-stats.php # přepočítá agregované statistiky
reset.php maže uživatelská data, ne instalaci. Globální číselníky (země, sazby DPH, sazby členských států pro OSS, výkazy, příjemci podání) i provozní údaje instance (licence, režim plánovaných úloh, smlouva o zálohování) zůstávají — po jejich smazání by je totiž nikdo nevrátil, protože je seedují migrace a ty jsou evidované jako proběhlé. Kdyby přesto číselník sazeb členských států kdykoli zmizel, vrátí ho php api/bin/migrate.php — má na to sebeopravný krok. Poznáte to podle toho, že import i vystavení odmítnou každý doklad se sazbou vyšší než 0 %.
5.5 Cron skripty
V cmd/ jsou připravené .cmd (Windows Task Scheduler) i .sh (Linux cron) wrappery. Zvol právě jeden způsob plánování:
- Jeden dispatcher — naplánuj pouze
cron-dispatchkaždou minutu. Sám spouští úlohy v jejich časech a levnou kontrolou přeskočí ty, které nemají práci. - Jednotlivé úlohy — naplánuj každý potřebný wrapper samostatně podle tabulky.
Oba režimy nekombinuj, jinak by se některé úlohy spouštěly dvakrát.
| Skript | Doporučená frekvence |
|---|---|
cron-cleanup | 1× denně 03:00 |
cron-backup | 1× denně 02:00 |
cron-backup-pdf | 1× denně 02:30 |
cron-backup-documents | 1× denně 02:35 |
cron-bank-scan | každých 30 min |
cron-bank-email-notices | každých 30 min |
cron-scan-purchase-inbox | každých 10 min |
cron-send-reminders | 1× denně 09:00, Po–Pá |
cron-send-approval-reminders | 1× denně 09:15, Po–Pá |
cron-document-request-reminders | 1× denně 09:30, Po–Pá |
cron-epo-status | každou minutu; jednotlivé pokusy mají vlastní odstup |
cron-generate-recurring-invoices | 1× denně 06:30 |
cron-automation-digest | každou hodinu v ranním okně 06:00–08:00 |
cron-ai-worker | každých 10 min; zpracuje frontu po zapnutí AI asistence |
cron-ai-rule-miner | 1× denně 04:00; vytváří návrhová pravidla z korekcí |
cron-shoptet-orders | každých 15 min; jen firmy se zapnutým automatickým stahováním objednávek ze Shoptetu, interval určuje firma (§ 37.5) |
cron-payroll-post | 1× měsíčně 1. dne 04:00; zaúčtuje mzdy za předchozí měsíc |
cron-payroll-registration-changes | 1× denně 05:00; jen firmy se zapnutými mzdami. Hledá změny hlásitelné do registru pojištěnců (ČSSZ) a zakládá návrh povinnosti s termínem — nic neodesílá. Denní běh stačí: lhůta je osm dnů (§ 71.3). Bez ní se změna zjistí jen tehdy, když někdo otevře kartu zaměstnance, a lhůta uteče |
cron-vat-clearing | 1× měsíčně 1. dne 04:30; interní doklad zúčtování DPH za skončené období (§ 84.3.3) |
cron-vat-status-apply | 1× denně 00:30; aplikuje plánované změny plátcovství DPH v den účinnosti |
cron-journal-integrity-check | 1× denně 02:30; čtecí kontrola integrity deníku |
cron-cnb-rates | 1× denně 15:00; stahuje kurzovní lístek ČNB do kurzové historie a dohání mezery za posledních 30 dnů. Bez ní se kurzy plní jen náhodně při prvním dotazu a cizoměnová úhrada ke dni bez kurzu se nemá čím ocenit |
cron-license-renew | každou hodinu v 15. minutě; server se běžně kontroluje 1× denně, kolem platby a při prodlení 1× za hodinu |
cron-version-check | 1× denně 06:00; kontrola dostupné aktualizace |
cron-dispatch | každou minutu, pouze v režimu jednoho dispatcheru |
Detaily v cmd/README.md.
Šifrování záloh: volitelné heslo cron.backup.password v cfg.php zašifruje všechny typy ZIP záloh (DB dump, PDF dokladů, sekce Dokumenty, mzdové podklady) algoritmem AES-256. Pro rozbalení použijte 7-Zip, WinRAR nebo unzip -P — vestavěný Průzkumník Windows šifrované AES-256 archivy neumí otevřít. Šifruje se obsah souborů, názvy souborů uvnitř archivu zůstávají čitelné. Pokud je heslo nastavené a PHP šifrování nepodporuje (libzip < 1.2), záloha se záměrně nevytvoří a úloha skončí chybou — nešifrovaná záloha by vznikla jen omylem.
5.5.1 Stažení záloh z aplikace
Hotové zálohy si správce instalace stáhne v nabídce Systém → Stažení záloh, aniž by potřeboval přístup k serveru přes SSH nebo FTP. Stránka ukazuje obsah adresáře se zálohami rozdělený do sekcí podle toho, která úloha soubor vyrobila:
- Databáze — úplný dump databáze z
cron-backup; - Dokumenty a přílohy — nahrané soubory a bankovní výpisy z
cron-backup-documents; - PDF doklady — vygenerovaná PDF z
cron-backup-pdf; - Mzdy — mzdové podklady z
cron-backup-payroll; - Ostatní — soubory, které pojmenování automatických záloh neodpovídají, typicky ruční kopie bez data v názvu.
Sekce se pozná podle tvaru názvu souboru, ne podle jména databáze, takže zálohy zůstanou ve správné sekci i po přejmenování databáze. V každé sekci je k dispozici pět nejnovějších záloh; v záhlaví sekce je vidět, kolik jich na disku leží celkem a kolik zabírají místa. Starší zálohy zůstávají na serveru, dokud je nesmaže retence.
U každého souboru je čas pořízení a velikost. Pod seznamem je cesta k adresáři na serveru, počet záloh a nastavená retence — tedy kolik souborů (nebo dnů) zpět se drží, než je úloha smaže.
Jsou-li zálohy šifrované, stránka nabídne Zobrazit heslo. Heslo se nezobrazuje samo od sebe ani přihlášenému správci: nejdřív se musíte znovu ověřit passkeyem, nebo přihlašovacím heslem a kódem z autentikátoru, máte-li ho zapnutý. Každé odhalení se zapisuje do protokolu činnosti — kdo a kdy, samotné heslo nikdy. Pokud zálohy šifrované nejsou, stránka to řekne nahlas: soubor bez hesla otevře celé účetnictví komukoli, kdo se k němu dostane.
Stránka je doplněk Kompletního exportu dat (§ 88.6.2), ne jeho náhrada. Export je jednorázový balíček aktuálního stavu jedné firmy na vyžádání, tady leží historie automatických záloh celé instalace.
💡 Relativní cesty v
cfg.php. Cestové klíče (cron.backup.output_dir,storage.*,logging.path, archivy přijatých/importovaných dokladů, DKIM) zadané relativně (např.storage/backup) se ukotvují k rootu aplikace, ne k pracovnímu adresáři procesu. Záloha tak skončí na očekávaném místě i když cron běží pod Task Schedulerem nebo systémovým cronem s jiným aktuálním adresářem. Absolutní cesty (vč.C:\…a UNC\\server) iMYINVOICE_DATA_DIRzůstávají beze změny.
Kontrola, že úlohy běží: otevři v aplikaci Systém → Plánované úlohy. Každý cron skript si zapisuje vlastní heartbeat do tabulky cron_runs (start, konec, exit code, JSON report). Stránka ukazuje pro každou doporučenou úlohu kdy naposled úspěšně proběhla, a pokud poslední běh chybí nebo je starší než max_age_hours (typicky 36 h), je tu varování Stáří / Selhává / Neběželo. Tím se odhalí "cron vůbec není nastavený" i "cron běží, ale failuje" — bez ohledu na OS (crontab vs. Task Scheduler vs. Docker host).
Stav „Nemá práci" (jen režim jednoho dispatcheru). Dispatcher úlohy, které mají levnou kontrolu práce (cron-epo-status, cron-ai-worker), vůbec nespouští, dokud pro ně není co dělat — jejich poslední běh proto legitimně stárne. Že plánování funguje, dokládá heartbeat samotného cron-dispatch, a takové úloze se místo varování ukáže neutrální Nemá práci. Jakmile dispatcher sám zestárne nebo začne selhávat, vrátí se u nich normální varování.