Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 14 additions & 8 deletions PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down
9 changes: 6 additions & 3 deletions README.es.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
9 changes: 6 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 18 additions & 0 deletions deploy/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading