Změny z pohledu DevOPS

Technická příručka pro upgrade zákaznické instance TAS z v5.17 na v5.19. Určeno DevOps a administrátorům, kteří upgrade plánují a provádějí: infrastruktura, konfigurace, databázové migrace, postup nasazení a rollback.

Dopady na zákaznickou konfiguraci (šablony, kalkulace, tisky, workflow, proměnné) řeší navazující článek Upgrade TAS 5.17 na 5.19 – konzultantská část.
Upgrade obsahuje migrace, které nevratně mažou data (historie běhů cronů, pozvánky, Guides, instance graph). Bez plné zálohy databáze upgrade nezačínejte – down() migrací obnoví jen schéma, ne obsah.

TL;DR – co vás nejpravděpodobněji shodí

#

Riziko

Dopad

1

TAS_APP_VERSION je nově povinná

Backend nenastartuje bez ní

2

Migrace přidává CHECK constrainty na TEMPLATE_TASKS / TEMPLATE_GRAPH a NOT NULL + CHECK na JS_SCRIPTS.JS_TYPE bez backfillu

Migrace spadne na legacy hodnotách

3

ArangoDB jako logger odstraněn

Instance s TAS_LOGGER_ARANGO_ENABLE=true musí přejít na Elasticsearch před upgradem

4

Certifikáty se migrují z filesystemu do secret_store

Adresář musí obsahovat jen certifikáty, jinak se ingestuje smetí

5

Přestavba cronů (tas-3500) – MSSQL rebuild tabulky, CRON_RUNS dropnuta

Historie běhů cronů se ztratí; nutné okno bez běžících cron workerů

6

Zabbix přešel z push na pull

Stará integrace přestane dodávat data

7

Migrace secret_store.valid_from se na 5.17 DB rozchází (5.17-only migrace)

Na PostgreSQL zůstane typ timestamp místo timestamptz

8

Buildujete image sami? plugin/ už není v backend build kontextu; frontend má nové názvy build targetů

Build pluginů selže / nasadí se špatný frontend target

9

security.password.saltRounds / pepper se přesunuly pod bcrypt, encryptionIvLength už nesmí být string

Validace konfigurace odmítne starý lokální override

Checklist

Proveďte dřív, než sáhnete na cokoliv dalšího.

Datové předpoklady migrací

Spusťte proti produkční kopii DB. Každý řádek ve výsledku znamená, že migrace spadne.

(A) JS_SCRIPTS.JS_TYPE – nově NOT NULL + check in ('C','F','R'), bez backfillu. Legacy default byl 'B'.

SELECT "JS_ID", "JS_TYPE" FROM "JS_SCRIPTS"
WHERE "JS_TYPE" IS NULL OR "JS_TYPE" NOT IN ('C','F','R');

(B) TEMPLATE_TASKS – nové CHECK constrainty.

SELECT DISTINCT "TTASK_TYPE"                FROM "TEMPLATE_TASKS";  -- povoleno: A,S,P,E,N,W,C
SELECT DISTINCT "TTASK_ASSESMENT_METHOD" FROM "TEMPLATE_TASKS"; -- S,U,T,L,W,C,A,V,P
SELECT DISTINCT "TTASK_ASSESMENT_HIERARCHY" FROM "TEMPLATE_TASKS"; -- G,C,D,P,A,S,L
SELECT DISTINCT "TTASK_INVOKE_EVENT" FROM "TEMPLATE_TASKS"; -- I,B
SELECT DISTINCT "TTASK_ENOT_TGT_TYPE" FROM "TEMPLATE_TASKS"; -- O,G,T,P,S,U,R
-- totéž pro TTASK_ENOT_COPY_TYPE, TTASK_ENOT_BLIND_TYPE, TTASK_ENOT_REPLY_TYPE
SELECT DISTINCT "TTASK_CAN_BE_BUTTON", "TTASK_GEN_HISTORY",
"TTASK_IS_BULK_COMPLETABLE", "TTASK_MULTIINSTANCE_FLAG",
"TTASK_SUFFICIENT_END" FROM "TEMPLATE_TASKS"; -- jen Y,N

(C) TEMPLATE_GRAPH

SELECT DISTINCT "TGRAPH_COLOR"     FROM "TEMPLATE_GRAPH";
-- povoleno: fffacd, e6e6fa, ffe4e1, f0ffff, ffe4b5, ffffff, ''
-- (migrace hodnoty nejdřív zlowercasuje)
SELECT DISTINCT "TGRAPH_BPMN_TYPE" FROM "TEMPLATE_GRAPH";
-- povoleno: bpmn:UserTask, bpmn:SendTask, bpmn:ReceiveTask, bpmn:ServiceTask,
-- bpmn:SubProcess, bpmn:IntermediateThrowEvent, bpmn:IntermediateCatchEvent,
-- bpmn:ScriptTask, bpmn:Task, bpmn:Participant, bpmn:Lane

(D) Orphan procesy – migrace přidává FK INSTANCE_PROCESSES → TEMPLATE_PROCESSES. Orphanům sama nastaví TPROC_ID = NULL; zjistěte předem rozsah.

SELECT count(*) FROM "INSTANCE_PROCESSES" ip
WHERE ip."TPROC_ID" IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM "TEMPLATE_PROCESSES" tp WHERE tp."TPROC_ID" = ip."TPROC_ID");
-- totéž pro ARCH_INSTANCE_PROCESSES

(E) Odhad délky nejtěžších kroků

SELECT count(*) FROM "TEMPLATE_TASK_LINKS";            -- migrace #18 dělá UPDATE po řádcích
SELECT count(*) FROM "INSTANCE_PROCESS_HISTORY"; -- migrace #22 přetypovává date -> timestamp
SELECT count(*) FROM "ARCH_INSTANCE_PROCESS_HISTORY"; -- na MSSQL přes mezikrok nvarchar(max)
SELECT count(*) FROM "INSTANCE_TASKS"; -- drop sloupců + validace CHECK
SELECT count(*) FROM "ARCH_INSTANCE_TASKS";
Hodnoty mimo povolený výčet je nutné opravit v datech před upgradem. Oprava je práce konzultanta – předejte mu výsledky dotazů a postupujte podle konzultantské části. Alternativou je lokální úprava migrace, ale to znamená odklon od standardní větve – takový zásah vždy zdokumentujte.

