En corto
Imagen Docker oficial (Community Edition):
| |
Instalación en binario, o contenedor con la secuencia a mano:
| |
En Kubernetes, lo mismo dentro del pod: kubectl -n seafile exec -it deploy/seafile -- bash y la secuencia anterior (o /scripts/gc.sh si es la imagen oficial).
Antes de nada: System Admin → Libraries → Trash → limpiar. Una biblioteca en la papelera conserva todos sus bloques y el GC no la toca.
Por qué el disco no baja solo
Seafile guarda los archivos troceados en bloques con dirección por contenido en seafile-data/storage/ (blocks/, fs/, commits/). Borrar un archivo o una biblioteca solo escribe un commit nuevo; los bloques siguen ahí porque el historial de la biblioteca todavía los referencia, y porque otra biblioteca o una versión anterior podría usarlos. Lo único que los elimina es seaf-gc, que recorre los commits vivos y borra todo lo que ya nadie referencia.
Dos cosas deciden qué es “nadie”:
- La papelera de bibliotecas del panel de administración: una biblioteca borrada por un usuario no se elimina, se mueve ahí. Hasta que la limpies, sus bloques cuentan como vivos.
- El historial de cada biblioteca (History settings: días a conservar). El GC respeta ese período; con historial ilimitado, los bloques de versiones viejas nunca se liberan.
Requisitos
- Community Edition: Seafile parado. Los bloques que se escriben mientras el GC corre podrían ser borrados por error. El script
/scripts/gc.shde la imagen oficial lo para y lo arranca solo; a mano,seafile.sh stopantes yseafile.sh startdespués. Pro tiene GC en caliente. - Ventana de mantenimiento. El tiempo crece con el tamaño del almacenamiento; en instalaciones grandes son horas.
- Respaldo o snapshot de
seafile-data(si está en ZFS, unzfs snapshotes instantáneo). Es la primera vez que algo va a borrar bloques de verdad.
Opciones de seaf-gc.sh
| Opción | Qué hace |
|---|---|
--dry-run | Cuenta lo que se borraría y no borra nada. Empieza siempre por aquí |
-r | Solo bloques de bibliotecas borradas (las ya purgadas de la papelera), sin revisar el historial. Lo más rápido para “borré una biblioteca de 500 GB” |
--rm-fs | Borra también objetos fs huérfanos. Tenía bugs antes de CE 11.0.7 / Pro 10.0.15; actualiza antes de usarlo |
-t N | Hilos. Solo ayuda con backends de objetos (S3, etc.); con sistema de archivos local déjalo en 1 |
--id-prefix ab | Solo bibliotecas cuyo ID empieza por ese prefijo (para trocear una pasada larga) |
<id> [<id>…] | Solo esas bibliotecas |
Ejemplo de una sola biblioteca, en seco:
| |
Procedimiento completo
- Panel de admin → Libraries → Trash → limpiar (o Clean por biblioteca). Sin este paso, el GC informa de cero bloques y no entiendes por qué.
- Revisa el historial de las bibliotecas grandes (History settings); si guardan todo para siempre, decide un número de días.
- Snapshot o respaldo de
seafile-data. docker exec seafile /scripts/gc.sh, o la secuencia a mano con--dry-runprimero. La salida termina con el resumen de bloques por biblioteca.- Comprueba:
du -sh /opt/seafile-data/seafile/storage/blocksydf -h.
Para no repetirlo a mano, un cron semanal de madrugada con el mismo docker exec basta en CE.
Trampas
- “GC no libera nada”: papelera sin vaciar, historial ilimitado, o bloques retenidos por snapshots del sistema de archivos (en ZFS,
zfs list -t snapshoty suUSED). - Nunca con Seafile arriba en CE. Si el contenedor arranca
seafile-servercomo proceso principal,seafile.sh stopdentro puede tumbar el contenedor; con la imagen oficial usa/scripts/gc.sh, que ya lo contempla. --rm-fsen versiones viejas puede borrar objetos que sí se usan; solo desde CE 11.0.7.- Nginx delante y clientes que muestran Server error al sincronizar tras el GC: suele ser
client_max_body_sizedemasiado bajo, no el GC; ponlo a0en elserverde Seafile. - Bibliotecas cifradas se recolectan igual; el GC no necesita la contraseña.
Referencia: Seafile GC en el manual de administración.