Garabato

Firma tus PDFs con tu propio certificado.

Garabato es una aplicación autoalojada para firmar PDFs con tus certificados digitales PKCS#12. Suelta un archivo, coloca la firma visible, firma y descarga. Los certificados y los documentos se guardan cifrados, y cada firma crea una versión nueva.

Instalar en un servidor
curl -fsSL https://raw.githubusercontent.com/Nonetss/garabato/main/scripts/bootstrap.sh | bash

Ejecútalo en un directorio vacío. Hace unas pocas preguntas, genera todos los secretos y arranca el stack con Docker Compose.

garabato.example.com/

Qué incluye

  1. Coloca la firma y firma.

    Elige un certificado, decide si la firma es visible o invisible, dibuja un rectángulo en la página y añade, si quieres, un motivo y un lugar. La firma es PAdES y lleva incrustada la cadena del certificado, y con una autoridad de sellado de tiempo configurada incluye un sello que demuestra cuándo se hizo.

    garabato.example.com/documents/:id
  2. Cada firma es una versión nueva.

    Firmar nunca sobrescribe un documento. El visor muestra los sellos visibles, el historial de versiones, todas descargables, y quién firmó con qué certificado.

    garabato.example.com/documents/:id
  3. Una biblioteca que se mantiene ordenada.

    Miniaturas de los PDFs en carpetas anidadas con su propio icono, etiquetas de colores y documentos fijados. Busca y filtra en toda la biblioteca, selecciona varios a la vez y muévelos arrastrando.

    garabato.example.com/documents
  4. Tus certificados, guardados cifrados.

    Importa un archivo PKCS#12 una vez y firma con él desde entonces. El archivo y su contraseña se sellan con su propia clave, y la lista muestra el titular, el NIF, el emisor y cuánto le queda de validez a cada uno.

    garabato.example.com/certificates
  5. Una traza de todo lo que haces.

    Todas las firmas con su documento, certificado, versión, posición y hashes, junto a cada importación, subida, unión, edición de páginas, descarga, renombrado, movimiento y borrado, filtrables por tipo, certificado, nombre y fechas.

    garabato.example.com/traces

Y el resto de la aplicación

Búsqueda en todas partes
⌘K o Ctrl+K te lleva a cualquier página, documento o carpeta de la biblioteca.
Claro, oscuro y móvil
Tema claro, oscuro o del sistema, una interfaz que funciona en el móvil y una PWA instalable.
Inicia sesión como prefieras
Email y contraseña, y además cualquier proveedor OIDC (Keycloak, Authentik, Google…), que se activa con tres variables.
Panel de administración
Usuarios, sesiones, organizaciones y equipos, API keys y un registro de actividad, solo para el rol admin.
Una API tipada
Cada procedimiento es también HTTP normal bajo /api/v1, documentado en /scalar para los administradores. Llámala desde scripts con una API key.
Tu almacenamiento
Los documentos van al MinIO incluido o a cualquier almacenamiento compatible con S3 que ya tengas.

Cómo está montado

Tres imágenes de la aplicación más PostgreSQL y un almacenamiento de objetos, levantados con Docker Compose. El navegador solo habla con el gateway Caddy, que manda la API al backend y todo lo demás al frontend. El backend es el dueño de la base de datos y del almacén de documentos.

Recorrido de las peticiones

Abrir una página
  1. Navegador
    → HTTPS
  2. Gateway:80
    Caddy
    → /*
  3. Frontend:4321
    Astro SSR
Firmar un documento
  1. Navegador
    → /rpc
  2. Gateway:80
    Caddy
  3. Backend:3000
    Hono · oRPC
    PostgreSQL
    → S3
  4. Almacenamiento:9000
    MinIO · S3

Enrutado del gateway

PeticiónVa a
/rpc/* /api/* /scalar* /openapi.jsonbackend:3000
/healthok
cualquier otra rutafrontend:4321

Solo se publica el puerto 80 del gateway, como FRONTEND_PORT (4444 por defecto). La consola del MinIO incluido escucha solo en el loopback del host, y el resto de servicios solo son accesibles dentro de la red de Compose.

Todo lo sensible se cifra en reposo.
Cada certificado y cada documento tiene su propia clave de datos aleatoria, envuelta por la clave maestra de CERTIFICATE_ENCRYPTION_KEY. Los archivos PKCS#12, sus contraseñas y cada versión de un PDF se sellan con AES-256-GCM, ligados al registro y al hueco al que pertenecen.
Firmas que un validador puede comprobar.
Garabato firma en PAdES baseline (ETSI.CAdES.detached) con el atributo signing-certificate-v2 e incrusta la cadena del emisor, para que un validador pueda llegar hasta la autoridad de certificación. Con TSA_URL definida, cada firma lleva además un sello de tiempo RFC 3161 (B-T), o falla antes que guardarse sin él.
No se sobrescribe nada.
Una firma crea una versión nueva del documento y un registro en el historial de firmas. Las versiones anteriores siguen descargables, y los documentos y certificados de otro usuario responden como no encontrados.
Leer la arquitectura en la documentación

En marcha con un solo comando.

En un host Linux con Docker, curl y openssl, desde un directorio vacío:

curl -fsSL https://raw.githubusercontent.com/Nonetss/garabato/main/scripts/bootstrap.sh | bash

Haz copia del .env generado, sobre todo de CERTIFICATE_ENCRYPTION_KEY, junto con la base de datos y los documentos. Si la pierdes, ningún certificado ni documento guardado se podrá recuperar.

¿Prefieres montarlo a mano? Desplegar con Docker Compose

Qué hace el script

  1. 1Pregunta el puerto, la URL pública y el primer administrador, y si los documentos van al MinIO incluido o a un almacenamiento externo compatible con S3.
  2. 2Genera todos los secretos con openssl, incluida la clave maestra que cifra los certificados y los documentos.
  3. 3Escribe .env y descarga compose.prod.yml en el directorio actual.
  4. 4Arranca el stack con las imágenes de ghcr.io. El backend migra la base de datos y crea el administrador al arrancar.
garabato.example.com