<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Self-Hosted on inetshell</title><link>https://inet.sh/es/tags/self-hosted/</link><description>Recent content in Self-Hosted on inetshell</description><generator>Hugo</generator><language>es</language><lastBuildDate>Fri, 25 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://inet.sh/es/tags/self-hosted/index.xml" rel="self" type="application/rss+xml"/><item><title>Seafile: recuperar espacio en disco con seaf-gc (el garbage collector)</title><link>https://inet.sh/es/posts/seafile/recuperar-espacio-seaf-gc/</link><pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/seafile/recuperar-espacio-seaf-gc/</guid><description>Borraste bibliotecas y archivos en Seafile y el disco sigue igual: los bloques solo se liberan con seaf-gc. Cómo correrlo en la imagen Docker oficial (/scripts/gc.sh), en una instalación en binario o en Kubernetes (seafile.sh stop, seaf-gc.sh, seafile.sh start), qué opciones tiene (--dry-run, -r, --rm-fs, -t) y por qué hay que vaciar antes la papelera de bibliotecas del admin.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p>Imagen Docker oficial (Community Edition):</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">docker <span class="nb">exec</span> seafile /scripts/gc.sh        <span class="c1"># para Seafile, corre el GC y lo vuelve a arrancar</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Instalación en binario, o contenedor con la secuencia a mano:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl"><span class="nb">cd</span> /opt/seafile/seafile-server-latest
</span></span><span class="line"><span class="cl">./seafile.sh stop
</span></span><span class="line"><span class="cl">./seaf-gc.sh --dry-run        <span class="c1"># cuántos bloques se irían, sin borrar nada</span>
</span></span><span class="line"><span class="cl">./seaf-gc.sh                  <span class="c1"># borrar</span>
</span></span><span class="line"><span class="cl">./seafile.sh start
</span></span></code></pre></td></tr></table>
</div>
</div><p>En Kubernetes, lo mismo dentro del pod: <code>kubectl -n seafile exec -it deploy/seafile -- bash</code> y la secuencia anterior (o <code>/scripts/gc.sh</code> si es la imagen oficial).</p>
<p>Antes de nada: <strong>System Admin → Libraries → Trash → limpiar</strong>. Una biblioteca en la papelera conserva todos sus bloques y el GC no la toca.</p>
<h2 id="por-qué-el-disco-no-baja-solo">Por qué el disco no baja solo</h2>
<p>Seafile guarda los archivos troceados en <strong>bloques</strong> con dirección por contenido en <code>seafile-data/storage/</code> (<code>blocks/</code>, <code>fs/</code>, <code>commits/</code>). 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 <code>seaf-gc</code>, que recorre los commits vivos y borra todo lo que ya nadie referencia.</p>
<p>Dos cosas deciden qué es &ldquo;nadie&rdquo;:</p>
<ul>
<li><strong>La papelera de bibliotecas</strong> 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.</li>
<li><strong>El historial</strong> de cada biblioteca (<em>History settings</em>: días a conservar). El GC respeta ese período; con historial ilimitado, los bloques de versiones viejas nunca se liberan.</li>
</ul>
<h2 id="requisitos">Requisitos</h2>
<ul>
<li><strong>Community Edition: Seafile parado.</strong> Los bloques que se escriben mientras el GC corre podrían ser borrados por error. El script <code>/scripts/gc.sh</code> de la imagen oficial lo para y lo arranca solo; a mano, <code>seafile.sh stop</code> antes y <code>seafile.sh start</code> después. Pro tiene GC en caliente.</li>
<li><strong>Ventana de mantenimiento.</strong> El tiempo crece con el tamaño del almacenamiento; en instalaciones grandes son horas.</li>
<li><strong>Respaldo o snapshot</strong> de <code>seafile-data</code> (si está en ZFS, un <code>zfs snapshot</code> es instantáneo). Es la primera vez que algo va a borrar bloques de verdad.</li>
</ul>
<h2 id="opciones-de-seaf-gcsh">Opciones de seaf-gc.sh</h2>
<table>
  <thead>
      <tr>
          <th>Opción</th>
          <th>Qué hace</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>--dry-run</code></td>
          <td>Cuenta lo que se borraría y no borra nada. Empieza siempre por aquí</td>
      </tr>
      <tr>
          <td><code>-r</code></td>
          <td>Solo bloques de bibliotecas borradas (las ya purgadas de la papelera), sin revisar el historial. Lo más rápido para &ldquo;borré una biblioteca de 500 GB&rdquo;</td>
      </tr>
      <tr>
          <td><code>--rm-fs</code></td>
          <td>Borra también objetos <code>fs</code> huérfanos. Tenía bugs antes de CE 11.0.7 / Pro 10.0.15; actualiza antes de usarlo</td>
      </tr>
      <tr>
          <td><code>-t N</code></td>
          <td>Hilos. Solo ayuda con backends de objetos (S3, etc.); con sistema de archivos local déjalo en 1</td>
      </tr>
      <tr>
          <td><code>--id-prefix ab</code></td>
          <td>Solo bibliotecas cuyo ID empieza por ese prefijo (para trocear una pasada larga)</td>
      </tr>
      <tr>
          <td><code>&lt;id&gt; [&lt;id&gt;…]</code></td>
          <td>Solo esas bibliotecas</td>
      </tr>
  </tbody>
