---
title: "Naik taraf tanpa waktu henti"
description: "Naik taraf Quire kendiri tanpa waktu henti."
image: "https://docs.quirelms.com/og.png"
---

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

# Naik taraf tanpa waktu henti

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

Peraturannya terdapat dalam `docs/architecture/23-ops.md` seksyen 7 dan
`docs/architecture/07-data.md` seksyen 4.1. Ini ialah prosedurnya.

## Jaminan yang menjadikannya selamat <!--quire:the-guarantee-that-makes-it-safe-->

**Keluaran R berjalan dengan betul terhadap skema R dan skema R tolak satu.**
Setiap perubahan skema dipecahkan kepada kembang, peralihan dan kontrak:

1. **Kembang**: tambah lajad, jadual atau indeks baharu. Kod lama mengabaikannya.
2. **Peralihan**, untuk sekurang-kurangnya satu keluaran: kod baharu menulis
   kedua-dua bentuk dan membaca yang baharu; satu tugas boleh disambung semula
   mengisi baris lama.
3. **Kontrak**: buang bentuk lama, dalam keluaran kemudian, bersendirian.

Jadi pada setiap masa dalam satu naik taraf berperingkat, proses lama dan baharu
boleh berkongsi satu pangkalan data. Tiada migrasi ke bawah: satu migrasi yang
membuang satu lajad satu jam yang lepas tidak dapat memberikan semula baris yang
ditulis dalam jam itu.

Tugas CI `schema-compat` menyemak jaminan itu pada setiap keluaran dengan
menjalankan ujian keluaran sebelumnya terhadap skema baharu.

## Sebelum anda bermula <!--quire:before-you-start-->

1. Baca nota keluaran. Sebuah keluaran yang memerlukan satu tetingkap penyelenggaraan
   menyatakan demikian, dengan anggarannya; paling banyak satu setiap keluaran.
2. Jalankan latihan pemulihan, atau sahkan ia berjalan hijau untuk keluaran ini
   ([backup-restore.md](/ms/ops/backup-restore/)). Sebuah latihan yang gagal
   menyekat naik taraf itu.
3. Buat satu sandaran asas: `docker compose -f docker/compose.yaml --profile backup
   run --rm backup`.

