---
title: "Atnaujinimas be prastovos"
description: "Atnaujinkite savo prieglobos turimą Quire be prastovos."
image: "https://docs.quirelms.com/og.png"
---

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

# Atnaujinimas be prastovos

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

Taisyklės yra `docs/architecture/23-ops.md` 7 skyriuje ir
`docs/architecture/07-data.md` 4.1 skyriuje. Štai procedūra.

## Garantija, dėl kurios tai saugu <!--quire:the-guarantee-that-makes-it-safe-->

**Versija R veikia teisingai su schema R ir schema R minus viena.** Kiekvienas
schemos pakeitimas išskirtas į išplėtimą, pereinamąjį ir sutraukimą:

1. **Išplėtimas**: pridedamas naujas stulpelis, lentelė arba indeksas. Senas
   kodas jo ignoruoja.
2. **Pereinamasis**, bent vienai versijai: naujas kodas įrašo abiejų formų ir
   skaito naują; tęsti galima užduotis senas eilutes užpildo.
3. **Sutraukimas**: sena forma išmetama vėlesnėje versijoje, atskirai.

Taigi kiekvieną rito atnaujinimo momentą seni ir nauji procesai gali dalytis
viena duomenų baze. Nužemėjimo migracijų nėra: migracija, kuri prieš valandą
išmetė stulpelį, negali grąžinti per tą valandą įrašytų eilučių.

CI užduotis `schema-compat` tikrina šią garantiją kiekvienai versijai
vykdydama ankstesnės versijos testus prieš naują schemą.

## Prieš pradėdami <!--quire:before-you-start-->

1. Perskaitykite versijos pastabas. Versijai, kuriai reikia techninės priežiūros
   lango, tai nurodyta su įvertinimu; daugiausia vienas toks per versiją.
2. Paleiskite atkūrimo pratybas arba patvirtinkite, kad šiai versijai jos
   praėjo žalios ([backup-restore.md](/lt/ops/backup-restore/)). Nepavykusios
   pratybos blokuoja atnaujinimą.
3. Padarykite bazinę atsarginę kopiją: `docker compose -f docker/compose.yaml --profile backup
   run --rm backup`.

