---
title: "Тыныгуусуз жаңылоо"
description: "Өзүн-өзү кармоочу Quire'ди тыныгуусуз жаңылоо."
image: "https://docs.quirelms.com/og.png"
---

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

# Тыныгуусуз жаңылоо

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

Эрежелер `docs/architecture/23-ops.md` 7-бөлүмүндө жана
`docs/architecture/07-data.md` 4.1-бөлүмүндө. Бул болсо процедура.

## Буну коопсуз кылган кепилдик <!--quire:the-guarantee-that-makes-it-safe-->

**Релиз R схема R жана схема R минус биринчи туура иштейт.** Ар бир схема
өзгөрүүсү кеңейтүү, өтүү жана кыскартууга бөлүнөт:

1. **Кеңейтүү**: жаңы колонканы, таблицаны же индексти кошуңуз. Эскы код аны
   эсептебейт.
2. **Өтүү**, кеминде бир релиз үчүн: жаңы код эки түрдө тең жазат жана жаңысын
   окуйт; улантылуучу жумуш эски саптарды толуктайт.
3. **Кыскартуу**: эски түрдү кийинки релизде, өзүнчө, таштап салыңыз.

Ошондуктан тыныгуусуз жаңылоонун ар кайсы учурда эски жана жаңы
процессстер бир маалымат базасын бөлүшө алат. Төмөндөткөн миграциялар жок:
бир саат мурун колонканы таштап салган миграция ошол сааттын ичинде жазылган
саптарды кайта бербейт.

`schema-compat` CI жумушу кепилдикти ар бир релизде мурунку релиздин
тесттерин жаңы схемага каршы иштетүү менен текшерет.

## Баштоодон мурун <!--quire:before-you-start-->

1. Релиз эскертүүлөрүн окуңуз. Тейлөө терезесин талап кылган рилиз бул
   жөнүндө болжол менен айтат; релизга кеминде бир.
2. Калыбына келтирүү машыгуусун өткөрүңүз же бул релиз үчүн жашыл
   өткөнүн ырастагыла ([backup-restore.md](/ky/ops/backup-restore/)). Ийгиликсиз
   машыгуу жаңылоону тосуп калат.
3. Негизги камдык көчүрмө алыңыз: `docker compose -f docker/compose.yaml --profile backup
   run --rm backup`.

