From 06137a3a38319e5b1c5daedf4e838fd80ea0c9d2 Mon Sep 17 00:00:00 2001 From: gnacho Date: Sun, 18 Oct 2026 09:35:16 +0200 Subject: [PATCH] docs: record the rollback drill result (#22) --- PLAN.md | 22 ++++++++++++++-------- README.es.md | 9 ++++++--- README.md | 9 ++++++--- deploy/README.md | 18 ++++++++++++++++++ 4 files changed, 44 insertions(+), 14 deletions(-) diff --git a/PLAN.md b/PLAN.md index 86e7676..27ed301 100644 --- a/PLAN.md +++ b/PLAN.md @@ -5,10 +5,10 @@ sin que DAVx⁵, Thunderbird, iOS ni las extensiones web (opencloud-agenda, opencloud-contacts) noten la diferencia. Estado al 18-Oct-2026: **fases 0-4 completadas** (issues #1-#9 y #21 cerrados; -davcloud es el servidor DAV de producción desde el 17-Oct) y **fase 5 en -curso** (soak + drill de rollback, issue #22). **Nada de Docker**: el -despliegue es un binario estático + systemd (ver `deploy/README.md`). Repo -público desde el 18-Oct-2026, licencia AGPL-3.0. +davcloud es el servidor DAV de producción desde el 17-Oct) y **fase 5 en curso** +(soak en marcha; el **drill de rollback pasó el 18-Oct-2026**, issue #22). +**Nada de Docker**: el despliegue es un binario estático + systemd (ver +`deploy/README.md`). Repo público desde el 18-Oct-2026, licencia AGPL-3.0. ## Hecho @@ -44,13 +44,19 @@ público desde el 18-Oct-2026, licencia AGPL-3.0. - **Ensayo de migración en seco**: copia real del volumen de producción montada en davcloud: lectura, escritura byte a byte y sync verificados con dos usuarios reales. El original quedó intacto. +- **Drill de rollback** (issue #22, 18-Oct-2026, sobre el volumen de + producción): Radicale 3.5.3 arrancado sobre los mismos datos, con los 5 items + servidos con el mismo UID y el mismo conjunto de campos, las props de + colección leídas y ninguno de los items borrados reapareciendo; vuelta a + davcloud con los items byte a byte intactos (Radicale solo añade su + `.Radicale.cache/item/`). ## Pendiente (issues) -- **#22 - Fase 5: soak + drill de rollback** (en curso desde el 17-Oct: - davcloud es el único servidor DAV; 1-2 semanas de uso diario, después - arrancar Radicale sobre el mismo volumen y verificar que lee todo lo escrito - por davcloud; solo entonces retirar Radicale). +- **#22 - Fase 5: soak + drill de rollback** (soak en curso desde el 17-Oct: + davcloud es el único servidor DAV; el drill ya pasó el 18-Oct-2026, ver + arriba). Queda el uso diario con datos reales y, solo entonces, retirar + Radicale del contenedor. - **Edición de recurrencias en la web UI**: sigue siendo un TODO documentado en `web/src/lib/ics.ts`. - **Fase 6 - paridad extendida (opcional, por necesidad)**: iMIP diff --git a/README.es.md b/README.es.md index 235f416..aae606c 100644 --- a/README.es.md +++ b/README.es.md @@ -153,9 +153,12 @@ el mismo volumen (layout y metadatos son byte-compatibles en ambos sentidos). ## Estado -En uso diario como servidor DAV detrás del despliegue de OpenCloud del autor; -el periodo de soak está en marcha y el drill de rollback sigue pendiente, así -que es software en desarrollo activo. La lista de fases y lo que queda está en +En uso diario como servidor DAV detrás del despliegue de OpenCloud del autor. El +drill de rollback pasó el 18-Oct-2026: Radicale 3.5.3 sirvió el mismo volumen +otra vez, leyó todo lo escrito por davcloud (mismos UID y campos, mismas props +de colección) y no tocó los ficheros, así que volver atrás es un cambio de +servicio. El periodo de soak sigue en marcha, así que es software en desarrollo +activo. La lista de fases y lo que queda está en [PLAN.md](PLAN.md). Cubierto por 40 tests de Go y 10 de la web, CI en cada push (test/lint/security/web) y un ensayo de migración contra una copia de un volumen real de producción. Las limitaciones conocidas están seguidas como diff --git a/README.md b/README.md index 3f4e7ce..12ce3e4 100644 --- a/README.md +++ b/README.md @@ -147,9 +147,12 @@ volume (the layout and metadata are byte-compatible both ways). ## Status -In daily use as the DAV server behind the author's OpenCloud deployment; the -soak period is running and the rollback drill is still pending, so treat it as -software in active development. The phase list and what is left are in +In daily use as the DAV server behind the author's OpenCloud deployment. The +rollback drill passed on 2026-10-18: Radicale 3.5.3 served the same volume +again, read every item davcloud had written (same UIDs and fields, same +collection properties) and left the files untouched, so going back is a service +switch. The soak period is still running, so treat it as software in active +development. The phase list and what is left are in [PLAN.md](PLAN.md). Covered by 40 Go tests and 10 web tests, CI on every push (test/lint/security/web), and a migration dry run against a copy of a real production volume. Known limitations are tracked as issues: iMIP, calendar diff --git a/deploy/README.md b/deploy/README.md index d4998a8..ed3d453 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -165,6 +165,24 @@ calendarios y eventos escritos por davcloud (mismos items, mismo layout, y el component-set en formato string). Solo cuando este drill pase se puede dar el cambio por definitivo. +Ejecutado y pasado el 18-Oct-2026 sobre el volumen de producción: Radicale 3.5.3 +arrancó sobre los mismos datos y sirvió los 5 items con el mismo UID y el mismo +conjunto de campos, incluidas las props de colección; ninguno de los items +borrados durante la fase con davcloud reapareció. La vuelta deja los items byte +a byte intactos: lo único que añade Radicale es su caché +`.Radicale.cache/item/`, que davcloud ignora. + +Dos trampas al verificar, medidas ese día: + +- Comparar los items **en disco**, no en la respuesta DAV. Radicale re-serializa + al servir (propiedades en orden alfabético y un CRLF final en las vCards: + 187 -> 189 bytes) aunque no modifica los ficheros. davcloud sí sirve los items + byte a byte. +- davcloud elige el endpoint por `X-Script-Name`: pedir un `.ics` con + `X-Script-Name: /carddav` devuelve 404 `dav: resource not found`, y el hash + del cuerpo del error parece una diferencia de datos. Usar la cabecera del tipo + correcto. + ## 7. Restore del volumen (verificado) Procedimiento comprobado: extraer la copia, reponer propietario, comparar el