Blokery prostředí

Kontrola

Očekávaný stav

TAS_LOGGER_ARANGO_ENABLE

musí být false / nepoužito; ArangoDB logger je odstraněn

Elasticsearch

povinný pro logy, historii běhů cronů a fulltext DMS

Redis

prakticky povinný (fleet health, cron monitor, restart pluginů, CRON_LAST_RUN); TAS_CACHE_MODE=memory je jen pro jednoinstanční dev

Používá zákazník plugin ksef?

Blokující – na 5.19 neexistuje, řešte s vývojem před upgradem

Používá zákazník staré EWS mail crony?

Migrace je smaže; konfiguraci najdete v update logu pod tagem [tas-3432]

Vlastní build image?

--build-arg TAS_APP_VERSION=<tag> je povinný; navíc --build-context plugin_source=./backend/plugin a nové názvy frontend targetů

Lokální override config/local.*?

Zkontrolovat security.password.* (přesun pod bcrypt) a database.encryptionIvLength (už nesmí být string)

Kapacita Elasticsearche

Přibude index <TAS_ELASTIC_INDEX_NAME>-cron-runs – naplánovat retenci

Plugin volume

Musí být zapisovatelný za běhu a sdílený všemi instancemi (instalace pluginů z GUI)

Zabbix monitoring

Připravte si API token (admin scope) a novou šablonu

MSSQL na jiném schématu než dbo

Opraveno v tas-3532 (je i v 5.17.9), ale ověřte, že jedete z verze ≥ 5.17.9

MSSQL verze

Migrace používají IF EXISTS → SQL Server 2016+

Záloha

Migrace nevratně mažou data. Full backup DB je nutný – down() migrací obnovuje jen schéma, ne obsah.

Seznam objektů, které upgrade odstraní:

  • CRON_RUNS – historie běhů cronů (přesunuta do Elasticsearche, stará data se nepřenášejí),
  • GUIDES, HEALTH_STATUS_PARAM,
  • INSTANCE_TASK_INVITATIONS, TEMPLATE_TASK_INVITATIONS,
  • INSTANCE_TASK_LINKS, INSTANCE_LINK_CONDITIONS,
  • INSTANCE_GRAPH, ARCH_INSTANCE_GRAPH,
  • TEMPLATE_TASK_CALCULATIONS,
  • sloupce: ITASK_SEEN, ITASK_DISC_FLAG, TTASK_DISC_FLAG, TTASK_ENOT_BODY, TTASK_IS_PROC_ID, TTJSCALC_TITLE, ITJSCALC_TITLE, TTASKLINK_IS_MANDATORY, IGRAPH_ITASKCON_ID, CRON_ALIAS, CRON_IS_CLONE, CRON_TIMEOUT, CRON_HELP.

Infrastruktura

Runtime a závislosti

Ani jeden package.json nemá pole engines – verzi Node určuje výhradně base image.

Položka

5.17

5.19

Node.js (backend image)

24.13.0

24.16.0 (backend/.nvmrc, node:24.16.0-alpine)

Node.js (frontend image)

24.11.0

24.11.0 – beze změny

TypeScript

5.9.3

6.0.3

Babel core/preset-env

7.29

8.0.x (ESM-only)

Fastify

5.8.1

5.10.0

@fastify/multipart

9.4.0

10.0.0

MikroORM

6.6.8

6.6.15 (záměrně ne v7)

tedious (MSSQL)

19.2.1

19.2.1 – drží se verze, kterou pinuje @mikro-orm/mssql@6

pg

8.20.0

8.22.0

@elastic/elasticsearch

9.3.3

9.4.2

ioredis / bullmq

5.10.0 / 5.70.2

5.11.1 / 5.79.3

nodemailer

8.0.1

9.0.3

firebase-admin

13.7.0

14.1.0 (modulární API)

puppeteer

24.38.0

25.3.0

sharp

0.34.5

0.35.3

ejs

4.0.1

6.0.1

htmlparser2 / node-html-parser

10.1.0 / 7.1.0

12.0.0 / 9.0.0

csv-parse / js-beautify / ini / basic-ftp

6.1.0 / 1.15.4 / 6.0.0 / 5.2.0

7.0.1 / 2.0.3 / 7.0.0 / 6.0.1

rate-limiter-flexible

9.1.1

11.2.0

npm v backend image

výchozí

npm@latest (v12) + patchnuté bundled deps

Nové backend závislosti: @modelcontextprotocol/sdk, @fastify/sse, fastify-plugin, tar-stream, tmp, tsx (dev).

Odstraněné: arangojs, typedi (nahrazeno vlastním DI v backend/src/infrastructure/di/service.ts), reflect-metadata, systeminformation, docx-templates, docxtemplater, pizzip (přesunuty do pluginu docxGenerator).

Frontend: ESLint + Prettier → Biome 2.4.x; přidán Vitest 4 + Testing Library + jsdom; react-beautiful-dnd → @dnd-kit; odstraněn hopscotch (zrušené Guides) a npm jako frontend dependency. Bezpečnostní bumpy: axios 1.16.1, sanitize-html 2.17.4, dompurify 3.4.5, express 4.22.2, lodash 4.18.1, overview-components 1.1.184. React / MUI / webpack majory beze změny.

Dockerfile

Adresář docker/** (swarm stacky tasdev.yml, tasmssql.yml, tasmssql-mac.yml, tasoracle.yml, skripty) je mezi 5.17 a 5.19 beze změny. Žádné nové služby, volumes ani healthchecky. docker-compose*.yml v repu není a HEALTHCHECK instrukci nemá ani jeden Dockerfile.

Backend (backend/Dockerfile)

  • ARG TAS_APP_VERSION → ENV TAS_APP_VERSION zapečeno do každé stage. CI ho předává z git tagu (TAG_NAME_CLEANED, včetně prerelease suffixu).
  • npm ci --legacy-peer-deps (kvůli openapi-typescript peer dep), v prod i dev stage.
  • npm_config_allow_remote=root, npm_config_allow_git=root – npm 12 by jinak odmítl xlsx CDN tarball a git dependency annotpdf.
  • Plugin source už není v backend build kontextu (backend/.dockerignore) a plugin_builder ho dostává přes named build context. plugin_builder nově dědí FROM test (dřív FROM linter).
  • Unit testy se už při buildu nespouští (běží v samostatném CI jobu).
  • Sada apk balíčků (LibreOffice, OpenJDK17, Chromium, msttcorefonts, openssl) je beze změny.
  • Názvy produkčních targetů beze změny: prod, prod_obfuscated (default), prod_devlicense, prod_obfuscated_devlicense.

Kdo staví image ručně, musí použít:

docker buildx build --build-context plugin_source=./backend/plugin --target plugin_archives ...
Bez --build-context plugin_source build pluginů selže.

Frontend (frontend/Dockerfile) – zkontrolujte deployment pipeline

Build se rozdělil podle licence. 5.17 měl source → prod / prod_obfuscated. 5.19 má:

source_base → source_prodlicense → prod, source_obfuscated_prodlicense → prod_obfuscated (default)
→ source_devlicense → prod_devlicense, source_obfuscated_devlicense → prod_obfuscated_devlicencse

Build patchuje developmentBuild v frontend/src/components5.0/zustand/loggedUserStore.ts podle licence.

Název dev-license obfuskovaného targetu obsahuje překlep: prod_obfuscated_devlicencse. Pokud na něj cílíte, musíte překlep zopakovat.

Nové a změněné env proměnné

Nově povinné

Proměnná

Poznámka

TAS_APP_VERSION

Dřív volitelná s fallbackem "5" z manifest.json. Nyní getMandatoryEnvString – backend spadne při startu. manifest.json a readManifestVersion() byly odstraněny. Hodnota se propisuje do application.version, GET /plugins/version, GET /system-health a do kontroly kompatibility pluginů.

Odstraněné

Proměnná

Náhrada

TAS_LOGGER_ARANGO_ENABLE, TAS_LOGGER_ARANGO_URL, TAS_ARANGO_DB_NAME, TAS_ARANGO_USERNAME, TAS_ARANGO_PASSWORD, TAS_ARANGO_JWT

Elasticsearch (loggerType je vždy elastic)

TAS_LOGGER_ELASTIC_ENABLE

bezpředmětné

TAS_CERTIFICATES_STORAGE_PATH (z deklarace konfigurace)

Certifikáty jsou v secret_store / Vault. Migrace ji ale ještě čte přes process.env (default /app/tas/storage/certificates) – viz Migrace certifikátů do Vaultu.

Nové (všechny volitelné)

Skupina

Proměnné

Cache

TAS_CACHE_MODE (redis | memory, default redis) – nová úniková varianta, Redis byl v 5.17 bezalternativní

Crony

TAS_CRONS_CONSECUTIVE_FAILURE_THRESHOLD (skutečný default 5; pokud je nastavená, je v GUI read-only)

Elastic

TAS_ELASTIC_CRON_RUN_INDEX_NAME (default <TAS_ELASTIC_INDEX_NAME>-cron-runs)

System health

TAS_HEALTH_SAMPLE_INTERVAL_SEC (60), TAS_HEALTH_RETENTION_HOURS (48), TAS_HEALTH_STALE_AFTER_SEC (180)

SIEM – soubor

TAS_LOGGER_FILE_ENABLE, TAS_LOGGER_SIEM_FILE_PATH (default /app/tas/storage/log/tas.log), TAS_LOGGER_FILE_LOG_LEVEL (default 3 = INFO)

SIEM – syslog

TAS_LOGGER_SYSLOG_ENABLE, TAS_LOGGER_SYSLOG_HOST, TAS_LOGGER_SYSLOG_PORT (514), TAS_LOGGER_SYSLOG_PROTOCOL (udp | tcp), TAS_LOGGER_SYSLOG_FACILITY (1), TAS_LOGGER_SYSLOG_LOG_LEVEL (2 = WARN+)

Console fallback

TAS_LOGGER_CONSOLE_FALLBACK_ENABLE (default true) – při loggerType=elastic a vypnutém stdout se automaticky přidá konzolový handler, aby se logy neztratily při výpadku ES

Mail přes MS Graph

TAS_MAIL_SMTP_TYPE=msgraph + TAS_MAIL_MSGRAPH_TENANT_ID, _CLIENT_ID, _CLIENT_SECRET, _SENDER, _SCOPE

Mail

TAS_MAIL_ALLOWED_CUSTOM_HEADERS (allowlist vlastních X-hlaviček)

Hesla

TAS_SECURITY_ARGON2_MEMORY_KIB (47104), _ITERATIONS (1), _PARALLELISM (1), _HASH_LENGTH (64), _SALT_LENGTH (32)

Vault

TAS_VAULT_KEY_PAIR_PUBLIC_SUFFIX (.public), TAS_VAULT_KEY_PAIR_PRIVATE_SUFFIX (.private)

envVariables.ts dokumentuje u TAS_CRONS_CONSECUTIVE_FAILURE_THRESHOLD default 3, ale staticConfigHandler.ts používá 5. Platí kód – skutečný default je 5.

Mrtvá, ale stále deklarovaná

TAS_LOGGER_FILE_PATH zůstává v envVariables.ts, ale staticConfigHandler.ts ji už nečte (logging.fallbackfilePath z globalConfig.ts zmizelo). Nahradila ji TAS_LOGGER_SIEM_FILE_PATH.

Zpřísněná validace statické konfigurace – může odmítnout dosud fungující lokální override.

Klíč

5.17

5.19

database.encryptionIvLength

number | string

jen number

security.password.saltRounds, security.password.pepper

ploché klíče

přesunuty pod security.password.bcrypt.{saltRounds,pepper}

–

–

nové povinné bloky security.password.argon2id.* a security.password.currentHashAlgorithm (bcrypt | argon2id)

logging.file.*, logging.syslog.*, application.health.*, featureFlag.vault.{keyPairPublicSuffix,keyPairPrivateSuffix}, integrations.mail.allowedCustomHeaders, integrations.elastic.cronRunIndex

–

nově povinné ve schématu (defaulty existují, takže bez zásahu projdou)

cache

required: ["redis"]

required: ["mode"]

Hex validace TAS_DATABASE_ENCRYPTION_KEY (64 hex znaků) a tokenových secretů (hex, min. 64 znaků) je stejná v obou větvích – přišla už v 5.17 s tas-3079. Není to nová překážka.

Frontend

Proměnná

Význam

TAS_PLUGIN_STORE_URL

Base URL pluginového storu (frontend/config/tas.base.js → config.pluginStoreUrl). Když není nastavená, záložka „Plugin Store“ se skryje. Prohlížeč volá store přímo, backend na něj nesahá. Není v docker/devstack/.env.template – doplňte ručně.

Dynamická (GUI) konfigurace

Změna

Detail

Nové

application.crons.consecutiveFailureThreshold (default 5)

Nové

application.health.* (sample interval / retention / stale threshold)

Nové

mail.sendMail.{newline,path} a mail.msgraph.{tenantId,clientId,clientSecret,sender,scope}; mail.type enum rozšířen o sendmail a msgraph

Nové

ai.recursionLimit (LangGraph), plus AI enabled/provider/key/Azure OpenAI pole

Nové

featureFlag.gui.disableMobilePullToRefresh

Přejmenováno

security.password.expirationEmail → expirationEmailEnabled (mapování je v dynamicConfigMigrationConsts.ts, proběhne automaticky)

Odstraněno

storage.certificates (vypadlo i z required)

Nová záložka

Administrace → Konfigurace → Plugins (konfigurace pluginů v PLUGIN_CONFIG, handler pluginConfigHandler.ts)

Pouze statické

integrations.ai.mcpServers (definice odchozích MCP serverů) – není editovatelné v GUI

Změny dynamické konfigurace lze aplikovat i z CLI: npm run dynamic-config:update.

Databázové migrace

24 nových logických migrací, každá jako dvojice MSSQL + PostgreSQL (žádná dialektově neutrální není). Plus regenerované snapshoty (.snapshot-TAS.json obou dialektů).

Přehled migrací

#

Migrace

Co dělá

Riziko

1

Migration20260420170448

CREATE TABLE AI_CONVERSATION_MEMORY

nízké

2

Migration20260424112724/25

secret_store + valid_from, rozšíření check kind o certificate

viz Rozjezd valid_from

3

…-vault-certificate-migration

TS datová migrace – načte soubory z certifikátového adresáře, zašifruje a vloží do secret_store

vysoké

4

Migration20260424130139

USERS.USER_PASSWORD 60 → 255 znaků (kvůli argon2id)

nízké (na PG přepis tabulky)

5

…-ai-llm-tool-call-status-fix

check constraint na AI_LLM_TOOL_CALL.STATUS + pending_confirmation

nízké

6

…-remove-backend-app-id-seq

DROP SEQUENCE BACKEND_APPLICATION_ID_SEQ

nízké

7

Migration20260525142332/33

AI_MESSAGE.CLIENT_ACTION

nízké

8

Migration20260527075819

CREATE TABLE PLUGIN_CONFIG

nízké

9

Migration20260529132931/32

*_ENOT_CUSTOM_HEADERS do 3 notifikačních tabulek

nízké

10

Migration20260602145822/23

DROP INSTANCE_TASK_INVITATIONS, TEMPLATE_TASK_INVITATIONS

ztráta dat

11

…-remove-guides

DROP GUIDES + GUIDE_ID_SEQ

ztráta dat

12

Migration20260608192313/14

Velký úklid šablon: drop TEMPLATE_TASK_CALCULATIONS, drop 6 sloupců (vč. na INSTANCE_TASKS a ARCH_INSTANCE_TASKS), přetypování, lowercase TGRAPH_COLOR, ~15 nových CHECK constraintů

vysoké + dlouhé

13

Migration20260609183923/24

DROP COLUMN ITASK_SEEN na INSTANCE_TASKS + ARCH_

střední (velké tabulky)

14

…-cron-overhaul

tas-3500. MSSQL: rebuild tabulky CRONS (CRONS_NEW + IDENTITY_INSERT + drop + rename), drop FK z XML_PROCESS_IMPORT, DROP CRON_RUNS. PG: in-place přejmenování sloupců, backfill alias→name, CRON_STATUS→boolean IS_ACTIVE, TYPE NOT NULL + check, dedupe + UNIQUE na DISPLAY_NAME

nejvyšší

15

…-add-markdown-webp-file-types

seed text/markdown, image/webp do DMS_FILE_TYPE (idempotentní)

nízké

16

Migration20260626183639

DROP INSTANCE_TASK_LINKS, INSTANCE_LINK_CONDITIONS + sekvence + ROLE_ACCESS_RIGHTS řádky; drop IGRAPH_ITASKCON_ID, TTASKLINK_IS_MANDATORY

vysoké

17

…-drop-health-status-param

DROP HEALTH_STATUS_PARAM

nízký objem

18

…-template-link-conditions-tree

Největší datová migrace. TTASK_OUTGOING_SPLIT_MODE NOT NULL default 'I'; CONDITIONS jsonb + TTASKLINK_IS_DEFAULT + UPDATED_AT/UPDATED_BY na TEMPLATE_TASK_LINKS; načte všechny linky + TEMPLATE_LINK_CONDITIONS + TEMPLATE_VARIABLES do paměti, poskládá strom podmínek, UPDATE po jednotlivých řádcích, backfill, NOT NULL, verifikace počtů a throw při nesouladu, oprava sekvence, nové FK

vysoké + dlouhé

19

…-instance-process-tproc-fk

orphanům TPROC_ID = NULL, pak FK → TEMPLATE_PROCESSES

dlouhé (největší tabulky)

20

…-prnt-append-scripts

PRNT_APPEND_SCRIPTS, TTASK_APPEND_SCRIPTS; JS_SCRIPTS.JS_TYPE → NOT NULL + check ('C','F','R') bez backfillu

vysoké

21

…-drop-instance-graph

DROP INSTANCE_GRAPH, ARCH_INSTANCE_GRAPH, IGRAPH_ID_SEQ, ROLE_ACCESS_RIGHTS řádky; nové FK ARCH_INSTANCE_TASK_HISTORY → ARCH_INSTANCE_TASKS

vysoké

22

…-iph-inserted-datetime

IPH_INSERTED date → datetime2/timestamptz na INSTANCE_PROCESS_HISTORY + ARCH_ (MSSQL přes mezikrok nvarchar(max))

dlouhé – plný přepis velkých historických tabulek

23

…-mcp-tool-call-audit

AI_LLM_TOOL_CALL + USER_ID (FK), COLLECTION, SOURCE; backfill 'unknown'/'general', pak NOT NULL

střední

24

…-seed-default-crons

seed 9 defaultních cronů – jen když je CRONS prázdná

nízké

Existující instance mají CRONS naplněnou, takže migrace #24 je no-op. Nové crony (DatabaseHealthReportCron, DatabaseIndexRebuildCron, …) je nutné založit ručně přes Administrace → Crony → „+“.

Migrace certifikátů do Vaultu (#3)

Migrace projde adresář process.env.TAS_CERTIFICATES_STORAGE_PATH (fallback /app/tas/storage/certificates), každý soubor v něm parsuje jako X.509, zašifruje a vloží jako secret_store řádek s kind = certificate.

Před migrací ověřte:

  • že proměnná ukazuje na správný adresář a že je v běhovém prostředí migrace dostupný (volume namountovaný),
  • že adresář obsahuje pouze certifikáty – cokoliv jiného (README, klíče, temp soubory) se pokusí naimportovat,
  • že je inicializovaný globalThis.container (šifrovací klíč databáze) a existuje uživatel s id = 1.
Třída v souboru se jmenuje Migration20260425100000, zatímco soubor Migration20260424112725/26-vault-certificate-migration.ts. Nemá to funkční dopad, ale při ručním dohledávání v migrační tabulce se neorientujte podle jména souboru.

Rozjezd secret_store.valid_from mezi 5.17 a 5.19

5.17 přidala sloupec migrací Migration20260528120000-secret-store-valid-from. Na 5.19 tato migrace neexistuje – sloupec přidává dřívější Migration20260424112724 (MSSQL) / …725 (PG).

Důsledky na DB, která už prošla 5.17:

  • V migrační tabulce zůstane osiřelý záznam Migration20260528120000.
  • Migration20260424112724/25 poběží „mimo pořadí“. Obě jsou psané defenzivně (MSSQL if not exists (select 1 from sys.columns …), PG add column if not exists), takže nespadnou – to je oprava tas-3673, která dřív končila MSSQL chybou 2705.
  • PostgreSQL – typový rozjezd. 5.17 vytvořila valid_from jako timestamp, 5.19 by ho vytvořila jako timestamptz. Migrace sloupec přeskočí, takže zůstane timestamp a neodpovídá 5.19 snapshotu/entitě. Funkčně to zatím nevadí, ale příští migrace generovaná ze snapshotu to může chtít řešit. Po upgradu ověřte a případně ručně sjednoťte.
  • breakpointCheck (npm run mig) může na osiřelý záznam upozornit – použijte npm run mig:nocheck nebo nové nástroje níže.

Nové CLI pro řešení problémů s migracemi

npm run db:migrations                 # JSON dump migrační tabulky: název, čas, co je pending
npm run db:migrations:set-state -- name=<Migration…> state=executed # označí za provedenou (SQL se nespustí)
npm run db:migrations:set-state -- name=<Migration…> state=pending # smaže řádek → poběží znovu
Ani jeden směr nesahá na schéma. state=executed předpokládá, že schéma už v cílovém stavu je; state=pending způsobí opětovný běh SQL proti schématu, které jeho změny už může obsahovat. Výsledek obsahuje willReRunOnNextMigration (u smazaného řádku bez odpovídajícího souboru zůstane false).

Další nové příkazy: npm run db:report (report fragmentace indexů + heavy queries), npm run db:rebuild-indexes.

Post-migrační krok mimo migrační tabulku

Každý migrate up nově spouští normalizaci parametrů cronů proti parametersSchema dané cron třídy:

  • typové neshody se zkoumají a koerzují ("5" → 5),
  • vlastnosti nepovolené schématem se odstraní,
  • defaulty se nedoplňují,
  • řádek, který ani po normalizaci nevalidoval (nebo se nepodařilo naparsovat), zůstane netknutý a zaloguje se warning.
Po migraci projděte log a dohledejte recovery záznamy (obsahují původní i normalizované JSON). Neopravitelné řádky se logují znovu při každé migraci, dokud je někdo neopraví v administraci.

Doporučený postup upgradu

  1. Oznámení odstávky. Odhad okna podle dotazu (E) – migrace #14, #18, #19 a #22 jsou lineární v počtu řádků.
  2. FULL BACKUP DB + snapshot volume se storage (certifikáty, pluginy, DMS).
  3. Předletová kontrola datových předpokladů a blokerů prostředí. Datové vady opravit TEĎ.
  4. Zastavit provoz:
    • nejdřív cron workery (nutné – cron overhaul je jednofázový drop sloupců),
    • pak web backendy,
    • frontend / LB do maintenance.
  5. Připravit konfiguraci pro 5.19:
    • TAS_APP_VERSION (povinná),
    • odstranit TAS_LOGGER_ARANGO_* a TAS_LOGGER_ELASTIC_ENABLE,
    • ověřit TAS_CERTIFICATES_STORAGE_PATH pro migraci,
    • volitelně TAS_PLUGIN_STORE_URL na frontendu.
  6. Nasadit 5.19 image (backend + frontend), backendy zatím NESTARTOVAT.
  7. Spustit migrace z jedné instance: npm run mig. Sledovat log; při pádu neopakovat naslepo – viz nové CLI.
  8. Zkontrolovat migrační log:
    • warningy z normalizace parametrů cronů,
    • řádky s tagem [tas-3432] = konfigurace smazaných EWS cronů → uložit stranou,
    • výsledek migrace certifikátů do secret_store.
  9. Nasadit / aktualizovat pluginy na verze pro 5.19. Bez toho se nenačtou.
  10. Nastartovat web backendy → ověřit /status/liveness, /status/readiness, /status/startup.
  11. Nastartovat cron workery.
  12. Provést post-upgrade konfiguraci.
  13. Projít ověřovací checklist.
  14. Sundat maintenance.
Sondy pro Kubernetes/LB (/status, /status/db, /status/db/users, /status/liveness|readiness|startup) jsou beze změny.

Post-upgrade konfigurace

Pluginy – povinné

Manifesty v 5.19 mají minimalCompatibleTasVersion: "5.19.0" a maximalCompatibleTasVersion: "5.19.999". Protože application.version je nově skutečná verze (dřív ji maskoval zastaralý manifest.json s 5.18.16), nekompatibilní plugin se tiše přeskočí.

Verze pluginů v 5.19:

Plugin

sysname

Verze

Ollama

Ollama

1.0.6

API Extensions

apiExtensions

1.0.4

Azure OpenAI

AzureOpenAI

1.0.7

Claude AI

ClaudeAI

1.0.7

docx Generator (nový)

docx-generator

1.0.2

Expose DB

expose-db

1.0.7

Google GenAI

GoogleGenAI

1.0.7

Help Docs (nový)

helpDocs

1.0.5

isDoc

is-doc

1.0.4

OpenAI

OpenAI

1.0.8

PDF Annotation

pdf-annotation

1.0.4

Single Sign-On

single-sign-on

1.0.3

Template Validation

template-validation

1.0.10

Plugin ksef v 5.19 chybí (v 5.17 byl). Pokud ho zákazník používá, eskalujte na vývoj před upgradem.

Nové možnosti správy pluginů:

  • Administrace → Pluginy → záložka Plugin Store (jen když je nastaveno TAS_PLUGIN_STORE_URL),
  • POST /plugins/install – nahraje archiv do plugin volume; plugin se tím nenačte,
  • DELETE /plugins/:sysname – odinstalace (smaže složku, restartRequired: true),
  • POST /plugins/kill – broadcast přes Redis; každý backend (web i cron) si vyvolá SIGTERM na vlastní graceful-shutdown handler a orchestrátor ho nastartuje zpět,
  • plugin se špatným manifestem nebo nenačitatelnou capability už neshodí start backendu – zaloguje se a přeskočí (tas-3545).
POST /plugins/kill vyžaduje, aby deployment restartoval ukončené kontejnery (docker / k8s restart policy). Pod holým npm run dev proces prostě skončí.

Crony – vyžaduje pozornost

Kompletní přestavba (tas-3500). Co udělat po upgradu:

  1. Projít celý seznam cronů v Administraci → Crony. Přejmenování sloupců (CRON_NAME→DISPLAY_NAME, CRON_FILE→TECHNICAL_NAME, CRON_SYNTAX→TIMING, CRON_STATUS→IS_ACTIVE boolean) proběhlo v datech, ale ověřte, že jsou aktivní ty správné.
  2. Historie běhů se ztratila – CRON_RUNS je dropnutá, nová historie jde do Elasticsearch indexu <integrations.elastic.index>-cron-runs (zakládá se automaticky přes iniESIndex, no-op při vypnutém ES indexování).
  3. Klonované crony zanikly (CRON_ALIAS, CRON_IS_CLONE dropnuty). Alias se přemigroval do uživatelského názvu.
  4. Per-cron timeout zanikl (CRON_TIMEOUT), stejně jako endpoint POST /cron-runs/kill a akce „zabít běh“. Zůstává crash recovery přes stale heartbeat a indikátor „běží mnohem déle než obvykle“.
  5. Cron help zaniklo – dokumentace parametrů je teď v parametersSchema a renderuje ji JsonForms.
  6. Nastavit application.crons.consecutiveFailureThreshold (default 5) – po N po sobě jdoucích selháních jde notifikační e-mail na chybové adresy cronu.
  7. Zvážit aktivaci nových cronů (zakládají se ručně, defaultně neaktivní): DatabaseHealthReportCron, DatabaseIndexRebuildCron.
  8. Cron DeleteLogs má nový výchozí název a popis („Remove old logs.“ – slovo „arango“ vypadlo).
  9. „Tovární nastavení“ na detailu cronu teď resetuje bezpodmínečně (timing, popis, parametry i aktivní stav; uživatelský název zůstává).
  10. Crony s parametry neodpovídajícími schématu už nelze uložit – POST /crons/create a POST /crons vrací 400 INVALID_CRON_PARAMETERS.
  11. Změna chování: MailReportsCron počítá úkol jako po termínu při deadline < teď (dřív < dnešní půlnoc).

Zabbix – push → pull, nutná rekonfigurace

Oblast

5.17

5.19

Model

TAS pushuje metriky (timer DataSender/ZabbixService)

Zabbix scrapuje

Konfigurace

tabulka HEALTH_STATUS_PARAM + /health-status/settings*

zrušeno

Šablona

backend/src/api/health/zabbix_default.json

backend/src/service/health/zabbix/tas_template.yaml (Zabbix 6.0 HTTP agent)

Endpoint

POST /health-status

GET /system-health/metrics

Auth

basic auth hook

dlouhodobý B2B API token (admin scope), hlavička Authorization: Bearer, makro {$TAS.HEALTH.TOKEN}

Kroky: vygenerovat API token s admin scope → naimportovat tas_template.yaml → nastavit makro → ověřit LLD discovery. Scrape endpoint záměrně obchází isAlive/inMaintenance hooky, takže monitoring funguje i během draining/maintenance.

Klíče tas.crons a tas.cronStatus a akce /health-status crons (cronStatus/crons/cronsGui/cronsHealth) si zachovaly tvar polí – stávající monitoring na ně funguje dál. Zrušeny: scheduledTasksGui, metrika tasZombieCron.

Metrika maxDiskUsePct a per-disk details ze system probe zmizely (odstraněna závislost systeminformation, čte se node:os). memUsedPct je teď mírně vyšší a konzervativnější (os.freemem()).

Odstraněná stránka Appstatus, nová System Health

Legacy stránka Appstatus je pryč. Nahrazuje ji Administrace → System Health (/administration/system-health) s probami pro: application, database, database-activity, Elasticsearch, Redis, Tika, LibreOffice, e-mail, Firebase, crony, host resources a business KPI.

  • Fleet-aware: každá instance se vzorkuje po 60 s do Redis (HEALTH_FLEET hash + per-instance série, 48h okno / 49h TTL). Bez Redis degraduje na lokální instanci.
  • Database Activity čte pg_stat_activity / sys.dm_exec_*. MSSQL uživatel potřebuje VIEW SERVER STATE, jinak se karta zobrazí jako „unknown“ (dřív by vypsala celý failující SQL).
  • Nový dashboard widget „System health“ (admin only).

E-mail

  • Nový transport msgraph (app-only / Client Credentials) vedle basic, oauth2 a sendmail.
  • Vlastní X-hlavičky v notifikacích s podporou placeholderů + allowlist (TAS_MAIL_ALLOWED_CUSTOM_HEADERS).
  • MS Graph mail crony: clientSecret může být {{vault:name}} odkaz na Vault secret; nová tlačítka „Discover folders“ (POST /ms-graph/discover-folders) a duplikace schránky.
  • Nově zakládané crony „Create Processes from MS Graph mails“ mají useEmailObjectInDataHolder = false (aby field mapping fungoval). Stávající crony si drží uložené parametry.

Hesla a autentizace

  • Hashování přešlo na argon2id s lazy migrací z bcryptu – uživatel se přehashuje při příštím přihlášení. Globální pepper byl zrušen, včetně souvisejícího configu.
  • USERS.USER_PASSWORD rozšířen na 255 znaků.
  • Fallback na jinou authority při výchozí (bez explicitního auth_id) cestě přihlášení.
  • Zamčení uživatele nově invaliduje cache (USER2-<id>) → existující access tokeny přestanou fungovat okamžitě.
  • GET /authorization/config vrací paramsSchema per authority (frontend renderuje formuláře z JSON schématu).

Breaking changes pro integrace a API

Odstraněné endpointy

Endpoint

Poznámka

POST /health-status, GET /status/full, /health-status/settings*, test/default-json

nahrazeno GET /system-health*

GET /connections/used-connections, POST /connections/destroy-connection

nahrazeno GET /system-health/db-activity + POST …/cancel

POST /ai/chat

zůstává /ai/messages

GET /guides/:id?, POST /guide/:id?, DELETE /guide/:id

funkce Guides zrušena

GET user password status

zrušeno bez náhrady

POST /crons/clone, POST /crons/restart-cron, GET /cron-runs/summary, POST /cron-runs/kill

zrušeno

POST /tasks/invitation/:itaskId

typ úkolu „pozvánka“ zrušen

GET /template-link/:id

linky se čtou přes nový model

Změněné kontrakty

Co

Změna

POST /processes/to-delete/:iprocId, /processes/suspend/:iprocId, /processes/resume/:iprocId

konsolidováno do POST /processes/:iprocId/status

GET /roles/:id?

rozděleno na list + GET /roles/:id

GET /template-processes/:tProcId/template-tasks/:id

ttask_event_params se vrací jako surový JSON string – klient musí JSON.parse. Dřív se klíče rekurzivně lowercasovaly a rozbíjely camelCase uvnitř smart-event konfigurace.

GET /processes/:id/graph

Payload přepsán: jeden uzel na template task s poli instances / history_entries, reprezentativní solver, drift markery origin (both/instanceOnly/templateOnly). Nově vynucuje process rights – nedostupný case vrací 400 LACK_OF_PERMISSIONS místo prázdného diagramu.

/crons*

přejmenovaná pole: cronTechnicalName, DISPLAY_NAME, TIMING, PARAMETERS, TYPE, boolean isActive; schéma je parametersSchema (dřív místy cronParametersSchema)

GET /org-units/import-preview

vrací už jen headers + checkedEntities (strom vizualizace odstraněn)

Chybové stavy z 3rd-party

Chyba z knihovny s vlastním statusCode (typicky Elasticsearch 401) se už nepropaguje – vrací se 500. Status určují jen TAS výjimky a Fastify chyby (FST_*). Skutečné auth chyby (AuthException) fungují dál.

MCP tool names

z CollectionName__tool na holé tool; kolekce je v popisu tooly jako [CollectionName] …

Nové endpointy

  • POST /mcp/:scenario? – stateless MCP Streamable HTTP endpoint pro externí klienty (Claude Desktop / Claude Code). Scénáře: case-creation, case-editing, case-lookup, knowledge, account, administration; holé /mcp vystaví vše. Jen API token (tokenPayload.kind === "api"), session token vrací UNAUTHORIZED. Každé volání se auditovává do AI_LLM_TOOL_CALL se source = mcp.
  • GET /system-health, /system-health/series, /system-health/db-activity, POST /system-health/db-activity/cancel, GET /system-health/metrics
  • GET /crons/available, GET /crons/monitor, POST /crons/create, /cron-runs, /cron-runs/:id
  • GET /plugins/version, POST /plugins/install, POST /plugins/kill, DELETE /plugins/:sysname
  • GET /plugin-config, /plugin-config/:sysname/schema, /plugin-config/:sysname/data, POST /plugin-config
  • GET /scripts/list/:type, GET /scripts/mapped/:kind/:kindId?
  • POST /ms-graph/discover-folders
  • DELETE licence, vault key-pair generování, AI observability endpointy
Omezení MCP: write tooly, které v chatu vyžadují potvrzení, se přes MCP provedou okamžitě – protokol server-side human-in-the-loop nevynutí (destructiveHint je jen doporučující).

Ověřovací checklist po upgradu

Start a základ
  • Backend nastartoval bez "ENV variable … is mandatory" v logu
  • GET /plugins/version vrací skutečnou verzi (5.19.x), ne 5.18.16
  • /status/liveness, /status/readiness, /status/startup OK
  • Administrace → System Health: všechny proby zelené nebo žluté, žádná v „unknown“ z důvodu chybějících práv
Pluginy
  • Administrace → Pluginy: všechny očekávané pluginy jsou načtené (nekompatibilní se tiše přeskočí – porovnejte se seznamem verzí)
  • helpDocs a docx-generator nainstalované, pokud je zákazník má mít
  • KSeF: vyřešeno
Databáze a migrace
  • npm run db:migrations – nic není pending, žádný nečekaný orphan kromě Migration20260528120000
  • PostgreSQL: ověřen typ secret_store.valid_from
  • Certifikáty: SELECT count(*) FROM secret_store WHERE kind = 'certificate' odpovídá počtu souborů v původním adresáři
Crony
  • Seznam cronů odpovídá stavu před upgradem (aktivní / neaktivní, timing)
  • V migračním logu žádné neopravené warningy z normalizace parametrů
  • Cron monitor se plní; ES index <index>-cron-runs existuje
  • EWS crony: konfigurace vytažená z logu [tas-3432], přenesená do MS Graph cronů
  • Testovací ruční spuštění klíčových cronů (Run manually)
Logy a monitoring
  • Logy tečou do Elasticsearche; žádná stopa po Arango konfiguraci
  • Zabbix scrapuje GET /system-health/metrics, LLD discovery funguje
  • Filtrování logů podle iproc_id / tproc_id / ttask_id / header_id / cron_id funguje
Frontend
  • Ikony se zobrazují správně (tas-3710 – BOM v appStyles.css rozbíjel @font-face)
  • Přihlášení, dashboard, přehledy, detail případu, workflow diagram
  • Diagram případu (nový payload) se vykresluje včetně archivovaných případů
Pokud jsou ikony rozbité, image je z buildu před opravou tas-3710 → přebuildovat. Nouzové řešení: připnout "postcss": "8.5.23" ve frontend overrides.
Funkční ověření
  • Odeslání e-mailu (notifikace i report)
  • Generování tisku / PDF (LibreOffice, Puppeteer/Chromium)
  • Upload do DMS + fulltext + náhledy
  • AD/LDAP synchronizace (AdSyncCron – v 5.19 opravena, dřív tiše nesynchronizovala nikoho)
  • Šablony: uložení úkolu, uložení proměnné, uložení odkazu v diagramu
  • Přihlášení uživatele s bcrypt heslem → ověřit rehash na argon2id
Toto je technický smoke test. Hloubkové ověření šablon, kalkulací, tisků a workflow provádí konzultant podle konzultantské části.

Poznámky ke škálování

  • Restart pluginů (POST /plugins/kill) shodí všechny backendy sdílející Redis, včetně cron workerů, se staggerem. Deployment musí ukončené kontejnery automaticky startovat.
  • Plugin volume (TAS_PLUGINS_LOCATION → featureFlag.plugins.destination) musí být nově zapisovatelný za běhu a sdílený všemi instancemi – instalace i odinstalace pluginů z GUI do něj zapisují.
  • Instance se v Health page tagují jako Web nebo Cron worker; přepínač instancí je v hlavičce.
  • Globální infra proby (DB / ES / Redis / Tika / mail / Firebase / crony / business) cachují výsledek v Redis na jedno vzorkovací okno, aby se při N instancích nespouštěly N krát.

Co konkrétně degraduje bez Redis (TAS_CACHE_MODE=memory):

Funkce

Chování bez Redis

Fleet health registry (HEALTH_FLEET, 48h série)

jen lokální instance

Čítače po sobě jdoucích selhání cronů, CRONJOB_running stamp, dedup heartbeat alertů

nefunguje napříč instancemi

CRON_LAST_RUN-* watermark (PostponedTaskCron, PlanCron)

ztrácí se při restartu

POST /plugins/kill (pub/sub kanál tas.scaling.plugins.kill)

restart více instancí nefunguje

TAS_CACHE_MODE=memory je únikový režim pro jednoinstanční dev, ne pro produkci.

CI proměnné (jen pro pipeline, ne runtime): PLUGIN_STORE_URL nahrazena dvojicí PLUGIN_STORE_DEV_URL / PLUGIN_STORE_PROD_URL (.github/workflows/image-tag-push.yml) – buildy z stable/* publikují do PROD storu, ostatní do DEV. Sdílené zůstávají secret CICD_PLUGIN_STORE_PRIVATE_KEY a proměnná PLUGIN_STORE_USERNAME (default tas-ci). Publikace je opt-in – dokud není URL nastavená, je to no-op.

Rollback

Migrace mažou tabulky a sloupce; down() obnoví jen strukturu, ne data. Praktický rollback je tedy:

  1. Zastavit 5.19 (web i cron).
  2. Obnovit DB ze zálohy pořízené v kroku 2 postupu upgradu.
  3. Vrátit 5.17 image a původní env (vrátit TAS_CERTIFICATES_STORAGE_PATH do configu, případně Arango proměnné).
  4. Vrátit pluginy ve verzích pro 5.17.
  5. Vrátit původní Zabbix šablonu.
Restore DB je jediná spolehlivá cesta – nespoléhejte na migration down.

Frantisek Brych Updated by Frantisek Brych

Hlavní změny a zaniklé funkce ve verzi 5.19

Contact

Team assistant (opens in a new tab)

Powered by HelpDocs (opens in a new tab)