---
title: "Aktualizace bez odstávky"
description: "Aktualizujte self-hosted Quire bez odstávky."
image: "https://docs.quirelms.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.quirelms.com/cs/llms.txt
> Use this file to discover all available pages before exploring further.

# Aktualizace bez odstávky

<span id="upgrading-without-downtime"></span>

Pravidla jsou v části 7 dokumentu `docs/architecture/23-ops.md` a části 4.1 dokumentu `docs/architecture/07-data.md`. Toto je postup.

## Záruka bezpečné aktualizace <!--quire:the-guarantee-that-makes-it-safe-->

**Verze R správně funguje se schématem R i se schématem R minus jedna.** Každá změna schématu se rozdělí na rozšíření, přechod a odebrání:

1. **Rozšíření**: přidejte nový sloupec, tabulku nebo index. Starý kód ho ignoruje.
2. **Přechod**, alespoň na jednu verzi: nový kód zapisuje oba tvary a čte nový; obnovitelná úloha doplní staré řádky.
3. **Odebrání**: starý tvar se odstraní až v pozdější samostatné verzi.

Při každém okamžiku postupné aktualizace tak mohou staré i nové procesy sdílet jednu databázi. Downgrade migrace neexistují: migrace, která před hodinou odstranila sloupec, nemůže vrátit řádky zapsané během této hodiny.

CI úloha `schema-compat` ověřuje záruku při každé verzi spuštěním testů předchozí verze proti novému schématu.

## Než začnete <!--quire:before-you-start-->

1. Přečtěte si poznámky k verzi. Verze vyžadující servisní odstávku to uvede i s odhadem; připadá v úvahu nejvýše jedna na verzi.
2. Proveďte restore drill nebo ověřte, že v této verzi úspěšně proběhl ([backup-restore.md](/cs/ops/backup-restore/)). Neúspěšný drill aktualizaci blokuje.
3. Vytvořte základní zálohu: `docker compose -f docker/compose.yaml --profile backup run --rm backup`.

## Docker Compose na jednom hostiteli <!--quire:docker-compose-one-host-->

```sh
export QUIRE_RELEASE=2026.10.0            # or set it in docker/.env
docker compose -f docker/compose.yaml pull   # or build
docker compose -f docker/compose.yaml run --rm migrate
docker compose -f docker/compose.yaml up -d --no-deps web content collab
docker compose -f docker/compose.yaml up -d --no-deps worker scheduler
```

Pořadí je záměrné:

1. **Nejprve migrace**, zatímco stará verze obsluhuje provoz. Rozšiřující migrace jí nejsou viditelné.
2. **Potom webová vrstva.** Při signálu SIGTERM každý webový proces přepne `/readyz` na `draining`, do 30 sekund dokončí rozpracované požadavky, uzavře streamy s upozorněním na opětovné připojení a skončí. `stop_grace_period` je 40 sekund, takže Compose nikdy nepřeruší řádné vypínání.
3. **Nakonec workery**, aby se nejnovější podoba události začala vytvářet dříve, než ji začne očekávat nejnovější konzument. Workery ihned přestanou načítat úlohy a dostanou 120 sekund. Nedokončená úloha se bezpečně načte jinde znovu, protože každá úloha je idempotentní. Scheduler předá vedení při dalším cyklu.

Na jediném hostiteli Compose postupně nahradí každý kontejner, takže se každá služba na krátkou dobu přeruší. Chcete-li se přerušení zcela vyhnout, provozujte webovou vrstvu ve dvou kontejnerech za vlastním proxy (přidáním druhé služby webu bez publikovaného portu v override souboru) a obnovujte je postupně. Než budete pokračovat, počkejte, až každý ohlásí zdravý stav.

## Několik hostitelů nebo orchestrátor <!--quire:several-hosts-or-an-orchestrator-->

Zachovejte stejné pořadí: migraci spusťte jednou jako samostatnou úlohu, potom postupně aktualizujte webovou vrstvu s jedním dodatečným a nulou nedostupných instancí a nakonec workery. Sondy připravenosti směřujte na `/readyz` a sondy živosti na `/healthz`.

U vyhrazených databází tenantů provede krok `migrate` obojí: nejprve migruje řídicí databázi a pak postupně každou databázi uvedenou v `ops.tenant_database`, vždy pod vlastním zámkem. Selhání jedné databáze tenanta nezastaví ostatní. Po dokončení všech databází porovná migrační protokoly a skončí s nenulovým kódem, pokud každá databáze nemá přesně tytéž migrace jako řídicí databáze. Uvede všechny databáze, které zaostávají nebo jsou napřed. Stejný příkaz nainstaluje frontové tabulky v každé databázi, protože worker zpracovává úlohy připnutého tenanta tam, kde byly zapsány.