## Docker Compose, satu hos <!--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
```

Urutannya adalah disengajakan:

1. **Migrate dahulu**, semasa keluaran lama melayani trafik. Migrasi kembang
   tidak kelihatan kepadanya.
2. **Lapisan web seterusnya.** Pada SIGTERM, setiap proses web menukar `/readyz`
   kepada `draining`, menyiapkan permintaan yang sedang berjalan dalam masa 30
   saat, menutup strim dengan satu panduan sambung semula, dan keluar.
   `stop_grace_period` ialah 40 saat supaya Compose tidak pernah memotong satu
   drain yang sihat.
3. **Pekerja terakhir**, supaya bentuk peristiwa terbaharu dihasilkan sebelum
   pengguna terbaharu menjangkakannya. Pekerja berhenti mengambil serta-merta dan
   diberi 120 saat; satu tugas yang tidak dapat siap diambil semula di tempat
   lain, yang selamat kerana setiap tugas adalah idempoten. Perancang menyerahkan
   kepimpinan pada detik seterusnya.

Pada satu hos, Compose menggantikan setiap bekas bergilir-gilir, jadi terdapat
sedikit jurang setiap perkhidmatan. Untuk tiada langsung jurang, jalankan lapisan
web sebagai dua bekas di belakang proksi anda sendiri (satu fail override yang
menambah perkhidmatan web kedua tanpa port yang diterbitkan), dan cipta semula
mereka satu demi satu, menunggu setiap satu melaporkan sihat sebelum yang
seterusnya.

## Beberapa hos atau satu pengatur orkestra <!--quire:several-hosts-or-an-orchestrator-->

Gunakan urutan yang sama: migrate sekali daripada satu tugas tunggal, kemudian
rollingkan lapisan web dengan surge satu dan unavailable sifar, kemudian para
pekerja. Tunjukkan probe kesediaan ke `/readyz` dan probe kelayakan hidup ke
`/healthz`.

Dengan pangkalan data penyewa khusus, langkah `migrate` melakukan kedua-duanya: ia
migrate pangkalan data kawalan terlebih dahulu, kemudian setiap pangkalan data yang
disenaraikan dalam `ops.tenant_database`, satu demi satu, setiap satu di bawah
kunci sendirinya. Kegagalan dalam satu pangkalan data penyewa tidak menghentikan
yang lain. Apabila setiap pangkalan data selesai, ia membandingkan leger migrasi
dan keluar dengan bukan sifar melainkan setiap pangkalan data telah memohon tepat
migrasi yang telah dipohon oleh pangkalan data kawalan, dengan menamakan setiap satu
yang tertinggal atau terkehadapan. Arahan yang sama memasang jadual giliran dalam
setiap pangkalan data, kerana pekerja menghabiskan tugas penyewa yang disemat di
tempat ia ditulis.

```sh
bun apps/worker/src/migrate.ts   # what the Compose step runs
bun run db:migrate:all                            # the same, from a checkout
```
Migrasi biasa dan persediaan pertama juga memasang dokumen undang-undang Inggeris kanonis operator Quire ke dalam `ops.platform_policy_version`. Pemasang adalah idempoten: hanya bodi Inggeris yang hilang dan tepat bodi pemegang tempat yang dicipta oleh migrasi digantikan. Benih diarkibkan dan versi terbitan baharu disisipkan; rujukan penerimaan bersejarah dan bodi dikekalkan. Sebarang versi tulen yang ditulis oleh operator, termasuk draf, dikekalkan dan mesti diurus melalui konsol Dasar platform. Dokumen, versi dan persetujuan dasar penyewa tidak pernah diubah oleh peralihan ini. Ini ialah penerbitan teks operator, bukan pensijilan undang-undang atau pemenuhan automatik janji-janjinya.


Setiap pangkalan data khusus dicapai melalui nama ia didaftarkan. Sebuah pangkalan
data yang didaftarkan sebagai `env:QUIRE_DB_NORTHWIND_URL` memerlukan:

| Pemboleh ubah | Digunakan untuk |
| --- | --- |
| `QUIRE_DB_NORTHWIND_URL` | Peranan aplikasi, untuk lapisan web dan pekerja |
| `QUIRE_DB_NORTHWIND_URL_MIGRATOR` | Peranan migrator, untuk arahan ini dan untuk perpindahan |
| `QUIRE_DB_NORTHWIND_URL_SUPERUSER` | Pilihan: memohon semula bootstrap (peranan, skema, pembantu) sebelum migrate |

Sebuah pangkalan data berdaftar tanpa sambungan `_MIGRATOR` dilaporkan sebagai
kegagalan, tidak pernah dilepaskan. Lapisan web boleh rolling sebaik sahaja
pangkalan data kawalan selesai. Sebuah pangkalan data penyewa yang tertinggal satu
jam memberi amaran; sethari ia mengejarkan.

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

Daripada migrasi 0264, korpus grounding menggunakan satu indeks pgvector HNSW
di mana pelayan mempunyai sambungan tambahan itu; perkhidmatan `postgres` dalam
Compose dibina dengannya (`docker/postgres.Dockerfile`). `migrate` pertama selepas
menukar imej mencipta sambungan tambahan itu melalui bootstrap superuser, dan 0264
kemudian menambah satu lajad vektor yang dijana dan membina indeks itu. Menambah
lajad itu menulis semula `app.ai_chunk` sekali di bawah satu kunci eksklusif, jadi
permintaan grounding menunggunya; tiada apa-apa yang lain menyentuh jadual itu.

Pada sebuah pelayan tanpa pgvector, 0264 mencatat satu notis dan tidak mengubah
apa-apa, dan pengambilan kekal tepat. Dengan pgvector yang lebih lama daripada 0.8,
lajad dan indeks dibina tetapi pengambilan kekal tepat sehingga sambungan tambahan
dinaik taraf (`alter extension vector update`), kerana imbasan HNSW berpenapis
memerlukan imbasan berulang 0.8. Untuk menghidupkannya kemudian pada sebuah pelayan
tanpanya, pasang sambungan tambahan itu, jalankan bootstrap sekali lagi (atau
`create extension vector` sebagai superuser), kemudian sebagai `quire_migrator`:

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

Ia adalah idempoten dan memulangkan `enabled` atau `unavailable`. Jalankannya pada
setiap pangkalan data penyewa khusus juga.

## Mengundur <!--quire:rolling-back-->

Mengundur **kod** sentiasa tersedia: tetapkan `QUIRE_RELEASE` kepada tag sebelumnya
dan `up -d` sekali lagi. Itu berfungsi kerana skema adalah serasi dalam kedua-dua
arah dalam sesebuah keluaran.

Mengundur **skema** tidak ditawarkan. Apa yang tidak dapat dibatalkan, dan cara
pulih daripadanya:

| Tidak boleh diterbalikkan | Pemulihan |
| --- | --- |
| Satu migrasi kontrak yang membuang satu lajad | Pemulihan pada titik masa ke sebelum pembuangan ke dalam satu pangkalan data baharu, ekstrak, gabung |
| Satu perubahan data di tempat | Yang sama, kemudian selaraskan tulisan sejak itu |
| Webhook dan peristiwa yang dihantar | Peristiwa kompensasi, bukan sekali-kali pemadaman |
| E-mel yang dihantar | Seorang manusia menulis susulannya |
| Rantai hash audit | Tidak pernah ditulis semula; tambah satu entri pembetulan |

Itulah sebabnya satu migrasi kontrak dihantar bersendirian: satu pemulihan
kemudian mempunyai sempadan yang bersih.

## Memeriksa naik taraf <!--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/ms/ops/upgrade/index.mdx
