---
title: "Зогсолтгүй шинэчлэлт"
description: "Зогсолтгүйгээр өөрийн серверийн Quire-г шинэчлэх."
image: "https://docs.quirelms.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.quirelms.com/mn/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](/mn/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 секунд авна; дуусч чадахгүй ажил өөр газар дахин татагдах бөгөөд энэ нь аюулгүй — учир нь бүх ажил идемпотент. Scheduler дараагийн тэмдэглэгээндээ удирдлагыг шилжүүлнэ.

Нэг хост дээр Compose контейнер бүрийг дараалан солидог тул үйлчилгээ бүрт богино завсарлага гарна. Завсарлагагүй байхын тулд веб түвшинг өөрийн проксигийн ард хоёр контейнераар ажиллуулаарай (хоёр дахь web үйлчилгээ нэмсэн, нийтлэгдсэн портгүй дарж бичих файл), мөн тэдгээрийг нэг нэгээр нь дахин үүсгээд, дараагийнх нь эхлэхээс өмнө бүр эрүүл гэж тайлагдахыг хүлээнэ үү.

## Хэд хэдэн хост эсвэл оркестратор <!--quire:several-hosts-or-an-orchestrator-->

Ижил дарааллыг ашиглана уу: дан ажлаас нэг удаа шилжүүлэлт хийгээд, дараа нь веб түвшинг surge one, unavailable zero-тэй эргүүлэх, дараа нь ажилчид. Бэлэн байдлын шалгалтуудыг `/readyz`-д, амьд байдлыг `/healthz`-д чиглүүлнэ.

Тусгай түрээсчийн өгөгдлийн сангуудтай `migrate` алхам хоёуланг хийдэг: эхлээд хяналтын өгөгдлийн санг шилжүүлээд, дараа нь `ops.tenant_database`-д жагссан бүх өгөгдлийн санг нэг нэгээр нь, бүр өөрийн түгжээний дор шилжүүлнэ. Нэг түрээсчийн өгөгдлийн сан дахь алдаа бусдыг зогсоохгүй. Бүх өгөгдлийн сан дууссаны дараа шилжүүлэлтийн бичиг тэмдэглэлүүдийг харьцуулаад, бүх өгөгдлийн сан хяналтын өгөгдлийн сан руу яг шилжүүлсэн шилжүүлэлтүүдийг хэрэгжүүлээгүй бол нэгээс ялгаатай утгаар гарна — хоцрогдсон эсвэл түрүүлсэн бүрийг нэрлэнэ. Тэр л команд сургалтын ээлжийн хүснэгтүүдийг бүр өгөгдлийн санд суулгадаг — учир нь ажилч пин хийгдсэн түрээсчийн ажлуудыг бичигдсэн газраас нь уншидаг.

```sh
bun apps/worker/src/migrate.ts   # what the Compose step runs
bun run db:migrate:all                            # the same, from a checkout
```
Ердийн шилжилт болон анхны тохиргоо нь `ops.platform_policy_version` руу Quire операторын канон англи хууль эрх зүйн баримт бичгүүдийг мөн суулгадаг. Суулгагч нь идемпотент: зөвхөн дутуу англи текстүүд болон шилжилтээс үүсгэсэн яг орлуулагч текстүүд солигдоно. Сийдүүд архивлагдаж, шинэ нийтлэгдсэн хувилбар оруулна; түүхэн хүлээн зөвшөөрлийн эшлэл болон текстүүд хадгалагдана. Операторын үнэхээр бичсэн аливаа хувилбар, ноорог орно, хадгалагдаж, платформын Бодлогуудын консолээр удирдагдах ёстой. Түрээслэгчийн бодлогын баримт бичиг, хувилбар, зөвшөөрөл энэ шилжилтээр хэзээ ч өөрчлөгдөхгүй. Энэ бол операторын текстийг нийтлэх явдал бөгөөд хууль эрх зүйн баталгаажуулалт эсвэл түүний амлалтыг автоматаар биелүүлэх явдал биш юм.


Тусгай өгөгдлийн сан бүр бүртгэгдсэн нэрээрээ хүртээмжтэй болдог. `env:QUIRE_DB_NORTHWIND_URL` гэж бүртгэгдсэн өгөгдлийн санд дараах шаардлагатай:

| Хувьсагч | Юунд ашиглана вэ |
| --- | --- |
| `QUIRE_DB_NORTHWIND_URL` | Програмын үүрэг, веб түвшин болон ажилчдад |
| `QUIRE_DB_NORTHWIND_URL_MIGRATOR` | Шилжүүлэгчийн үүрэг, энэ команд болон шилжүүлэлтүүдэд |
| `QUIRE_DB_NORTHWIND_URL_SUPERUSER` | Сонголттой: шилжүүлэхээс өмнө эхлүүлэлтийг (үүрэг, схем, туслахууд) дахин хэрэгжүүлнэ |

`_MIGRATOR` холболтгүй бүртгэгдсэн өгөгдлийн санг алдаа гэж тайлагддаг, хэзээ ч алгасдаггүй. Хяналтын өгөгдлийн сан дууссаны дараа веб түвшин эргүүлж болно. Нэг цагаар хоцрогдсон түрээсчийн өгөгдлийн сан анхааруулга; нэг өдрөөр бол мэдэгдэл өгнө.

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

0264 шилжүүлэлтээс эхлэн суурь баримтын агуулга серверт хамтаргал байвал pgvector HNSW индекс ашиглана; Compose-ийн `postgres` үйлчилгээ үүнтэй бүтээгдсэн (`docker/postgres.Dockerfile`). Дүрс солихын дараах анхны `migrate` нь супер хэрэглэгчийн эхлүүлэлтээр хамтаргалыг үүсгээд, 0264 дараа нь үүсгэгдсэн вектор багана нэмээд индексийг байна. Багана нэмэх нь `app.ai_chunk`-ийг нэг удаа онцгой түгжээний дор дахин бичдэг тул суурьлах хүсэлтүүд үүнийг хүлээнэ; өөр юу ч тэр хүснэгтэд хүрдэггүй.

pgvector-гүй сервер дээр 0264 мэдэгдэл бичээд юуг ч өөрчлөхгүй бөгөөд татан авалт яг хэвээрээ үлдэнэ. 0.8-аас хуучин pgvector-тай бол багана, индекс байгуулагдаж боловч хамтаргал шинэчлэгдөх хүртэл (`alter extension vector update`) татан авалт яг хэвээрээ үлдэнэ — учир нь шүүлттэй HNSW скан нь 0.8-ийн дадлагатай скан шаардана. Дараа нь үүнгүй сервер дээр идэвхжүүлэхийн тулд хамтаргалыг суулгаад, эхлүүлэлтийг дахин ажиллуулаарай (эсвэл супер хэрэглэгчээр `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` буцаана. Үүнийг бүр тусгай түрээсчийн өгөгдлийн сан дээр ч мөн ажиллуулна уу.

## Буцах <!--quire:rolling-back-->

**Код**-ыг буцаах нь үргэлж боломжтой: `QUIRE_RELEASE`-ийг өмнөх шошгод тогтооод дахин `up -d` хийнэ үү. Энэ нь ажиллана — учир нь схем нь хувилбарын дотор хоёр тийшээ нийцтэй.

**Схем**-ийг буцаах санал болгодоггүй. Юу буцаах боломжгүй вэ, үүнээс хэрхэн сэргээх вэ:

| Буцаах боломжгүй | Сэргээлт |
| --- | --- |
| Багана устгасан хураалтын шилжүүлэлт | Устгахаас өмнөх байдлаар шинэ өгөгдлийн сан руу цагийн цэгийн сэргээлт хийж, гаргаж авч, нэгтгэх |
| Шуудхан өөрчлөгдсөн өгөгдөл | Ижил зүйл, дараа нь хойшлуулсан бичлэгүүдийг тохируулах |
| Илгээсэн вебхүүк болон үйл явдлууд | Компенсацийн үйл явдлууд, хэзээ ч устгалгүй |
| Илгээсэн имэйл | Хүн дагалдах захиаг бичнэ |
| Аудитын хэш хэлхээ | Хэзээ ч дахин бичигдэхгүй; засварын бичлэг нэмнэ |

Ийм учраас хураалтын шилжүүлэлт дангаараа ирдэг: ингэснээр сэргээлтэд цэвэр хязгаар байна.

## Шинэчлэлтийг шалгах <!--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/mn/ops/upgrade/index.mdx