## Docker Compose, бир хост <!--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
```

Тартиби ойлонулган:

1. **Алгач миграция**, эски релиз трафикти тейлөөдө. Кеңейтүү
   миграциялары анын көзүнө көрүнбөйт.
2. **Андан кийин веб катмары.** SIGTERM келгенде ар бир веб процесс
   `/readyz`'ди `draining` кылып которот, ишинде турган суроолорду 30
   секундун ичинде бүтүрөт, кайра туташуу кеши менен агымдарды жабат жана
   чыгат. `stop_grace_period` 40 секунд, ошондуктан Compose абалы жакшы
   тазалоону эч качан үзбөйт.
3. **Акыркысы жумушчулар**, ошондо эң жаңы окуя түрү эң жаңы керектөөчү
   күтөөрүнөн мурун өндүрүлөт. Жумушчулар дароо тартууну токтотуп, 120
   секунд алат; бүтө албаган жумуш башка жерден кайра алынат, бул коопсуз
   анткени ар бир жумуш бирдейликке ээ. Кезектеөөчү кийинки тикесинде
   жетекчиликти өткөрөт.

Бир хостта Compose ар бир контейнерди кезектештирүү менен алмаштырат,
ошондуктан кызмат үчүн кыска үзүлүш болот. Эч кандай үзүлүш болбосу үчүн,
веб катмарын өзүңүздүн проксиңиздин артында эки контейнер катары
иштетиңиз (чыгарылган порту жок экинчи веб кызматын кошот override
файлы), жана аларды биринчи кийинкиги, ар бири саламат экенин
кабарлаганча күтүп, кайра түзүңүз.

## Бир нече хост же оркестратор <!--quire:several-hosts-or-an-orchestrator-->

Ошол эле тартиптин колдонуңуз: бир гана жумуштан бир жолу миграция
кылыңыз, андан кийин веб катмарын surge бир, unavailable нөл менен
түшүрүңүз, андан кийин жумушчуларды. Даярдык текшерүүлөрүн `/readyz`'ге,
ал эми тирүүлүк текшерүүсүн `/healthz`'ге багыттаңыз.

Айырмаланган tenant маалымат базалары менен `migrate` адымы экинчисин да
кылат: ал алгач башкы маалымат базасын миграциялайт, андан кийин
`ops.tenant_database` атындагы ар бир маалымат базасын, биринчи кийинкиги,
ар бири өз блогунун астында. Бир tenant базасындагы ийгиликсиздик
калгандарын токтотпойт. Ар бир маалымат базасы бүткөндө ал миграция
журналдарын салыштырып, ар бир маалымат базасы башкы маалымат базасы
колдонгон миграцияларды так колдонбосо нөлдөн тышкары чыгат, арка
кечигип же алдыда экенин атап. Ошол эле буйрук ар бир маалымат
базасында кезектер таблицасын орнотот, анткени жумушчу тигилген
tenantтын жумуштарын жазылган жеринен керектейт.

```sh
bun apps/worker/src/migrate.ts   # what the Compose step runs
bun run db:migrate:all                            # the same, from a checkout
```

Ар бир айырмаланган маалымат базасы анын катталган аты аркылуу туташтырылат.
`env:QUIRE_DB_NORTHWIND_URL` катары катталган маалымат базасына төмөнкүлөр
керек:

| Variable | Used for |
| --- | --- |
| `QUIRE_DB_NORTHWIND_URL` | Колдонмо ролу, веб катмары жана жумушчу үчүн |
| `QUIRE_DB_NORTHWIND_URL_MIGRATOR` | Миграциялоочу ролу, бул буйрук жана жылдыруулар үчүн |
| `QUIRE_DB_NORTHWIND_URL_SUPERUSER` | Милдеттүү эмес: миграциялоодон мурун bootstrap'ти (рольдер, схемалар, жардамчылар) кайра колдонот |

`_MIGRATOR` туташуусу жок катталган маалымат базасы ийгиликсиздик катары
кабарланат, эч качан өткөрүлбөйт. Башкы маалымат базасы бүткөндөн кийин
веб катмары бир жолу түшүрүлөшү мүмкүн. Бир саат кечигкен tenant
маалымат базасы эскертет; бир күн кечигсе чакырык жөнөтөт.

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

0264 миграциясынан бери негиз берүү корпусу серверде кеңейтүү бар жерде
pgvector HNSW индексин колдонот; Compose'дун `postgres` кызматы аны менен
курулган (`docker/postgres.Dockerfile`). Сүрөттөрдү алмаштырганнан кийинки
биринчи `migrate` кеңейтүүнү superuser bootstrap аркылуу түзөт, андан кийин
0264 жаратылган вектор колонканы кошот жана индекс курат. Колонканы кошуу
`app.ai_chunk`'ты бир жолу атайын блоктун астында кайра жазат, ошондуктан
негиз берүү суроолору аны күтөт; башка эч нерсе ошол таблицага тийбейт.

pgvector жок серверде 0264 эскертүү жазып, эч нерсени өзгөртпөйт, жана
издөө так бойдон калат. 0.8ден мурунку pgvector менен колонка жана
индекс курулат, бирок кеңейтүү жаңырылганга (`alter extension vector update`)
чейин издөө так бойдон калат, анткени чыпкаланган HNSW скандаштары 0.8дин
кайталап скандашын талап кылат. Кийин аны жок болгон серверде
күйгүзүү үчүн, кеңейтүүнү орнотуп, bootstrap'ти кайра иштетиңуз (же
superuser болуп `create extension vector`), андан кийин `quire_migrator`
катары:

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

Ал бирдейликке ээ жана `enabled` же `unavailable` кайтарат. Аны ар бир
айырмаланган tenant маалымат базасында да иштетиңиз.

## Артка кайтуу <!--quire:rolling-back-->

**Кодду** артка кайтуу ар дайым жеткиликтүү: `QUIRE_RELEASE` мурунки
тегге коюп, кайра `up -d` кылыңыз. Бул иштейт, анткени схема релиз
ийчинде эки багытта туруктуу.

**Схеманы** артка кайтуу сунушталбайт. Кайтарылбай турган нерсе жана
анын кантип калыбына келтирилиши:

| Not reversible | Recovery |
| --- | --- |
| Колонканы таштап салган кыскартуу миграциясы | Таштоого чейинки учурга чейинки калыбына келтирүү жаңы маалымат базасына, чыгаруу, кошуу |
| Ошол жердеги маалымат өзгөртүүсү | Ошондой эле, андан кийинки жазууларды теңдөө |
| Жөнөтүлгөн вебхуктар жана окуялар | Толуктоочу окуялар, эч качан өчүрүү |
| Жөнөтүлгөн почта | Адам кийинки катты жазат |
| Аудит хэш чынжыры | Эч качан кайра жазылбайт; түзөтүү жазуусун кошуңуз |

Ошондуктан кыскартуу миграциясы өзүнчө чыгат: андан кийин калыбына
келтирүүнүн таза чеги болот.

## Жаңылоону текшерүү <!--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/ky/ops/upgrade/index.mdx
