---
title: "Nadogradnja bez prekida rada"
description: "Nadogradite vlastitu Quire instalaciju bez prekida rada."
image: "https://docs.quirelms.com/og.png"
---

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

# Nadogradnja bez prekida rada

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

Pravila su navedena u odjeljku 7 dokumenta `docs/architecture/23-ops.md` i odjeljku 4.1 dokumenta `docs/architecture/07-data.md`. Ovo je postupak nadogradnje.

## Garancija koja omogućava sigurnu nadogradnju <!--quire:the-guarantee-that-makes-it-safe-->

**Izdanje R ispravno radi sa šemom R i šemom R minus jedan.** Svaka promjena šeme podijeljena je na proširenje, prijelaz i uklanjanje:

1. **Proširenje**: dodajte novu kolonu, tabelu ili indeks. Stari kod ih ignoriše.
2. **Prijelaz**, tokom najmanje jednog izdanja: novi kod zapisuje u oba oblika i čita novi; zadatak koji se može nastaviti popunjava stare redove.
3. **Uklanjanje**: u kasnijem izdanju, kao jedinu promjenu, uklonite stari oblik.

Tako stari i novi procesi tokom postepene nadogradnje uvijek mogu dijeliti istu bazu. Povratne migracije ne postoje: migracija koja je prije sat vremena uklonila kolonu ne može vratiti redove unesene u tom satu.

CI zadatak `schema-compat` provjerava ovu garanciju za svako izdanje tako što testove prethodnog izdanja pokreće nad novom šemom.

## Prije početka <!--quire:before-you-start-->

1. Pročitajte bilješke izdanja. Ako izdanje zahtijeva period održavanja, bilješke navode procjenu; takav period predviđen je najviše jednom po izdanju.
2. Pokrenite probu vraćanja sigurnosne kopije ili potvrdite da je za ovo izdanje uspješno prošla ([backup-restore.md](/bs/ops/backup-restore/)). Neuspjela proba blokira nadogradnju.
3. Napravite osnovnu sigurnosnu kopiju: `docker compose -f docker/compose.yaml --profile backup
   run --rm backup`.

