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
Keluaran R berjalan dengan betul terhadap skema R dan skema R tolak satu. Setiap perubahan skema dipecahkan kepada kembang, peralihan dan kontrak:
- Kembang: tambah lajad, jadual atau indeks baharu. Kod lama mengabaikannya.
- Peralihan, untuk sekurang-kurangnya satu keluaran: kod baharu menulis kedua-dua bentuk dan membaca yang baharu; satu tugas boleh disambung semula mengisi baris lama.
- 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
- Baca nota keluaran. Sebuah keluaran yang memerlukan satu tetingkap penyelenggaraan menyatakan demikian, dengan anggarannya; paling banyak satu setiap keluaran.
- Jalankan latihan pemulihan, atau sahkan ia berjalan hijau untuk keluaran ini (backup-restore.md). Sebuah latihan yang gagal menyekat naik taraf itu.
- Buat satu sandaran asas:
docker compose -f docker/compose.yaml --profile backup run --rm backup.
Docker Compose, satu hos
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 schedulerUrutannya adalah disengajakan:
- Migrate dahulu, semasa keluaran lama melayani trafik. Migrasi kembang tidak kelihatan kepadanya.
- Lapisan web seterusnya. Pada SIGTERM, setiap proses web menukar
/readyzkepadadraining, menyiapkan permintaan yang sedang berjalan dalam masa 30 saat, menutup strim dengan satu panduan sambung semula, dan keluar.stop_grace_periodialah 40 saat supaya Compose tidak pernah memotong satu drain yang sihat. - 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
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.
bun apps/worker/src/migrate.ts # what the Compose step runs
bun run db:migrate:all # the same, from a checkoutMigrasi 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
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:
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
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
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