</table>
<p>Ejemplo de una sola biblioteca, en seco:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">./seaf-gc.sh --dry-run 3f5a1c2e-7b9d-4e21-8c44-0a6d9e7f1b23
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="procedimiento-completo">Procedimiento completo</h2>
<ol>
<li>Panel de admin → <strong>Libraries → Trash</strong> → limpiar (o <em>Clean</em> por biblioteca). Sin este paso, el GC informa de cero bloques y no entiendes por qué.</li>
<li>Revisa el historial de las bibliotecas grandes (<em>History settings</em>); si guardan todo para siempre, decide un número de días.</li>
<li>Snapshot o respaldo de <code>seafile-data</code>.</li>
<li><code>docker exec seafile /scripts/gc.sh</code>, o la secuencia a mano con <code>--dry-run</code> primero. La salida termina con el resumen de bloques por biblioteca.</li>
<li>Comprueba: <code>du -sh /opt/seafile-data/seafile/storage/blocks</code> y <code>df -h</code>.</li>
</ol>
<p>Para no repetirlo a mano, un cron semanal de madrugada con el mismo <code>docker exec</code> basta en CE.</p>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong>&ldquo;GC no libera nada&rdquo;</strong>: papelera sin vaciar, historial ilimitado, o bloques retenidos por snapshots del sistema de archivos (en ZFS, <code>zfs list -t snapshot</code> y su <code>USED</code>).</li>
<li><strong>Nunca con Seafile arriba en CE.</strong> Si el contenedor arranca <code>seafile-server</code> como proceso principal, <code>seafile.sh stop</code> dentro puede tumbar el contenedor; con la imagen oficial usa <code>/scripts/gc.sh</code>, que ya lo contempla.</li>
<li><strong><code>--rm-fs</code> en versiones viejas</strong> puede borrar objetos que sí se usan; solo desde CE 11.0.7.</li>
<li><strong>Nginx delante</strong> y clientes que muestran <em>Server error</em> al sincronizar tras el GC: suele ser <code>client_max_body_size</code> demasiado bajo, no el GC; ponlo a <code>0</code> en el <code>server</code> de Seafile.</li>
<li><strong>Bibliotecas cifradas</strong> se recolectan igual; el GC no necesita la contraseña.</li>
</ul>
<p>Referencia: <a href="https://manual.seafile.com/latest/administration/seafile_gc/">Seafile GC</a> en el manual de administración.</p>
]]></content:encoded></item></channel></rss>