## Docker Compose na jednom hostu <!--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
```

Redoslijed je namjeran:

1. **Prvo migrirajte**, dok staro izdanje još poslužuje promet. Promjene za proširenje nisu vidljive starom izdanju.
2. **Zatim nadogradite web sloj.** Pri SIGTERM-u svaki web proces postavlja `/readyz` na `draining`, dovršava zahtjeve u toku najkasnije za 30 sekundi, zatvara tokove uz uputu za ponovno povezivanje i gasi se. `stop_grace_period` je 40 sekundi, pa Compose neće prekinuti uredno gašenje.
3. **Na kraju nadogradite workere**, tako da se novi oblik događaja proizvodi prije nego što ga počne očekivati najnoviji potrošač. Workeri odmah prestaju preuzimati zadatke i dobijaju 120 sekundi; zadatak koji ne mogu dovršiti preuzima se drugdje, što je sigurno jer je svaki zadatak idempotentan. Scheduler predaje vodstvo na sljedećem ciklusu.

Na jednom hostu Compose zamjenjuje kontejnere redom, pa svaka usluga kratko prekida rad. Za neprekidan rad pokrenite dva web kontejnera iza vlastitog proxyja (u override datoteci dodajte drugu web uslugu bez objavljenog porta) i rekreirajte ih jedan po jedan, čekajući da svaki postane zdrav prije sljedećeg.

## Više hostova ili orkestrator <!--quire:several-hosts-or-an-orchestrator-->

Zadržite isti redoslijed: jednom pokrenite migraciju kao zaseban zadatak, zatim postepeno nadogradite web sloj s jednim dodatnim i nula nedostupnih instanci, pa workere. Provjere spremnosti usmjerite na `/readyz`, a provjere aktivnosti na `/healthz`.

Kada su baze podataka klijenata namjenske, korak `migrate` migrira kontrolnu bazu, zatim svaku bazu navedenu u `ops.tenant_database`, jednu po jednu i uz vlastitu blokadu. Greška u jednoj bazi klijenta ne zaustavlja ostale. Nakon migracije svih baza upoređuju se evidencije migracija; komanda završava kodom koji nije nula osim ako je u svakoj bazi primijenjeno tačno isto kao u kontrolnoj bazi, te navodi svaku bazu koja zaostaje ili je ispred. Ista komanda instalira tabele reda u svakoj bazi jer worker obrađuje zadatke fiksiranog klijenta u bazi u koju su upisani.

```sh
bun apps/worker/src/migrate.ts   # what the Compose step runs
bun run db:migrate:all                            # the same, from a checkout
```
Uobičajena migracija i početno podešavanje također instaliraju kanonske engleske pravne dokumente operatera Quire u `ops.platform_policy_version`. Instalater je idempotentan: zamjenjuju se samo nedostajući engleski tekstovi i tačno oni placeholder tekstovi koje je uspostavila migracija. Seeda se arhiviraju i ubacuje se nova objavljena verzija; historijska odobrenja i tekstovi se zadržavaju. Svaka stvarno autorova verzija, uključujući nacrt, čuva se i mora se upravljati putem konzole pravila na platformi. Dokumenti, verzije i saglasnost politika klijenta nikada se ne mijenjaju ovim prelaskom. Ovo je objavljivanje teksta operatera, a ne pravna certifikacija niti automatsko ispunjenje njegovih obećanja.


Svakoj namjenskoj bazi pristupa se pomoću imena pod kojim je registrovana. Za bazu registrovanu kao `env:QUIRE_DB_NORTHWIND_URL` potrebno je:

| Varijabla | Koristi se za |
| --- | --- |
| `QUIRE_DB_NORTHWIND_URL` | Uloga aplikacije za web sloj i workera |
| `QUIRE_DB_NORTHWIND_URL_MIGRATOR` | Uloga migratora za ovu komandu i premještanja |
| `QUIRE_DB_NORTHWIND_URL_SUPERUSER` | Opcionalno: ponovna primjena početnih postavki (uloge, šeme i pomoćne funkcije) prije migriranja |

Registrovana baza bez veze `_MIGRATOR` prijavljuje se kao neuspješna, nikad se ne preskače. Web sloj može se nadograditi nakon završetka migracije kontrolne baze. Kašnjenje baze klijenta od jednog sata izaziva upozorenje, a kašnjenje od jednog dana šalje stranicu.

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

Od migracije 0264 korpus uzemljenja koristi pgvector HNSW indeks ako server ima tu ekstenziju; Compose `postgres` servis izgrađen je s njom (`docker/postgres.Dockerfile`). Prvi `migrate` nakon promjene slika stvara ekstenziju putem početne postavke superusera, a migracija 0264 dodaje generisanu vektorsku kolonu i gradi indeks. Dodavanje kolone jednom prepisuje `app.ai_chunk` uz ekskluzivnu blokadu, pa zahtjevi za uzemljenje čekaju; ništa drugo ne koristi tu tabelu.

Na serveru bez pgvectora migracija 0264 bilježi obavještenje i ne mijenja ništa, a dohvat ostaje tačan. Uz pgvector stariji od 0.8 kolona i indeks se izgrade, ali dohvat ostaje tačan dok se ekstenzija ne nadogradi (`alter extension vector update`), jer filtriranim HNSW pretragama trebaju iterativni prolazi iz verzije 0.8. Da biste kasnije omogućili funkciju na serveru bez nje, instalirajte ekstenziju, ponovo izvršite početnu postavku (ili kao superuser pokrenite `create extension vector`), pa kao `quire_migrator` pokrenite:

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

Operacija je idempotentna i vraća `enabled` ili `unavailable`. Pokrenite je i na svakoj namjenskoj bazi klijenta.

## Vraćanje prethodne verzije <!--quire:rolling-back-->

Vraćanje **koda** uvijek je moguće: postavite `QUIRE_RELEASE` na prethodnu oznaku, pa ponovo pokrenite `up -d`. To radi jer je šema kompatibilna u oba smjera unutar izdanja.

Vraćanje **šeme** nije podržano. Evo šta se ne može poništiti i kako se oporaviti:

| Nepovratna promjena | Oporavak |
| --- | --- |
| Uklanjanje kolone migracijom | Vratite stanje na trenutak prije uklanjanja u novu bazu, izdvojite podatke i spojite ih |
| Izmjena podataka na mjestu | Isto, pa uskladite naknadne zapise |
| Poslani webhookovi i događaji | Kompenzacijski događaji; nikada brisanje |
| Poslana e-pošta | Osoba šalje naknadnu poruku |
| Hash lanac revizije | Nikad se ne prepisuje; dodaje se ispravni zapis |

Zato se migracija uklanjanja objavljuje sama: vraćanje tada ima jasnu granicu.

## Provjera nadogradnje <!--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/bs/ops/upgrade/index.mdx