## Docker Compose, viena sistema <!--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
```

Eilė yra numatyta sąmoningai:

1. **Pirmiausia migracija**, kol sena versija aptarnauja srautą. Išplėtimo
   migracijos jai nematomos.
2. **Tada tinklo sluoksnis.** Gavus SIGTERM kiekvienas web procesas `/readyz`
   perjungia į `draining`, per 30 sekundžių užbaigia vykdančias užklausas,
   uždaro srautus su pakartotinio prisijungimo užuomina ir išeina.
   `stop_grace_period` yra 40 sekundžių, kad Compose niekada nenutrauktų
   sveiko ištuštinimo.
3. **Paskutiniai darbininkai**, kad naujausia įvykio forma būtų sukurta anksčiau,
   nei to laukia naujausias vartotojas. Darbininkai iš karto nustoja imti ir
   gauna 120 sekundžių; užduotis, kuri negali baigtis, bus paimta kitur, o tai
   saugu, nes kiekviena užduotis idempotentinė. Tvarkytuvas vadovavimą
   perduoda kitu savo taku.

Vienoje sistemoje Compose keičia kiekvieną konteinerį iš eilės, todėl kiekvienai
paslaugai yra trumpa pertraukėlė. Kad pertraukėlės visai nebūtų, paleiskite
tinklo sluoksnį kaip du konteinerius už savo paties įėjimo taško (perrašymo
failas, pridedantis antrą web paslaugą be skelbiamo porto) ir atkurkite juos
po vieną, palaukdami, kol kiekvienas praneš apie sveikatą, prieš kitą.

## Kelių sistemų arba orkestratorius <!--quire:several-hosts-or-an-orchestrator-->

Naudokite tą pačią tvarką: migraciją atlikite vieną kartą iš vienos užduoties,
tada atnaujinkite tinklo sluoksnį su surge one ir unavailable zero, tada
darbininkus. Pasiruošumo zondus nukreipkite į `/readyz`, o gyvybės – į `/healthz`.

Turint atskiras nuomininkų duomenų bazes, žingsnis `migrate` daro abu dalykus:
pirma migruoja valdymo duomenų bazę, tada kiekvieną `ops.tenant_database`
sąraše išvardytą duomenų bazę po vieną, kiekvieną su savo užraktu. Vienos
nuomininko duomenų bazės nesėkmė nesustabdo kitų. Kai baigiama visos,
palyginamos migracijų knygos ir išeinama su ne nuliniu kodu, jei ne kiekviena
duomenų bazė pritaikė lygiai tas pačias migracijas, kaip valdymo duomenų bazė,
įvardijant kiekvieną atsiliekančią arba pirmaujančią. Ta pati komanda įdiegia
eilės lenteles kiekvienoje duomenų bazėje, nes darbininkas suvartoja pririšto
nuomininko užduotis ten, kur jos buvo įrašytos.

```sh
bun apps/worker/src/migrate.ts   # what the Compose step runs
bun run db:migrate:all                            # the same, from a checkout
```
Įprasta migracija ir pradinė sąranka taip pat įdiegia kanoninius angliškus teisinius Quire operatoriaus dokumentus į `ops.platform_policy_version`. Diegimo programa yra idempotentinė: pakeičiami tik trūkstami angliški tekstai ir tiksliai tie laikini tekstai, kuriuos sukūrė migracija. Pradiniai duomenys archyvuojami ir įterpiama nauja paskelbta versija; istoriniai priėmimo nuorodos ir tekstai išsaugomi. Bet kuri tikra operatoriaus parašyta versija, įskaitant juodraštį, išsaugoma ir turi būti valdoma per platformos Politikos konsolę. Nuomininko politikos dokumentai, versijos ir sutikimas šiuo perėjimu niekada nekeičiami. Tai yra operatoriaus teksto publikavimas, o ne teisinis sertifikavimas ar automatinis jo pažadų vykdymas.


Kiekviena atskira duomenų bazė pasiekiama pavadinimu, kuriuo ji užregistruota.
Duomenų bazė, užregistruota kaip `env:QUIRE_DB_NORTHWIND_URL`, reikia:

| Kintamasis | Kam naudojamas |
| --- | --- |
| `QUIRE_DB_NORTHWIND_URL` | Programų vaidmuo tinklo sluoksniui ir darbininkui |
| `QUIRE_DB_NORTHWIND_URL_MIGRATOR` | Migratoriaus vaidmuo šiai komandai ir perkėlimams |
| `QUIRE_DB_NORTHWIND_URL_SUPERUSER` | Neprivaloma: pakartotinai pritaiko pradinę sąrangą (vaidmenys, schemos, pagalbinės) prieš migruojant |

Užregistruota duomenų bazė be `_MIGRATOR` ryšio pranešama kaip nesėkmė,
niekada nepraleidžiama. Tinklo sluoksnis gali riti, kai baigiama valdymo
duomenų bazė. Nuomininko duomenų bazė, atsilikusi valandą, įspėjama; parą –
kviečiama budintis.

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

Nuo migracijos 0264 pagrindo korpusas naudoja pgvector HNSW indeksą ten, kur
serveryje yra plėtinys; Compose `postgres` paslauga pastatyta su ja
(`docker/postgres.Dockerfile`). Pirmas `migrate` pakeitus atvaizdus sukuria
plėtinį per superuserio pradinę sąrangą, o 0264 tada prideda generuojamą
vektorių stulpelį ir stato indeksą. Stulpelio pridėjimas kartą perrašo
`app.ai_chunk` su išskirtiniu užraktu, todėl pagrindo užklausos jo laukia;
niekas kitas tos lentelės neliečia.

Serveryje be pgvector 0264 užrašo pranešimą ir nieko nekeičia, o paieška lieka
tiksli. Su pgvector, senesniu už 0.8, stulpelis ir indeksas pastatomi, bet
paieška lieka tiksli, kol plėtinys neatnaujinamas (`alter extension vector
update`), nes filtruoti HNSW nuskaitymai reikia 0.8 interaktyvių nuskaitymų.
Kad vėliau tai įjungtumėte serveryje, kur jo nėra, įdiekite plėtinį, dar kartą
paleiskite pradinę sąrangą (arba `create extension vector` superuseriu), tada
kaip `quire_migrator`:

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

Tai idempotentiška ir grąžina `enabled` arba `unavailable`. Paleiskite ją ir
kiekvienoje atskiroje nuomininko duomenų bazėje.

## Atšaukimas <!--quire:rolling-back-->

**Kodo** atšaukimas visada galimas: nustatykite `QUIRE_RELEASE` į ankstesnę
žymą ir vėl `up -d`. Tai veikia, nes schema abiem kryptimis suderinama tos
pačios versijos viduje.

**Schemos** atšaukimo nesiūloma. Kas negali būti atšaukta ir kaip iš to
atkurti:

| Neatvirkštinis | Atkūrimas |
| --- | --- |
| Sutraukimo migracija, išmetusi stulpelį | Laiko atžvilgiu atkūrimas iki išmetimo į naują duomenų bazę, ištraukimas, suliejimas |
| Vietinis duomenų pakeitimas | Tas pats, tada susitaikymas su rašymais nuo tada |
| Išsiųsti „webhooks“ ir įvykiai | Kompensuojantys įvykiai, niekada trynimas |
| Išsiųstas el. laiškas | Žmogus parašo tęstinį laišką |
| Audito maišos grandinė | Niekada neperrašoma; pridedama pataisos eilutė |

Todėl sutraukimo migracija išleidžiama atskirai: tada atkūrimas turi švarią
ribą.

## Atnaujinimo patikrinimas <!--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/lt/ops/upgrade/index.mdx