```sh
bun apps/worker/src/migrate.ts   # what the Compose step runs
bun run db:migrate:all                            # the same, from a checkout
```
Běžná migrace i prvotní nastavení také nainstalují kanonické anglické právní dokumenty operátora Quire do `ops.platform_policy_version`. Instalátor je idempotentní: nahrazují se pouze chybějící anglické texty a právě ty zástupné texty, které nasadila migrace. Nasazená data se archivují a vloží se nová publikovaná verze; historické odkazy na přijetí i texty zůstanou zachovány. Každá skutečná verze sepsaná operátorem, včetně konceptu, se zachová a musí se spravovat v konzoli Zásady platformy. Dokumenty, verze ani souhlas zásad tenantů se tímto přechodem nikdy nemění. Jde o publikaci textu operátora, nikoli o právní certifikaci ani automatické plnění jeho slibů.


Každá vyhrazená databáze se připojuje pod svým registrovaným názvem. Databáze zaregistrovaná jako `env:QUIRE_DB_NORTHWIND_URL` potřebuje:

| Proměnná | Použití |
| --- | --- |
| `QUIRE_DB_NORTHWIND_URL` | Aplikační role pro webovou vrstvu a worker |
| `QUIRE_DB_NORTHWIND_URL_MIGRATOR` | Role migrátoru pro tento příkaz a přesuny |
| `QUIRE_DB_NORTHWIND_URL_SUPERUSER` | Volitelně: před migrací znovu provede bootstrap (role, schémata, pomocné funkce) |

Chybějící připojení `_MIGRATOR` u registrované databáze se ohlásí jako selhání a nikdy se nepřeskočí. Webovou vrstvu lze aktualizovat, jakmile je hotová řídicí databáze. Zaostává-li databáze tenanta hodinu, zobrazí se varování; při jednodenním zpoždění přijde upozornění správci.

## pgvector <!--quire:pgvector-->

Od migrace 0264 používá korpus pro podklady index HNSW pgvector, pokud má server toto rozšíření; služba Compose `postgres` je s ním sestavena (`docker/postgres.Dockerfile`). První `migrate` po změně image vytvoří rozšíření prostřednictvím bootstrapu superuživatele. Migrace 0264 pak přidá generovaný vektorový sloupec a vytvoří index. Přidání sloupce jednou přepíše `app.ai_chunk` pod výhradním zámkem, takže požadavky na podklady počkají; na tuto tabulku nic jiného nesahá.

Na serveru bez pgvector migrace 0264 zapíše upozornění a nic nezmění; vyhledávání zůstane přesné. U pgvector staršího než 0.8 se sloupec a index vytvoří, ale vyhledávání zůstane přesné, dokud se rozšíření neaktualizuje (`alter extension vector update`), protože filtrované skeny HNSW potřebují iterativní skeny z verze 0.8. Chcete-li ho později povolit na serveru, který ho nemá, nainstalujte rozšíření, znovu spusťte bootstrap (nebo jako superuživatel spusťte `create extension vector`) a potom jako `quire_migrator`:

```sql
set maintenance_work_mem = '1GB';  -- the HNSW build is much faster in memory
select ops.ai_chunk_enable_vector_index();
```

Příkaz je idempotentní a vrací `enabled` nebo `unavailable`. Spusťte ho také v každé vyhrazené databázi tenanta.

## Návrat k předchozí verzi <!--quire:rolling-back-->

Vrácení **kódu** je vždy možné: nastavte `QUIRE_RELEASE` na předchozí tag a znovu spusťte `up -d`. Funguje to, protože schéma je v rámci verze kompatibilní oběma směry.

Vrácení **schématu** se nenabízí. Následující změny nelze vzít zpět a takto z nich lze obnovit data:

| Nevratná změna | Obnova |
| --- | --- |
| Migrace odstranila sloupec | Obnovení do nového databázového systému k okamžiku před odstraněním, extrakce a sloučení dat |
| Změna dat na místě | Totéž a následné sladění s pozdějšími zápisy |
| Odeslané webhooky a události | Kompenzační události, nikdy ne mazání |
| Odeslaný e-mail | Následnou zprávu musí napsat člověk |
| Auditní hashový řetězec | Nikdy ho nepřepisujte; přidejte opravný záznam |

Proto se migrace odebírající starou podobu vydává samostatně: obnova pak má jasnou hranici.

## Kontrola aktualizace <!--quire:checking-the-upgrade-->

```sh
docker compose -f docker/compose.yaml ps           # every service healthy
curl -fsS http://localhost:8080/readyz             # ready, and what is configured
docker compose -f docker/compose.yaml logs migrate # the migrations applied
```

Source: https://docs.quirelms.com/cs/ops/upgrade/index.mdx
